From e866c6e00c8d0eb8e8a85bea6ec5bf442fd9edba Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 23 Mar 2023 00:28:15 -0300 Subject: [PATCH 001/265] Ignore changes to .lock --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 4734f531a..b2973e34b 100644 --- a/.gitignore +++ b/.gitignore @@ -140,3 +140,4 @@ dmypy.json notebooks/ /tests/ +poetry.lock From c2a2dd0a07fa3c847ce3b7db271689195a977af7 Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 23 Mar 2023 01:21:48 -0300 Subject: [PATCH 002/265] Add base as reference --- br_denatran_frota/README.md | 20 ++ br_denatran_frota/code/download_frota.R | 121 ++++++++ br_denatran_frota/code/download_frota_old.R | 106 +++++++ br_denatran_frota/code/frota_municipio_tipo.R | 137 +++++++++ br_denatran_frota/code/frota_uf_tipo.R | 97 +++++++ br_denatran_frota/code/utils.R | 207 ++++++++++++++ br_denatran_frota/dataset_config.yaml | 69 +++++ br_denatran_frota/municipio_tipo/publish.sql | 50 ++++ .../municipio_tipo/schema-prod.json | 1 + .../municipio_tipo/schema-staging.json | 1 + .../municipio_tipo/table_config.yaml | 268 ++++++++++++++++++ .../municipio_tipo/table_description.txt | 67 +++++ br_denatran_frota/uf_tipo/publish.sql | 49 ++++ br_denatran_frota/uf_tipo/schema-prod.json | 1 + br_denatran_frota/uf_tipo/table_config.yaml | 263 +++++++++++++++++ .../uf_tipo/table_description.txt | 67 +++++ 16 files changed, 1524 insertions(+) create mode 100644 br_denatran_frota/README.md create mode 100644 br_denatran_frota/code/download_frota.R create mode 100644 br_denatran_frota/code/download_frota_old.R create mode 100644 br_denatran_frota/code/frota_municipio_tipo.R create mode 100644 br_denatran_frota/code/frota_uf_tipo.R create mode 100644 br_denatran_frota/code/utils.R create mode 100644 br_denatran_frota/dataset_config.yaml create mode 100644 br_denatran_frota/municipio_tipo/publish.sql create mode 100644 br_denatran_frota/municipio_tipo/schema-prod.json create mode 100644 br_denatran_frota/municipio_tipo/schema-staging.json create mode 100644 br_denatran_frota/municipio_tipo/table_config.yaml create mode 100644 br_denatran_frota/municipio_tipo/table_description.txt create mode 100644 br_denatran_frota/uf_tipo/publish.sql create mode 100644 br_denatran_frota/uf_tipo/schema-prod.json create mode 100644 br_denatran_frota/uf_tipo/table_config.yaml create mode 100644 br_denatran_frota/uf_tipo/table_description.txt diff --git a/br_denatran_frota/README.md b/br_denatran_frota/README.md new file mode 100644 index 000000000..feaeb233b --- /dev/null +++ b/br_denatran_frota/README.md @@ -0,0 +1,20 @@ +# Frota de Veículos + +Como capturar os dados de br_denatran_frota? + +1. Para capturar esses dados, basta verificar o link dos dados originais indicado em `dataset_config.yaml` no item `website`. + +2. Caso tenha sido utilizado algum código de captura ou tratamento, estes estarão contidos em `code/`. Se o dado publicado for em sua versão bruta, não existirá a pasta `code/`. + +Os dados publicados estão disponíveis em: https://basedosdados.org/dataset/br-denatran-frota + +## Download e Leitura + +Dependências: + +- [unrar](https://www.rarlab.com/rar_add.htm) para extrair os arquivos `.rar` via cli. + +Ubuntu e Debian: +```sh +sudo apt-get install unrar +``` \ No newline at end of file diff --git a/br_denatran_frota/code/download_frota.R b/br_denatran_frota/code/download_frota.R new file mode 100644 index 000000000..0734e7526 --- /dev/null +++ b/br_denatran_frota/code/download_frota.R @@ -0,0 +1,121 @@ +library(rvest) +library(httr) +library(archive) # +library(magrittr) +library(stringr) +library(tibble) +library(dplyr) +library(purrr) + +download_frota <- function(key = NULL, prefix = NULL, month, year, tempdir = tempdir(), dir = getwd()) { + + months <- c( + "janeiro" = 1, + "fevereiro" = 2, + "marco" = 3, + "abril" = 4, + "maio" = 5, + "junho" = 6, + "julho" = 7, + "agosto" = 8, + "setembro" = 9, + "outubro" = 10, + "novembro" = 11, + "dezembro" = 12 + ) + + if (year > 2012) { + url <- paste0("https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-denatran/frota-de-veiculos-", year) + } else { + # Antes de 2013 os dados vem em um arquivo unico zip + stop("Utilize a função download_frota_old()") + } + + if (!dir.exists(tempdir)) dir.create(tempdir, recursive = T) + if (!dir.exists(dir)) dir.create(dir, recursive = T) + + download_file <- function(i) { + if (i$filetype %in% c("rar", "zip")) handle_compact(i) + if (i$filetype %in% c("xlsx", "xls")) handle_xl(i) + } + + make_filename <- function(i, ext = TRUE) { + stringi::stri_trans_general(i$txt, id = "Latin-ASCII; lower") %>% + stringr::str_replace_all("\\s+", "_") %>% + paste0(., "_", i$mes, "-", i$ano, ifelse(ext, paste0(".", i$filetype), as.character(""))) + } + + handle_xl <- function(i) { + dest_path_file <- paste0(dir, "/", prefix, "_", i$mes, "-", i$ano, paste0(".", i$filetype)) + if (!file.exists(dest_path_file)) { + utils::download.file( + url = i$href, + destfile = dest_path_file + ) + } + } + + handle_compact <- function(i) { + path_file_zip <- paste0(tempdir, "/", make_filename(i)) + dir_file <- paste0(tempdir, "/", make_filename(i, ext = F)) + + if (!file.exists(path_file_zip)) { + utils::download.file(url = i$href, destfile = path_file_zip) + } + + # archive package has a bug + if (i$filetype == "rar") { + if (!dir.exists(dir_file)) dir.create(dir_file) + system(paste0("unrar -o+ -inul x ", path_file_zip, " ", dir_file)) + } else { + archive::archive_extract(path_file_zip, dir = dir_file) + } + + # Remove rar, zip files. Keep only xls or xlsx + list.files(dir_file, full.names = T, pattern = "rar|zip") %>% purrr::walk(~file.remove(.x)) + + file <- list.files(dir_file) %>% .[!is.na(.)] + + if (length(file) == 0) { + stop(paste0("File not found on dir")) + } + + file_ext <- stringr::str_extract(file, ".(xlsx|xls)") + + # String multibyte is invalid + # file.rename( + # from = paste0(dir_file, "/", file), + # to = paste0(dir_file, "/", prefix, "_", month, "-", year, file_ext) + # ) + + if (!dir.exists(dir)) dir.create(dir) + + file.copy( + overwrite = TRUE, + from = paste0(dir_file, "/", file), + to = paste0(dir, "/", prefix, "_", i$mes, "-", i$ano, file_ext) + ) + + } + + get_html <- xml2::read_html(httr::GET(url, httr::user_agent("httr"))) + nodes <- get_html %>% rvest::html_nodes("p > a") + + tibble::tibble( + txt = nodes %>% rvest::html_text(), + href = nodes %>% rvest::html_attr("href") + ) %>% + dplyr::filter(stringr::str_ends(href, "xls|xlsx|rar|zip")) %>% + dplyr::mutate( + mes_name = stringr::str_match(href, regex(stringr::str_c(names(months), collapse = "|"))) %>% as.vector(), + ano = stringr::str_match(href, "\\d{4}") %>% as.vector() %>% as.numeric(), + mes = months[mes_name], + filetype = stringr::str_match(href, "[a-z]+$") %>% as.vector() + ) %>% + dplyr::filter( + stringr::str_detect(txt, regex(key, ignore_case = TRUE)), + mes %in% month + ) %>% + purrr::transpose() %>% + purrr::walk(~download_file(.x)) +} \ No newline at end of file diff --git a/br_denatran_frota/code/download_frota_old.R b/br_denatran_frota/code/download_frota_old.R new file mode 100644 index 000000000..61d645616 --- /dev/null +++ b/br_denatran_frota/code/download_frota_old.R @@ -0,0 +1,106 @@ +library(archive) # +library(stringr) +library(stringi) + +download_frota_old <- function(key = NULL, prefix = NULL, year, tempdir = tempdir(), dir = getwd()) { + + if (year > 2012) { + stop("Utilize download_frota()") + } + + mi_url <- paste0( + "https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-denatran/estatisticas/renavam/", + year, + "/frota", + ifelse(year > 2008, "_", ""), + year, + ".zip" + ) + + if (!dir.exists(tempdir)) dir.create(tempdir, recursive = T) + if (!dir.exists(dir)) dir.create(dir, recursive = T) + + dir_temp <- paste0(tempdir, "/", "frota__", year) + path_file <- paste0(dir_temp, ".zip") + + if (!file.exists(path_file)) { + tryCatch( + utils::download.file( + url = mi_url, + destfile = path_file + ), + error = function(e) { + if (file.exists(path_file)) { + file.remove(path_file) + } + } + ) + + utils::unzip( + path_file, + exdir = paste0(tempdir, "/", "frota__", year) + ) + } + + months <- c( + "jan" = 1, + "fev" = 2, + "mar" = 3, + "abr" = 4, + "mai" = 5, + "jun" = 6, + "jul" = 7, + "ago" = 8, + "set" = 9, + "out" = 10, + "nov" = 11, + "dez" = 12 + ) + + list.files(path = dir_temp, full.names = T, recursive = T) %>% + purrr::walk(function(i) { + if (stringr::str_ends(i, ".zip")) { + utils::unzip(i, exdir = paste0(dirname(i), "/")) + } + }) + + list.files(path = dir_temp, full.names = T, recursive = T) %>% + purrr::walk(function(i) { + + get_by <- list( + regiao = "(frota tipo uf)|(frota uf)|(frota regiao uf)|(frota regiao tipo uf)", + municipio = "(frota munic)|(frota mun)" + ) + + new_name <- basename(i) %>% + stringi::stri_trans_general(id = "Latin-ASCII; lower") %>% + stringr::str_replace("regi�es", "regiao") %>% + stringr::str_replace_all("\\s+", "_") %>% + stringr::str_replace_all("_|-", " ") %>% + stringr::str_replace("^(\\d\\_|\\d)+", "") %>% + stringr::str_replace_all("internet|^\\s", "") + + # Match jan|fev|... or number of month (two digits) + get_month <- stringr::str_match( + new_name, + regex(paste0(stringr::str_c(names(months), collapse = "|"), "|\\d{2}(?=\\d{4})"), ignore_case = T) + ) + + month_i <- ifelse( + stringr::str_count(get_month) == 2, + as.numeric(get_month), + months[get_month] + ) + + file_ext <- stringr::str_extract(new_name, ".[a-zA-Z0-9]+$") + + if (stringr::str_detect(new_name, regex(get_by[[key]], ignore_case = T)) & + stringr::str_ends(new_name, "(xls|xlsx)$")) { + # print(paste0(paste0(dir, "/", prefix, "-", month_i, "-", year, file_ext), "--", i)) + file.copy( + from = i, + to = paste0(dir, "/", prefix, "_", month_i, "-", year, file_ext) + ) + } + }) +} \ No newline at end of file diff --git a/br_denatran_frota/code/frota_municipio_tipo.R b/br_denatran_frota/code/frota_municipio_tipo.R new file mode 100644 index 000000000..4f935e17b --- /dev/null +++ b/br_denatran_frota/code/frota_municipio_tipo.R @@ -0,0 +1,137 @@ +library(janitor) +library(lubridate) +library(xlsx) # +library(readxl) +library(dplyr) +library(tidyr) +library(magrittr) +library(purrr) +library(readr) +library(stringr) +library(stringdist) + +source("code/download_frota.R") +source("code/download_frota_old.R") +source("code/utils.R") + +PATH_TEMP <- paste0(getwd(), "/tmp") +PATH_DOWNLOAD_MUN <- paste0(getwd(), "/input/frota_municipio_tipo") +PREFIX_FROTA_MUN <- "frota_mun_tipo" + +# Download da frota de 2004 a 2012 por municipio +2003:2012 %>% purrr::walk( + ~download_frota_old( + key = "municipio", + prefix = PREFIX_FROTA_MUN, + year = .x, + tempdir = PATH_TEMP, + dir = PATH_DOWNLOAD_MUN + ) +) + +2014:2020 %>% purrr::walk( + ~download_frota( + key = "Frota por Munic", + prefix = PREFIX_FROTA_MUN, + month = 1:12, + year = .x, + tempdir = PATH_TEMP, + dir = PATH_DOWNLOAD_MUN + ) +) + +2021 %>% purrr::walk( + ~download_frota( + key = "Frota por Munic", + prefix = PREFIX_FROTA_MUN, + month = 1:3, + year = .x, + tempdir = PATH_TEMP, + dir = PATH_DOWNLOAD_MUN + ) +) + +list.files(PATH_DOWNLOAD_MUN, full.names = T) %>% + purrr::map( + ~read_xl(.x, type = "uf") %>% + dplyr::select(!total) %>% + dplyr::rename(sigla_uf = uf, municipio_original = municipio) %>% + dplyr::filter(sigla_uf %in% names(siglas_uf)) %>% + dplyr::mutate( + dplyr::across(!c(sigla_uf, municipio_original), as.numeric), + id_municipio = purrr::map2_chr(sigla_uf, municipio_original, ~get_ibge_info(.x, .y)) + ) %>% + dplyr::relocate(c(id_municipio, ano, mes), .after = municipio_original) + ) -> frota_municipios + + +# Cada tibble deve ter 28 colunas +frota_municipios %>% purrr::map_lgl(~ncol(.x) == 26) %>% all(T) + +# Unnest a lista de tibbles, padroniza as colunas, soma e salva como csv e rds +frota_municipios %>% + purrr::map_dfr(~tidyr::unnest(.)) %>% + dplyr::mutate( + chassiplataforma = na.omit( + dplyr::c_across(dplyr::any_of(c("chassiplataforma", "chassiplatafaforma", "chassiplataf"))) + )[1], + tratoresteira = na.omit( + dplyr::c_across(dplyr::any_of(c("tratoresteira", "tratorestei"))) + )[1] + ) %>% + dplyr::select(-dplyr::any_of(c("chassiplatafaforma", "chassiplataf", "tratorestei"))) %>% + dplyr::mutate( + total = rowSums(dplyr::across(automovel:chassiplataforma)) + ) -> df_municipios + +# Filter municipios que não foram encontrados na tabela do IBGE +df_municipios %>% + filter(is.na(id_municipio)) %>% + group_by(municipio_original, sigla_uf) %>% + summarise() + +## Fix nome dos municipios +# ASSU, RN -> AÇU, 2400208 +# BOA SAUDE, RN -> Januário Cicco, 2405306 +# BOM JESUS, GO -> Bom Jesus de Goiás, 5203500 +# EMBU, SP -> Embu das Artes, "3515004" +# ITABIRINHA DE MANTENA, MG -> Itabirinha, 3131802 +# ITAMARACA, PE -> Ilha de Itamaracá, "2607604" +# JAMARI, RO -> Candeias do Jamari, "1100809" +# LIVRAMENTO DO BRUMADO, BA -> Livramento de Nossa Senhora, "2919504" +# SANTA ROSA, AC -> Santa Rosa do Purus, "1200435" +# SAO BENTO DE POMBAL, PB -> São Bentinho, "2513927" +# VILA ALTA, PR -> Alto Paraíso, "4128625" +# VILA NOVA DO MAMORE, RO -> Nova Mamoré, "1100338" + +df_municipios %>% + dplyr::mutate( + id_municipio = + dplyr::case_when( + municipio_original == "ASSU" & sigla_uf == "RN" ~ "2400208", + municipio_original == "BOA SAUDE" & sigla_uf == "RN" ~ "2405306", + municipio_original == "BOM JESUS" & sigla_uf == "GO" ~ "5203500", + municipio_original == "EMBU" & sigla_uf == "SP" ~ "3515004", + municipio_original == "ITABIRINHA DE MANTENA" & sigla_uf == "MG" ~ "3131802", + municipio_original == "ITAMARACA" & sigla_uf == "PE" ~ "2607604", + municipio_original == "JAMARI" & sigla_uf == "RO" ~ "1100809", + municipio_original == "LIVRAMENTO DO BRUMADO" & sigla_uf == "BA" ~ "2919504", + municipio_original == "SANTA ROSA" & sigla_uf == "AC" ~ "1200435", + municipio_original == "SAO BENTO DE POMBAL" & sigla_uf == "PB" ~ "2513927", + municipio_original == "VILA ALTA" & sigla_uf == "PR" ~ "4128625", + municipio_original == "VILA NOVA DO MAMORE" & sigla_uf == "RO" ~ "1100338", + TRUE ~ id_municipio + ) + ) -> frota_municipios_dist + + +frota_municipios_dist %>% + filter(is.na(id_municipio)) %>% + group_by(municipio_original, sigla_uf) %>% + summarise() + +frota_municipios_dist %>% + dplyr::filter(!is.na(id_municipio)) %>% + dplyr::select(!municipio_original) %>% + readr::write_rds(file = "output/municipio_tipo.rds") %T>% + readr::write_csv(file = "output/municipio_tipo.csv") \ No newline at end of file diff --git a/br_denatran_frota/code/frota_uf_tipo.R b/br_denatran_frota/code/frota_uf_tipo.R new file mode 100644 index 000000000..b92aede98 --- /dev/null +++ b/br_denatran_frota/code/frota_uf_tipo.R @@ -0,0 +1,97 @@ +library(janitor) +library(lubridate) +library(xlsx) # +library(readxl) +library(dplyr) +library(tidyr) +library(stringr) +library(magrittr) +library(purrr) +library(readr) +library(stringdist) + +source("code/download_frota.R") +source("code/download_frota_old.R") +source("code/utils.R") + +PATH_TEMP <- paste0(getwd(), "/tmp") +PATH_DOWNLOAD_REG <- paste0(getwd(), "/input/frota_regiao_tipo") + +PREFIX_FROTA_REG <- "frota_regiao_tipo" + +# Download da frota por regiao de 2003 a 2012 +2003:2012 %>% purrr::walk( + ~download_frota_old( + key = "regiao", + prefix = PREFIX_FROTA_REG, + year = .x, + tempdir = PATH_TEMP, + dir = PATH_DOWNLOAD_REG + ) +) + +# Download da frota por regiao e tipo em 2013 +## Demais meses de agosto a key é "Frota por Tipo" +2013 %>% + purrr::walk(~download_frota( + key = "Frota por tipo", + prefix = PREFIX_FROTA_REG, + month = c(1:7, 10:12), + year = .x, + tempdir = PATH_TEMP, + dir = PATH_DOWNLOAD_REG + )) + +## Agosto e setembro de 2013 a key é "Frota por Região" +2013 %>% + purrr::walk(~download_frota( + key = "Frota por Região", + prefix = PREFIX_FROTA_REG, + month = 8:9, + year = .x, + tempdir = PATH_TEMP, + dir = PATH_DOWNLOAD_REG + )) + + +# Download da frota de 2014 a 2020 por região e tipo veículo +2014:2020 %>% purrr::walk(~download_frota( + key = "Frota por UF e Tipo", + prefix = PREFIX_FROTA_REG, + month = 1:12, + year = .x, + tempdir = PATH_TEMP, + dir = PATH_DOWNLOAD_REG +)) + + +2021 %>% purrr::walk(~download_frota( + key = "Frota por UF e Tipo", + prefix = PREFIX_FROTA_REG, + month = 1:12, + year = .x, + tempdir = PATH_TEMP, + dir = PATH_DOWNLOAD_REG +)) + +list.files(PATH_DOWNLOAD_REG, full.names = T) %>% + purrr::map( + ~read_xl(.x, type = "grandes reg|uf") %>% + dplyr::rename("sigla_uf" = 1) %>% + dplyr::filter(sigla_uf %in% unname(siglas_uf)) %>% + dplyr::select(sigla_uf, ano, mes, automovel:utilitario) %>% + dplyr::rowwise() %>% + dplyr::mutate( + dplyr::across(!c(sigla_uf), as.numeric), + sigla_uf = sigla_uf %>% stringr::str_trim() %>% get_sigla_uf(), + total = rowSums(across(automovel:utilitario)) + ) + ) -> frota_regiao + +# Cada tibble deve ter 25 colunas e 27 linhas +frota_regiao %>% purrr::map_lgl(~ncol(.x) == 25 & nrow(.x) == 27) %>% all(T) + +frota_regiao %>% + purrr::map_dfr(~tidyr::unnest(.)) %>% + readr::write_csv(file = "output/uf_tipo.csv") %T>% + readr::write_rds(file = "output/uf_tipo.rds") \ No newline at end of file diff --git a/br_denatran_frota/code/utils.R b/br_denatran_frota/code/utils.R new file mode 100644 index 000000000..93e136d0d --- /dev/null +++ b/br_denatran_frota/code/utils.R @@ -0,0 +1,207 @@ +find_sheet <- function(x, date) { + read_sheet <- tryCatch( + readxl::excel_sheets(x), + error = function(e) { + xlsx::getSheets(xlsx::loadWorkbook(x)) %>% names() + } + ) + + sheet_names <- read_sheet %>% + stringr::str_subset(., "^(?!.*Glossário).*$") + + if (length(sheet_names) == 1) { + sheet_names[[1]] + } else { + month_name <- lubridate::month(date, label = T) + + query_sheet <- stringr::str_subset( + sheet_names, + regex(paste0("\\d{2}(?=\\d{4}$)", "|", month_name), ignore_case = T) + ) + + if (length(query_sheet) == 0) { + return(sheet_names[[1]]) + } + + if (length(query_sheet) > 1) { + # Exceções + if (date == "01-04-2010") { + return(query_sheet[[1]]) + } + stop(paste(date, ", more than one sheet found")) + } + query_sheet + } +} + +row_of_header <- function(x, key_of_header) { + # Return number of row than is the header of tibble + # x is vector of first colunm + # key_of_header is string + match <- stringr::str_subset(x, stringr::regex(key_of_header, ignore_case = T)) + result <- which(x == match) + + if (length(result) == 0) { + return(0) + } + + if (length(result) > 1) { + result[2] + } else { + result + } +} + +set_header <- function(x, key_of_header) { + number_of_header <- row_of_header(x[[1]], key_of_header) + if (number_of_header == 0) { + return(x) + } + janitor::row_to_names(x, row_number = number_of_header) +} + +# Some xls file can't be read by readxl package using read_xls() function, see this issue +read_old_xls <- function(x, date) { + sheet_name <- find_sheet(x, date) + start_row <- 1 + + while (start_row <= 5) { + result <- try( + xlsx::read.xlsx2( + x, + sheetName = sheet_name, + startRow = start_row, + endRow = 10 + ), + silent = T + ) + # Number of column can be more than 23 + if (!is.null(result) && ncol(result) >= 23 && class(result) != "try-error") { + break + } + start_row <- start_row + 1 + } + xlsx::read.xlsx2(x, sheetName = sheet_name, startRow = start_row) %>% + tibble::as_tibble() +} + +read_xl <- function(x, type) { + date <- stringr::str_match(x, "\\d{1,2}-\\d{4}") %>% + paste0("01-", .) %>% + lubridate::dmy() + + read <- function(pl) { + tryCatch( + readxl::read_excel(pl, sheet = find_sheet(pl, date)), + error = function(e) read_old_xls(x, date) + ) + } + + read(x) %>% + set_header(., key_of_header = type) %>% + janitor::clean_names() %>% + dplyr::rename_with(.fn = function(x) stringr::str_replace(x, pattern = "_|\\.|-", replacement = "")) %>% + dplyr::select(!starts_with("na")) %>% + dplyr::mutate( + ano = lubridate::year(date), + mes = lubridate::month(date) + ) +} + +# Tabela com os id dos estados e municipios +download_utils_files <- function() { + if (!dir.exists("input")) dir.create("input/ibge_cods", recursive = T) + utils::download.file( + url = "ftp://geoftp.ibge.gov.br/organizacao_do_territorio/estrutura_territorial/divisao_territorial/2018/DTB_2018.zip", + destfile = paste0("input/ibge_cods/ibge_cods.zip") + ) + utils::unzip("input/ibge_cods/ibge_cods.zip", exdir = paste0("input/ibge_cods/")) +} + +download_utils_files() + +ibge_ids <- readxl::read_excel("input/ibge_cods/RELATORIO_DTB_BRASIL_DISTRITO.xls") %>% + janitor::clean_names() + +ufs <- ibge_ids %>% + dplyr::group_by(nome_uf, uf) %>% + dplyr::summarise() %>% + dplyr::ungroup() %>% + dplyr::mutate(uf = as.numeric(uf)) %>% + dplyr::rename(id_uf = uf) + +municipios <- ibge_ids %>% + dplyr::group_by( + uf, + nome_uf, + codigo_municipio_completo, + nome_municipio + ) %>% + dplyr::summarise() %>% + dplyr::mutate( + name_upper = stringi::stri_trans_general(nome_municipio, id = "Latin-ASCII; upper"), + codigo_municipio_completo = as.numeric(codigo_municipio_completo), + uf = as.numeric(uf) + ) %>% + dplyr::ungroup() %>% + dplyr::rename( + id_uf = uf, + uf = nome_uf, + id_municipio = codigo_municipio_completo, + municipio = nome_municipio + ) + +siglas_uf <- c( + "AC" = "Acre", + "AL" = "Alagoas", + "AP" = "Amapá", + "AM" = "Amazonas", + "BA" = "Bahia", + "CE" = "Ceará", + "DF" = "Distrito Federal", + "ES" = "Espírito Santo", + "GO" = "Goiás", + "MA" = "Maranhão", + "MT" = "Mato Grosso", + "MS" = "Mato Grosso do Sul", + "MG" = "Minas Gerais", + "PA" = "Pará", + "PB" = "Paraíba", + "PR" = "Paraná", + "PE" = "Pernambuco", + "PI" = "Piauí", + "RJ" = "Rio de Janeiro", + "RN" = "Rio Grande do Norte", + "RS" = "Rio Grande do Sul", + "RO" = "Rondônia", + "RR" = "Roraima", + "SC" = "Santa Catarina", + "SP" = "São Paulo", + "SE" = "Sergipe", + "TO" = "Tocantins" +) + +get_ibge_info <- function(uf, name, tolerance = 0.60) { + state <- siglas_uf[uf] + result <- municipios %>% + dplyr::filter(uf == state) %>% + dplyr::mutate(dist = stringdist::stringsim(name_upper, name)) %>% + dplyr::arrange(dplyr::desc(dist)) %>% + dplyr::slice(1L) %>% + as.list() + + if (length(result[[1]]) == 0 || result$dist < tolerance) { + return(NA) + } + as.character(result$id_municipio) +} + +get_uf_name <- function(x) { + if (nchar(x) != 2) return(x) + unname(siglas_uf[x]) +} + +get_sigla_uf <- function(uf_name) { + purrr::keep(siglas_uf, ~.x == uf_name) %>% + names() +} diff --git a/br_denatran_frota/dataset_config.yaml b/br_denatran_frota/dataset_config.yaml new file mode 100644 index 000000000..d8db54254 --- /dev/null +++ b/br_denatran_frota/dataset_config.yaml @@ -0,0 +1,69 @@ +dataset_id: br_denatran_frota # AUTO GENERATED + +url_ckan: https://basedosdados.org/dataset/br-denatran-frota +url_github: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota + +# Descreva a base. +# Ela é sobre o que? +# Quais as principais fontes de dados? +# Há links para FAQs e explicações? +description: | # REQUIRED + Frota de Veículos por tipo, estado e município + +# Qual organização disponibiliza os dados originais? +# Opções: escolher dessa lista -> https://basedosdados.org/api/3/action/organization_list +organization: Departamento Nacional de Trânsito # REQUIRED + +# Qual departamento/grupo/pessoa mantém os dados originais? +author: + name: Departamento Nacional de Trânsito + email: + +# Onde encontrar os dados originais e mais informações? +website: + - https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-denatran/estatisticas-frota-de-veiculos-denatran + +# Quais grupos caracterizam a base? +# Opções: escolher dessa lista -> https://basedosdados.org/api/3/action/group_list +groups: + - infra-transp + +# Quais etiquetas caracterizam a base? +# Opções: escolher dessa lista -> https://basedosdados.org/api/3/action/tag_list +# Caso crie etiquetas novas, as regras são: +# - letras minúsculas +# - sem acentos +# - não repita nomes de grupos (ex. educacao, saude, meio ambiente, economia, etc.) +tags: + - veiculo + - trafego + +# Em quais línguas a base (ou a fonte original) está disponível? +# Regras: minúsculo, sem acentos. +# Opções: portugues, ingles, espanhol, frances, chines, russo, hindi, alemao, etc. +languages: + - portugues + +# Os dados originais estão disponíveis de graça? +free: sim + +# Are microdata available for download? +microdata: sim + +# Existe uma API na fonte original? +API: não + +# É necessário registrar um usuário para baixar os dados originais? +registration: não + +# Como os dados originais estão disponibilizados? +availability: online + +# A fonte original requer IP brasileiro para acesso? +brazilian_IP: não + +# Essa base está sob qual licença? +# A licença MIT se aplica a bases públicas. +# Caso não seja pública, ver opções aqui: https://help.data.world/hc/en-us/articles/115006114287-Common-license-types-for-datasets +license: + name: MIT # REQUIRED diff --git a/br_denatran_frota/municipio_tipo/publish.sql b/br_denatran_frota/municipio_tipo/publish.sql new file mode 100644 index 000000000..f4e74c045 --- /dev/null +++ b/br_denatran_frota/municipio_tipo/publish.sql @@ -0,0 +1,50 @@ +/* + +Query para publicar a tabela. + +Esse é o lugar para: + - modificar nomes, ordem e tipos de colunas + - dar join com outras tabelas + - criar colunas extras (e.g. logs, proporções, etc.) + +Qualquer coluna definida aqui deve também existir em `table_config.yaml`. + +# Além disso, sinta-se à vontade para alterar alguns nomes obscuros +# para algo um pouco mais explícito. + +TIPOS: + - Para modificar tipos de colunas, basta substituir STRING por outro tipo válido. + - Exemplo: `SAFE_CAST(column_name AS NUMERIC) column_name` + - Mais detalhes: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types + +*/ + +CREATE VIEW basedosdados-312117.br_denatran_frota.municipio_tipo AS +SELECT +SAFE_CAST(sigla_uf AS STRING) sigla_uf, +SAFE_CAST(id_municipio AS STRING) id_municipio, +SAFE_CAST(ano AS INT64) ano, +SAFE_CAST(mes AS INT64) mes, +SAFE_CAST(automovel AS INT64) automovel, +SAFE_CAST(bonde AS INT64) bonde, +SAFE_CAST(caminhao AS INT64) caminhao, +SAFE_CAST(caminhaotrator AS INT64) caminhaotrator, +SAFE_CAST(caminhonete AS INT64) caminhonete, +SAFE_CAST(camioneta AS INT64) camioneta, +SAFE_CAST(ciclomotor AS INT64) ciclomotor, +SAFE_CAST(microonibus AS INT64) microonibus, +SAFE_CAST(motocicleta AS INT64) motocicleta, +SAFE_CAST(motoneta AS INT64) motoneta, +SAFE_CAST(onibus AS INT64) onibus, +SAFE_CAST(quadriciclo AS INT64) quadriciclo, +SAFE_CAST(reboque AS INT64) reboque, +SAFE_CAST(semireboque AS INT64) semireboque, +SAFE_CAST(sidecar AS INT64) sidecar, +SAFE_CAST(outros AS INT64) outros, +SAFE_CAST(tratoresteira AS INT64) tratoresteira, +SAFE_CAST(tratorrodas AS INT64) tratorrodas, +SAFE_CAST(triciclo AS INT64) triciclo, +SAFE_CAST(utilitario AS INT64) utilitario, +SAFE_CAST(chassiplataforma AS INT64) chassiplataforma, +SAFE_CAST(total AS INT64) total +from basedosdados-312117.br_denatran_frota_staging.municipio_tipo as t \ No newline at end of file diff --git a/br_denatran_frota/municipio_tipo/schema-prod.json b/br_denatran_frota/municipio_tipo/schema-prod.json new file mode 100644 index 000000000..ecd58455f --- /dev/null +++ b/br_denatran_frota/municipio_tipo/schema-prod.json @@ -0,0 +1 @@ +[{"name": "sigla_uf", "description": "Sigla da Unidade da Federa\u00e7\u00e3o original da base", "is_in_staging": true, "is_partition": false, "type": "STRING", "mode": "NULLABLE"}, {"name": "id_municipio", "description": "ID Munic\u00edpio - IBGE 7 D\u00edgitos", "is_in_staging": true, "is_partition": false, "type": "STRING", "mode": "NULLABLE"}, {"name": "ano", "description": "Ano", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "mes", "description": "M\u00eas", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "automovel", "description": "Autom\u00f3vel", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "bonde", "description": "Bonde", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "caminhao", "description": "Caminh\u00e3o", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "caminhaotrator", "description": "Caminh\u00e3o Trator", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "caminhonete", "description": "Caminhonete", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "camioneta", "description": "Camioneta", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "chassiplataforma", "description": "Chassi Plataforma", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "ciclomotor", "description": "Ciclo Motor", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "microonibus", "description": "Micro\u00f4nibus", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "motocicleta", "description": "Motocicleta", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "motoneta", "description": "Motoneta", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "onibus", "description": "\u00d4nibus", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "quadriciclo", "description": "Quadriciclo", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "reboque", "description": "Reboque", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "semireboque", "description": "Semi-reboque", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "sidecar", "description": "Side-car", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "outros", "description": "Argumento que n\u00e3o se enquadra em nenhuma defini\u00e7\u00e3o estabelecida", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "tratoresteira", "description": "Trator esteira", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "tratorrodas", "description": "Trator rodas", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "triciclo", "description": "Triciclo", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "utilitario", "description": "Utilit\u00e1rio", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "total", "description": "Total", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}] \ No newline at end of file diff --git a/br_denatran_frota/municipio_tipo/schema-staging.json b/br_denatran_frota/municipio_tipo/schema-staging.json new file mode 100644 index 000000000..43cc3a6ef --- /dev/null +++ b/br_denatran_frota/municipio_tipo/schema-staging.json @@ -0,0 +1 @@ +[{"name": "sigla_uf", "description": "Sigla da Unidade da Federa\u00e7\u00e3o", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "ano", "description": "Ano", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "mes", "description": "M\u00eas", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "automovel", "description": "Autom\u00f3vel", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "bonde", "description": "Bonde", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "caminhao", "description": "Caminh\u00e3o", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "caminhaotrator", "description": "Caminh\u00e3o Trator", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "caminhonete", "description": "Caminhonete", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "camioneta", "description": "Camioneta", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "chassiplataforma", "description": "Chassi Plataforma", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "ciclomotor", "description": "Ciclo Motor", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "microonibus", "description": "Micro\u00f4nibus", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "motocicleta", "description": "Motocicleta", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "motoneta", "description": "Motoneta", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "onibus", "description": "\u00d4nibus", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "quadriciclo", "description": "Quadriciclo", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "reboque", "description": "Reboque", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "semireboque", "description": "Semi-reboque", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "sidecar", "description": "Side-car", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "outros", "description": "Argumento que n\u00e3o se enquadra em nenhuma defini\u00e7\u00e3o estabelecida", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "tratoresteira", "description": "Trator esteira", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "tratorrodas", "description": "Trator rodas", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "triciclo", "description": "Triciclo", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "utilitario", "description": "Utilit\u00e1rio", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "total", "description": "Total", "is_in_staging": true, "is_partition": false, "type": "STRING"}] \ No newline at end of file diff --git a/br_denatran_frota/municipio_tipo/table_config.yaml b/br_denatran_frota/municipio_tipo/table_config.yaml new file mode 100644 index 000000000..2ab4752e2 --- /dev/null +++ b/br_denatran_frota/municipio_tipo/table_config.yaml @@ -0,0 +1,268 @@ +source_bucket_name: basedosdadosdev +project_id_staging: basedosdados-312117 +project_id_prod: basedosdados-312117 +table_id: municipio_tipo # AUTO GENERATED +dataset_id: br_denatran_frota # AUTO GENERATED + +url_ckan: https://basedosdados.org/dataset/br-denatran-frota # AUTO GENERATED +url_github: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota # AUTO GENERATED + +version: v1.3 # REQUIRED + +last_updated: 2021-05-28 # AUTO GENERATED + +# Descreva a tabela. Essas são as primeiras frases que um usuário vai ver. +# Você não precisa ser muito conciso. Sinta-se a vontade para dar exemplos de +# como usar os dados. +# Se souber, liste também aplicações: pesquisa, apps, etc. que usem os dados. +description: | # REQUIRED + Frota de veículos por município e tipo + +# Quem está completando esse arquivo config? +published_by: + name: Pedro Castro # REQUIRED + code_url: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota/code # REQUIRED + website: https://github.com/pedrocastroo + email: pdesacastro@gmail.com + +# Qual organização/departamento/pessoa tratou os dados? +# As vezes há um ponto intermediário entre os dados originais e subir na Base dos Dados. +# Se essa pessoa é você, preencha abaixo com suas informações. +treated_by: + name: Pedro Castro + code_url: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota/code + website: https://basedosdados.org/ + email: pdesacastro@gmail.com + +# Se houve passos de tratamento, limpeza e manipulação de dados, descreva-os aqui. +treatment_description: | + Padronização das colunas. Nova coluna, id_municipio. Remoção das linhas "MUNICIPIO NAO INFORMADO". + +# Com qual frequência a base é atualizada? +# Opções: hora | dia | semana | mes | 1 ano | 2 anos | 5 anos | 10 anos | unico | recorrente +data_update_frequency: mes # REQUIRED + +# Nível da observação (qual é a granularidade de cada linha na tabela) +# Escolha todas as opções necessárias. +# Regras: +# - minúsculo, sem acento, singular. +# - em portugues (ou seja, não use os nomes de colunas abaixo) +# Exemplos: pais, estado, municipio, cidade, hora, dia, semana, mes, ano, etc. +observation_level: #REQUIRED + - municipio + - mes + +# Quais colunas identificam uma linha unicamente? +# Preencha com os nomes de colunas. Ex: id_municipio, ano. +# Pode ser vazio pois certas tabelas não possuem identificadores. +primary_keys: + - id_municipio + - ano + - mes + +# Qual é a cobertura espacial da tabela? +# Regras: +# - minúsculo, sem acento, singular +# - descer até o menor nível administrativo cuja cobertura abaixo seja 'todos' +# Exemplo 1: tabela que cubra todos os municípios nos estados de SP e GO +# - brasil +# - SP, GO +# Exemplo 2: tabela que cubra países inteiros na América Latina +# - brasil, argentina, peru, equador +coverage_geo: + - brasil + +# Qual é a cobertura temporal (em anos) da tabela? +# Opções: ..., 1990, 1991, ..., 1999, 2000, 2001, ..., 2019, 2020, ... +coverage_time: + - 2003 + - 2004 + - 2005 + - 2006 + - 2007 + - 2008 + - 2009 + - 2010 + - 2011 + - 2012 + - 2013 + - 2014 + - 2015 + - 2016 + - 2017 + - 2018 + - 2019 + - 2020 + - 2021 + +# Liste as colunas da tabela que representam partições. +# Não esqueça de deletar essas colunas nas tabelas .csv na hora de subir para o BigQuery. +# Isso poupará muito tempo e dinheiro às pessoas utilizando essa tabela. +# Se não houver partições, não modifique abaixo. +partitions: # REQUIRED + +# Quais são as colunas? Certifique-se de escrever uma boa descrição, as pessoas vão gostar +# para saber sobre o que é a coluna. +# Adicionar todas as colunas manualmente pode ser bastante cansativo, por isso, quando +# inicializando este arquivo de configuração, você pode apontar a função para uma amostra de dados que +# preencherá automaticamente as colunas. +# Algumas colunas existirão apenas na tabela final, você as construirá em `publish.sql`. +# Para esses, defina is_in_staging como False. +# Além disso, você deve adicionar as colunas de partição aqui e definir is_partition como True. +columns: # REQUIRED + + - + name: sigla_uf + description: Sigla da Unidade da Federação original da base + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: id_municipio + description: ID Município - IBGE 7 Dígitos + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: ano + description: Ano + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: mes + description: Mês + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: automovel + description: Automóvel + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: bonde + description: Bonde + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: caminhao + description: Caminhão + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: caminhaotrator + description: Caminhão Trator + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: caminhonete + description: Caminhonete + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: camioneta + description: Camioneta + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: chassiplataforma + description: Chassi Plataforma + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: ciclomotor + description: Ciclo Motor + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: microonibus + description: Microônibus + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: motocicleta + description: Motocicleta + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: motoneta + description: Motoneta + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: onibus + description: Ônibus + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: quadriciclo + description: Quadriciclo + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: reboque + description: Reboque + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: semireboque + description: Semi-reboque + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: sidecar + description: Side-car + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: outros + description: Argumento que não se enquadra em nenhuma definição estabelecida + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: tratoresteira + description: Trator esteira + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: tratorrodas + description: Trator rodas + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: triciclo + description: Triciclo + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: utilitario + description: Utilitário + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: total + description: Total + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. \ No newline at end of file diff --git a/br_denatran_frota/municipio_tipo/table_description.txt b/br_denatran_frota/municipio_tipo/table_description.txt new file mode 100644 index 000000000..7ca0fad1e --- /dev/null +++ b/br_denatran_frota/municipio_tipo/table_description.txt @@ -0,0 +1,67 @@ +Frota de veículos por município e tipo + + +Para saber mais acesse: +Website: https://basedosdados.org/dataset/br-denatran-frota +Github: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota + +Ajude a manter o projeto :) +Apoia-se: https://apoia.se/basedosdados + +Publicado por +------------- +Nome: Pedro Castro +Código: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota/code +Website: https://github.com/pedrocastroo +Email: pdesacastro@gmail.comTratado por +----------- +Nome: Pedro Castro +Código: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota/code +Website: https://basedosdados.org/ +Email: pdesacastro@gmail.com + +Nível da Observação (i.e. a granularidade da linha) +------------------- +- municipio +- mes + +Colunas identificando linhas unicamente +------------------- +- id_municipio +- ano +- mes + +Cobertura Temporal +------------------ +- 2003 +- 2004 +- 2005 +- 2006 +- 2007 +- 2008 +- 2009 +- 2010 +- 2011 +- 2012 +- 2013 +- 2014 +- 2015 +- 2016 +- 2017 +- 2018 +- 2019 +- 2020 +- 2021 + +Cobertura Espacial +------------------ +- brasil + +Tratamento +---------- +Padronização das colunas. Nova coluna, id_municipio. Remoção das linhas "MUNICIPIO NAO INFORMADO". + +Frequencia de Atualização +------------------------- +mes + diff --git a/br_denatran_frota/uf_tipo/publish.sql b/br_denatran_frota/uf_tipo/publish.sql new file mode 100644 index 000000000..016ef11b3 --- /dev/null +++ b/br_denatran_frota/uf_tipo/publish.sql @@ -0,0 +1,49 @@ +/* + +Query para publicar a tabela. + +Esse é o lugar para: + - modificar nomes, ordem e tipos de colunas + - dar join com outras tabelas + - criar colunas extras (e.g. logs, proporções, etc.) + +Qualquer coluna definida aqui deve também existir em `table_config.yaml`. + +# Além disso, sinta-se à vontade para alterar alguns nomes obscuros +# para algo um pouco mais explícito. + +TIPOS: + - Para modificar tipos de colunas, basta substituir STRING por outro tipo válido. + - Exemplo: `SAFE_CAST(column_name AS NUMERIC) column_name` + - Mais detalhes: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types + +*/ + +CREATE VIEW basedosdados-312117.br_denatran_frota.uf_tipo AS +SELECT +SAFE_CAST(sigla_uf AS STRING) sigla_uf, +SAFE_CAST(ano AS INT64) ano, +SAFE_CAST(mes AS INT64) mes, +SAFE_CAST(automovel AS INT64) automovel, +SAFE_CAST(bonde AS INT64) bonde, +SAFE_CAST(caminhao AS INT64) caminhao, +SAFE_CAST(caminhaotrator AS INT64) caminhaotrator, +SAFE_CAST(caminhonete AS INT64) caminhonete, +SAFE_CAST(camioneta AS INT64) camioneta, +SAFE_CAST(chassiplataforma AS INT64) chassiplataforma, +SAFE_CAST(ciclomotor AS INT64) ciclomotor, +SAFE_CAST(microonibus AS INT64) microonibus, +SAFE_CAST(motocicleta AS INT64) motocicleta, +SAFE_CAST(motoneta AS INT64) motoneta, +SAFE_CAST(onibus AS INT64) onibus, +SAFE_CAST(quadriciclo AS INT64) quadriciclo, +SAFE_CAST(reboque AS INT64) reboque, +SAFE_CAST(semireboque AS INT64) semireboque, +SAFE_CAST(sidecar AS INT64) sidecar, +SAFE_CAST(outros AS INT64) outros, +SAFE_CAST(tratoresteira AS INT64) tratoresteira, +SAFE_CAST(tratorrodas AS INT64) tratorrodas, +SAFE_CAST(triciclo AS INT64) triciclo, +SAFE_CAST(utilitario AS INT64) utilitario, +SAFE_CAST(total AS INT64) total +from basedosdados-312117.br_denatran_frota_staging.uf_tipo as t diff --git a/br_denatran_frota/uf_tipo/schema-prod.json b/br_denatran_frota/uf_tipo/schema-prod.json new file mode 100644 index 000000000..9179eec10 --- /dev/null +++ b/br_denatran_frota/uf_tipo/schema-prod.json @@ -0,0 +1 @@ +[{"name": "sigla_uf", "description": "Sigla da Unidade da Federa\u00e7\u00e3o", "is_in_staging": true, "is_partition": false, "type": "STRING", "mode": "NULLABLE"}, {"name": "ano", "description": "Ano", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "mes", "description": "M\u00eas", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "automovel", "description": "Autom\u00f3vel", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "bonde", "description": "Bonde", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "caminhao", "description": "Caminh\u00e3o", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "caminhaotrator", "description": "Caminh\u00e3o Trator", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "caminhonete", "description": "Caminhonete", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "camioneta", "description": "Camioneta", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "chassiplataforma", "description": "Chassi Plataforma", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "ciclomotor", "description": "Ciclo Motor", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "microonibus", "description": "Micro\u00f4nibus", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "motocicleta", "description": "Motocicleta", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "motoneta", "description": "Motoneta", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "onibus", "description": "\u00d4nibus", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "quadriciclo", "description": "Quadriciclo", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "reboque", "description": "Reboque", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "semireboque", "description": "Semi-reboque", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "sidecar", "description": "Side-car", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "outros", "description": "Argumento que n\u00e3o se enquadra em nenhuma defini\u00e7\u00e3o estabelecida", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "tratoresteira", "description": "Trator esteira", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "tratorrodas", "description": "Trator rodas", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "triciclo", "description": "Triciclo", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "utilitario", "description": "Utilit\u00e1rio", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "total", "description": "Total", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}] \ No newline at end of file diff --git a/br_denatran_frota/uf_tipo/table_config.yaml b/br_denatran_frota/uf_tipo/table_config.yaml new file mode 100644 index 000000000..08424b33c --- /dev/null +++ b/br_denatran_frota/uf_tipo/table_config.yaml @@ -0,0 +1,263 @@ +source_bucket_name: basedosdadosdev +project_id_staging: basedosdados-312117 +project_id_prod: basedosdados-312117 +table_id: uf_tipo # AUTO GENERATED +dataset_id: br_denatran_frota # AUTO GENERATED + + +url_ckan: https://basedosdados.org/dataset/br-denatran-frota # AUTO GENERATED +url_github: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota # AUTO GENERATED + +version: v1.2 # REQUIRED + +last_updated: 2021-05-28 # AUTO GENERATED + +# Descreva a tabela. Essas são as primeiras frases que um usuário vai ver. +# Você não precisa ser muito conciso. Sinta-se a vontade para dar exemplos de +# como usar os dados. +# Se souber, liste também aplicações: pesquisa, apps, etc. que usem os dados. +description: | # REQUIRED + Frota veículos por estado e tipo + +# Quem está completando esse arquivo config? +published_by: + name: Pedro Castro # REQUIRED + code_url: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota/code # REQUIRED + website: https://github.com/pedrocastroo + email: pdesacastro@gmail.com + +# Qual organização/departamento/pessoa tratou os dados? +# As vezes há um ponto intermediário entre os dados originais e subir na Base dos Dados. +# Se essa pessoa é você, preencha abaixo com suas informações. +treated_by: + name: Pedro Castro + code_url: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota/code + website: https://basedosdados.org/ + email: pdesacastro@gmail.com + +# Se houve passos de tratamento, limpeza e manipulação de dados, descreva-os aqui. +treatment_description: | + Padronização dos nomes das colunas. Remoção das linhas do total dos estados. + +# Com qual frequência a base é atualizada? +# Opções: hora | dia | semana | mes | 1 ano | 2 anos | 5 anos | 10 anos | unico | recorrente +data_update_frequency: mes # REQUIRED + +# Nível da observação (qual é a granularidade de cada linha na tabela) +# Escolha todas as opções necessárias. +# Regras: + # - minúsculo, sem acento, singular. +# - em portugues (ou seja, não use os nomes de colunas abaixo) +# Exemplos: pais, estado, municipio, cidade, hora, dia, semana, mes, ano, etc. +observation_level: #REQUIRED + - unidade da federação + - mes + +# Quais colunas identificam uma linha unicamente? +# Preencha com os nomes de colunas. Ex: id_municipio, ano. +# Pode ser vazio pois certas tabelas não possuem identificadores. +primary_keys: + - ano + - mes + - sigla_uf + +# Qual é a cobertura espacial da tabela? +# Regras: + # - minúsculo, sem acento, singular +# - descer até o menor nível administrativo cuja cobertura abaixo seja 'todos' +# Exemplo 1: tabela que cubra todos os municípios nos estados de SP e GO +# - brasil +# - SP, GO +# Exemplo 2: tabela que cubra países inteiros na América Latina +# - brasil, argentina, peru, equador +coverage_geo: + - brasil + +# Qual é a cobertura temporal (em anos) da tabela? +# Opções: ..., 1990, 1991, ..., 1999, 2000, 2001, ..., 2019, 2020, ... +coverage_time: + - 2003 + - 2004 + - 2005 + - 2006 + - 2007 + - 2008 + - 2009 + - 2010 + - 2011 + - 2012 + - 2013 + - 2014 + - 2015 + - 2016 + - 2017 + - 2018 + - 2019 + - 2020 + - 2021 + +# Liste as colunas da tabela que representam partições. +# Não esqueça de deletar essas colunas nas tabelas .csv na hora de subir para o BigQuery. +# Isso poupará muito tempo e dinheiro às pessoas utilizando essa tabela. +# Se não houver partições, não modifique abaixo. +partitions: # REQUIRED + +# Quais são as colunas? Certifique-se de escrever uma boa descrição, as pessoas vão gostar +# para saber sobre o que é a coluna. +# Adicionar todas as colunas manualmente pode ser bastante cansativo, por isso, quando +# inicializando este arquivo de configuração, você pode apontar a função para uma amostra de dados que +# preencherá automaticamente as colunas. +# Algumas colunas existirão apenas na tabela final, você as construirá em `publish.sql`. +# Para esses, defina is_in_staging como False. +# Além disso, você deve adicionar as colunas de partição aqui e definir is_partition como True. +columns: # REQUIRED + + - + name: sigla_uf + description: Sigla da Unidade da Federação + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: ano + description: Ano + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: mes + description: Mês + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: automovel + description: Automóvel + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: bonde + description: Bonde + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: caminhao + description: Caminhão + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: caminhaotrator + description: Caminhão Trator + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: caminhonete + description: Caminhonete + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: camioneta + description: Camioneta + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: chassiplataforma + description: Chassi Plataforma + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: ciclomotor + description: Ciclo Motor + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: microonibus + description: Microônibus + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: motocicleta + description: Motocicleta + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: motoneta + description: Motoneta + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: onibus + description: Ônibus + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: quadriciclo + description: Quadriciclo + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: reboque + description: Reboque + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: semireboque + description: Semi-reboque + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: sidecar + description: Side-car + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: outros + description: Argumento que não se enquadra em nenhuma definição estabelecida + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: tratoresteira + description: Trator esteira + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: tratorrodas + description: Trator rodas + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: triciclo + description: Triciclo + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: utilitario + description: Utilitário + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partition. + + - + name: total + description: Total + is_in_staging: True # Bool [True, False], whether the column is in the staging table + is_partition: False # Bool [True, False], whether the column is a partitio \ No newline at end of file diff --git a/br_denatran_frota/uf_tipo/table_description.txt b/br_denatran_frota/uf_tipo/table_description.txt new file mode 100644 index 000000000..982522203 --- /dev/null +++ b/br_denatran_frota/uf_tipo/table_description.txt @@ -0,0 +1,67 @@ +Frota veículos por estado e tipo + + +Para saber mais acesse: +Website: https://basedosdados.org/dataset/br-denatran-frota +Github: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota + +Ajude a manter o projeto :) +Apoia-se: https://apoia.se/basedosdados + +Publicado por +------------- +Nome: Pedro Castro +Código: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota/code +Website: https://github.com/pedrocastroo +Email: pdesacastro@gmail.comTratado por +----------- +Nome: Pedro Castro +Código: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota/code +Website: https://basedosdados.org/ +Email: pdesacastro@gmail.com + +Nível da Observação (i.e. a granularidade da linha) +------------------- +- unidade da federação +- mes + +Colunas identificando linhas unicamente +------------------- +- ano +- mes +- sigla_uf + +Cobertura Temporal +------------------ +- 2003 +- 2004 +- 2005 +- 2006 +- 2007 +- 2008 +- 2009 +- 2010 +- 2011 +- 2012 +- 2013 +- 2014 +- 2015 +- 2016 +- 2017 +- 2018 +- 2019 +- 2020 +- 2021 + +Cobertura Espacial +------------------ +- brasil + +Tratamento +---------- +Padronização dos nomes das colunas. Remoção das linhas do total dos estados. + +Frequencia de Atualização +------------------------- +mes + From 959b3f9d4d76068bd3c32a92c46ec4939d7a8db9 Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 23 Mar 2023 02:08:24 -0300 Subject: [PATCH 003/265] Add package and base python code --- br_denatran_frota/code/download_frota.py | 93 ++ poetry.lock | 1535 +++------------------- pyproject.toml | 1 + 3 files changed, 282 insertions(+), 1347 deletions(-) create mode 100644 br_denatran_frota/code/download_frota.py diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py new file mode 100644 index 000000000..c75ef01e4 --- /dev/null +++ b/br_denatran_frota/code/download_frota.py @@ -0,0 +1,93 @@ +import os +import re +import tempfile +from urllib.request import urlopen, urlretrieve +from zipfile import ZipFile +from rarfile import RarFile +from bs4 import BeautifulSoup +from collections import defaultdict + + +def download_frota(key=None, prefix=None, month=None, year=None, tempdir=None, dir=None): + months = { + "janeiro": 1, + "fevereiro": 2, + "marco": 3, + "abril": 4, + "maio": 5, + "junho": 6, + "julho": 7, + "agosto": 8, + "setembro": 9, + "outubro": 10, + "novembro": 11, + "dezembro": 12, + } + + if year > 2012: + url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-denatran/frota-de-veiculos-{year}" + else: + raise ValueError("Utilize a função download_frota_old()") + + if not tempdir: + tempdir = tempfile.gettempdir() + if not dir: + dir = os.getcwd() + + def make_filename(i, ext=True): + txt = i["txt"] + mes = i["mes"] + ano = i["ano"] + filetype = i["filetype"] + filename = re.sub("\\s+", "_", txt, flags=re.UNICODE).lower() + filename = f"{filename}_{mes}-{ano}" + if ext: + filename += f".{filetype}" + return filename + + def handle_xl(i): + dest_path_file = os.path.join(dir, f"{prefix}_{i['mes']}-{i['ano']}.{i['filetype']}") + if not os.path.isfile(dest_path_file): + urlretrieve(i["href"], dest_path_file) + + def handle_compact(i): + path_file_zip = os.path.join(tempdir, make_filename(i)) + dir_file = os.path.join(tempdir, make_filename(i, ext=False)) + + if not os.path.isfile(path_file_zip): + urlretrieve(i["href"], path_file_zip) + + if i["filetype"] == "rar": + with RarFile(path_file_zip) as rar_file: + rar_file.extractall(dir_file) + else: + with ZipFile(path_file_zip) as zip_file: + zip_file.extractall(dir_file) + + for filename in os.listdir(dir_file): + filepath = os.path.join(dir_file, filename) + if os.path.isfile(filepath): + if filename.endswith((".xlsx", ".xls")): + dest_path_file = os.path.join( + dir, f"{prefix}_{i['mes']}-{i['ano']}.{filename.split('.')[-1]}" + ) + if not os.path.isfile(dest_path_file): + os.rename(filepath, dest_path_file) + else: + os.remove(filepath) + + soup = BeautifulSoup(urlopen(url), "html.parser") + nodes = soup.select("p > a") + + data = defaultdict(list) + for node in nodes: + txt = node.text + href = node.attrib["href"] + match = re.search("(?i)xls|xlsx|rar|zip$", href) + if match and re.search(key, txt, re.IGNORECASE) and months.get(match.group(1)) in month: + filetype = match.group().lower() + mes_name = re.search("(%s)" % "|".join(months.keys()), href).group(1) + mes = months[mes_name] + ano = int(re.search("\d{4}", href).group()) + info = {'txt': txt, 'href': href, 'mes_name': mes_name, 'mes': mes, 'ano': ano, 'filetype': filetype} + download_file(info) diff --git a/poetry.lock b/poetry.lock index c9a17db19..60a414b94 100644 --- a/poetry.lock +++ b/poetry.lock @@ -23,10 +23,10 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] -docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] -tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] [[package]] name = "basedosdados" @@ -117,7 +117,6 @@ python-versions = "*" docopt = "*" python-slugify = ">=1.0" requests = "*" -setuptools = "*" six = ">=1.9,<2.0" [[package]] @@ -149,7 +148,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "coverage" -version = "6.4.4" +version = "7.2.2" description = "Code coverage measurement for Python" category = "dev" optional = false @@ -202,7 +201,7 @@ complete = ["bokeh (>=1.0.0,!=2.0.0)", "distributed (==2021.11.2)", "jinja2", "n dataframe = ["numpy (>=1.18)", "pandas (>=1.0)"] diagnostics = ["bokeh (>=1.0.0,!=2.0.0)", "jinja2"] distributed = ["distributed (==2021.11.2)"] -test = ["pre-commit", "pytest", "pytest-rerunfailures", "pytest-xdist"] +test = ["pytest", "pytest-rerunfailures", "pytest-xdist", "pre-commit"] [[package]] name = "db-dtypes" @@ -241,7 +240,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" wrapt = ">=1.10,<2" [package.extras] -dev = ["PyTest", "PyTest (<5)", "PyTest-Cov", "PyTest-Cov (<2.6)", "bump2version (<1)", "configparser (<5)", "importlib-metadata (<3)", "importlib-resources (<4)", "sphinx (<2)", "sphinxcontrib-websupport (<2)", "tox", "zipp (<2)"] +dev = ["tox", "bump2version (<1)", "sphinx (<2)", "importlib-metadata (<3)", "importlib-resources (<4)", "configparser (<5)", "sphinxcontrib-websupport (<2)", "zipp (<2)", "PyTest (<5)", "PyTest-Cov (<2.6)", "pytest", "pytest-cov"] [[package]] name = "dill" @@ -278,7 +277,6 @@ jinja2 = "*" msgpack = ">=0.6.0" psutil = ">=5.0" pyyaml = "*" -setuptools = "*" sortedcontainers = "<2.0.0 || >2.0.0,<2.0.1 || >2.0.1" tblib = ">=1.6.0" toolz = ">=0.8.2" @@ -300,7 +298,7 @@ websocket-client = ">=0.32.0" [package.extras] ssh = ["paramiko (>=2.4.2)"] -tls = ["cryptography (>=3.4.7)", "idna (>=2.0.0)", "pyOpenSSL (>=17.5.0)"] +tls = ["pyOpenSSL (>=17.5.0)", "cryptography (>=3.4.7)", "idna (>=2.0.0)"] [[package]] name = "docopt" @@ -319,7 +317,7 @@ optional = false python-versions = ">=3.7" [package.extras] -codecs = ["lz4", "python-snappy", "zstandard"] +codecs = ["python-snappy", "zstandard", "lz4"] lz4 = ["lz4"] snappy = ["python-snappy"] zstandard = ["zstandard"] @@ -345,9 +343,9 @@ optional = false python-versions = ">=3.7" [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=14.0.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "zopfli (>=0.1.4)", "lz4 (>=1.7.4.2)", "matplotlib", "sympy", "skia-pathops (>=0.5.0)", "uharfbuzz (>=0.23.0)", "brotlicffi (>=0.8.0)", "scipy", "brotli (>=1.0.1)", "munkres", "unicodedata2 (>=14.0.0)", "xattr"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "scipy"] +interpolatable = ["scipy", "munkres"] lxml = ["lxml (>=4.0,<5)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] @@ -356,7 +354,7 @@ symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] unicode = ["unicodedata2 (>=14.0.0)"] -woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] +woff = ["zopfli (>=0.1.4)", "brotlicffi (>=0.8.0)", "brotli (>=1.0.1)"] [[package]] name = "fsspec" @@ -371,7 +369,7 @@ abfs = ["adlfs"] adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] -dropbox = ["dropbox", "dropboxdrivefs", "requests"] +dropbox = ["dropboxdrivefs", "requests", "dropbox"] entrypoints = ["importlib-metadata"] fuse = ["fusepy"] gcs = ["gcsfs"] @@ -380,7 +378,7 @@ github = ["requests"] gs = ["gcsfs"] gui = ["panel"] hdfs = ["pyarrow (>=1)"] -http = ["aiohttp", "requests"] +http = ["requests", "aiohttp"] libarchive = ["libarchive-c"] oci = ["ocifs"] s3 = ["s3fs"] @@ -417,7 +415,6 @@ packaging = ">=14.3" protobuf = {version = ">=3.12.0", markers = "python_version > \"3\""} pytz = "*" requests = ">=2.18.0,<3.0.0dev" -setuptools = ">=40.3.0" six = ">=1.13.0" [package.extras] @@ -452,11 +449,10 @@ python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" cachetools = ">=2.0.0,<5.0" pyasn1-modules = ">=0.2.1" rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} -setuptools = ">=40.3.0" six = ">=1.9.0" [package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] +aiohttp = ["requests (>=2.20.0,<3.0.0dev)", "aiohttp (>=3.6.2,<4.0.0dev)"] pyopenssl = ["pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] @@ -508,11 +504,11 @@ python-dateutil = ">=2.7.2,<3.0dev" requests = ">=2.18.0,<3.0.0dev" [package.extras] -all = ["Shapely (>=1.6.0,<2.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.38.1,<2.0dev)", "opentelemetry-api (>=0.11b0)", "opentelemetry-instrumentation (>=0.11b0)", "opentelemetry-sdk (>=0.11b0)", "pandas (>=0.24.2)", "pyarrow (>=3.0.0,<7.0dev)", "tqdm (>=4.7.4,<5.0.0dev)"] +all = ["google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.38.1,<2.0dev)", "pyarrow (>=3.0.0,<7.0dev)", "geopandas (>=0.9.0,<1.0dev)", "Shapely (>=1.6.0,<2.0dev)", "pandas (>=0.24.2)", "tqdm (>=4.7.4,<5.0.0dev)", "opentelemetry-api (>=0.11b0)", "opentelemetry-sdk (>=0.11b0)", "opentelemetry-instrumentation (>=0.11b0)"] bignumeric_type = ["pyarrow (>=3.0.0,<7.0dev)"] bqstorage = ["google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.38.1,<2.0dev)", "pyarrow (>=3.0.0,<7.0dev)"] -geopandas = ["Shapely (>=1.6.0,<2.0dev)", "geopandas (>=0.9.0,<1.0dev)"] -opentelemetry = ["opentelemetry-api (>=0.11b0)", "opentelemetry-instrumentation (>=0.11b0)", "opentelemetry-sdk (>=0.11b0)"] +geopandas = ["geopandas (>=0.9.0,<1.0dev)", "Shapely (>=1.6.0,<2.0dev)"] +opentelemetry = ["opentelemetry-api (>=0.11b0)", "opentelemetry-sdk (>=0.11b0)", "opentelemetry-instrumentation (>=0.11b0)"] pandas = ["pandas (>=0.24.2)", "pyarrow (>=3.0.0,<7.0dev)"] tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] @@ -683,9 +679,9 @@ python-versions = ">=3.7" zipp = ">=0.5" [package.extras] -docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] [[package]] name = "iniconfig" @@ -746,7 +742,7 @@ colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} [package.extras] -dev = ["Sphinx (>=4.1.1)", "black (>=19.10b0)", "colorama (>=0.3.4)", "docutils (==0.16)", "flake8 (>=3.7.7)", "isort (>=5.1.1)", "pytest (>=4.6.2)", "pytest-cov (>=2.7.1)", "sphinx-autobuild (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "tox (>=3.9.0)"] +dev = ["colorama (>=0.3.4)", "docutils (==0.16)", "flake8 (>=3.7.7)", "tox (>=3.9.0)", "pytest (>=4.6.2)", "pytest-cov (>=2.7.1)", "black (>=19.10b0)", "isort (>=5.1.1)", "Sphinx (>=4.1.1)", "sphinx-autobuild (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)"] [[package]] name = "markupsafe" @@ -765,9 +761,9 @@ optional = false python-versions = ">=3.6" [package.extras] -dev = ["flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] -docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.7)", "sphinx (==4.3.0)", "sphinx-issues (==1.2.0)", "sphinx-version-warning (==1.1.2)"] -lint = ["flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)"] +dev = ["pytest", "pytz", "simplejson", "mypy (==0.910)", "flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "pre-commit (>=2.4,<3.0)", "tox"] +docs = ["sphinx (==4.3.0)", "sphinx-issues (==1.2.0)", "alabaster (==0.7.12)", "sphinx-version-warning (==1.1.2)", "autodocsumm (==0.2.7)"] +lint = ["mypy (==0.910)", "flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "pre-commit (>=2.4,<3.0)"] tests = ["pytest", "pytz", "simplejson"] [[package]] @@ -782,9 +778,9 @@ python-versions = ">=3.6" marshmallow = ">=3.0.0,<4.0.0" [package.extras] -dev = ["flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "mock", "pre-commit (>=2.7,<3.0)", "pytest", "tox"] +dev = ["pytest", "mock", "flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.7,<3.0)", "tox"] lint = ["flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.7,<3.0)"] -tests = ["mock", "pytest"] +tests = ["pytest", "mock"] [[package]] name = "matplotlib" @@ -837,9 +833,6 @@ category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" -[package.dependencies] -setuptools = "*" - [[package]] name = "numpy" version = "1.21.4" @@ -925,7 +918,6 @@ numpy = ">=1.16.6" pandas = ">=0.24.2" pyarrow = ">=3.0.0,<8.0dev" pydata-google-auth = "*" -setuptools = "*" [package.extras] tqdm = ["tqdm (>=4.23.0)"] @@ -960,7 +952,7 @@ locket = "*" toolz = "*" [package.extras] -complete = ["blosc", "numpy (>=1.9.0)", "pandas (>=0.19.0)", "pyzmq"] +complete = ["numpy (>=1.9.0)", "pandas (>=0.19.0)", "pyzmq", "blosc"] [[package]] name = "pendulum" @@ -995,8 +987,8 @@ optional = false python-versions = ">=3.7" [package.extras] -docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] [[package]] name = "pluggy" @@ -1057,26 +1049,26 @@ urllib3 = ">=1.24.3" [package.extras] airtable = ["airtable-python-wrapper (>=0.11,<0.12)"] -all_extras = ["PyGithub (>=1.51,<2.0)", "Pygments (>=2.2,<3.0)", "airtable-python-wrapper (>=0.11,<0.12)", "atlassian-python-api (>=2.0.1)", "azure-cosmos (>=3.1.1,<3.2)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "black", "boto3 (>=1.9,<2.0)", "confluent-kafka (>=1.7.0)", "dask-cloudprovider[aws] (>=0.2.0)", "dask-kubernetes (>=0.8.0)", "dropbox (>=9.0,<10.0)", "dulwich (>=0.19.7)", "feedparser (>=5.0.1,<6.0)", "flaky (>=3.0)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "graphviz (>=0.8)", "graphviz (>=0.8.3)", "great-expectations (>=0.11.1)", "gspread (>=3.6.0)", "hvac (>=0.10)", "jinja2 (>=2.0,<4.0)", "jira (>=2.0.0)", "kubernetes (>=9.0.0a1,<=13.0)", "mypy (>=0.600,<0.813)", "nbconvert (>=6.0.7)", "pandas (>=1.0.1)", "papermill (>=2.2.0)", "prometheus-client (>=0.9.0)", "psycopg2-binary (>=2.8.2)", "pushbullet.py (>=0.11.0)", "pyarrow (>=5.0.0)", "pyexasol (>=0.16.1)", "pymysql (>=0.9.3)", "pyodbc (>=4.0.30)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "python-gitlab (>=2.5.0,<3.0)", "redis (>=3.2.1)", "responses (>=0.14.0)", "sendgrid (>=6.7.0)", "snowflake-connector-python (>=1.8.2,<2.5)", "soda-sql (>=2.0.0b25)", "spacy (>=2.0.0,<3.0.0)", "testfixtures (>=6.10.3)", "tweepy (>=3.5,<4.0)"] -all_orchestration_extras = ["PyGithub (>=1.51,<2.0)", "atlassian-python-api (>=2.0.1)", "azure-storage-blob (>=12.1.0,<13.0)", "boto3 (>=1.9,<2.0)", "dulwich (>=0.19.7)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "kubernetes (>=9.0.0a1,<=13.0)", "python-gitlab (>=2.5.0,<3.0)"] +all_extras = ["airtable-python-wrapper (>=0.11,<0.12)", "boto3 (>=1.9,<2.0)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "azure-cosmos (>=3.1.1,<3.2)", "atlassian-python-api (>=2.0.1)", "dask-cloudprovider[aws] (>=0.2.0)", "black", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "mypy (>=0.600,<0.813)", "Pygments (>=2.2,<3.0)", "pytest (>=6.0)", "testfixtures (>=6.10.3)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "flaky (>=3.0)", "responses (>=0.14.0)", "dropbox (>=9.0,<10.0)", "great-expectations (>=0.11.1)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-auth (>=2.0,<3.0)", "dulwich (>=0.19.7)", "PyGithub (>=1.51,<2.0)", "python-gitlab (>=2.5.0,<3.0)", "gspread (>=3.6.0)", "jira (>=2.0.0)", "papermill (>=2.2.0)", "nbconvert (>=6.0.7)", "confluent-kafka (>=1.7.0)", "dask-kubernetes (>=0.8.0)", "kubernetes (>=9.0.0a1,<=13.0)", "pandas (>=1.0.1)", "psycopg2-binary (>=2.8.2)", "prometheus-client (>=0.9.0)", "pymysql (>=0.9.3)", "pyodbc (>=4.0.30)", "pushbullet.py (>=0.11.0)", "redis (>=3.2.1)", "feedparser (>=5.0.1,<6.0)", "snowflake-connector-python (>=1.8.2,<2.5)", "spacy (>=2.0.0,<3.0.0)", "hvac (>=0.10)", "graphviz (>=0.8.3)", "tweepy (>=3.5,<4.0)", "pyarrow (>=5.0.0)", "pyexasol (>=0.16.1)", "soda-sql (>=2.0.0b25)", "sendgrid (>=6.7.0)"] +all_orchestration_extras = ["boto3 (>=1.9,<2.0)", "azure-storage-blob (>=12.1.0,<13.0)", "atlassian-python-api (>=2.0.1)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-auth (>=2.0,<3.0)", "dulwich (>=0.19.7)", "PyGithub (>=1.51,<2.0)", "python-gitlab (>=2.5.0,<3.0)", "kubernetes (>=9.0.0a1,<=13.0)"] aws = ["boto3 (>=1.9,<2.0)"] -azure = ["azure-cosmos (>=3.1.1,<3.2)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)"] -base_library_ci = ["PyGithub (>=1.51,<2.0)", "Pygments (>=2.2,<3.0)", "atlassian-python-api (>=2.0.1)", "azure-storage-blob (>=12.1.0,<13.0)", "black", "boto3 (>=1.9,<2.0)", "dulwich (>=0.19.7)", "flaky (>=3.0)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "jira (>=2.0.0)", "kubernetes (>=9.0.0a1,<=13.0)", "mypy (>=0.600,<0.813)", "pandas (>=1.0.1)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "python-gitlab (>=2.5.0,<3.0)", "responses (>=0.14.0)", "testfixtures (>=6.10.3)"] +azure = ["azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "azure-cosmos (>=3.1.1,<3.2)"] +base_library_ci = ["boto3 (>=1.9,<2.0)", "azure-storage-blob (>=12.1.0,<13.0)", "atlassian-python-api (>=2.0.1)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-auth (>=2.0,<3.0)", "dulwich (>=0.19.7)", "PyGithub (>=1.51,<2.0)", "python-gitlab (>=2.5.0,<3.0)", "kubernetes (>=9.0.0a1,<=13.0)", "black", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "mypy (>=0.600,<0.813)", "Pygments (>=2.2,<3.0)", "pytest (>=6.0)", "testfixtures (>=6.10.3)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "flaky (>=3.0)", "responses (>=0.14.0)", "pandas (>=1.0.1)", "jira (>=2.0.0)"] bitbucket = ["atlassian-python-api (>=2.0.1)"] dask_cloudprovider = ["dask-cloudprovider[aws] (>=0.2.0)"] -dev = ["Pygments (>=2.2,<3.0)", "black", "flaky (>=3.0)", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "mypy (>=0.600,<0.813)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "responses (>=0.14.0)", "testfixtures (>=6.10.3)"] +dev = ["black", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "mypy (>=0.600,<0.813)", "Pygments (>=2.2,<3.0)", "pytest (>=6.0)", "testfixtures (>=6.10.3)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "flaky (>=3.0)", "responses (>=0.14.0)"] dremio = ["pyarrow (>=5.0.0)"] dropbox = ["dropbox (>=9.0,<10.0)"] exasol = ["pyexasol (>=0.16.1)"] -gcp = ["google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)"] +gcp = ["google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-auth (>=2.0,<3.0)"] ge = ["great-expectations (>=0.11.1)"] git = ["dulwich (>=0.19.7)"] github = ["PyGithub (>=1.51,<2.0)"] gitlab = ["python-gitlab (>=2.5.0,<3.0)"] -google = ["google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)"] +google = ["google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-auth (>=2.0,<3.0)"] gsheets = ["gspread (>=3.6.0)"] jira = ["jira (>=2.0.0)"] -jupyter = ["nbconvert (>=6.0.7)", "papermill (>=2.2.0)"] +jupyter = ["papermill (>=2.2.0)", "nbconvert (>=6.0.7)"] kafka = ["confluent-kafka (>=1.7.0)"] kubernetes = ["dask-kubernetes (>=0.8.0)", "kubernetes (>=9.0.0a1,<=13.0)"] mysql = ["pymysql (>=0.9.3)"] @@ -1091,9 +1083,9 @@ snowflake = ["snowflake-connector-python (>=1.8.2,<2.5)"] sodasql = ["soda-sql (>=2.0.0b25)"] spacy = ["spacy (>=2.0.0,<3.0.0)"] sql_server = ["pyodbc (>=4.0.30)"] -task_library_ci = ["PyGithub (>=1.51,<2.0)", "Pygments (>=2.2,<3.0)", "airtable-python-wrapper (>=0.11,<0.12)", "atlassian-python-api (>=2.0.1)", "azure-cosmos (>=3.1.1,<3.2)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "black", "boto3 (>=1.9,<2.0)", "confluent-kafka (>=1.7.0)", "dask-kubernetes (>=0.8.0)", "dropbox (>=9.0,<10.0)", "dulwich (>=0.19.7)", "feedparser (>=5.0.1,<6.0)", "flaky (>=3.0)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "graphviz (>=0.8)", "graphviz (>=0.8.3)", "great-expectations (>=0.11.1)", "gspread (>=3.6.0)", "hvac (>=0.10)", "jinja2 (>=2.0,<4.0)", "jira (>=2.0.0)", "kubernetes (>=9.0.0a1,<=13.0)", "mypy (>=0.600,<0.813)", "nbconvert (>=6.0.7)", "pandas (>=1.0.1)", "papermill (>=2.2.0)", "prometheus-client (>=0.9.0)", "psycopg2-binary (>=2.8.2)", "pushbullet.py (>=0.11.0)", "pyarrow (>=5.0.0)", "pyexasol (>=0.16.1)", "pymysql (>=0.9.3)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "python-gitlab (>=2.5.0,<3.0)", "redis (>=3.2.1)", "responses (>=0.14.0)", "sendgrid (>=6.7.0)", "snowflake-connector-python (>=1.8.2,<2.5)", "soda-sql (>=2.0.0b25)", "spacy (>=2.0.0,<3.0.0)", "testfixtures (>=6.10.3)", "tweepy (>=3.5,<4.0)"] +task_library_ci = ["airtable-python-wrapper (>=0.11,<0.12)", "boto3 (>=1.9,<2.0)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "azure-cosmos (>=3.1.1,<3.2)", "atlassian-python-api (>=2.0.1)", "black", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "mypy (>=0.600,<0.813)", "Pygments (>=2.2,<3.0)", "pytest (>=6.0)", "testfixtures (>=6.10.3)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "flaky (>=3.0)", "responses (>=0.14.0)", "dropbox (>=9.0,<10.0)", "great-expectations (>=0.11.1)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-auth (>=2.0,<3.0)", "dulwich (>=0.19.7)", "PyGithub (>=1.51,<2.0)", "python-gitlab (>=2.5.0,<3.0)", "gspread (>=3.6.0)", "jira (>=2.0.0)", "papermill (>=2.2.0)", "nbconvert (>=6.0.7)", "confluent-kafka (>=1.7.0)", "dask-kubernetes (>=0.8.0)", "kubernetes (>=9.0.0a1,<=13.0)", "pandas (>=1.0.1)", "psycopg2-binary (>=2.8.2)", "prometheus-client (>=0.9.0)", "pymysql (>=0.9.3)", "pushbullet.py (>=0.11.0)", "redis (>=3.2.1)", "feedparser (>=5.0.1,<6.0)", "snowflake-connector-python (>=1.8.2,<2.5)", "spacy (>=2.0.0,<3.0.0)", "hvac (>=0.10)", "graphviz (>=0.8.3)", "tweepy (>=3.5,<4.0)", "pyarrow (>=5.0.0)", "pyexasol (>=0.16.1)", "soda-sql (>=2.0.0b25)", "sendgrid (>=6.7.0)"] templates = ["jinja2 (>=2.0,<4.0)"] -test = ["flaky (>=3.0)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "responses (>=0.14.0)", "testfixtures (>=6.10.3)"] +test = ["pytest (>=6.0)", "testfixtures (>=6.10.3)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "flaky (>=3.0)", "responses (>=0.14.0)"] twitter = ["tweepy (>=3.5,<4.0)"] vault = ["hvac (>=0.10)"] viz = ["graphviz (>=0.8.3)"] @@ -1129,7 +1121,7 @@ optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.extras] -test = ["enum34", "ipaddress", "mock", "pywin32", "unittest2", "wmi"] +test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"] [[package]] name = "py" @@ -1191,7 +1183,6 @@ python-versions = "*" [package.dependencies] google-auth = "*" google-auth-oauthlib = "*" -setuptools = "*" [[package]] name = "pymssql" @@ -1248,7 +1239,7 @@ coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] -testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] +testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] [[package]] name = "python-box" @@ -1259,9 +1250,9 @@ optional = false python-versions = ">=3.6" [package.extras] -all = ["msgpack", "ruamel.yaml", "toml"] +pyyaml = ["pyyaml"] +all = ["ruamel.yaml", "toml", "msgpack"] msgpack = ["msgpack"] -pyyaml = ["PyYAML"] "ruamel.yaml" = ["ruamel.yaml"] toml = ["toml"] yaml = ["ruamel.yaml"] @@ -1323,6 +1314,14 @@ category = "main" optional = false python-versions = ">=3.6" +[[package]] +name = "rarfile" +version = "4.0" +description = "RAR archive reader for Python" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "redis" version = "4.3.4" @@ -1444,19 +1443,6 @@ numpy = ">=1.15" pandas = ">=0.23" scipy = ">=1.0" -[[package]] -name = "setuptools" -version = "65.6.3" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - [[package]] name = "setuptools-scm" version = "6.4.2" @@ -1467,7 +1453,6 @@ python-versions = ">=3.6" [package.dependencies] packaging = ">=20.0" -setuptools = "*" tomli = ">=1.0.0" [package.extras] @@ -1574,7 +1559,7 @@ optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*" [package.extras] -dev = ["argopt", "py-make (>=0.1.0)", "pydoc-markdown", "twine"] +dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] [[package]] name = "tweepy" @@ -1620,7 +1605,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] brotli = ["brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] @@ -1669,7 +1654,7 @@ optional = false python-versions = ">=3.5" [package.extras] -dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] +dev = ["pytest (>=4.6.2)", "black (>=19.3b0)"] [[package]] name = "wrapt" @@ -1699,1287 +1684,143 @@ optional = false python-versions = ">=3.7" [package.extras] -docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] -testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "1.1" python-versions = ">=3.8,<3.11" -content-hash = "278926d8c793d2005dcf81f948bdb3d4d1e314b44285303a5861b4cafcb6032b" +content-hash = "386708a680c12b63843df69173e9193fc9a88adce420ddadd1c4351236fb6756" [metadata.files] -async-timeout = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, -] -basedosdados = [ - {file = "basedosdados-1.6.9-py3-none-any.whl", hash = "sha256:9a73ad8a3667cca327d81c5d41ec809ed0675825dfc5d93d1efcf45f9bd1e867"}, - {file = "basedosdados-1.6.9.tar.gz", hash = "sha256:51783ea130944295dbc6b7dcbad8676ca0ff0234cdf2b4d212177bcd12db7921"}, -] -beautifulsoup4 = [ - {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, - {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, -] -cachetools = [ - {file = "cachetools-4.2.4-py3-none-any.whl", hash = "sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1"}, - {file = "cachetools-4.2.4.tar.gz", hash = "sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693"}, -] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -cfgv = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.8.tar.gz", hash = "sha256:735e240d9a8506778cd7a453d97e817e536bb1fc29f4f6961ce297b9c7a917b0"}, - {file = "charset_normalizer-2.0.8-py3-none-any.whl", hash = "sha256:83fcdeb225499d6344c8f7f34684c2981270beacc32ede2e669e94f7fa544405"}, -] -ckanapi = [ - {file = "ckanapi-4.6.tar.gz", hash = "sha256:35361965bfb38c8e146d7229f2d7c3aaf1c0f2ef547de4239b4d38931bf081d2"}, -] -click = [ - {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, - {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, -] -cloudpickle = [ - {file = "cloudpickle-2.0.0-py3-none-any.whl", hash = "sha256:6b2df9741d06f43839a3275c4e6632f7df6487a1f181f5f46a052d3c917c3d11"}, - {file = "cloudpickle-2.0.0.tar.gz", hash = "sha256:5cd02f3b417a783ba84a4ec3e290ff7929009fe51f6405423cfccfadd43ba4a4"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -coverage = [ - {file = "coverage-6.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7b4da9bafad21ea45a714d3ea6f3e1679099e420c8741c74905b92ee9bfa7cc"}, - {file = "coverage-6.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fde17bc42e0716c94bf19d92e4c9f5a00c5feb401f5bc01101fdf2a8b7cacf60"}, - {file = "coverage-6.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdbb0d89923c80dbd435b9cf8bba0ff55585a3cdb28cbec65f376c041472c60d"}, - {file = "coverage-6.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:67f9346aeebea54e845d29b487eb38ec95f2ecf3558a3cffb26ee3f0dcc3e760"}, - {file = "coverage-6.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42c499c14efd858b98c4e03595bf914089b98400d30789511577aa44607a1b74"}, - {file = "coverage-6.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c35cca192ba700979d20ac43024a82b9b32a60da2f983bec6c0f5b84aead635c"}, - {file = "coverage-6.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9cc4f107009bca5a81caef2fca843dbec4215c05e917a59dec0c8db5cff1d2aa"}, - {file = "coverage-6.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f444627b3664b80d078c05fe6a850dd711beeb90d26731f11d492dcbadb6973"}, - {file = "coverage-6.4.4-cp310-cp310-win32.whl", hash = "sha256:66e6df3ac4659a435677d8cd40e8eb1ac7219345d27c41145991ee9bf4b806a0"}, - {file = "coverage-6.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:35ef1f8d8a7a275aa7410d2f2c60fa6443f4a64fae9be671ec0696a68525b875"}, - {file = "coverage-6.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c1328d0c2f194ffda30a45f11058c02410e679456276bfa0bbe0b0ee87225fac"}, - {file = "coverage-6.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61b993f3998ee384935ee423c3d40894e93277f12482f6e777642a0141f55782"}, - {file = "coverage-6.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d5dd4b8e9cd0deb60e6fcc7b0647cbc1da6c33b9e786f9c79721fd303994832f"}, - {file = "coverage-6.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7026f5afe0d1a933685d8f2169d7c2d2e624f6255fb584ca99ccca8c0e966fd7"}, - {file = "coverage-6.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9c7b9b498eb0c0d48b4c2abc0e10c2d78912203f972e0e63e3c9dc21f15abdaa"}, - {file = "coverage-6.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ee2b2fb6eb4ace35805f434e0f6409444e1466a47f620d1d5763a22600f0f892"}, - {file = "coverage-6.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ab066f5ab67059d1f1000b5e1aa8bbd75b6ed1fc0014559aea41a9eb66fc2ce0"}, - {file = "coverage-6.4.4-cp311-cp311-win32.whl", hash = "sha256:9d6e1f3185cbfd3d91ac77ea065d85d5215d3dfa45b191d14ddfcd952fa53796"}, - {file = "coverage-6.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e3d3c4cc38b2882f9a15bafd30aec079582b819bec1b8afdbde8f7797008108a"}, - {file = "coverage-6.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a095aa0a996ea08b10580908e88fbaf81ecf798e923bbe64fb98d1807db3d68a"}, - {file = "coverage-6.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef6f44409ab02e202b31a05dd6666797f9de2aa2b4b3534e9d450e42dea5e817"}, - {file = "coverage-6.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b7101938584d67e6f45f0015b60e24a95bf8dea19836b1709a80342e01b472f"}, - {file = "coverage-6.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14a32ec68d721c3d714d9b105c7acf8e0f8a4f4734c811eda75ff3718570b5e3"}, - {file = "coverage-6.4.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6a864733b22d3081749450466ac80698fe39c91cb6849b2ef8752fd7482011f3"}, - {file = "coverage-6.4.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:08002f9251f51afdcc5e3adf5d5d66bb490ae893d9e21359b085f0e03390a820"}, - {file = "coverage-6.4.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a3b2752de32c455f2521a51bd3ffb53c5b3ae92736afde67ce83477f5c1dd928"}, - {file = "coverage-6.4.4-cp37-cp37m-win32.whl", hash = "sha256:f855b39e4f75abd0dfbcf74a82e84ae3fc260d523fcb3532786bcbbcb158322c"}, - {file = "coverage-6.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ee6ae6bbcac0786807295e9687169fba80cb0617852b2fa118a99667e8e6815d"}, - {file = "coverage-6.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:564cd0f5b5470094df06fab676c6d77547abfdcb09b6c29c8a97c41ad03b103c"}, - {file = "coverage-6.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cbbb0e4cd8ddcd5ef47641cfac97d8473ab6b132dd9a46bacb18872828031685"}, - {file = "coverage-6.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6113e4df2fa73b80f77663445be6d567913fb3b82a86ceb64e44ae0e4b695de1"}, - {file = "coverage-6.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d032bfc562a52318ae05047a6eb801ff31ccee172dc0d2504614e911d8fa83e"}, - {file = "coverage-6.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e431e305a1f3126477abe9a184624a85308da8edf8486a863601d58419d26ffa"}, - {file = "coverage-6.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cf2afe83a53f77aec067033199797832617890e15bed42f4a1a93ea24794ae3e"}, - {file = "coverage-6.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:783bc7c4ee524039ca13b6d9b4186a67f8e63d91342c713e88c1865a38d0892a"}, - {file = "coverage-6.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ff934ced84054b9018665ca3967fc48e1ac99e811f6cc99ea65978e1d384454b"}, - {file = "coverage-6.4.4-cp38-cp38-win32.whl", hash = "sha256:e1fabd473566fce2cf18ea41171d92814e4ef1495e04471786cbc943b89a3781"}, - {file = "coverage-6.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:4179502f210ebed3ccfe2f78bf8e2d59e50b297b598b100d6c6e3341053066a2"}, - {file = "coverage-6.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:98c0b9e9b572893cdb0a00e66cf961a238f8d870d4e1dc8e679eb8bdc2eb1b86"}, - {file = "coverage-6.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc600f6ec19b273da1d85817eda339fb46ce9eef3e89f220055d8696e0a06908"}, - {file = "coverage-6.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a98d6bf6d4ca5c07a600c7b4e0c5350cd483c85c736c522b786be90ea5bac4f"}, - {file = "coverage-6.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01778769097dbd705a24e221f42be885c544bb91251747a8a3efdec6eb4788f2"}, - {file = "coverage-6.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfa0b97eb904255e2ab24166071b27408f1f69c8fbda58e9c0972804851e0558"}, - {file = "coverage-6.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fcbe3d9a53e013f8ab88734d7e517eb2cd06b7e689bedf22c0eb68db5e4a0a19"}, - {file = "coverage-6.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:15e38d853ee224e92ccc9a851457fb1e1f12d7a5df5ae44544ce7863691c7a0d"}, - {file = "coverage-6.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6913dddee2deff8ab2512639c5168c3e80b3ebb0f818fed22048ee46f735351a"}, - {file = "coverage-6.4.4-cp39-cp39-win32.whl", hash = "sha256:354df19fefd03b9a13132fa6643527ef7905712109d9c1c1903f2133d3a4e145"}, - {file = "coverage-6.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:1238b08f3576201ebf41f7c20bf59baa0d05da941b123c6656e42cdb668e9827"}, - {file = "coverage-6.4.4-pp36.pp37.pp38-none-any.whl", hash = "sha256:f67cf9f406cf0d2f08a3515ce2db5b82625a7257f88aad87904674def6ddaec1"}, - {file = "coverage-6.4.4.tar.gz", hash = "sha256:e16c45b726acb780e1e6f88b286d3c10b3914ab03438f32117c4aa52d7f30d58"}, -] -croniter = [ - {file = "croniter-1.0.15-py2.py3-none-any.whl", hash = "sha256:0f97b361fe343301a8f66f852e7d84e4fb7f21379948f71e1bbfe10f5d015fbd"}, - {file = "croniter-1.0.15.tar.gz", hash = "sha256:a70dfc9d52de9fc1a886128b9148c89dd9e76b67d55f46516ca94d2d73d58219"}, -] -cycler = [ - {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, - {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, -] -dask = [ - {file = "dask-2021.11.2-py3-none-any.whl", hash = "sha256:2b0ad7beba8950add4fdc7c5cb94fa9444915ddb00c711d5743e2c4bb0a95ef5"}, - {file = "dask-2021.11.2.tar.gz", hash = "sha256:e12bfe272928d62fa99623d98d0e0b0c045b33a47509ef31a22175aa5fd10917"}, -] -db-dtypes = [ - {file = "db-dtypes-1.0.1.tar.gz", hash = "sha256:3eb5931c9f8c314a1a4aeb698a7eb1d713cddaed4a7a13f0408a8785c4a72330"}, - {file = "db_dtypes-1.0.1-py2.py3-none-any.whl", hash = "sha256:b26b295773d2a4b445f6a7f297ec04dd9eb5d3fb26622032550da013486ba7b7"}, -] -dbt-client = [ - {file = "dbt-client-0.1.3.tar.gz", hash = "sha256:192fff51a51d6d002d4048dd494e601592599e004c0f31f1ea5156aa6d516cf5"}, - {file = "dbt_client-0.1.3-py3-none-any.whl", hash = "sha256:31a0db4844c1559c95c643a6f57d1e39d4e9c3b4d9a8c867f7b3e6ed75cedca0"}, -] -deprecated = [ - {file = "Deprecated-1.2.13-py2.py3-none-any.whl", hash = "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d"}, - {file = "Deprecated-1.2.13.tar.gz", hash = "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d"}, -] -dill = [ - {file = "dill-0.3.5.1-py2.py3-none-any.whl", hash = "sha256:33501d03270bbe410c72639b350e941882a8b0fd55357580fbc873fba0c59302"}, - {file = "dill-0.3.5.1.tar.gz", hash = "sha256:d75e41f3eff1eee599d738e76ba8f4ad98ea229db8b085318aa2b3333a208c86"}, -] -distlib = [ - {file = "distlib-0.3.5-py2.py3-none-any.whl", hash = "sha256:b710088c59f06338ca514800ad795a132da19fda270e3ce4affc74abf955a26c"}, - {file = "distlib-0.3.5.tar.gz", hash = "sha256:a7f75737c70be3b25e2bee06288cec4e4c221de18455b2dd037fe2a795cab2fe"}, -] -distributed = [ - {file = "distributed-2021.11.2-py3-none-any.whl", hash = "sha256:af1f7b98d85d43886fefe2354379c848c7a5aa6ae4d2313a7aca9ab9081a7e56"}, - {file = "distributed-2021.11.2.tar.gz", hash = "sha256:f86a01a2e1e678865d2e42300c47552b5012cd81a2d354e47827a1fd074cc302"}, -] -docker = [ - {file = "docker-5.0.3-py2.py3-none-any.whl", hash = "sha256:7a79bb439e3df59d0a72621775d600bc8bc8b422d285824cb37103eab91d1ce0"}, - {file = "docker-5.0.3.tar.gz", hash = "sha256:d916a26b62970e7c2f554110ed6af04c7ccff8e9f81ad17d0d40c75637e227fb"}, -] -docopt = [ - {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, -] -fastavro = [ - {file = "fastavro-1.4.11-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:44f01008f95d685edacc4b10366c755d25612df00924349f7d34a29f08522ce3"}, - {file = "fastavro-1.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f5e736d12e67348f253da8a332d7c3b483ca04f2b6e772befa79d1a46bac9d"}, - {file = "fastavro-1.4.11-cp310-cp310-win_amd64.whl", hash = "sha256:8dca11bc3191cd7de0a3c4b76a70dac493356a219e96ebcde0def1f06faddef7"}, - {file = "fastavro-1.4.11-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7a2a0bf03686f9d860e8f8476be000f5b3e6cc9af6853dbabab2ef9cfa5dc3a0"}, - {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c17e3decfac260e1be4d02d1903d2483eec2f3ce7f92c9b808a0f6a81572c4b"}, - {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ba25c6529f50722a7618cc4ca24c7d265def57fd9f94e4e554e1df8cce38d2"}, - {file = "fastavro-1.4.11-cp37-cp37m-win_amd64.whl", hash = "sha256:ceaba04da9419f40899a670eb62eb373a127b511bb8e3ae4f6f1f23ec49bd0e4"}, - {file = "fastavro-1.4.11-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:732eab3a1ae5d2c3f4b52e747c55bcc41c4df0eb7e8a395038080741a3c0a934"}, - {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03d3c802b71f44e7b3442abae961bba996258244bd222b242ad1e5cb7754e57"}, - {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cb7475a9b25b9f8aebe7eb756dafedd0369434571062f3883d894281befd7c"}, - {file = "fastavro-1.4.11-cp38-cp38-win_amd64.whl", hash = "sha256:ce0776f54591aef90bcd02bd919964abe4c2ad2a10a4336c3a1b66cef289b41c"}, - {file = "fastavro-1.4.11-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:621e72cc365c9539d7590e7b43e48a62e6bfb4c2de7c16837fed54d113d7312c"}, - {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842b25782f911ee8c626f9d9fedc2ef01aeac272536fe90ee6d45b2ae7cdb024"}, - {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8491bfcba25c9d661289f884688e5a4f56f2ee389a240d0ad02692495a9a087"}, - {file = "fastavro-1.4.11-cp39-cp39-win_amd64.whl", hash = "sha256:c94130a8c8d80073eb0276844915aa5e928ae322024e76dc57943542ccda211c"}, - {file = "fastavro-1.4.11.tar.gz", hash = "sha256:7c64332ad52de0134be9a933ca986514c3ff85c63d54bc5398c31f0498ac1820"}, -] -filelock = [ - {file = "filelock-3.7.1-py3-none-any.whl", hash = "sha256:37def7b658813cda163b56fc564cdc75e86d338246458c4c28ae84cabefa2404"}, - {file = "filelock-3.7.1.tar.gz", hash = "sha256:3a0fd85166ad9dbab54c9aec96737b744106dc5f15c0b09a6744a445299fcf04"}, -] -fonttools = [ - {file = "fonttools-4.33.3-py3-none-any.whl", hash = "sha256:f829c579a8678fa939a1d9e9894d01941db869de44390adb49ce67055a06cc2a"}, - {file = "fonttools-4.33.3.zip", hash = "sha256:c0fdcfa8ceebd7c1b2021240bd46ef77aa8e7408cf10434be55df52384865f8e"}, -] -fsspec = [ - {file = "fsspec-2021.11.1-py3-none-any.whl", hash = "sha256:bcb136caa37e1470dd8314a7d3917cb9b25dd9da44c10d36df556ab4ef038185"}, - {file = "fsspec-2021.11.1.tar.gz", hash = "sha256:03683e606651d5e4bd9180525d57477bd5430e5dc68d2e459835dc14cecc3dd4"}, -] -google-analytics-data = [ - {file = "google-analytics-data-0.12.1.tar.gz", hash = "sha256:8d5436797338683ff80988d6303e1bbeca01a1d7ece73c248fe2315aa2ae70dc"}, - {file = "google_analytics_data-0.12.1-py2.py3-none-any.whl", hash = "sha256:320a16df6624606abbceef85c6b0a67727eff48f27da347630929b3ee28cd5ff"}, -] -google-api-core = [ - {file = "google-api-core-1.31.5.tar.gz", hash = "sha256:85d2074f2c8f9c07e614d7f978767d71ceb7d40647814ef4236d3a0ef671ee75"}, - {file = "google_api_core-1.31.5-py2.py3-none-any.whl", hash = "sha256:6815207a8b422e9da42c200681603f304b25f98c98b675a9db9fdc3717e44280"}, -] -google-api-python-client = [ - {file = "google-api-python-client-2.58.0.tar.gz", hash = "sha256:3af6a181763a8cb18f2b9d973760ba32e4fe2af09e4ce06626ff6a53777c33fa"}, - {file = "google_api_python_client-2.58.0-py2.py3-none-any.whl", hash = "sha256:8f4eeed1b46f3f445307719aa3e9678e429d90c0af4f22ada707a72ba10fe02d"}, -] -google-auth = [ - {file = "google-auth-1.35.0.tar.gz", hash = "sha256:b7033be9028c188ee30200b204ea00ed82ea1162e8ac1df4aa6ded19a191d88e"}, - {file = "google_auth-1.35.0-py2.py3-none-any.whl", hash = "sha256:997516b42ecb5b63e8d80f5632c1a61dddf41d2a4c2748057837e06e00014258"}, -] -google-auth-httplib2 = [ - {file = "google-auth-httplib2-0.1.0.tar.gz", hash = "sha256:a07c39fd632becacd3f07718dfd6021bf396978f03ad3ce4321d060015cc30ac"}, - {file = "google_auth_httplib2-0.1.0-py2.py3-none-any.whl", hash = "sha256:31e49c36c6b5643b57e82617cb3e021e3e1d2df9da63af67252c02fa9c1f4a10"}, -] -google-auth-oauthlib = [ - {file = "google-auth-oauthlib-0.4.6.tar.gz", hash = "sha256:a90a072f6993f2c327067bf65270046384cda5a8ecb20b94ea9a687f1f233a7a"}, - {file = "google_auth_oauthlib-0.4.6-py2.py3-none-any.whl", hash = "sha256:3f2a6e802eebbb6fb736a370fbf3b055edcb6b52878bf2f26330b5e041316c73"}, -] -google-cloud-bigquery = [ - {file = "google-cloud-bigquery-2.30.1.tar.gz", hash = "sha256:4e3b5e3dcc475d5a601d84872ac0b63e059540be2251b1c4165c51106d572855"}, - {file = "google_cloud_bigquery-2.30.1-py2.py3-none-any.whl", hash = "sha256:c62d601aa0f62388e1909d11de40db7597b02fb8602ccb7f21a3ac2a0997495b"}, -] -google-cloud-bigquery-storage = [ - {file = "google-cloud-bigquery-storage-1.1.0.tar.gz", hash = "sha256:c92533cedbb672f1a35555c112d4d5cccb9f8f6d0e98a604fbf98223773adad3"}, - {file = "google_cloud_bigquery_storage-1.1.0-py2.py3-none-any.whl", hash = "sha256:fc543e9d2343d34c043ad48984333ba84de10be31b7af8435548aaf8555507c4"}, -] -google-cloud-core = [ - {file = "google-cloud-core-2.2.1.tar.gz", hash = "sha256:476d1f71ab78089e0638e0aaf34bfdc99bab4fce8f4170ba6321a5243d13c5c7"}, - {file = "google_cloud_core-2.2.1-py2.py3-none-any.whl", hash = "sha256:ab6cee07791afe4e210807ceeab749da6a076ab16d496ac734bf7e6ffea27486"}, -] -google-cloud-storage = [ - {file = "google-cloud-storage-1.42.3.tar.gz", hash = "sha256:7754d4dcaa45975514b404ece0da2bb4292acbc67ca559a69e12a19d54fcdb06"}, - {file = "google_cloud_storage-1.42.3-py2.py3-none-any.whl", hash = "sha256:71ee3a0dcf2c139f034a054181cd7658f1ec8f12837d2769c450a8a00fcd4c6d"}, -] -google-crc32c = [ - {file = "google-crc32c-1.3.0.tar.gz", hash = "sha256:276de6273eb074a35bc598f8efbc00c7869c5cf2e29c90748fccc8c898c244df"}, - {file = "google_crc32c-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cb6994fff247987c66a8a4e550ef374671c2b82e3c0d2115e689d21e511a652d"}, - {file = "google_crc32c-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9da0a39b53d2fab3e5467329ed50e951eb91386e9d0d5b12daf593973c3b168"}, - {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:eb0b14523758e37802f27b7f8cd973f5f3d33be7613952c0df904b68c4842f0e"}, - {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:95c68a4b9b7828ba0428f8f7e3109c5d476ca44996ed9a5f8aac6269296e2d59"}, - {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c3cf890c3c0ecfe1510a452a165431b5831e24160c5fcf2071f0f85ca5a47cd"}, - {file = "google_crc32c-1.3.0-cp310-cp310-win32.whl", hash = "sha256:3bbce1be3687bbfebe29abdb7631b83e6b25da3f4e1856a1611eb21854b689ea"}, - {file = "google_crc32c-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:c124b8c8779bf2d35d9b721e52d4adb41c9bfbde45e6a3f25f0820caa9aba73f"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:42ae4781333e331a1743445931b08ebdad73e188fd554259e772556fc4937c48"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ff71073ebf0e42258a42a0b34f2c09ec384977e7f6808999102eedd5b49920e3"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fe31de3002e7b08eb20823b3735b97c86c5926dd0581c7710a680b418a8709d4"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd7760a88a8d3d705ff562aa93f8445ead54f58fd482e4f9e2bafb7e177375d4"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0b9e622c3b2b8d0ce32f77eba617ab0d6768b82836391e4f8f9e2074582bf02"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-win32.whl", hash = "sha256:779cbf1ce375b96111db98fca913c1f5ec11b1d870e529b1dc7354b2681a8c3a"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:04e7c220798a72fd0f08242bc8d7a05986b2a08a0573396187fd32c1dcdd58b3"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e7a539b9be7b9c00f11ef16b55486141bc2cdb0c54762f84e3c6fc091917436d"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ca60076c388728d3b6ac3846842474f4250c91efbfe5afa872d3ffd69dd4b318"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05340b60bf05b574159e9bd940152a47d38af3fb43803ffe71f11d704b7696a6"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:318f73f5484b5671f0c7f5f63741ab020a599504ed81d209b5c7129ee4667407"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f58099ad7affc0754ae42e6d87443299f15d739b0ce03c76f515153a5cda06c"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-win32.whl", hash = "sha256:f52a4ad2568314ee713715b1e2d79ab55fab11e8b304fd1462ff5cccf4264b3e"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bab4aebd525218bab4ee615786c4581952eadc16b1ff031813a2fd51f0cc7b08"}, - {file = "google_crc32c-1.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dda4d8a3bb0b50f540f6ff4b6033f3a74e8bf0bd5320b70fab2c03e512a62812"}, - {file = "google_crc32c-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fec221a051150eeddfdfcff162e6db92c65ecf46cb0f7bb1bf812a1520ec026b"}, - {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:226f2f9b8e128a6ca6a9af9b9e8384f7b53a801907425c9a292553a3a7218ce0"}, - {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a7f9cbea4245ee36190f85fe1814e2d7b1e5f2186381b082f5d59f99b7f11328"}, - {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a4db36f9721fdf391646685ecffa404eb986cbe007a3289499020daf72e88a2"}, - {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:12674a4c3b56b706153a358eaa1018c4137a5a04635b92b4652440d3d7386206"}, - {file = "google_crc32c-1.3.0-cp38-cp38-win32.whl", hash = "sha256:650e2917660e696041ab3dcd7abac160b4121cd9a484c08406f24c5964099829"}, - {file = "google_crc32c-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:58be56ae0529c664cc04a9c76e68bb92b091e0194d6e3c50bea7e0f266f73713"}, - {file = "google_crc32c-1.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:96a8918a78d5d64e07c8ea4ed2bc44354e3f93f46a4866a40e8db934e4c0d74b"}, - {file = "google_crc32c-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:13af315c3a0eec8bb8b8d80b8b128cb3fcd17d7e4edafc39647846345a3f003a"}, - {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6311853aa2bba4064d0c28ca54e7b50c4d48e3de04f6770f6c60ebda1e975267"}, - {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ed447680ff21c14aaceb6a9f99a5f639f583ccfe4ce1a5e1d48eb41c3d6b3217"}, - {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1c1d6236feab51200272d79b3d3e0f12cf2cbb12b208c835b175a21efdb0a73"}, - {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e0f1ff55dde0ebcfbef027edc21f71c205845585fffe30d4ec4979416613e9b3"}, - {file = "google_crc32c-1.3.0-cp39-cp39-win32.whl", hash = "sha256:fbd60c6aaa07c31d7754edbc2334aef50601b7f1ada67a96eb1eb57c7c72378f"}, - {file = "google_crc32c-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:127f9cc3ac41b6a859bd9dc4321097b1a4f6aa7fdf71b4f9227b9e3ebffb4422"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fc28e0db232c62ca0c3600884933178f0825c99be4474cdd645e378a10588125"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1926fd8de0acb9d15ee757175ce7242e235482a783cd4ec711cc999fc103c24e"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5da2c81575cc3ccf05d9830f9e8d3c70954819ca9a63828210498c0774fda1a3"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:891f712ce54e0d631370e1f4997b3f182f3368179198efc30d477c75d1f44942"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:7f6fe42536d9dcd3e2ffb9d3053f5d05221ae3bbcefbe472bdf2c71c793e3183"}, -] -google-resumable-media = [ - {file = "google-resumable-media-2.1.0.tar.gz", hash = "sha256:725b989e0dd387ef2703d1cc8e86217474217f4549593c477fd94f4024a0f911"}, - {file = "google_resumable_media-2.1.0-py2.py3-none-any.whl", hash = "sha256:cdc75ea0361e39704dc7df7da59fbd419e73c8bc92eac94d8a020d36baa9944b"}, -] -googleapis-common-protos = [ - {file = "googleapis-common-protos-1.53.0.tar.gz", hash = "sha256:a88ee8903aa0a81f6c3cec2d5cf62d3c8aa67c06439b0496b49048fb1854ebf4"}, - {file = "googleapis_common_protos-1.53.0-py2.py3-none-any.whl", hash = "sha256:f6d561ab8fb16b30020b940e2dd01cd80082f4762fa9f3ee670f4419b4b8dbd0"}, -] -grpcio = [ - {file = "grpcio-1.42.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:6e5eec67909795f7b1ff2bd941bd6c2661ca5217ea9c35003d73314100786f60"}, - {file = "grpcio-1.42.0-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:8e8cd9909fdd232ecffb954936fd90c935ebe0b5fce36c88813f8247ce54019c"}, - {file = "grpcio-1.42.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:b4d7115ee08a36f3f50a6233bd78280e40847e078d2a5bb39c0ab0db4490d58f"}, - {file = "grpcio-1.42.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b781f412546830be55644f7c48251d30860f4725981862d4a1ea322f80d9cd34"}, - {file = "grpcio-1.42.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e62140c46d8125927c673c72c960cb387c02b2a1a3c6985a8b0a3914d27c0018"}, - {file = "grpcio-1.42.0-cp310-cp310-win32.whl", hash = "sha256:6b69726d7bbb633133c1b0d780b1357aa9b7a7f714fead6470bab1feb8012806"}, - {file = "grpcio-1.42.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6c0b159b38fcc3bbc3331105197c1f58ac0d294eb83910d136a325a85def88f"}, - {file = "grpcio-1.42.0-cp36-cp36m-linux_armv7l.whl", hash = "sha256:53e10d07e541073eb9a84d49ecffb831c3cbb970bcd8cd8de8431e935bf66c2e"}, - {file = "grpcio-1.42.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:7a3c9b8e13365529f9426d4754085e8a9c2ad718a41a46a97e4e30e87bb45eae"}, - {file = "grpcio-1.42.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:66f910b6324ae69625e63db2eb29d833c307cfa36736fe13d2f841656c5f658f"}, - {file = "grpcio-1.42.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:59163b8d2e0d85f0ecbee52b348f867eec7e0f909177564fb3956363f7e616e5"}, - {file = "grpcio-1.42.0-cp36-cp36m-manylinux_2_17_aarch64.whl", hash = "sha256:d92c1721c7981812d0f42dfc8248b15d3b6a2ea79eb8870776364423de2aa245"}, - {file = "grpcio-1.42.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65720d2bf05e2b78c4bffe372f13c41845bae5658fd3f5dd300c374dd240e5cb"}, - {file = "grpcio-1.42.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f385e40846ff81d1c6dce98dcc192c7988a46540758804c4a2e6da5a0e3e3e05"}, - {file = "grpcio-1.42.0-cp36-cp36m-win32.whl", hash = "sha256:ea3560ffbfe08327024380508190103937fef25e355d2259f8b5c003a0732f55"}, - {file = "grpcio-1.42.0-cp36-cp36m-win_amd64.whl", hash = "sha256:29fc36c99161ff307c8ca438346b2e36f81dac5ecdbabc983d0b255d7913fb19"}, - {file = "grpcio-1.42.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:76b5fa4c6d88f804456e763461cf7a1db38b200669f1ba00c579014ab5aa7965"}, - {file = "grpcio-1.42.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:d1451a8c0c01c5b5fdfeb8f777820cb277fb5d797d972f57a41bb82483c44a79"}, - {file = "grpcio-1.42.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6655df5f31664bac4cd6c9b52f389fd92cd10025504ad83685038f47e11e29d8"}, - {file = "grpcio-1.42.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:5b9f0c4822e3a52a1663a315752c6bbdbed0ec15a660d3e64137335acbb5b7ce"}, - {file = "grpcio-1.42.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:7742606ac2bc03ed10360f4f630e0cc01dce864fe63557254e9adea21bb51416"}, - {file = "grpcio-1.42.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:603d71de14ab1f1fd1254b69ceda73545943461b1f51f82fda9477503330b6ea"}, - {file = "grpcio-1.42.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d08ce780bbd8d1a442d855bd681ed0f7483c65d2c8ed83701a9ea4f13678411f"}, - {file = "grpcio-1.42.0-cp37-cp37m-win32.whl", hash = "sha256:2aba7f93671ec971c5c70db81633b49a2f974aa09a2d811aede344a32bad1896"}, - {file = "grpcio-1.42.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2956da789d74fc35d2c869b3aa45dbf41c5d862c056ca8b5e35a688347ede809"}, - {file = "grpcio-1.42.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:21aa4a111b3381d3dd982a3df62348713b29f651aa9f6dfbc9415adbfe28d2ba"}, - {file = "grpcio-1.42.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a6f9ed5320b93c029615b75f6c8caf2c76aa6545d8845f3813908892cfc5f84e"}, - {file = "grpcio-1.42.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:3a13953e12dc40ee247b5fe6ef22b5fac8f040a76b814a11bf9f423e82402f28"}, - {file = "grpcio-1.42.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:f721b42a20d886c03d9b1f461b228cdaf02ccf6c4550e263f7fd3ce3ff19a8f1"}, - {file = "grpcio-1.42.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:e2d9c6690d4c88cd51ee395d7ba5bd1d26d7c37e94cb59e7fd62ff21ecaf891d"}, - {file = "grpcio-1.42.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7f66eb220898787d7821a7931e35ae2512ed74f79f75adcd7ea2fb3119ca87d"}, - {file = "grpcio-1.42.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2e3f250e5398bf474c6e140df1b67494bf1e31c5277b5bf93841a564cbc22d0"}, - {file = "grpcio-1.42.0-cp38-cp38-win32.whl", hash = "sha256:06d5364e85e0fa50ee68bffd9c93a6aff869a91c68f1fd7ba1b944e063a0ff9f"}, - {file = "grpcio-1.42.0-cp38-cp38-win_amd64.whl", hash = "sha256:d58b3774ee2084c31aad140586a42e18328d9823959ca006a0b85ad7937fe405"}, - {file = "grpcio-1.42.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:b74bbac7e039cf23ed0c8edd820c31e90a52a22e28a03d45274a0956addde8d2"}, - {file = "grpcio-1.42.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2b264cf303a22c46f8d455f42425c546ad6ce22f183debb8d64226ddf1e039f4"}, - {file = "grpcio-1.42.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:64f2b3e6474e2ad865478b64f0850d15842acbb2623de5f78a60ceabe00c63e0"}, - {file = "grpcio-1.42.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:bf916ee93ea2fd52b5286ed4e19cbbde5e82754914379ea91dc5748550df3b4e"}, - {file = "grpcio-1.42.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:6ef72f0abdb89fb7c366a99e04823ecae5cda9f762f2234f42fc280447277cd6"}, - {file = "grpcio-1.42.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47ab65be9ba7a0beee94bbe2fb1dd03cb7832db9df4d1f8fae215a16b3edeb5e"}, - {file = "grpcio-1.42.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0209f30741de1875413f40e89bec9c647e7afad4a3549a6a1682c1ee23da68ca"}, - {file = "grpcio-1.42.0-cp39-cp39-win32.whl", hash = "sha256:5441d343602ce10ba48fcb36bb5de197a15a01dc9ee0f71c2a73cd5cd3d7f5ac"}, - {file = "grpcio-1.42.0-cp39-cp39-win_amd64.whl", hash = "sha256:17433f7eb01737240581b33fbc2eae7b7fa6d3429571782580bceaf05ec56cb8"}, - {file = "grpcio-1.42.0.tar.gz", hash = "sha256:4a8f2c7490fe3696e0cdd566e2f099fb91b51bc75446125175c55581c2f7bc11"}, -] -heapdict = [ - {file = "HeapDict-1.0.1-py3-none-any.whl", hash = "sha256:6065f90933ab1bb7e50db403b90cab653c853690c5992e69294c2de2b253fc92"}, - {file = "HeapDict-1.0.1.tar.gz", hash = "sha256:8495f57b3e03d8e46d5f1b2cc62ca881aca392fd5cc048dc0aa2e1a6d23ecdb6"}, -] -httplib2 = [ - {file = "httplib2-0.20.4-py3-none-any.whl", hash = "sha256:8b6a905cb1c79eefd03f8669fd993c36dc341f7c558f056cb5a33b5c2f458543"}, - {file = "httplib2-0.20.4.tar.gz", hash = "sha256:58a98e45b4b1a48273073f905d2961666ecf0fbac4250ea5b47aef259eb5c585"}, -] -hvac = [ - {file = "hvac-0.11.2-py2.py3-none-any.whl", hash = "sha256:3e8a34804b1e20954a2b4991cc13ed9c09b32e50dadd9d3438224481150f6568"}, - {file = "hvac-0.11.2.tar.gz", hash = "sha256:f905c59d32d88d3f67571fe5a8a78de4659e04798ad809de439f667247d13626"}, -] -identify = [ - {file = "identify-2.5.3-py2.py3-none-any.whl", hash = "sha256:25851c8c1370effb22aaa3c987b30449e9ff0cece408f810ae6ce408fdd20893"}, - {file = "identify-2.5.3.tar.gz", hash = "sha256:887e7b91a1be152b0d46bbf072130235a8117392b9f1828446079a816a05ef44"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -ipeadatapy = [ - {file = "ipeadatapy-0.1.7-py3-none-any.whl", hash = "sha256:0de48658c0cd49d30fa23f69ef33ea954aea05b888051acca98afffc22b07ed5"}, - {file = "ipeadatapy-0.1.7.tar.gz", hash = "sha256:f5eff1d34769ea14f7cb26ed6899991f18df9dfa20d9a3c134d1ebcb72424dbc"}, -] -jinja2 = [ - {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, - {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, -] -kiwisolver = [ - {file = "kiwisolver-1.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e395ece147f0692ca7cdb05a028d31b83b72c369f7b4a2c1798f4b96af1e3d8"}, - {file = "kiwisolver-1.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b7f50a1a25361da3440f07c58cd1d79957c2244209e4f166990e770256b6b0b"}, - {file = "kiwisolver-1.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c032c41ae4c3a321b43a3650e6ecc7406b99ff3e5279f24c9b310f41bc98479"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1dcade8f6fe12a2bb4efe2cbe22116556e3b6899728d3b2a0d3b367db323eacc"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e45e780a74416ef2f173189ef4387e44b5494f45e290bcb1f03735faa6779bf"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d2bb56309fb75a811d81ed55fbe2208aa77a3a09ff5f546ca95e7bb5fac6eff"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b2d6c12f2ad5f55104a36a356192cfb680c049fe5e7c1f6620fc37f119cdc2"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:262c248c60f22c2b547683ad521e8a3db5909c71f679b93876921549107a0c24"}, - {file = "kiwisolver-1.4.2-cp310-cp310-win32.whl", hash = "sha256:1008346a7741620ab9cc6c96e8ad9b46f7a74ce839dbb8805ddf6b119d5fc6c2"}, - {file = "kiwisolver-1.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:6ece2e12e4b57bc5646b354f436416cd2a6f090c1dadcd92b0ca4542190d7190"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b978afdb913ca953cf128d57181da2e8798e8b6153be866ae2a9c446c6162f40"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f88c4b8e449908eeddb3bbd4242bd4dc2c7a15a7aa44bb33df893203f02dc2d"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e348f1904a4fab4153407f7ccc27e43b2a139752e8acf12e6640ba683093dd96"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c839bf28e45d7ddad4ae8f986928dbf5a6d42ff79760d54ec8ada8fb263e097c"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8ae5a071185f1a93777c79a9a1e67ac46544d4607f18d07131eece08d415083a"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c222f91a45da9e01a9bc4f760727ae49050f8e8345c4ff6525495f7a164c8973"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:a4e8f072db1d6fb7a7cc05a6dbef8442c93001f4bb604f1081d8c2db3ca97159"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:be9a650890fb60393e60aacb65878c4a38bb334720aa5ecb1c13d0dac54dd73b"}, - {file = "kiwisolver-1.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ec2e55bf31b43aabe32089125dca3b46fdfe9f50afbf0756ae11e14c97b80ca"}, - {file = "kiwisolver-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d1078ba770d6165abed3d9a1be1f9e79b61515de1dd00d942fa53bba79f01ae"}, - {file = "kiwisolver-1.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cbb5eb4a2ea1ffec26268d49766cafa8f957fe5c1b41ad00733763fae77f9436"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e6cda72db409eefad6b021e8a4f964965a629f577812afc7860c69df7bdb84a"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1605c7c38cc6a85212dfd6a641f3905a33412e49f7c003f35f9ac6d71f67720"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81237957b15469ea9151ec8ca08ce05656090ffabc476a752ef5ad7e2644c526"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:240009fdf4fa87844f805e23f48995537a8cb8f8c361e35fda6b5ac97fcb906f"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:240c2d51d098395c012ddbcb9bd7b3ba5de412a1d11840698859f51d0e643c4f"}, - {file = "kiwisolver-1.4.2-cp38-cp38-win32.whl", hash = "sha256:8b6086aa6936865962b2cee0e7aaecf01ab6778ce099288354a7229b4d9f1408"}, - {file = "kiwisolver-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:0d98dca86f77b851350c250f0149aa5852b36572514d20feeadd3c6b1efe38d0"}, - {file = "kiwisolver-1.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:91eb4916271655dfe3a952249cb37a5c00b6ba68b4417ee15af9ba549b5ba61d"}, - {file = "kiwisolver-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa4d97d7d2b2c082e67907c0b8d9f31b85aa5d3ba0d33096b7116f03f8061261"}, - {file = "kiwisolver-1.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:71469b5845b9876b8d3d252e201bef6f47bf7456804d2fbe9a1d6e19e78a1e65"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8ff3033e43e7ca1389ee59fb7ecb8303abb8713c008a1da49b00869e92e3dd7c"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89b57c2984f4464840e4b768affeff6b6809c6150d1166938ade3e22fbe22db8"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffbdb9a96c536f0405895b5e21ee39ec579cb0ed97bdbd169ae2b55f41d73219"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a830a03970c462d1a2311c90e05679da56d3bd8e78a4ba9985cb78ef7836c9f"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f74f2a13af201559e3d32b9ddfc303c94ae63d63d7f4326d06ce6fe67e7a8255"}, - {file = "kiwisolver-1.4.2-cp39-cp39-win32.whl", hash = "sha256:e677cc3626287f343de751e11b1e8a5b915a6ac897e8aecdbc996cd34de753a0"}, - {file = "kiwisolver-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b3e251e5c38ac623c5d786adb21477f018712f8c6fa54781bd38aa1c60b60fc2"}, - {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c380bb5ae20d829c1a5473cfcae64267b73aaa4060adc091f6df1743784aae0"}, - {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:484f2a5f0307bc944bc79db235f41048bae4106ffa764168a068d88b644b305d"}, - {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8afdf533b613122e4bbaf3c1e42c2a5e9e2d1dd3a0a017749a7658757cb377"}, - {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42f6ef9b640deb6f7d438e0a371aedd8bef6ddfde30683491b2e6f568b4e884e"}, - {file = "kiwisolver-1.4.2.tar.gz", hash = "sha256:7f606d91b8a8816be476513a77fd30abe66227039bd6f8b406c348cb0247dcc9"}, -] -locket = [ - {file = "locket-0.2.1-py2.py3-none-any.whl", hash = "sha256:12b6ada59d1f50710bca9704dbadd3f447dbf8dac6664575c1281cadab8e6449"}, - {file = "locket-0.2.1.tar.gz", hash = "sha256:3e1faba403619fe201552f083f1ecbf23f550941bc51985ac6ed4d02d25056dd"}, -] -loguru = [ - {file = "loguru-0.6.0-py3-none-any.whl", hash = "sha256:4e2414d534a2ab57573365b3e6d0234dfb1d84b68b7f3b948e6fb743860a77c3"}, - {file = "loguru-0.6.0.tar.gz", hash = "sha256:066bd06758d0a513e9836fd9c6b5a75bfb3fd36841f4b996bc60b547a309d41c"}, -] -markupsafe = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, -] -marshmallow = [ - {file = "marshmallow-3.14.1-py3-none-any.whl", hash = "sha256:04438610bc6dadbdddb22a4a55bcc7f6f8099e69580b2e67f5a681933a1f4400"}, - {file = "marshmallow-3.14.1.tar.gz", hash = "sha256:4c05c1684e0e97fe779c62b91878f173b937fe097b356cd82f793464f5bc6138"}, -] -marshmallow-oneofschema = [ - {file = "marshmallow-oneofschema-3.0.1.tar.gz", hash = "sha256:62cd2099b29188c92493c2940ee79d1bf2f2619a71721664e5a98ec2faa58237"}, - {file = "marshmallow_oneofschema-3.0.1-py2.py3-none-any.whl", hash = "sha256:bd29410a9f2f7457a2b428286e2a80ef76b8ddc3701527dc1f935a88914b02f2"}, -] -matplotlib = [ - {file = "matplotlib-3.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:03bbb3f5f78836855e127b5dab228d99551ad0642918ccbf3067fcd52ac7ac5e"}, - {file = "matplotlib-3.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49a5938ed6ef9dda560f26ea930a2baae11ea99e1c2080c8714341ecfda72a89"}, - {file = "matplotlib-3.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:77157be0fc4469cbfb901270c205e7d8adb3607af23cef8bd11419600647ceed"}, - {file = "matplotlib-3.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5844cea45d804174bf0fac219b4ab50774e504bef477fc10f8f730ce2d623441"}, - {file = "matplotlib-3.5.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c87973ddec10812bddc6c286b88fdd654a666080fbe846a1f7a3b4ba7b11ab78"}, - {file = "matplotlib-3.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a05f2b37222319753a5d43c0a4fd97ed4ff15ab502113e3f2625c26728040cf"}, - {file = "matplotlib-3.5.2-cp310-cp310-win32.whl", hash = "sha256:9776e1a10636ee5f06ca8efe0122c6de57ffe7e8c843e0fb6e001e9d9256ec95"}, - {file = "matplotlib-3.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:b4fedaa5a9aa9ce14001541812849ed1713112651295fdddd640ea6620e6cf98"}, - {file = "matplotlib-3.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ee175a571e692fc8ae8e41ac353c0e07259113f4cb063b0ec769eff9717e84bb"}, - {file = "matplotlib-3.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e8bda1088b941ead50caabd682601bece983cadb2283cafff56e8fcddbf7d7f"}, - {file = "matplotlib-3.5.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9480842d5aadb6e754f0b8f4ebeb73065ac8be1855baa93cd082e46e770591e9"}, - {file = "matplotlib-3.5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6c623b355d605a81c661546af7f24414165a8a2022cddbe7380a31a4170fa2e9"}, - {file = "matplotlib-3.5.2-cp37-cp37m-win32.whl", hash = "sha256:a91426ae910819383d337ba0dc7971c7cefdaa38599868476d94389a329e599b"}, - {file = "matplotlib-3.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c4b82c2ae6d305fcbeb0eb9c93df2602ebd2f174f6e8c8a5d92f9445baa0c1d3"}, - {file = "matplotlib-3.5.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ebc27ad11df3c1661f4677a7762e57a8a91dd41b466c3605e90717c9a5f90c82"}, - {file = "matplotlib-3.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a32ea6e12e80dedaca2d4795d9ed40f97bfa56e6011e14f31502fdd528b9c89"}, - {file = "matplotlib-3.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2a0967d4156adbd0d46db06bc1a877f0370bce28d10206a5071f9ecd6dc60b79"}, - {file = "matplotlib-3.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2b696699386766ef171a259d72b203a3c75d99d03ec383b97fc2054f52e15cf"}, - {file = "matplotlib-3.5.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7f409716119fa39b03da3d9602bd9b41142fab7a0568758cd136cd80b1bf36c8"}, - {file = "matplotlib-3.5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b8d3f4e71e26307e8c120b72c16671d70c5cd08ae412355c11254aa8254fb87f"}, - {file = "matplotlib-3.5.2-cp38-cp38-win32.whl", hash = "sha256:b6c63cd01cad0ea8704f1fd586e9dc5777ccedcd42f63cbbaa3eae8dd41172a1"}, - {file = "matplotlib-3.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:75c406c527a3aa07638689586343f4b344fcc7ab1f79c396699eb550cd2b91f7"}, - {file = "matplotlib-3.5.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4a44cdfdb9d1b2f18b1e7d315eb3843abb097869cd1ef89cfce6a488cd1b5182"}, - {file = "matplotlib-3.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3d8e129af95b156b41cb3be0d9a7512cc6d73e2b2109f82108f566dbabdbf377"}, - {file = "matplotlib-3.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:364e6bca34edc10a96aa3b1d7cd76eb2eea19a4097198c1b19e89bee47ed5781"}, - {file = "matplotlib-3.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea75df8e567743207e2b479ba3d8843537be1c146d4b1e3e395319a4e1a77fe9"}, - {file = "matplotlib-3.5.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:44c6436868186564450df8fd2fc20ed9daaef5caad699aa04069e87099f9b5a8"}, - {file = "matplotlib-3.5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d7705022df2c42bb02937a2a824f4ec3cca915700dd80dc23916af47ff05f1a"}, - {file = "matplotlib-3.5.2-cp39-cp39-win32.whl", hash = "sha256:ee0b8e586ac07f83bb2950717e66cb305e2859baf6f00a9c39cc576e0ce9629c"}, - {file = "matplotlib-3.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:c772264631e5ae61f0bd41313bbe48e1b9bcc95b974033e1118c9caa1a84d5c6"}, - {file = "matplotlib-3.5.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:751d3815b555dcd6187ad35b21736dc12ce6925fc3fa363bbc6dc0f86f16484f"}, - {file = "matplotlib-3.5.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:31fbc2af27ebb820763f077ec7adc79b5a031c2f3f7af446bd7909674cd59460"}, - {file = "matplotlib-3.5.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4fa28ca76ac5c2b2d54bc058b3dad8e22ee85d26d1ee1b116a6fd4d2277b6a04"}, - {file = "matplotlib-3.5.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:24173c23d1bcbaed5bf47b8785d27933a1ac26a5d772200a0f3e0e38f471b001"}, - {file = "matplotlib-3.5.2.tar.gz", hash = "sha256:48cf850ce14fa18067f2d9e0d646763681948487a8080ec0af2686468b4607a2"}, -] -more-itertools = [ - {file = "more-itertools-8.13.0.tar.gz", hash = "sha256:a42901a0a5b169d925f6f217cd5a190e32ef54360905b9c39ee7db5313bfec0f"}, - {file = "more_itertools-8.13.0-py3-none-any.whl", hash = "sha256:c5122bffc5f104d37c1626b8615b511f3427aa5389b94d61e5ef8236bfbc3ddb"}, -] -msgpack = [ - {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:96acc674bb9c9be63fa8b6dabc3248fdc575c4adc005c440ad02f87ca7edd079"}, - {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c3ca57c96c8e69c1a0d2926a6acf2d9a522b41dc4253a8945c4c6cd4981a4e3"}, - {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0a792c091bac433dfe0a70ac17fc2087d4595ab835b47b89defc8bbabcf5c73"}, - {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c58cdec1cb5fcea8c2f1771d7b5fec79307d056874f746690bd2bdd609ab147"}, - {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f97c0f35b3b096a330bb4a1a9247d0bd7e1f3a2eba7ab69795501504b1c2c39"}, - {file = "msgpack-1.0.3-cp310-cp310-win32.whl", hash = "sha256:36a64a10b16c2ab31dcd5f32d9787ed41fe68ab23dd66957ca2826c7f10d0b85"}, - {file = "msgpack-1.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c1ba333b4024c17c7591f0f372e2daa3c31db495a9b2af3cf664aef3c14354f7"}, - {file = "msgpack-1.0.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c2140cf7a3ec475ef0938edb6eb363fa704159e0bf71dde15d953bacc1cf9d7d"}, - {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f4c22717c74d44bcd7af353024ce71c6b55346dad5e2cc1ddc17ce8c4507c6b"}, - {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d733a15ade190540c703de209ffbc42a3367600421b62ac0c09fde594da6ec"}, - {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7e03b06f2982aa98d4ddd082a210c3db200471da523f9ac197f2828e80e7770"}, - {file = "msgpack-1.0.3-cp36-cp36m-win32.whl", hash = "sha256:3d875631ecab42f65f9dce6f55ce6d736696ced240f2634633188de2f5f21af9"}, - {file = "msgpack-1.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:40fb89b4625d12d6027a19f4df18a4de5c64f6f3314325049f219683e07e678a"}, - {file = "msgpack-1.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6eef0cf8db3857b2b556213d97dd82de76e28a6524853a9beb3264983391dc1a"}, - {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d8c332f53ffff01953ad25131272506500b14750c1d0ce8614b17d098252fbc"}, - {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c0903bd93cbd34653dd63bbfcb99d7539c372795201f39d16fdfde4418de43a"}, - {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf1e6bfed4860d72106f4e0a1ab519546982b45689937b40257cfd820650b920"}, - {file = "msgpack-1.0.3-cp37-cp37m-win32.whl", hash = "sha256:d02cea2252abc3756b2ac31f781f7a98e89ff9759b2e7450a1c7a0d13302ff50"}, - {file = "msgpack-1.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f30dd0dc4dfe6231ad253b6f9f7128ac3202ae49edd3f10d311adc358772dba"}, - {file = "msgpack-1.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f201d34dc89342fabb2a10ed7c9a9aaaed9b7af0f16a5923f1ae562b31258dea"}, - {file = "msgpack-1.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bb87f23ae7d14b7b3c21009c4b1705ec107cb21ee71975992f6aca571fb4a42a"}, - {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a3a5c4b16e9d0edb823fe54b59b5660cc8d4782d7bf2c214cb4b91a1940a8ef"}, - {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74da1e5fcf20ade12c6bf1baa17a2dc3604958922de8dc83cbe3eff22e8b611"}, - {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73a80bd6eb6bcb338c1ec0da273f87420829c266379c8c82fa14c23fb586cfa1"}, - {file = "msgpack-1.0.3-cp38-cp38-win32.whl", hash = "sha256:9fce00156e79af37bb6db4e7587b30d11e7ac6a02cb5bac387f023808cd7d7f4"}, - {file = "msgpack-1.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:9b6f2d714c506e79cbead331de9aae6837c8dd36190d02da74cb409b36162e8a"}, - {file = "msgpack-1.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:89908aea5f46ee1474cc37fbc146677f8529ac99201bc2faf4ef8edc023c2bf3"}, - {file = "msgpack-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:973ad69fd7e31159eae8f580f3f707b718b61141838321c6fa4d891c4a2cca52"}, - {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da24375ab4c50e5b7486c115a3198d207954fe10aaa5708f7b65105df09109b2"}, - {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a598d0685e4ae07a0672b59792d2cc767d09d7a7f39fd9bd37ff84e060b1a996"}, - {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4c309a68cb5d6bbd0c50d5c71a25ae81f268c2dc675c6f4ea8ab2feec2ac4e2"}, - {file = "msgpack-1.0.3-cp39-cp39-win32.whl", hash = "sha256:494471d65b25a8751d19c83f1a482fd411d7ca7a3b9e17d25980a74075ba0e88"}, - {file = "msgpack-1.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:f01b26c2290cbd74316990ba84a14ac3d599af9cebefc543d241a66e785cf17d"}, - {file = "msgpack-1.0.3.tar.gz", hash = "sha256:51fdc7fb93615286428ee7758cecc2f374d5ff363bdd884c7ea622a7a327a81e"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -nodeenv = [ - {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, - {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, -] -numpy = [ - {file = "numpy-1.21.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8890b3360f345e8360133bc078d2dacc2843b6ee6059b568781b15b97acbe39f"}, - {file = "numpy-1.21.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:69077388c5a4b997442b843dbdc3a85b420fb693ec8e33020bb24d647c164fa5"}, - {file = "numpy-1.21.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e89717274b41ebd568cd7943fc9418eeb49b1785b66031bc8a7f6300463c5898"}, - {file = "numpy-1.21.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b78ecfa070460104934e2caf51694ccd00f37d5e5dbe76f021b1b0b0d221823"}, - {file = "numpy-1.21.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:615d4e328af7204c13ae3d4df7615a13ff60a49cb0d9106fde07f541207883ca"}, - {file = "numpy-1.21.4-cp310-cp310-win_amd64.whl", hash = "sha256:1403b4e2181fc72664737d848b60e65150f272fe5a1c1cbc16145ed43884065a"}, - {file = "numpy-1.21.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:74b85a17528ca60cf98381a5e779fc0264b4a88b46025e6bcbe9621f46bb3e63"}, - {file = "numpy-1.21.4-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92aafa03da8658609f59f18722b88f0a73a249101169e28415b4fa148caf7e41"}, - {file = "numpy-1.21.4-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5d95668e727c75b3f5088ec7700e260f90ec83f488e4c0aaccb941148b2cd377"}, - {file = "numpy-1.21.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5162ec777ba7138906c9c274353ece5603646c6965570d82905546579573f73"}, - {file = "numpy-1.21.4-cp37-cp37m-win32.whl", hash = "sha256:81225e58ef5fce7f1d80399575576fc5febec79a8a2742e8ef86d7b03beef49f"}, - {file = "numpy-1.21.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32fe5b12061f6446adcbb32cf4060a14741f9c21e15aaee59a207b6ce6423469"}, - {file = "numpy-1.21.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c449eb870616a7b62e097982c622d2577b3dbc800aaf8689254ec6e0197cbf1e"}, - {file = "numpy-1.21.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2e4ed57f45f0aa38beca2a03b6532e70e548faf2debbeb3291cfc9b315d9be8f"}, - {file = "numpy-1.21.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1247ef28387b7bb7f21caf2dbe4767f4f4175df44d30604d42ad9bd701ebb31f"}, - {file = "numpy-1.21.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34f3456f530ae8b44231c63082c8899fe9c983fd9b108c997c4b1c8c2d435333"}, - {file = "numpy-1.21.4-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c9c23158b87ed0e70d9a50c67e5c0b3f75bcf2581a8e34668d4e9d7474d76c6"}, - {file = "numpy-1.21.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4799be6a2d7d3c33699a6f77201836ac975b2e1b98c2a07f66a38f499cb50ce"}, - {file = "numpy-1.21.4-cp38-cp38-win32.whl", hash = "sha256:bc988afcea53e6156546e5b2885b7efab089570783d9d82caf1cfd323b0bb3dd"}, - {file = "numpy-1.21.4-cp38-cp38-win_amd64.whl", hash = "sha256:170b2a0805c6891ca78c1d96ee72e4c3ed1ae0a992c75444b6ab20ff038ba2cd"}, - {file = "numpy-1.21.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fde96af889262e85aa033f8ee1d3241e32bf36228318a61f1ace579df4e8170d"}, - {file = "numpy-1.21.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c885bfc07f77e8fee3dc879152ba993732601f1f11de248d4f357f0ffea6a6d4"}, - {file = "numpy-1.21.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e6f5f50d1eff2f2f752b3089a118aee1ea0da63d56c44f3865681009b0af162"}, - {file = "numpy-1.21.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ad010846cdffe7ec27e3f933397f8a8d6c801a48634f419e3d075db27acf5880"}, - {file = "numpy-1.21.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c74c699b122918a6c4611285cc2cad4a3aafdb135c22a16ec483340ef97d573c"}, - {file = "numpy-1.21.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9864424631775b0c052f3bd98bc2712d131b3e2cd95d1c0c68b91709170890b0"}, - {file = "numpy-1.21.4-cp39-cp39-win32.whl", hash = "sha256:b1e2312f5b8843a3e4e8224b2b48fe16119617b8fc0a54df8f50098721b5bed2"}, - {file = "numpy-1.21.4-cp39-cp39-win_amd64.whl", hash = "sha256:e3c3e990274444031482a31280bf48674441e0a5b55ddb168f3a6db3e0c38ec8"}, - {file = "numpy-1.21.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a3deb31bc84f2b42584b8c4001c85d1934dbfb4030827110bc36bfd11509b7bf"}, - {file = "numpy-1.21.4.zip", hash = "sha256:e6c76a87633aa3fa16614b61ccedfae45b91df2767cf097aa9c933932a7ed1e0"}, -] -oauth2client = [ - {file = "oauth2client-4.1.3-py2.py3-none-any.whl", hash = "sha256:b8a81cc5d60e2d364f0b1b98f958dbd472887acaf1a5b05e21c28c31a2d6d3ac"}, - {file = "oauth2client-4.1.3.tar.gz", hash = "sha256:d486741e451287f69568a4d26d70d9acd73a2bbfa275746c535b4209891cccc6"}, -] -oauthlib = [ - {file = "oauthlib-3.1.1-py2.py3-none-any.whl", hash = "sha256:42bf6354c2ed8c6acb54d971fce6f88193d97297e18602a3a886603f9d7730cc"}, - {file = "oauthlib-3.1.1.tar.gz", hash = "sha256:8f0215fcc533dd8dd1bee6f4c412d4f0cd7297307d43ac61666389e3bc3198a3"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pandas = [ - {file = "pandas-1.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e9dbacd22555c2d47f262ef96bb4e30880e5956169741400af8b306bbb24a273"}, - {file = "pandas-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e2b83abd292194f350bb04e188f9379d36b8dfac24dd445d5c87575f3beaf789"}, - {file = "pandas-1.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2552bffc808641c6eb471e55aa6899fa002ac94e4eebfa9ec058649122db5824"}, - {file = "pandas-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fc87eac0541a7d24648a001d553406f4256e744d92df1df8ebe41829a915028"}, - {file = "pandas-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0d8fd58df5d17ddb8c72a5075d87cd80d71b542571b5f78178fb067fa4e9c72"}, - {file = "pandas-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:4aed257c7484d01c9a194d9a94758b37d3d751849c05a0050c087a358c41ad1f"}, - {file = "pandas-1.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:375262829c8c700c3e7cbb336810b94367b9c4889818bbd910d0ecb4e45dc261"}, - {file = "pandas-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc3cd122bea268998b79adebbb8343b735a5511ec14efb70a39e7acbc11ccbdc"}, - {file = "pandas-1.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4f5a82afa4f1ff482ab8ded2ae8a453a2cdfde2001567b3ca24a4c5c5ca0db3"}, - {file = "pandas-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8092a368d3eb7116e270525329a3e5c15ae796ccdf7ccb17839a73b4f5084a39"}, - {file = "pandas-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6257b314fc14958f8122779e5a1557517b0f8e500cfb2bd53fa1f75a8ad0af2"}, - {file = "pandas-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:82ae615826da838a8e5d4d630eb70c993ab8636f0eff13cb28aafc4291b632b5"}, - {file = "pandas-1.5.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:457d8c3d42314ff47cc2d6c54f8fc0d23954b47977b2caed09cd9635cb75388b"}, - {file = "pandas-1.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c009a92e81ce836212ce7aa98b219db7961a8b95999b97af566b8dc8c33e9519"}, - {file = "pandas-1.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:71f510b0efe1629bf2f7c0eadb1ff0b9cf611e87b73cd017e6b7d6adb40e2b3a"}, - {file = "pandas-1.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a40dd1e9f22e01e66ed534d6a965eb99546b41d4d52dbdb66565608fde48203f"}, - {file = "pandas-1.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ae7e989f12628f41e804847a8cc2943d362440132919a69429d4dea1f164da0"}, - {file = "pandas-1.5.2-cp38-cp38-win32.whl", hash = "sha256:530948945e7b6c95e6fa7aa4be2be25764af53fba93fe76d912e35d1c9ee46f5"}, - {file = "pandas-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:73f219fdc1777cf3c45fde7f0708732ec6950dfc598afc50588d0d285fddaefc"}, - {file = "pandas-1.5.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9608000a5a45f663be6af5c70c3cbe634fa19243e720eb380c0d378666bc7702"}, - {file = "pandas-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:315e19a3e5c2ab47a67467fc0362cb36c7c60a93b6457f675d7d9615edad2ebe"}, - {file = "pandas-1.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e18bc3764cbb5e118be139b3b611bc3fbc5d3be42a7e827d1096f46087b395eb"}, - {file = "pandas-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0183cb04a057cc38fde5244909fca9826d5d57c4a5b7390c0cc3fa7acd9fa883"}, - {file = "pandas-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:344021ed3e639e017b452aa8f5f6bf38a8806f5852e217a7594417fb9bbfa00e"}, - {file = "pandas-1.5.2-cp39-cp39-win32.whl", hash = "sha256:e7469271497960b6a781eaa930cba8af400dd59b62ec9ca2f4d31a19f2f91090"}, - {file = "pandas-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:c218796d59d5abd8780170c937b812c9637e84c32f8271bbf9845970f8c1351f"}, - {file = "pandas-1.5.2.tar.gz", hash = "sha256:220b98d15cee0b2cd839a6358bd1f273d0356bf964c1a1aeb32d47db0215488b"}, -] -pandas-gbq = [ - {file = "pandas-gbq-0.17.4.tar.gz", hash = "sha256:70ac57cc6ebf9d1e1c1c810f5ccac710163acd4c3d13e8badea27bb66fae19f7"}, - {file = "pandas_gbq-0.17.4-py2.py3-none-any.whl", hash = "sha256:3b3714167bdc4b1a6013ff6286a452727efbceb412922a2ca39aa996e8e8b129"}, -] -pandavro = [ - {file = "pandavro-1.6.0.tar.gz", hash = "sha256:d098da34529fbb20de5fd1a6f231918d1b60941b25bea5dc87897ef0d472cb6f"}, -] -partd = [ - {file = "partd-1.2.0-py3-none-any.whl", hash = "sha256:5c3a5d70da89485c27916328dc1e26232d0e270771bd4caef4a5124b6a457288"}, - {file = "partd-1.2.0.tar.gz", hash = "sha256:aa67897b84d522dcbc86a98b942afab8c6aa2f7f677d904a616b74ef5ddbc3eb"}, -] -pendulum = [ - {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, - {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, - {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, - {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, - {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, - {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, - {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, - {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, - {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, - {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, - {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, - {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, - {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, - {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, - {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, - {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, - {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, - {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, - {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, - {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, - {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, -] -pillow = [ - {file = "Pillow-9.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af79d3fde1fc2e33561166d62e3b63f0cc3e47b5a3a2e5fea40d4917754734ea"}, - {file = "Pillow-9.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:55dd1cf09a1fd7c7b78425967aacae9b0d70125f7d3ab973fadc7b5abc3de652"}, - {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66822d01e82506a19407d1afc104c3fcea3b81d5eb11485e593ad6b8492f995a"}, - {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5eaf3b42df2bcda61c53a742ee2c6e63f777d0e085bbc6b2ab7ed57deb13db7"}, - {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01ce45deec9df310cbbee11104bae1a2a43308dd9c317f99235b6d3080ddd66e"}, - {file = "Pillow-9.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aea7ce61328e15943d7b9eaca87e81f7c62ff90f669116f857262e9da4057ba3"}, - {file = "Pillow-9.1.0-cp310-cp310-win32.whl", hash = "sha256:7a053bd4d65a3294b153bdd7724dce864a1d548416a5ef61f6d03bf149205160"}, - {file = "Pillow-9.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:97bda660702a856c2c9e12ec26fc6d187631ddfd896ff685814ab21ef0597033"}, - {file = "Pillow-9.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:21dee8466b42912335151d24c1665fcf44dc2ee47e021d233a40c3ca5adae59c"}, - {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b6d4050b208c8ff886fd3db6690bf04f9a48749d78b41b7a5bf24c236ab0165"}, - {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5cfca31ab4c13552a0f354c87fbd7f162a4fafd25e6b521bba93a57fe6a3700a"}, - {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed742214068efa95e9844c2d9129e209ed63f61baa4d54dbf4cf8b5e2d30ccf2"}, - {file = "Pillow-9.1.0-cp37-cp37m-win32.whl", hash = "sha256:c9efef876c21788366ea1f50ecb39d5d6f65febe25ad1d4c0b8dff98843ac244"}, - {file = "Pillow-9.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:de344bcf6e2463bb25179d74d6e7989e375f906bcec8cb86edb8b12acbc7dfef"}, - {file = "Pillow-9.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:17869489de2fce6c36690a0c721bd3db176194af5f39249c1ac56d0bb0fcc512"}, - {file = "Pillow-9.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:25023a6209a4d7c42154073144608c9a71d3512b648a2f5d4465182cb93d3477"}, - {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8782189c796eff29dbb37dd87afa4ad4d40fc90b2742704f94812851b725964b"}, - {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:463acf531f5d0925ca55904fa668bb3461c3ef6bc779e1d6d8a488092bdee378"}, - {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f42364485bfdab19c1373b5cd62f7c5ab7cc052e19644862ec8f15bb8af289e"}, - {file = "Pillow-9.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3fddcdb619ba04491e8f771636583a7cc5a5051cd193ff1aa1ee8616d2a692c5"}, - {file = "Pillow-9.1.0-cp38-cp38-win32.whl", hash = "sha256:4fe29a070de394e449fd88ebe1624d1e2d7ddeed4c12e0b31624561b58948d9a"}, - {file = "Pillow-9.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c24f718f9dd73bb2b31a6201e6db5ea4a61fdd1d1c200f43ee585fc6dcd21b34"}, - {file = "Pillow-9.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fb89397013cf302f282f0fc998bb7abf11d49dcff72c8ecb320f76ea6e2c5717"}, - {file = "Pillow-9.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c870193cce4b76713a2b29be5d8327c8ccbe0d4a49bc22968aa1e680930f5581"}, - {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69e5ddc609230d4408277af135c5b5c8fe7a54b2bdb8ad7c5100b86b3aab04c6"}, - {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35be4a9f65441d9982240e6966c1eaa1c654c4e5e931eaf580130409e31804d4"}, - {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82283af99c1c3a5ba1da44c67296d5aad19f11c535b551a5ae55328a317ce331"}, - {file = "Pillow-9.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a325ac71914c5c043fa50441b36606e64a10cd262de12f7a179620f579752ff8"}, - {file = "Pillow-9.1.0-cp39-cp39-win32.whl", hash = "sha256:a598d8830f6ef5501002ae85c7dbfcd9c27cc4efc02a1989369303ba85573e58"}, - {file = "Pillow-9.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0c51cb9edac8a5abd069fd0758ac0a8bfe52c261ee0e330f363548aca6893595"}, - {file = "Pillow-9.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a336a4f74baf67e26f3acc4d61c913e378e931817cd1e2ef4dfb79d3e051b481"}, - {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb1b89b11256b5b6cad5e7593f9061ac4624f7651f7a8eb4dfa37caa1dfaa4d0"}, - {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:255c9d69754a4c90b0ee484967fc8818c7ff8311c6dddcc43a4340e10cd1636a"}, - {file = "Pillow-9.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5a3ecc026ea0e14d0ad7cd990ea7f48bfcb3eb4271034657dc9d06933c6629a7"}, - {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5b0ff59785d93b3437c3703e3c64c178aabada51dea2a7f2c5eccf1bcf565a3"}, - {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7110ec1701b0bf8df569a7592a196c9d07c764a0a74f65471ea56816f10e2c8"}, - {file = "Pillow-9.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8d79c6f468215d1a8415aa53d9868a6b40c4682165b8cb62a221b1baa47db458"}, - {file = "Pillow-9.1.0.tar.gz", hash = "sha256:f401ed2bbb155e1ade150ccc63db1a4f6c1909d3d378f7d1235a44e90d75fb97"}, -] -platformdirs = [ - {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, - {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, -] -pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, -] -pre-commit = [ - {file = "pre_commit-2.20.0-py2.py3-none-any.whl", hash = "sha256:51a5ba7c480ae8072ecdb6933df22d2f812dc897d5fe848778116129a681aac7"}, - {file = "pre_commit-2.20.0.tar.gz", hash = "sha256:a978dac7bc9ec0bcee55c18a277d553b0f419d259dadb4b9418ff2d00eb43959"}, -] -prefect = [ - {file = "prefect-0.15.9-py3-none-any.whl", hash = "sha256:595c9f229349528f7bcd2aa866c9c10dcfbf059a20803526924339d45604ec76"}, - {file = "prefect-0.15.9.tar.gz", hash = "sha256:52d4d28493cd1a90e1acf96b5a92b2902950849b481a49f762998448a41cf127"}, -] -proto-plus = [ - {file = "proto-plus-1.19.8.tar.gz", hash = "sha256:bdf45f0e0be71510eb2ec9db4da78afde7b5fb8b0a507a36340a9b6ce8e48e58"}, - {file = "proto_plus-1.19.8-py3-none-any.whl", hash = "sha256:3434eadaed845a337d6c488d2b7d055d733aaa231c0c0d4c778ec720bb91cf87"}, -] -protobuf = [ - {file = "protobuf-3.19.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d80f80eb175bf5f1169139c2e0c5ada98b1c098e2b3c3736667f28cbbea39fc8"}, - {file = "protobuf-3.19.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a529e7df52204565bcd33738a7a5f288f3d2d37d86caa5d78c458fa5fabbd54d"}, - {file = "protobuf-3.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28ccea56d4dc38d35cd70c43c2da2f40ac0be0a355ef882242e8586c6d66666f"}, - {file = "protobuf-3.19.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b30a7de128c46b5ecb343917d9fa737612a6e8280f440874e5cc2ba0d79b8f6"}, - {file = "protobuf-3.19.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5935c8ce02e3d89c7900140a8a42b35bc037ec07a6aeb61cc108be8d3c9438a6"}, - {file = "protobuf-3.19.1-cp36-cp36m-win32.whl", hash = "sha256:74f33edeb4f3b7ed13d567881da8e5a92a72b36495d57d696c2ea1ae0cfee80c"}, - {file = "protobuf-3.19.1-cp36-cp36m-win_amd64.whl", hash = "sha256:038daf4fa38a7e818dd61f51f22588d61755160a98db087a046f80d66b855942"}, - {file = "protobuf-3.19.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e51561d72efd5bd5c91490af1f13e32bcba8dab4643761eb7de3ce18e64a853"}, - {file = "protobuf-3.19.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:6e8ea9173403219239cdfd8d946ed101f2ab6ecc025b0fda0c6c713c35c9981d"}, - {file = "protobuf-3.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db3532d9f7a6ebbe2392041350437953b6d7a792de10e629c1e4f5a6b1fe1ac6"}, - {file = "protobuf-3.19.1-cp37-cp37m-win32.whl", hash = "sha256:615b426a177780ce381ecd212edc1e0f70db8557ed72560b82096bd36b01bc04"}, - {file = "protobuf-3.19.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d8919368410110633717c406ab5c97e8df5ce93020cfcf3012834f28b1fab1ea"}, - {file = "protobuf-3.19.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:71b0250b0cfb738442d60cab68abc166de43411f2a4f791d31378590bfb71bd7"}, - {file = "protobuf-3.19.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3cd0458870ea7d1c58e948ac8078f6ba8a7ecc44a57e03032ed066c5bb318089"}, - {file = "protobuf-3.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:655264ed0d0efe47a523e2255fc1106a22f6faab7cc46cfe99b5bae085c2a13e"}, - {file = "protobuf-3.19.1-cp38-cp38-win32.whl", hash = "sha256:b691d996c6d0984947c4cf8b7ae2fe372d99b32821d0584f0b90277aa36982d3"}, - {file = "protobuf-3.19.1-cp38-cp38-win_amd64.whl", hash = "sha256:e7e8d2c20921f8da0dea277dfefc6abac05903ceac8e72839b2da519db69206b"}, - {file = "protobuf-3.19.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fd390367fc211cc0ffcf3a9e149dfeca78fecc62adb911371db0cec5c8b7472d"}, - {file = "protobuf-3.19.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d83e1ef8cb74009bebee3e61cc84b1c9cd04935b72bca0cbc83217d140424995"}, - {file = "protobuf-3.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36d90676d6f426718463fe382ec6274909337ca6319d375eebd2044e6c6ac560"}, - {file = "protobuf-3.19.1-cp39-cp39-win32.whl", hash = "sha256:e7b24c11df36ee8e0c085e5b0dc560289e4b58804746fb487287dda51410f1e2"}, - {file = "protobuf-3.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:77d2fadcf369b3f22859ab25bd12bb8e98fb11e05d9ff9b7cd45b711c719c002"}, - {file = "protobuf-3.19.1-py2.py3-none-any.whl", hash = "sha256:e813b1c9006b6399308e917ac5d298f345d95bb31f46f02b60cd92970a9afa17"}, - {file = "protobuf-3.19.1.tar.gz", hash = "sha256:62a8e4baa9cb9e064eb62d1002eca820857ab2138440cb4b3ea4243830f94ca7"}, -] -psutil = [ - {file = "psutil-5.8.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64"}, - {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0ae6f386d8d297177fd288be6e8d1afc05966878704dad9847719650e44fc49c"}, - {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:12d844996d6c2b1d3881cfa6fa201fd635971869a9da945cf6756105af73d2df"}, - {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:02b8292609b1f7fcb34173b25e48d0da8667bc85f81d7476584d889c6e0f2131"}, - {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6ffe81843131ee0ffa02c317186ed1e759a145267d54fdef1bc4ea5f5931ab60"}, - {file = "psutil-5.8.0-cp27-none-win32.whl", hash = "sha256:ea313bb02e5e25224e518e4352af4bf5e062755160f77e4b1767dd5ccb65f876"}, - {file = "psutil-5.8.0-cp27-none-win_amd64.whl", hash = "sha256:5da29e394bdedd9144c7331192e20c1f79283fb03b06e6abd3a8ae45ffecee65"}, - {file = "psutil-5.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:74fb2557d1430fff18ff0d72613c5ca30c45cdbfcddd6a5773e9fc1fe9364be8"}, - {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:74f2d0be88db96ada78756cb3a3e1b107ce8ab79f65aa885f76d7664e56928f6"}, - {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99de3e8739258b3c3e8669cb9757c9a861b2a25ad0955f8e53ac662d66de61ac"}, - {file = "psutil-5.8.0-cp36-cp36m-win32.whl", hash = "sha256:36b3b6c9e2a34b7d7fbae330a85bf72c30b1c827a4366a07443fc4b6270449e2"}, - {file = "psutil-5.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:52de075468cd394ac98c66f9ca33b2f54ae1d9bff1ef6b67a212ee8f639ec06d"}, - {file = "psutil-5.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c6a5fd10ce6b6344e616cf01cc5b849fa8103fbb5ba507b6b2dee4c11e84c935"}, - {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:61f05864b42fedc0771d6d8e49c35f07efd209ade09a5afe6a5059e7bb7bf83d"}, - {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:0dd4465a039d343925cdc29023bb6960ccf4e74a65ad53e768403746a9207023"}, - {file = "psutil-5.8.0-cp37-cp37m-win32.whl", hash = "sha256:1bff0d07e76114ec24ee32e7f7f8d0c4b0514b3fae93e3d2aaafd65d22502394"}, - {file = "psutil-5.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:fcc01e900c1d7bee2a37e5d6e4f9194760a93597c97fee89c4ae51701de03563"}, - {file = "psutil-5.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6223d07a1ae93f86451d0198a0c361032c4c93ebd4bf6d25e2fb3edfad9571ef"}, - {file = "psutil-5.8.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d225cd8319aa1d3c85bf195c4e07d17d3cd68636b8fc97e6cf198f782f99af28"}, - {file = "psutil-5.8.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:28ff7c95293ae74bf1ca1a79e8805fcde005c18a122ca983abf676ea3466362b"}, - {file = "psutil-5.8.0-cp38-cp38-win32.whl", hash = "sha256:ce8b867423291cb65cfc6d9c4955ee9bfc1e21fe03bb50e177f2b957f1c2469d"}, - {file = "psutil-5.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:90f31c34d25b1b3ed6c40cdd34ff122b1887a825297c017e4cbd6796dd8b672d"}, - {file = "psutil-5.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6323d5d845c2785efb20aded4726636546b26d3b577aded22492908f7c1bdda7"}, - {file = "psutil-5.8.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:245b5509968ac0bd179287d91210cd3f37add77dad385ef238b275bad35fa1c4"}, - {file = "psutil-5.8.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:90d4091c2d30ddd0a03e0b97e6a33a48628469b99585e2ad6bf21f17423b112b"}, - {file = "psutil-5.8.0-cp39-cp39-win32.whl", hash = "sha256:ea372bcc129394485824ae3e3ddabe67dc0b118d262c568b4d2602a7070afdb0"}, - {file = "psutil-5.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3"}, - {file = "psutil-5.8.0.tar.gz", hash = "sha256:0c9ccb99ab76025f2f0bbecf341d4656e9c1351db8cc8a03ccd62e318ab4b5c6"}, -] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pyaml = [ - {file = "pyaml-20.4.0-py2.py3-none-any.whl", hash = "sha256:67081749a82b72c45e5f7f812ee3a14a03b3f5c25ff36ec3b290514f8c4c4b99"}, - {file = "pyaml-20.4.0.tar.gz", hash = "sha256:29a5c2a68660a799103d6949167bd6c7953d031449d08802386372de1db6ad71"}, -] -pyarrow = [ - {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_13_universal2.whl", hash = "sha256:c7a6e7e0bf8779e9c3428ced85507541f3da9a0675e2f4781d4eb2c7042cbf81"}, - {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:7a683f71b848eb6310b4ec48c0def55dac839e9994c1ac874c9b2d3d5625def1"}, - {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5144bd9db2920c7cb566c96462d62443cc239104f94771d110f74393f2fb42a2"}, - {file = "pyarrow-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed0be080cf595ea15ff1c9ff4097bbf1fcc4b50847d98c0a3c0412fbc6ede7e9"}, - {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:072c1a0fca4509eefd7d018b78542fb7e5c63aaf5698f1c0a6e45628ae17ba44"}, - {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5bed4f948c032c40597302e9bdfa65f62295240306976ecbe43a54924c6f94f"}, - {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:465f87fa0be0b2928b2beeba22b5813a0203fb05d90fd8563eea48e08ecc030e"}, - {file = "pyarrow-6.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:ddf2e6e3b321adaaf716f2d5af8e92d205a9671e0cb7c0779710a567fd1dd580"}, - {file = "pyarrow-6.0.0-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:0204e80777ab8f4e9abd3a765a8ec07ed1e3c4630bacda50d2ce212ef0f3826f"}, - {file = "pyarrow-6.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:82fe80309e01acf29e3943a1f6d3c98ec109fe1d356bc1ac37d639bcaadcf684"}, - {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:281ce5fa03621d786a9beb514abb09846db7f0221b50eabf543caa24037eaacd"}, - {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5408fa8d623e66a0445f3fb0e4027fd219bf99bfb57422d543d7b7876e2c5b55"}, - {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a19e58dfb04e451cd8b7bdec3ac8848373b95dfc53492c9a69789aa9074a3c1b"}, - {file = "pyarrow-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b86d175262db1eb46afdceb36d459409eb6f8e532d3dec162f8bf572c7f57623"}, - {file = "pyarrow-6.0.0-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:2d2c681659396c745e4f1988d5dd41dcc3ad557bb8d4a8c2e44030edafc08a91"}, - {file = "pyarrow-6.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c666bc6a1cebf01206e2dc1ab05f25f39f35d3a499e0ef5cd635225e07306ca"}, - {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8d41dfb09ba9236cca6245f33088eb42f3c54023da281139241e0f9f3b4b754e"}, - {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477c746ef42c039348a288584800e299456c80c5691401bb9b19aa9c02a427b7"}, - {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c38263ea438a1666b13372e7565450cfeec32dbcd1c2595749476a58465eaec"}, - {file = "pyarrow-6.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e81508239a71943759cee272ce625ae208092dd36ef2c6713fccee30bbcf52bb"}, - {file = "pyarrow-6.0.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:a50d2f77b86af38ceabf45617208b9105d20e7a5eebc584e7c8c0acededd82ce"}, - {file = "pyarrow-6.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbda7595f24a639bcef3419ecfac17216efacb09f7b0f1b4c4c97f900d65ca0e"}, - {file = "pyarrow-6.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bf3400780c4d3c9cb43b1e8a1aaf2e1b7199a0572d0a645529d2784e4d0d8497"}, - {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:15dc0d673d3f865ca63c877bd7a2eced70b0a08969fb733a28247134b8a1f18b"}, - {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1d9a2f4ee812ed0bd4182cabef99ea914ac297274f0de086f2488093d284ef"}, - {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d046dc78a9337baa6415be915c5a16222505233e238a1017f368243c89817eea"}, - {file = "pyarrow-6.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:ea64a48a85c631eb2a0ea13ccdec5143c85b5897836b16331ee4289d27a57247"}, - {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_13_universal2.whl", hash = "sha256:cc1d4a70efd583befe92d4ea6f74ed2e0aa31ccdde767cd5cae8e77c65a1c2d4"}, - {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:004185e0babc6f3c3fba6ba4f106e406a0113d0f82bb9ad9a8571a1978c45d04"}, - {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c23f8cdecd3d9e49f9b0f9a651ae5549d1d32fd4901fb1bdc2d327edfba844f"}, - {file = "pyarrow-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fb701ec4a94b92102606d4e88f0b8eba34f09a5ad8e014eaa4af76f42b7f62ae"}, - {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da7860688c33ca88ac05f1a487d32d96d9caa091412496c35f3d1d832145675a"}, - {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac941a147d14993987cc8b605b721735a34b3e54d167302501fb4db1ad7382c7"}, - {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6163d82cca7541774b00503c295fe86a1722820eddb958b57f091bb6f5b0a6db"}, - {file = "pyarrow-6.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:376c4b5f248ae63df21fe15c194e9013753164be2d38f4b3fb8bde63ac5a1958"}, - {file = "pyarrow-6.0.0.tar.gz", hash = "sha256:5be62679201c441356d3f2a739895dcc8d4d299f2a6eabcd2163bfb6a898abba"}, -] -pyasn1 = [ - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, -] -pyasn1-modules = [ - {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, - {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, -] -pydata-google-auth = [ - {file = "pydata-google-auth-1.2.0.tar.gz", hash = "sha256:076411ecd7a5ac927ba9741c32ea599bc66e54170dffc1259f3cd353cf25cbd7"}, - {file = "pydata_google_auth-1.2.0-py2.py3-none-any.whl", hash = "sha256:2e2b27425d6f8a9ead496c0fd677a09448cbca2b71055abe3ee72c7f8f1774f4"}, -] -pymssql = [ - {file = "pymssql-2.2.5-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:6462017183f05ae231c3f84efce4e9a8d085b4a2e9e3ed5c407ee643494a0842"}, - {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6a013c82f7320c92039ac20db935e897a3fcd7423435705cef177f863dbb32e4"}, - {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:45e9bba4870103363c865d2b867de8de082745dd753083f27927ded3d15df587"}, - {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20de2f718f3c99040637a0e7d3b81f22e62211bcac01fb65641b964e70f26e20"}, - {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18eb4fcb55b67aaa2811e124eb8750fd84eeba1668a695908c6cc13682f6be5d"}, - {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_24_i686.whl", hash = "sha256:9969971117401096a8a7c1e08d84ea3d5d3f598ee482822583a44e2e6d3791d0"}, - {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:bb858c8a64990dd0145d874ef01af4b6fe39e9202ee0a74a8dff8285b801db21"}, - {file = "pymssql-2.2.5-cp310-cp310-win32.whl", hash = "sha256:da78a94908d42aa0f8af1b917c49c4dea38273035f81ea168b095e0b3ba8e486"}, - {file = "pymssql-2.2.5-cp310-cp310-win_amd64.whl", hash = "sha256:b691779a450ebbbb98cd2ad89ae9f17799b0bf0c9dd2e65b316efcc74246716e"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92262bf5d21b6d80e887d6fd0f03ab6337dad39b642b1887416cc67b1bd04cbf"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00f5b7e22bf7eb0faa5c6693e02c00f10ecc89fe505bbe84d553352681c2a749"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac80d1d11703120b986c604ddf4993c3dcbcbe907b04e34729c5aae2891399c0"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bf813ea0e4a0bfbb53a3469125eed06635222ea729339403585fd45f18a7812"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_24_i686.whl", hash = "sha256:73b747261cdf8d69395823cf650cf143d618ada412cbec90a88e4d449e7fa7f8"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_24_x86_64.whl", hash = "sha256:ce9e7ed16793c72d28e80506abd59a06b594fc55fe24f6256b7007b5b5e26120"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b5dcb4e4ceb16592a5d9ea3868162f21e7c215dde5c5e7f992709696c84a69b0"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9c90bc134a0c5c60e9acf651d87275c7e6dc6682981f62d574fa3dd441acb0f2"}, - {file = "pymssql-2.2.5-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:29d647ef61641cebc0e16d4a549b3f793f32bab88e7ba7c7550772a7aba9dea3"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:633079e248cdefef2207c0a55608637d0f3410f53e5679c589b37ea7965a2cca"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e373764cc81719f830b113ce6fee6849f2c4e5dfe1037804864b7dfb9946817e"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b47c05da0fffd6dd77141c1c37975a8469334f63e6faf03f5eab6d83c9001cc"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc245011aad9c018105193585469461c35fb35e7255b8e66fa27479f835742aa"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_24_i686.whl", hash = "sha256:72bbccdaf4938db7ff99db1f82ecdf6dc78778d8b7bbe6080590dd01024988de"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:395ec9e512a8d5b707aea8f516eebf51291b6fb6bc18fe4da88b222843bd4d46"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bb912b4681d55dce63f940becb7f4533661cfdb99cd6cd3daa7d7b5e285e977"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14dee37da84653d1e483236d51bc0545e6442e0642ee362526db6599fd3c1733"}, - {file = "pymssql-2.2.5-cp37-cp37m-win32.whl", hash = "sha256:5e2cd5a6da441aa3e8ee13e8811f884791d77a4cb17028381543bf50d010c919"}, - {file = "pymssql-2.2.5-cp37-cp37m-win_amd64.whl", hash = "sha256:ba43efd1057018ab404c8603bbce643347b9165c08364df8a8c03d54dffc4453"}, - {file = "pymssql-2.2.5-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:ac8d6b7e0dc97a9261b7500f086772ff5cf2bf9a0340d0aaee4dff5b217dd526"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ed7c5e58cd0ffcf3448cc38dfd2a6011f657759fcae9509748320cd89a0b8d32"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:30c4ab08cff619c7fe4d309fa6a05219b343082a1f46ca368deab5841632b8bf"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49806c343a6dea5221e98cabed1532fdd14535c5e5bb183001e0ffad31e11032"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15cc71762ec75a66bcb3751c2534ba4151b8512252b0377b842efec7cae6d953"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_24_i686.whl", hash = "sha256:e42c7043c472d45db686ae67601c6680596a2f12ceaa99fb136e647d3d8cd643"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:c738d51181ab4b3332631644ef7b561543837d1d942a291f8bc36a9e2dfb65db"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e33770ad113a646a45e4fc75f30683e92c9b929431e12977f824d6c810f28162"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8c5ad8d09f9035009ccb6f20bc9829ef60c03c436efb4b5c33af395c4030ea3d"}, - {file = "pymssql-2.2.5-cp38-cp38-win32.whl", hash = "sha256:c0611a3ea2a7ac496df30506fd28e4f7389808c59743b2eac0069e89af7289b8"}, - {file = "pymssql-2.2.5-cp38-cp38-win_amd64.whl", hash = "sha256:45c1519c94f9915911075c95fc63d62ba612e152248093aa12b7e902499c6416"}, - {file = "pymssql-2.2.5-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:1089cd5871daedc9918f8958605bbd2621006c29c06b571b419be53ea46c113a"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8ac2b3213462f078671806702dfadb8e459923f0f5013d371febebf4caf598ba"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9b707e5867bb49ad9d8945231112dfa3e9588b98f6f1248714d1f1af88321230"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:538a8e7ce255cabf093b25b72f8037b1d5fd3ba28b13a34c761a029840dc1880"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b9f5ec7896fd2f19393cd564d8ef562b26692218a84088ce1b10e9fe1215032"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_24_i686.whl", hash = "sha256:6086f0b695b7ceb4603cdc2f66356a58e367a3f1828d1ca99255c4d92d1f0932"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:e0b1bcb8465d787d5141bfc02d98e1e507d02155848b1b5622528402760f5dbf"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ebb7867207cf4cd497ea1d01b42590ed1db3561ef3ab8e135239301b6ee2695e"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8b32ad436f293c8cbadc1ba3aaf2621ab82303d169b1ab6f30f55053640ab5b1"}, - {file = "pymssql-2.2.5-cp39-cp39-win32.whl", hash = "sha256:cc523bfd26671346faccb1273b16a74dcdf1a8ac81c93c6bfebdb240e4d5a042"}, - {file = "pymssql-2.2.5-cp39-cp39-win_amd64.whl", hash = "sha256:e9cce9c47e6d550992936f91f8f2e97a8f5132749bad1cd4f5f7923bf8732d1f"}, - {file = "pymssql-2.2.5.tar.gz", hash = "sha256:857411c308ecb584a3ca633be30f1971d2a8cc0bcd978709b1abf96ff43767ad"}, -] -pyparsing = [ - {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, - {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, -] -pytest = [ - {file = "pytest-6.0.2-py3-none-any.whl", hash = "sha256:0e37f61339c4578776e090c3b8f6b16ce4db333889d65d0efb305243ec544b40"}, - {file = "pytest-6.0.2.tar.gz", hash = "sha256:c8f57c2a30983f469bf03e68cdfa74dc474ce56b8f280ddcb080dfd91df01043"}, -] -pytest-cov = [ - {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, - {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, -] -python-box = [ - {file = "python-box-5.4.1.tar.gz", hash = "sha256:b68e0f8abc86f3deda751b3390f64df64a0989459de51ba4db949662a7b4d8ac"}, - {file = "python_box-5.4.1-py3-none-any.whl", hash = "sha256:60ae9156de34cf92b899bd099580950df70a5b0813e67a3310a1cdd1976457fa"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] -python-slugify = [ - {file = "python-slugify-5.0.2.tar.gz", hash = "sha256:f13383a0b9fcbe649a1892b9c8eb4f8eab1d6d84b84bb7a624317afa98159cab"}, - {file = "python_slugify-5.0.2-py2.py3-none-any.whl", hash = "sha256:6d8c5df75cd4a7c3a2d21e257633de53f52ab0265cd2d1dc62a730e8194a7380"}, -] -pytz = [ - {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, - {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, -] -pytzdata = [ - {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, - {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, -] -pywin32 = [ - {file = "pywin32-227-cp27-cp27m-win32.whl", hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"}, - {file = "pywin32-227-cp27-cp27m-win_amd64.whl", hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"}, - {file = "pywin32-227-cp35-cp35m-win32.whl", hash = "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"}, - {file = "pywin32-227-cp35-cp35m-win_amd64.whl", hash = "sha256:a929a4af626e530383a579431b70e512e736e9588106715215bf685a3ea508d4"}, - {file = "pywin32-227-cp36-cp36m-win32.whl", hash = "sha256:300a2db938e98c3e7e2093e4491439e62287d0d493fe07cce110db070b54c0be"}, - {file = "pywin32-227-cp36-cp36m-win_amd64.whl", hash = "sha256:9b31e009564fb95db160f154e2aa195ed66bcc4c058ed72850d047141b36f3a2"}, - {file = "pywin32-227-cp37-cp37m-win32.whl", hash = "sha256:47a3c7551376a865dd8d095a98deba954a98f326c6fe3c72d8726ca6e6b15507"}, - {file = "pywin32-227-cp37-cp37m-win_amd64.whl", hash = "sha256:31f88a89139cb2adc40f8f0e65ee56a8c585f629974f9e07622ba80199057511"}, - {file = "pywin32-227-cp38-cp38-win32.whl", hash = "sha256:7f18199fbf29ca99dff10e1f09451582ae9e372a892ff03a28528a24d55875bc"}, - {file = "pywin32-227-cp38-cp38-win_amd64.whl", hash = "sha256:7c1ae32c489dc012930787f06244426f8356e129184a02c25aef163917ce158e"}, - {file = "pywin32-227-cp39-cp39-win32.whl", hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"}, - {file = "pywin32-227-cp39-cp39-win_amd64.whl", hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"}, -] -pyyaml = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] -redis = [ - {file = "redis-4.3.4-py3-none-any.whl", hash = "sha256:a52d5694c9eb4292770084fa8c863f79367ca19884b329ab574d5cb2036b3e54"}, - {file = "redis-4.3.4.tar.gz", hash = "sha256:ddf27071df4adf3821c4f2ca59d67525c3a82e5f268bed97b813cb4fabf87880"}, -] -redis-pal = [ - {file = "redis-pal-1.0.0.tar.gz", hash = "sha256:8e20caf8127056a2d1208d6dd0873643efb8357602193e26c1ada8ed6737fa88"}, - {file = "redis_pal-1.0.0-py3-none-any.whl", hash = "sha256:8cbf55c926c761ce9d60803ed66ef2575f351b43c9554fd66f6458d323430bf0"}, -] -requests = [ - {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, - {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, -] -requests-oauthlib = [ - {file = "requests-oauthlib-1.3.0.tar.gz", hash = "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a"}, - {file = "requests_oauthlib-1.3.0-py2.py3-none-any.whl", hash = "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d"}, -] -rsa = [ - {file = "rsa-4.8-py3-none-any.whl", hash = "sha256:95c5d300c4e879ee69708c428ba566c59478fd653cc3a22243eeb8ed846950bb"}, - {file = "rsa-4.8.tar.gz", hash = "sha256:5c6bd9dc7a543b7fe4304a631f8a8a3b674e2bbfc49c2ae96200cdbe55df6b17"}, -] -"ruamel.yaml" = [ - {file = "ruamel.yaml-0.17.10-py3-none-any.whl", hash = "sha256:ffb9b703853e9e8b7861606dfdab1026cf02505bade0653d1880f4b2db47f815"}, - {file = "ruamel.yaml-0.17.10.tar.gz", hash = "sha256:106bc8d6dc6a0ff7c9196a47570432036f41d556b779c6b4e618085f57e39e67"}, -] -"ruamel.yaml.clib" = [ - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e7be2c5bcb297f5b82fee9c665eb2eb7001d1050deaba8471842979293a80b0"}, - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:066f886bc90cc2ce44df8b5f7acfc6a7e2b2e672713f027136464492b0c34d7c"}, - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:221eca6f35076c6ae472a531afa1c223b9c29377e62936f61bc8e6e8bdc5f9e7"}, - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win32.whl", hash = "sha256:1070ba9dd7f9370d0513d649420c3b362ac2d687fe78c6e888f5b12bf8bc7bee"}, - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:77df077d32921ad46f34816a9a16e6356d8100374579bc35e15bab5d4e9377de"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:cfdb9389d888c5b74af297e51ce357b800dd844898af9d4a547ffc143fa56751"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7b2927e92feb51d830f531de4ccb11b320255ee95e791022555971c466af4527"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win32.whl", hash = "sha256:ada3f400d9923a190ea8b59c8f60680c4ef8a4b0dfae134d2f2ff68429adfab5"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win_amd64.whl", hash = "sha256:de9c6b8a1ba52919ae919f3ae96abb72b994dd0350226e28f3686cb4f142165c"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d67f273097c368265a7b81e152e07fb90ed395df6e552b9fa858c6d2c9f42502"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:72a2b8b2ff0a627496aad76f37a652bcef400fd861721744201ef1b45199ab78"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d3c620a54748a3d4cf0bcfe623e388407c8e85a4b06b8188e126302bcab93ea8"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win32.whl", hash = "sha256:9efef4aab5353387b07f6b22ace0867032b900d8e91674b5d8ea9150db5cae94"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win_amd64.whl", hash = "sha256:846fc8336443106fe23f9b6d6b8c14a53d38cef9a375149d61f99d78782ea468"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0847201b767447fc33b9c235780d3aa90357d20dd6108b92be544427bea197dd"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:78988ed190206672da0f5d50c61afef8f67daa718d614377dcd5e3ed85ab4a99"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:210c8fcfeff90514b7133010bf14e3bad652c8efde6b20e00c43854bf94fa5a6"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win32.whl", hash = "sha256:a49e0161897901d1ac9c4a79984b8410f450565bbad64dbfcbf76152743a0cdb"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win_amd64.whl", hash = "sha256:bf75d28fa071645c529b5474a550a44686821decebdd00e21127ef1fd566eabe"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a32f8d81ea0c6173ab1b3da956869114cae53ba1e9f72374032e33ba3118c233"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7f7ecb53ae6848f959db6ae93bdff1740e651809780822270eab111500842a84"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:61bc5e5ca632d95925907c569daa559ea194a4d16084ba86084be98ab1cec1c6"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win32.whl", hash = "sha256:89221ec6d6026f8ae859c09b9718799fea22c0e8da8b766b0b2c9a9ba2db326b"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win_amd64.whl", hash = "sha256:31ea73e564a7b5fbbe8188ab8b334393e06d997914a4e184975348f204790277"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc6a613d6c74eef5a14a214d433d06291526145431c3b964f5e16529b1842bed"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1866cf2c284a03b9524a5cc00daca56d80057c5ce3cdc86a52020f4c720856f0"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1b4139a6ffbca8ef60fdaf9b33dec05143ba746a6f0ae0f9d11d38239211d335"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win32.whl", hash = "sha256:3fb9575a5acd13031c57a62cc7823e5d2ff8bc3835ba4d94b921b4e6ee664104"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win_amd64.whl", hash = "sha256:825d5fccef6da42f3c8eccd4281af399f21c02b32d98e113dbc631ea6a6ecbc7"}, - {file = "ruamel.yaml.clib-0.2.6.tar.gz", hash = "sha256:4ff604ce439abb20794f05613c374759ce10e3595d1867764dd1ae675b85acbd"}, -] -scipy = [ - {file = "scipy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:87b01c7d5761e8a266a0fbdb9d88dcba0910d63c1c671bdb4d99d29f469e9e03"}, - {file = "scipy-1.8.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ae3e327da323d82e918e593460e23babdce40d7ab21490ddf9fc06dec6b91a18"}, - {file = "scipy-1.8.0-cp310-cp310-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:16e09ef68b352d73befa8bcaf3ebe25d3941fe1a58c82909d5589856e6bc8174"}, - {file = "scipy-1.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c17a1878d00a5dd2797ccd73623ceca9d02375328f6218ee6d921e1325e61aff"}, - {file = "scipy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937d28722f13302febde29847bbe554b89073fbb924a30475e5ed7b028898b5f"}, - {file = "scipy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:8f4d059a97b29c91afad46b1737274cb282357a305a80bdd9e8adf3b0ca6a3f0"}, - {file = "scipy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:38aa39b6724cb65271e469013aeb6f2ce66fd44f093e241c28a9c6bc64fd79ed"}, - {file = "scipy-1.8.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:559a8a4c03a5ba9fe3232f39ed24f86457e4f3f6c0abbeae1fb945029f092720"}, - {file = "scipy-1.8.0-cp38-cp38-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:f4a6d3b9f9797eb2d43938ac2c5d96d02aed17ef170c8b38f11798717523ddba"}, - {file = "scipy-1.8.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92b2c2af4183ed09afb595709a8ef5783b2baf7f41e26ece24e1329c109691a7"}, - {file = "scipy-1.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a279e27c7f4566ef18bab1b1e2c37d168e365080974758d107e7d237d3f0f484"}, - {file = "scipy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad5be4039147c808e64f99c0e8a9641eb5d2fa079ff5894dcd8240e94e347af4"}, - {file = "scipy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:3d9dd6c8b93a22bf9a3a52d1327aca7e092b1299fb3afc4f89e8eba381be7b59"}, - {file = "scipy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:5e73343c5e0d413c1f937302b2e04fb07872f5843041bcfd50699aef6e95e399"}, - {file = "scipy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:de2e80ee1d925984c2504812a310841c241791c5279352be4707cdcd7c255039"}, - {file = "scipy-1.8.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:c2bae431d127bf0b1da81fc24e4bba0a84d058e3a96b9dd6475dfcb3c5e8761e"}, - {file = "scipy-1.8.0-cp39-cp39-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:723b9f878095ed994756fa4ee3060c450e2db0139c5ba248ee3f9628bd64e735"}, - {file = "scipy-1.8.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:011d4386b53b933142f58a652aa0f149c9b9242abd4f900b9f4ea5fbafc86b89"}, - {file = "scipy-1.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6f0cd9c0bd374ef834ee1e0f0999678d49dcc400ea6209113d81528958f97c7"}, - {file = "scipy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3720d0124aced49f6f2198a6900304411dbbeed12f56951d7c66ebef05e3df6"}, - {file = "scipy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:3d573228c10a3a8c32b9037be982e6440e411b443a6267b067cac72f690b8d56"}, - {file = "scipy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb7088e89cd751acf66195d2f00cf009a1ea113f3019664032d9075b1e727b6c"}, - {file = "scipy-1.8.0.tar.gz", hash = "sha256:31d4f2d6b724bc9a98e527b5849b8a7e589bf1ea630c33aa563eda912c9ff0bd"}, -] -seaborn = [ - {file = "seaborn-0.11.2-py3-none-any.whl", hash = "sha256:85a6baa9b55f81a0623abddc4a26b334653ff4c6b18c418361de19dbba0ef283"}, - {file = "seaborn-0.11.2.tar.gz", hash = "sha256:cf45e9286d40826864be0e3c066f98536982baf701a7caa386511792d61ff4f6"}, -] -setuptools = [ - {file = "setuptools-65.6.3-py3-none-any.whl", hash = "sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54"}, - {file = "setuptools-65.6.3.tar.gz", hash = "sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75"}, -] -setuptools-scm = [ - {file = "setuptools_scm-6.4.2-py3-none-any.whl", hash = "sha256:acea13255093849de7ccb11af9e1fb8bde7067783450cee9ef7a93139bddf6d4"}, - {file = "setuptools_scm-6.4.2.tar.gz", hash = "sha256:6833ac65c6ed9711a4d5d2266f8024cfa07c533a0e55f4c12f6eff280a5a9e30"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -sortedcontainers = [ - {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, - {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, -] -soupsieve = [ - {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, - {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, -] -tabulate = [ - {file = "tabulate-0.8.9-py3-none-any.whl", hash = "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4"}, - {file = "tabulate-0.8.9.tar.gz", hash = "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7"}, -] -tblib = [ - {file = "tblib-1.7.0-py2.py3-none-any.whl", hash = "sha256:289fa7359e580950e7d9743eab36b0691f0310fce64dee7d9c31065b8f723e23"}, - {file = "tblib-1.7.0.tar.gz", hash = "sha256:059bd77306ea7b419d4f76016aef6d7027cc8a0785579b5aad198803435f882c"}, -] -text-unidecode = [ - {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, - {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tomli = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] -tomlkit = [ - {file = "tomlkit-0.7.0-py2.py3-none-any.whl", hash = "sha256:6babbd33b17d5c9691896b0e68159215a9387ebfa938aa3ac42f4a4beeb2b831"}, - {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, -] -toolz = [ - {file = "toolz-0.11.2-py3-none-any.whl", hash = "sha256:a5700ce83414c64514d82d60bcda8aabfde092d1c1a8663f9200c07fdcc6da8f"}, - {file = "toolz-0.11.2.tar.gz", hash = "sha256:6b312d5e15138552f1bda8a4e66c30e236c831b612b2bf0005f8a1df10a4bc33"}, -] -tornado = [ - {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, - {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, - {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, - {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, - {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, - {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, - {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, - {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, - {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, - {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, - {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, - {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, - {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, - {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, - {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, - {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, - {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, - {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, - {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, - {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, - {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, - {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, - {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, - {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, - {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, - {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, - {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, - {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, - {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, - {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, - {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, - {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, -] -tqdm = [ - {file = "tqdm-4.50.2-py2.py3-none-any.whl", hash = "sha256:43ca183da3367578ebf2f1c2e3111d51ea161ed1dc4e6345b86e27c2a93beff7"}, - {file = "tqdm-4.50.2.tar.gz", hash = "sha256:69dfa6714dee976e2425a9aab84b622675b7b1742873041e3db8a8e86132a4af"}, -] -tweepy = [ - {file = "tweepy-4.4.0-py2.py3-none-any.whl", hash = "sha256:cf02c4fbbd027fbc7172c24d03f53f061329ac040b22d201e59592a1cff86364"}, - {file = "tweepy-4.4.0.tar.gz", hash = "sha256:8d4b4520271b796fa7efc4c5d5ef3228af4d79f6a4d3ace3900b2778ed8f6f1c"}, -] -unidecode = [ - {file = "Unidecode-1.3.4-py3-none-any.whl", hash = "sha256:afa04efcdd818a93237574791be9b2817d7077c25a068b00f8cff7baa4e59257"}, - {file = "Unidecode-1.3.4.tar.gz", hash = "sha256:8e4352fb93d5a735c788110d2e7ac8e8031eb06ccbfe8d324ab71735015f9342"}, -] -uritemplate = [ - {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, - {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, -] -urllib3 = [ - {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, - {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, -] -virtualenv = [ - {file = "virtualenv-20.16.3-py2.py3-none-any.whl", hash = "sha256:4193b7bc8a6cd23e4eb251ac64f29b4398ab2c233531e66e40b19a6b7b0d30c1"}, - {file = "virtualenv-20.16.3.tar.gz", hash = "sha256:d86ea0bb50e06252d79e6c241507cb904fcd66090c3271381372d6221a3970f9"}, -] -websocket-client = [ - {file = "websocket-client-1.2.1.tar.gz", hash = "sha256:8dfb715d8a992f5712fff8c843adae94e22b22a99b2c5e6b0ec4a1a981cc4e0d"}, - {file = "websocket_client-1.2.1-py2.py3-none-any.whl", hash = "sha256:0133d2f784858e59959ce82ddac316634229da55b498aac311f1620567a710ec"}, -] -wget = [ - {file = "wget-3.2.zip", hash = "sha256:35e630eca2aa50ce998b9b1a127bb26b30dfee573702782aa982f875e3f16061"}, -] -win32-setctime = [ - {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, - {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, -] -wrapt = [ - {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, - {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, - {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, - {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, - {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, - {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, - {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, - {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, - {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, - {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, - {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, - {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, - {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, - {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, - {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, - {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, -] -zict = [ - {file = "zict-2.0.0-py3-none-any.whl", hash = "sha256:26aa1adda8250a78dfc6a78d200bfb2ea43a34752cf58980bca75dde0ba0c6e9"}, - {file = "zict-2.0.0.tar.gz", hash = "sha256:8e2969797627c8a663575c2fc6fcb53a05e37cdb83ee65f341fc6e0c3d0ced16"}, -] -zipp = [ - {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, - {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, -] +async-timeout = [] +atomicwrites = [] +attrs = [] +basedosdados = [] +beautifulsoup4 = [] +cachetools = [] +certifi = [] +cfgv = [] +charset-normalizer = [] +ckanapi = [] +click = [] +cloudpickle = [] +colorama = [] +coverage = [] +croniter = [] +cycler = [] +dask = [] +db-dtypes = [] +dbt-client = [] +deprecated = [] +dill = [] +distlib = [] +distributed = [] +docker = [] +docopt = [] +fastavro = [] +filelock = [] +fonttools = [] +fsspec = [] +google-analytics-data = [] +google-api-core = [] +google-api-python-client = [] +google-auth = [] +google-auth-httplib2 = [] +google-auth-oauthlib = [] +google-cloud-bigquery = [] +google-cloud-bigquery-storage = [] +google-cloud-core = [] +google-cloud-storage = [] +google-crc32c = [] +google-resumable-media = [] +googleapis-common-protos = [] +grpcio = [] +heapdict = [] +httplib2 = [] +hvac = [] +identify = [] +idna = [] +importlib-metadata = [] +iniconfig = [] +ipeadatapy = [] +jinja2 = [] +kiwisolver = [] +locket = [] +loguru = [] +markupsafe = [] +marshmallow = [] +marshmallow-oneofschema = [] +matplotlib = [] +more-itertools = [] +msgpack = [] +mypy-extensions = [] +nodeenv = [] +numpy = [] +oauth2client = [] +oauthlib = [] +packaging = [] +pandas = [] +pandas-gbq = [] +pandavro = [] +partd = [] +pendulum = [] +pillow = [] +platformdirs = [] +pluggy = [] +pre-commit = [] +prefect = [] +proto-plus = [] +protobuf = [] +psutil = [] +py = [] +pyaml = [] +pyarrow = [] +pyasn1 = [] +pyasn1-modules = [] +pydata-google-auth = [] +pymssql = [] +pyparsing = [] +pytest = [] +pytest-cov = [] +python-box = [] +python-dateutil = [] +python-slugify = [] +pytz = [] +pytzdata = [] +pywin32 = [] +pyyaml = [] +rarfile = [] +redis = [] +redis-pal = [] +requests = [] +requests-oauthlib = [] +rsa = [] +"ruamel.yaml" = [] +"ruamel.yaml.clib" = [] +scipy = [] +seaborn = [] +setuptools-scm = [] +six = [] +sortedcontainers = [] +soupsieve = [] +tabulate = [] +tblib = [] +text-unidecode = [] +toml = [] +tomli = [] +tomlkit = [] +toolz = [] +tornado = [] +tqdm = [] +tweepy = [] +unidecode = [] +uritemplate = [] +urllib3 = [] +virtualenv = [] +websocket-client = [] +wget = [] +win32-setctime = [] +wrapt = [] +zict = [] +zipp = [] diff --git a/pyproject.toml b/pyproject.toml index 065c65fae..5160e0077 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -97,6 +97,7 @@ google-analytics-data = "0.12.1" google-api-python-client = "^2.58.0" oauth2client = "^4.1.3" redis-pal = "^1.0.0" +rarfile = "^4.0" [tool.poetry.dev-dependencies] pytest_cov = "^3.0.0" From c5a1bf175c609004c3c4a687fae4dfb8be54b5e2 Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 23 Mar 2023 02:21:29 -0300 Subject: [PATCH 004/265] Missing function --- br_denatran_frota/code/download_frota.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index c75ef01e4..ff6e0cd94 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -75,7 +75,13 @@ def handle_compact(i): os.rename(filepath, dest_path_file) else: os.remove(filepath) - + + def download_file(i): + if i['filetype'] in ['rar', 'zip']: + handle_compact(i) + elif i['filetype'] in ['xlsx', 'xls']: + handle_xl(i) + soup = BeautifulSoup(urlopen(url), "html.parser") nodes = soup.select("p > a") From bef1e58ab6a0aff4b67169aacdc7f46e55dc84f1 Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 23 Mar 2023 18:18:16 -0300 Subject: [PATCH 005/265] Converted code from R to Python --- br_denatran_frota/code/download_frota.R | 4 +- br_denatran_frota/code/download_frota_gpt.py | 101 +++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 br_denatran_frota/code/download_frota_gpt.py diff --git a/br_denatran_frota/code/download_frota.R b/br_denatran_frota/code/download_frota.R index 0734e7526..b9ce2930c 100644 --- a/br_denatran_frota/code/download_frota.R +++ b/br_denatran_frota/code/download_frota.R @@ -118,4 +118,6 @@ download_frota <- function(key = NULL, prefix = NULL, month, year, tempdir = tem ) %>% purrr::transpose() %>% purrr::walk(~download_file(.x)) -} \ No newline at end of file +} + +download_frota(year = 2013, month = 1, tempdir = 'p') diff --git a/br_denatran_frota/code/download_frota_gpt.py b/br_denatran_frota/code/download_frota_gpt.py new file mode 100644 index 000000000..d12cd9856 --- /dev/null +++ b/br_denatran_frota/code/download_frota_gpt.py @@ -0,0 +1,101 @@ +import os +import re +import tempfile +from urllib.request import urlopen, urlretrieve +from zipfile import ZipFile +from rarfile import RarFile +from bs4 import BeautifulSoup +from collections import defaultdict + + +def download_frota( month=None, year=None, tempdir=None, dir=None): + months = { + "janeiro": 1, + "fevereiro": 2, + "marco": 3, + "abril": 4, + "maio": 5, + "junho": 6, + "julho": 7, + "agosto": 8, + "setembro": 9, + "outubro": 10, + "novembro": 11, + "dezembro": 12, + } + + if year > 2012: + url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-Senatran/frota-de-veiculos-{year}" + else: + raise ValueError("Utilize a função download_frota_old()") + + if not tempdir: + tempdir = tempfile.gettempdir() + if not dir: + dir = os.getcwd() + + def make_filename(i, ext=True): + txt = i["txt"] + mes = i["mes"] + ano = i["ano"] + filetype = i["filetype"] + filename = re.sub("\\s+", "_", txt, flags=re.UNICODE).lower() + filename = f"{filename}_{mes}-{ano}" + if ext: + filename += f".{filetype}" + return filename + + def handle_xl(i): + dest_path_file = os.path.join(dir, f"{i['mes']}-{i['ano']}.{i['filetype']}") + if not os.path.isfile(dest_path_file): + urlretrieve(i["href"], dest_path_file) + + def handle_compact(i): + path_file_zip = os.path.join(tempdir, make_filename(i)) + dir_file = os.path.join(tempdir, make_filename(i, ext=False)) + + if not os.path.isfile(path_file_zip): + urlretrieve(i["href"], path_file_zip) + + if i["filetype"] == "rar": + with RarFile(path_file_zip) as rar_file: + rar_file.extractall(dir_file) + else: + with ZipFile(path_file_zip) as zip_file: + zip_file.extractall(dir_file) + + for filename in os.listdir(dir_file): + filepath = os.path.join(dir_file, filename) + if os.path.isfile(filepath): + if filename.endswith((".xlsx", ".xls")): + dest_path_file = os.path.join( + dir, f"{i['mes']}-{i['ano']}.{filename.split('.')[-1]}" + ) + if not os.path.isfile(dest_path_file): + os.rename(filepath, dest_path_file) + else: + os.remove(filepath) + + def download_file(i): + if i['filetype'] in ['rar', 'zip']: + handle_compact(i) + elif i['filetype'] in ['xlsx', 'xls']: + handle_xl(i) + + soup = BeautifulSoup(urlopen(url), "html.parser") + nodes = soup.select("p > a") + + data = defaultdict(list) + for node in nodes: + txt = node.text + href = node.get('href') + match = re.search(r"(?i)\/([\w-]+)\/(\d{4})\/(\w+)\/([\w-]+)\.(?:xls|xlsx|rar|zip)$", href) + if match: + matched_month = match.group(3) + matched_year = match.group(2) + if months.get(matched_month) == month and matched_year == str(year): + filetype = match.group(0).split('.')[-1].lower() + info = {'txt': txt, 'href': href, 'mes_name': matched_month, 'mes': month, 'ano': year, 'filetype': filetype} + download_file(info) + +download_frota(year=2022, month = 12) \ No newline at end of file From 62b6ddbd99fd255774bcfb9e1151410ed0fbea5e Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 23 Mar 2023 18:22:51 -0300 Subject: [PATCH 006/265] Simply files --- br_denatran_frota/code/download_frota.py | 28 ++--- br_denatran_frota/code/download_frota_gpt.py | 101 ------------------- 2 files changed, 15 insertions(+), 114 deletions(-) delete mode 100644 br_denatran_frota/code/download_frota_gpt.py diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index ff6e0cd94..d12cd9856 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -8,7 +8,7 @@ from collections import defaultdict -def download_frota(key=None, prefix=None, month=None, year=None, tempdir=None, dir=None): +def download_frota( month=None, year=None, tempdir=None, dir=None): months = { "janeiro": 1, "fevereiro": 2, @@ -25,7 +25,7 @@ def download_frota(key=None, prefix=None, month=None, year=None, tempdir=None, d } if year > 2012: - url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-denatran/frota-de-veiculos-{year}" + url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-Senatran/frota-de-veiculos-{year}" else: raise ValueError("Utilize a função download_frota_old()") @@ -46,7 +46,7 @@ def make_filename(i, ext=True): return filename def handle_xl(i): - dest_path_file = os.path.join(dir, f"{prefix}_{i['mes']}-{i['ano']}.{i['filetype']}") + dest_path_file = os.path.join(dir, f"{i['mes']}-{i['ano']}.{i['filetype']}") if not os.path.isfile(dest_path_file): urlretrieve(i["href"], dest_path_file) @@ -69,7 +69,7 @@ def handle_compact(i): if os.path.isfile(filepath): if filename.endswith((".xlsx", ".xls")): dest_path_file = os.path.join( - dir, f"{prefix}_{i['mes']}-{i['ano']}.{filename.split('.')[-1]}" + dir, f"{i['mes']}-{i['ano']}.{filename.split('.')[-1]}" ) if not os.path.isfile(dest_path_file): os.rename(filepath, dest_path_file) @@ -88,12 +88,14 @@ def download_file(i): data = defaultdict(list) for node in nodes: txt = node.text - href = node.attrib["href"] - match = re.search("(?i)xls|xlsx|rar|zip$", href) - if match and re.search(key, txt, re.IGNORECASE) and months.get(match.group(1)) in month: - filetype = match.group().lower() - mes_name = re.search("(%s)" % "|".join(months.keys()), href).group(1) - mes = months[mes_name] - ano = int(re.search("\d{4}", href).group()) - info = {'txt': txt, 'href': href, 'mes_name': mes_name, 'mes': mes, 'ano': ano, 'filetype': filetype} - download_file(info) + href = node.get('href') + match = re.search(r"(?i)\/([\w-]+)\/(\d{4})\/(\w+)\/([\w-]+)\.(?:xls|xlsx|rar|zip)$", href) + if match: + matched_month = match.group(3) + matched_year = match.group(2) + if months.get(matched_month) == month and matched_year == str(year): + filetype = match.group(0).split('.')[-1].lower() + info = {'txt': txt, 'href': href, 'mes_name': matched_month, 'mes': month, 'ano': year, 'filetype': filetype} + download_file(info) + +download_frota(year=2022, month = 12) \ No newline at end of file diff --git a/br_denatran_frota/code/download_frota_gpt.py b/br_denatran_frota/code/download_frota_gpt.py deleted file mode 100644 index d12cd9856..000000000 --- a/br_denatran_frota/code/download_frota_gpt.py +++ /dev/null @@ -1,101 +0,0 @@ -import os -import re -import tempfile -from urllib.request import urlopen, urlretrieve -from zipfile import ZipFile -from rarfile import RarFile -from bs4 import BeautifulSoup -from collections import defaultdict - - -def download_frota( month=None, year=None, tempdir=None, dir=None): - months = { - "janeiro": 1, - "fevereiro": 2, - "marco": 3, - "abril": 4, - "maio": 5, - "junho": 6, - "julho": 7, - "agosto": 8, - "setembro": 9, - "outubro": 10, - "novembro": 11, - "dezembro": 12, - } - - if year > 2012: - url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-Senatran/frota-de-veiculos-{year}" - else: - raise ValueError("Utilize a função download_frota_old()") - - if not tempdir: - tempdir = tempfile.gettempdir() - if not dir: - dir = os.getcwd() - - def make_filename(i, ext=True): - txt = i["txt"] - mes = i["mes"] - ano = i["ano"] - filetype = i["filetype"] - filename = re.sub("\\s+", "_", txt, flags=re.UNICODE).lower() - filename = f"{filename}_{mes}-{ano}" - if ext: - filename += f".{filetype}" - return filename - - def handle_xl(i): - dest_path_file = os.path.join(dir, f"{i['mes']}-{i['ano']}.{i['filetype']}") - if not os.path.isfile(dest_path_file): - urlretrieve(i["href"], dest_path_file) - - def handle_compact(i): - path_file_zip = os.path.join(tempdir, make_filename(i)) - dir_file = os.path.join(tempdir, make_filename(i, ext=False)) - - if not os.path.isfile(path_file_zip): - urlretrieve(i["href"], path_file_zip) - - if i["filetype"] == "rar": - with RarFile(path_file_zip) as rar_file: - rar_file.extractall(dir_file) - else: - with ZipFile(path_file_zip) as zip_file: - zip_file.extractall(dir_file) - - for filename in os.listdir(dir_file): - filepath = os.path.join(dir_file, filename) - if os.path.isfile(filepath): - if filename.endswith((".xlsx", ".xls")): - dest_path_file = os.path.join( - dir, f"{i['mes']}-{i['ano']}.{filename.split('.')[-1]}" - ) - if not os.path.isfile(dest_path_file): - os.rename(filepath, dest_path_file) - else: - os.remove(filepath) - - def download_file(i): - if i['filetype'] in ['rar', 'zip']: - handle_compact(i) - elif i['filetype'] in ['xlsx', 'xls']: - handle_xl(i) - - soup = BeautifulSoup(urlopen(url), "html.parser") - nodes = soup.select("p > a") - - data = defaultdict(list) - for node in nodes: - txt = node.text - href = node.get('href') - match = re.search(r"(?i)\/([\w-]+)\/(\d{4})\/(\w+)\/([\w-]+)\.(?:xls|xlsx|rar|zip)$", href) - if match: - matched_month = match.group(3) - matched_year = match.group(2) - if months.get(matched_month) == month and matched_year == str(year): - filetype = match.group(0).split('.')[-1].lower() - info = {'txt': txt, 'href': href, 'mes_name': matched_month, 'mes': month, 'ano': year, 'filetype': filetype} - download_file(info) - -download_frota(year=2022, month = 12) \ No newline at end of file From c10bd930dd5e606bf452512fe3928a103ff55ae7 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 28 Mar 2023 17:54:43 -0300 Subject: [PATCH 007/265] Installable package + test --- br_denatran_frota/code/__init__.py | 0 br_denatran_frota/code/setup.py | 11 + .../code/test/download_frota_test.py | 39 + poetry.lock | 1552 ++++++++++++++--- pyproject.toml | 1 + 5 files changed, 1402 insertions(+), 201 deletions(-) create mode 100644 br_denatran_frota/code/__init__.py create mode 100644 br_denatran_frota/code/setup.py create mode 100644 br_denatran_frota/code/test/download_frota_test.py diff --git a/br_denatran_frota/code/__init__.py b/br_denatran_frota/code/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/br_denatran_frota/code/setup.py b/br_denatran_frota/code/setup.py new file mode 100644 index 000000000..4a1e6d3ad --- /dev/null +++ b/br_denatran_frota/code/setup.py @@ -0,0 +1,11 @@ +from setuptools import setup + +setup( + name='download_frota', + version='1.0', + py_modules=['download_frota'], + install_requires=[ + 'beautifulsoup4', + 'rarfile', + ], +) diff --git a/br_denatran_frota/code/test/download_frota_test.py b/br_denatran_frota/code/test/download_frota_test.py new file mode 100644 index 000000000..f88ce1e99 --- /dev/null +++ b/br_denatran_frota/code/test/download_frota_test.py @@ -0,0 +1,39 @@ +import os +import tempfile +import unittest +from unittest.mock import patch +from urllib.error import HTTPError +from download_frota import * + + +class TestDownloadFrota(unittest.TestCase): + + def setUp(self): + self.test_dir = tempfile.mkdtemp() + + def tearDown(self): + os.rmdir(self.test_dir) + + def test_download_frota_with_valid_args(self): + with patch('urllib.request.urlretrieve') as mock_urlretrieve: + download_frota(month=2, year=2022, dir=self.test_dir) + mock_urlretrieve.assert_called_once() + + def test_download_frota_with_invalid_year(self): + with self.assertRaises(ValueError): + download_frota(month=1, year=2010) + + def test_download_frota_with_invalid_month(self): + with self.assertRaises(HTTPError): + download_frota(month=13, year=2022, dir=self.test_dir) + + def test_download_frota_with_missing_directory(self): + with self.assertRaises(FileNotFoundError): + download_frota(month=1, year=2022, dir='invalid_directory') + + def test_download_frota_with_missing_temp_directory(self): + with self.assertRaises(FileNotFoundError): + download_frota(month=1, year=2022, tempdir='invalid_directory') + +if __name__ == '__main__': + unittest.main() diff --git a/poetry.lock b/poetry.lock index 60a414b94..ac53e631b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. + [[package]] name = "async-timeout" version = "4.0.2" @@ -5,6 +7,10 @@ description = "Timeout context manager for asyncio programs" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] [[package]] name = "atomicwrites" @@ -13,6 +19,10 @@ description = "Atomic file writes." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] [[package]] name = "attrs" @@ -21,12 +31,16 @@ description = "Classes Without Boilerplate" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, + {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, +] [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] +dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] +docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] +tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] +tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] [[package]] name = "basedosdados" @@ -35,6 +49,10 @@ description = "Organizar e facilitar o acesso a dados brasileiros através de ta category = "main" optional = false python-versions = ">=3.7.1,<3.11" +files = [ + {file = "basedosdados-1.6.9-py3-none-any.whl", hash = "sha256:9a73ad8a3667cca327d81c5d41ec809ed0675825dfc5d93d1efcf45f9bd1e867"}, + {file = "basedosdados-1.6.9.tar.gz", hash = "sha256:51783ea130944295dbc6b7dcbad8676ca0ff0234cdf2b4d212177bcd12db7921"}, +] [package.dependencies] ckanapi = "4.6" @@ -62,6 +80,10 @@ description = "Screen-scraping library" category = "main" optional = false python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, + {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, +] [package.dependencies] soupsieve = ">1.2" @@ -77,6 +99,10 @@ description = "Extensible memoizing collections and decorators" category = "main" optional = false python-versions = "~=3.5" +files = [ + {file = "cachetools-4.2.4-py3-none-any.whl", hash = "sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1"}, + {file = "cachetools-4.2.4.tar.gz", hash = "sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693"}, +] [[package]] name = "certifi" @@ -85,6 +111,10 @@ description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false python-versions = "*" +files = [ + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, +] [[package]] name = "cfgv" @@ -93,6 +123,10 @@ description = "Validate configuration and produce human readable error messages. category = "main" optional = false python-versions = ">=3.6.1" +files = [ + {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, + {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, +] [[package]] name = "charset-normalizer" @@ -101,9 +135,13 @@ description = "The Real First Universal Charset Detector. Open, modern and activ category = "main" optional = false python-versions = ">=3.5.0" +files = [ + {file = "charset-normalizer-2.0.8.tar.gz", hash = "sha256:735e240d9a8506778cd7a453d97e817e536bb1fc29f4f6961ce297b9c7a917b0"}, + {file = "charset_normalizer-2.0.8-py3-none-any.whl", hash = "sha256:83fcdeb225499d6344c8f7f34684c2981270beacc32ede2e669e94f7fa544405"}, +] [package.extras] -unicode_backport = ["unicodedata2"] +unicode-backport = ["unicodedata2"] [[package]] name = "ckanapi" @@ -112,11 +150,15 @@ description = "A command line interface and Python module for accessing the CKAN category = "main" optional = false python-versions = "*" +files = [ + {file = "ckanapi-4.6.tar.gz", hash = "sha256:35361965bfb38c8e146d7229f2d7c3aaf1c0f2ef547de4239b4d38931bf081d2"}, +] [package.dependencies] docopt = "*" python-slugify = ">=1.0" requests = "*" +setuptools = "*" six = ">=1.9,<2.0" [[package]] @@ -126,6 +168,10 @@ description = "Composable command line interface toolkit" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, + {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -137,6 +183,10 @@ description = "Extended pickling support for Python objects" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "cloudpickle-2.0.0-py3-none-any.whl", hash = "sha256:6b2df9741d06f43839a3275c4e6632f7df6487a1f181f5f46a052d3c917c3d11"}, + {file = "cloudpickle-2.0.0.tar.gz", hash = "sha256:5cd02f3b417a783ba84a4ec3e290ff7929009fe51f6405423cfccfadd43ba4a4"}, +] [[package]] name = "colorama" @@ -145,6 +195,10 @@ description = "Cross-platform colored terminal text." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] [[package]] name = "coverage" @@ -153,6 +207,59 @@ description = "Code coverage measurement for Python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "coverage-7.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c90e73bdecb7b0d1cea65a08cb41e9d672ac6d7995603d6465ed4914b98b9ad7"}, + {file = "coverage-7.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e2926b8abedf750c2ecf5035c07515770944acf02e1c46ab08f6348d24c5f94d"}, + {file = "coverage-7.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57b77b9099f172804e695a40ebaa374f79e4fb8b92f3e167f66facbf92e8e7f5"}, + {file = "coverage-7.2.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efe1c0adad110bf0ad7fb59f833880e489a61e39d699d37249bdf42f80590169"}, + {file = "coverage-7.2.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2199988e0bc8325d941b209f4fd1c6fa007024b1442c5576f1a32ca2e48941e6"}, + {file = "coverage-7.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:81f63e0fb74effd5be736cfe07d710307cc0a3ccb8f4741f7f053c057615a137"}, + {file = "coverage-7.2.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:186e0fc9cf497365036d51d4d2ab76113fb74f729bd25da0975daab2e107fd90"}, + {file = "coverage-7.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:420f94a35e3e00a2b43ad5740f935358e24478354ce41c99407cddd283be00d2"}, + {file = "coverage-7.2.2-cp310-cp310-win32.whl", hash = "sha256:38004671848b5745bb05d4d621526fca30cee164db42a1f185615f39dc997292"}, + {file = "coverage-7.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:0ce383d5f56d0729d2dd40e53fe3afeb8f2237244b0975e1427bfb2cf0d32bab"}, + {file = "coverage-7.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3eb55b7b26389dd4f8ae911ba9bc8c027411163839dea4c8b8be54c4ee9ae10b"}, + {file = "coverage-7.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d2b96123a453a2d7f3995ddb9f28d01fd112319a7a4d5ca99796a7ff43f02af5"}, + {file = "coverage-7.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:299bc75cb2a41e6741b5e470b8c9fb78d931edbd0cd009c58e5c84de57c06731"}, + {file = "coverage-7.2.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e1df45c23d4230e3d56d04414f9057eba501f78db60d4eeecfcb940501b08fd"}, + {file = "coverage-7.2.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:006ed5582e9cbc8115d2e22d6d2144a0725db542f654d9d4fda86793832f873d"}, + {file = "coverage-7.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d683d230b5774816e7d784d7ed8444f2a40e7a450e5720d58af593cb0b94a212"}, + {file = "coverage-7.2.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8efb48fa743d1c1a65ee8787b5b552681610f06c40a40b7ef94a5b517d885c54"}, + {file = "coverage-7.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4c752d5264053a7cf2fe81c9e14f8a4fb261370a7bb344c2a011836a96fb3f57"}, + {file = "coverage-7.2.2-cp311-cp311-win32.whl", hash = "sha256:55272f33da9a5d7cccd3774aeca7a01e500a614eaea2a77091e9be000ecd401d"}, + {file = "coverage-7.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:92ebc1619650409da324d001b3a36f14f63644c7f0a588e331f3b0f67491f512"}, + {file = "coverage-7.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5afdad4cc4cc199fdf3e18088812edcf8f4c5a3c8e6cb69127513ad4cb7471a9"}, + {file = "coverage-7.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0484d9dd1e6f481b24070c87561c8d7151bdd8b044c93ac99faafd01f695c78e"}, + {file = "coverage-7.2.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d530191aa9c66ab4f190be8ac8cc7cfd8f4f3217da379606f3dd4e3d83feba69"}, + {file = "coverage-7.2.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac0f522c3b6109c4b764ffec71bf04ebc0523e926ca7cbe6c5ac88f84faced0"}, + {file = "coverage-7.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ba279aae162b20444881fc3ed4e4f934c1cf8620f3dab3b531480cf602c76b7f"}, + {file = "coverage-7.2.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:53d0fd4c17175aded9c633e319360d41a1f3c6e352ba94edcb0fa5167e2bad67"}, + {file = "coverage-7.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c99cb7c26a3039a8a4ee3ca1efdde471e61b4837108847fb7d5be7789ed8fd9"}, + {file = "coverage-7.2.2-cp37-cp37m-win32.whl", hash = "sha256:5cc0783844c84af2522e3a99b9b761a979a3ef10fb87fc4048d1ee174e18a7d8"}, + {file = "coverage-7.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:817295f06eacdc8623dc4df7d8b49cea65925030d4e1e2a7c7218380c0072c25"}, + {file = "coverage-7.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6146910231ece63facfc5984234ad1b06a36cecc9fd0c028e59ac7c9b18c38c6"}, + {file = "coverage-7.2.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:387fb46cb8e53ba7304d80aadca5dca84a2fbf6fe3faf6951d8cf2d46485d1e5"}, + {file = "coverage-7.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:046936ab032a2810dcaafd39cc4ef6dd295df1a7cbead08fe996d4765fca9fe4"}, + {file = "coverage-7.2.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e627dee428a176ffb13697a2c4318d3f60b2ccdde3acdc9b3f304206ec130ccd"}, + {file = "coverage-7.2.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fa54fb483decc45f94011898727802309a109d89446a3c76387d016057d2c84"}, + {file = "coverage-7.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3668291b50b69a0c1ef9f462c7df2c235da3c4073f49543b01e7eb1dee7dd540"}, + {file = "coverage-7.2.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7c20b731211261dc9739bbe080c579a1835b0c2d9b274e5fcd903c3a7821cf88"}, + {file = "coverage-7.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5764e1f7471cb8f64b8cda0554f3d4c4085ae4b417bfeab236799863703e5de2"}, + {file = "coverage-7.2.2-cp38-cp38-win32.whl", hash = "sha256:4f01911c010122f49a3e9bdc730eccc66f9b72bd410a3a9d3cb8448bb50d65d3"}, + {file = "coverage-7.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:c448b5c9e3df5448a362208b8d4b9ed85305528313fca1b479f14f9fe0d873b8"}, + {file = "coverage-7.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfe7085783cda55e53510482fa7b5efc761fad1abe4d653b32710eb548ebdd2d"}, + {file = "coverage-7.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9d22e94e6dc86de981b1b684b342bec5e331401599ce652900ec59db52940005"}, + {file = "coverage-7.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:507e4720791977934bba016101579b8c500fb21c5fa3cd4cf256477331ddd988"}, + {file = "coverage-7.2.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc4803779f0e4b06a2361f666e76f5c2e3715e8e379889d02251ec911befd149"}, + {file = "coverage-7.2.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db8c2c5ace167fd25ab5dd732714c51d4633f58bac21fb0ff63b0349f62755a8"}, + {file = "coverage-7.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4f68ee32d7c4164f1e2c8797535a6d0a3733355f5861e0f667e37df2d4b07140"}, + {file = "coverage-7.2.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d52f0a114b6a58305b11a5cdecd42b2e7f1ec77eb20e2b33969d702feafdd016"}, + {file = "coverage-7.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:797aad79e7b6182cb49c08cc5d2f7aa7b2128133b0926060d0a8889ac43843be"}, + {file = "coverage-7.2.2-cp39-cp39-win32.whl", hash = "sha256:db45eec1dfccdadb179b0f9ca616872c6f700d23945ecc8f21bb105d74b1c5fc"}, + {file = "coverage-7.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:8dbe2647bf58d2c5a6c5bcc685f23b5f371909a5624e9f5cd51436d6a9f6c6ef"}, + {file = "coverage-7.2.2-pp37.pp38.pp39-none-any.whl", hash = "sha256:872d6ce1f5be73f05bea4df498c140b9e7ee5418bfa2cc8204e7f9b817caa968"}, + {file = "coverage-7.2.2.tar.gz", hash = "sha256:36dd42da34fe94ed98c39887b86db9d06777b1c8f860520e21126a75507024f2"}, +] [package.dependencies] tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} @@ -167,6 +274,10 @@ description = "croniter provides iteration for datetime object with cron like fo category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "croniter-1.0.15-py2.py3-none-any.whl", hash = "sha256:0f97b361fe343301a8f66f852e7d84e4fb7f21379948f71e1bbfe10f5d015fbd"}, + {file = "croniter-1.0.15.tar.gz", hash = "sha256:a70dfc9d52de9fc1a886128b9148c89dd9e76b67d55f46516ca94d2d73d58219"}, +] [package.dependencies] python-dateutil = "*" @@ -178,6 +289,10 @@ description = "Composable style cycles" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, + {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, +] [[package]] name = "dask" @@ -186,6 +301,10 @@ description = "Parallel PyData with Task Scheduling" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "dask-2021.11.2-py3-none-any.whl", hash = "sha256:2b0ad7beba8950add4fdc7c5cb94fa9444915ddb00c711d5743e2c4bb0a95ef5"}, + {file = "dask-2021.11.2.tar.gz", hash = "sha256:e12bfe272928d62fa99623d98d0e0b0c045b33a47509ef31a22175aa5fd10917"}, +] [package.dependencies] cloudpickle = ">=1.1.1" @@ -201,7 +320,7 @@ complete = ["bokeh (>=1.0.0,!=2.0.0)", "distributed (==2021.11.2)", "jinja2", "n dataframe = ["numpy (>=1.18)", "pandas (>=1.0)"] diagnostics = ["bokeh (>=1.0.0,!=2.0.0)", "jinja2"] distributed = ["distributed (==2021.11.2)"] -test = ["pytest", "pytest-rerunfailures", "pytest-xdist", "pre-commit"] +test = ["pre-commit", "pytest", "pytest-rerunfailures", "pytest-xdist"] [[package]] name = "db-dtypes" @@ -210,6 +329,10 @@ description = "Pandas Data Types for SQL systems (BigQuery, Spanner)" category = "main" optional = false python-versions = ">=3.6, <3.11" +files = [ + {file = "db-dtypes-1.0.1.tar.gz", hash = "sha256:3eb5931c9f8c314a1a4aeb698a7eb1d713cddaed4a7a13f0408a8785c4a72330"}, + {file = "db_dtypes-1.0.1-py2.py3-none-any.whl", hash = "sha256:b26b295773d2a4b445f6a7f297ec04dd9eb5d3fb26622032550da013486ba7b7"}, +] [package.dependencies] numpy = ">=1.16.6,<2.0dev" @@ -224,6 +347,10 @@ description = "A simple client for DBT RPC instances" category = "main" optional = false python-versions = ">=3.8,<4.0" +files = [ + {file = "dbt-client-0.1.3.tar.gz", hash = "sha256:192fff51a51d6d002d4048dd494e601592599e004c0f31f1ea5156aa6d516cf5"}, + {file = "dbt_client-0.1.3-py3-none-any.whl", hash = "sha256:31a0db4844c1559c95c643a6f57d1e39d4e9c3b4d9a8c867f7b3e6ed75cedca0"}, +] [package.dependencies] requests = ">=2.26.0,<3.0.0" @@ -235,12 +362,16 @@ description = "Python @deprecated decorator to deprecate old python classes, fun category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Deprecated-1.2.13-py2.py3-none-any.whl", hash = "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d"}, + {file = "Deprecated-1.2.13.tar.gz", hash = "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d"}, +] [package.dependencies] wrapt = ">=1.10,<2" [package.extras] -dev = ["tox", "bump2version (<1)", "sphinx (<2)", "importlib-metadata (<3)", "importlib-resources (<4)", "configparser (<5)", "sphinxcontrib-websupport (<2)", "zipp (<2)", "PyTest (<5)", "PyTest-Cov (<2.6)", "pytest", "pytest-cov"] +dev = ["PyTest", "PyTest (<5)", "PyTest-Cov", "PyTest-Cov (<2.6)", "bump2version (<1)", "configparser (<5)", "importlib-metadata (<3)", "importlib-resources (<4)", "sphinx (<2)", "sphinxcontrib-websupport (<2)", "tox", "zipp (<2)"] [[package]] name = "dill" @@ -249,6 +380,10 @@ description = "serialize all of python" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "dill-0.3.5.1-py2.py3-none-any.whl", hash = "sha256:33501d03270bbe410c72639b350e941882a8b0fd55357580fbc873fba0c59302"}, + {file = "dill-0.3.5.1.tar.gz", hash = "sha256:d75e41f3eff1eee599d738e76ba8f4ad98ea229db8b085318aa2b3333a208c86"}, +] [package.extras] graph = ["objgraph (>=1.7.2)"] @@ -260,6 +395,10 @@ description = "Distribution utilities" category = "main" optional = false python-versions = "*" +files = [ + {file = "distlib-0.3.5-py2.py3-none-any.whl", hash = "sha256:b710088c59f06338ca514800ad795a132da19fda270e3ce4affc74abf955a26c"}, + {file = "distlib-0.3.5.tar.gz", hash = "sha256:a7f75737c70be3b25e2bee06288cec4e4c221de18455b2dd037fe2a795cab2fe"}, +] [[package]] name = "distributed" @@ -268,6 +407,10 @@ description = "Distributed scheduler for Dask" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "distributed-2021.11.2-py3-none-any.whl", hash = "sha256:af1f7b98d85d43886fefe2354379c848c7a5aa6ae4d2313a7aca9ab9081a7e56"}, + {file = "distributed-2021.11.2.tar.gz", hash = "sha256:f86a01a2e1e678865d2e42300c47552b5012cd81a2d354e47827a1fd074cc302"}, +] [package.dependencies] click = ">=6.6" @@ -277,6 +420,7 @@ jinja2 = "*" msgpack = ">=0.6.0" psutil = ">=5.0" pyyaml = "*" +setuptools = "*" sortedcontainers = "<2.0.0 || >2.0.0,<2.0.1 || >2.0.1" tblib = ">=1.6.0" toolz = ">=0.8.2" @@ -290,6 +434,10 @@ description = "A Python library for the Docker Engine API." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "docker-5.0.3-py2.py3-none-any.whl", hash = "sha256:7a79bb439e3df59d0a72621775d600bc8bc8b422d285824cb37103eab91d1ce0"}, + {file = "docker-5.0.3.tar.gz", hash = "sha256:d916a26b62970e7c2f554110ed6af04c7ccff8e9f81ad17d0d40c75637e227fb"}, +] [package.dependencies] pywin32 = {version = "227", markers = "sys_platform == \"win32\""} @@ -298,7 +446,7 @@ websocket-client = ">=0.32.0" [package.extras] ssh = ["paramiko (>=2.4.2)"] -tls = ["pyOpenSSL (>=17.5.0)", "cryptography (>=3.4.7)", "idna (>=2.0.0)"] +tls = ["cryptography (>=3.4.7)", "idna (>=2.0.0)", "pyOpenSSL (>=17.5.0)"] [[package]] name = "docopt" @@ -307,6 +455,9 @@ description = "Pythonic argument parser, that will make you smile" category = "main" optional = false python-versions = "*" +files = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] [[package]] name = "fastavro" @@ -315,9 +466,27 @@ description = "Fast read/write of AVRO files" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "fastavro-1.4.11-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:44f01008f95d685edacc4b10366c755d25612df00924349f7d34a29f08522ce3"}, + {file = "fastavro-1.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f5e736d12e67348f253da8a332d7c3b483ca04f2b6e772befa79d1a46bac9d"}, + {file = "fastavro-1.4.11-cp310-cp310-win_amd64.whl", hash = "sha256:8dca11bc3191cd7de0a3c4b76a70dac493356a219e96ebcde0def1f06faddef7"}, + {file = "fastavro-1.4.11-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7a2a0bf03686f9d860e8f8476be000f5b3e6cc9af6853dbabab2ef9cfa5dc3a0"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c17e3decfac260e1be4d02d1903d2483eec2f3ce7f92c9b808a0f6a81572c4b"}, + {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ba25c6529f50722a7618cc4ca24c7d265def57fd9f94e4e554e1df8cce38d2"}, + {file = "fastavro-1.4.11-cp37-cp37m-win_amd64.whl", hash = "sha256:ceaba04da9419f40899a670eb62eb373a127b511bb8e3ae4f6f1f23ec49bd0e4"}, + {file = "fastavro-1.4.11-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:732eab3a1ae5d2c3f4b52e747c55bcc41c4df0eb7e8a395038080741a3c0a934"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03d3c802b71f44e7b3442abae961bba996258244bd222b242ad1e5cb7754e57"}, + {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cb7475a9b25b9f8aebe7eb756dafedd0369434571062f3883d894281befd7c"}, + {file = "fastavro-1.4.11-cp38-cp38-win_amd64.whl", hash = "sha256:ce0776f54591aef90bcd02bd919964abe4c2ad2a10a4336c3a1b66cef289b41c"}, + {file = "fastavro-1.4.11-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:621e72cc365c9539d7590e7b43e48a62e6bfb4c2de7c16837fed54d113d7312c"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842b25782f911ee8c626f9d9fedc2ef01aeac272536fe90ee6d45b2ae7cdb024"}, + {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8491bfcba25c9d661289f884688e5a4f56f2ee389a240d0ad02692495a9a087"}, + {file = "fastavro-1.4.11-cp39-cp39-win_amd64.whl", hash = "sha256:c94130a8c8d80073eb0276844915aa5e928ae322024e76dc57943542ccda211c"}, + {file = "fastavro-1.4.11.tar.gz", hash = "sha256:7c64332ad52de0134be9a933ca986514c3ff85c63d54bc5398c31f0498ac1820"}, +] [package.extras] -codecs = ["python-snappy", "zstandard", "lz4"] +codecs = ["lz4", "python-snappy", "zstandard"] lz4 = ["lz4"] snappy = ["python-snappy"] zstandard = ["zstandard"] @@ -329,6 +498,10 @@ description = "A platform independent file lock." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "filelock-3.7.1-py3-none-any.whl", hash = "sha256:37def7b658813cda163b56fc564cdc75e86d338246458c4c28ae84cabefa2404"}, + {file = "filelock-3.7.1.tar.gz", hash = "sha256:3a0fd85166ad9dbab54c9aec96737b744106dc5f15c0b09a6744a445299fcf04"}, +] [package.extras] docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] @@ -341,11 +514,15 @@ description = "Tools to manipulate font files" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "fonttools-4.33.3-py3-none-any.whl", hash = "sha256:f829c579a8678fa939a1d9e9894d01941db869de44390adb49ce67055a06cc2a"}, + {file = "fonttools-4.33.3.zip", hash = "sha256:c0fdcfa8ceebd7c1b2021240bd46ef77aa8e7408cf10434be55df52384865f8e"}, +] [package.extras] -all = ["fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "zopfli (>=0.1.4)", "lz4 (>=1.7.4.2)", "matplotlib", "sympy", "skia-pathops (>=0.5.0)", "uharfbuzz (>=0.23.0)", "brotlicffi (>=0.8.0)", "scipy", "brotli (>=1.0.1)", "munkres", "unicodedata2 (>=14.0.0)", "xattr"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=14.0.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["scipy", "munkres"] +interpolatable = ["munkres", "scipy"] lxml = ["lxml (>=4.0,<5)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] @@ -354,7 +531,7 @@ symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] unicode = ["unicodedata2 (>=14.0.0)"] -woff = ["zopfli (>=0.1.4)", "brotlicffi (>=0.8.0)", "brotli (>=1.0.1)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "fsspec" @@ -363,13 +540,17 @@ description = "File-system specification" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "fsspec-2021.11.1-py3-none-any.whl", hash = "sha256:bcb136caa37e1470dd8314a7d3917cb9b25dd9da44c10d36df556ab4ef038185"}, + {file = "fsspec-2021.11.1.tar.gz", hash = "sha256:03683e606651d5e4bd9180525d57477bd5430e5dc68d2e459835dc14cecc3dd4"}, +] [package.extras] abfs = ["adlfs"] adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] -dropbox = ["dropboxdrivefs", "requests", "dropbox"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] entrypoints = ["importlib-metadata"] fuse = ["fusepy"] gcs = ["gcsfs"] @@ -378,7 +559,7 @@ github = ["requests"] gs = ["gcsfs"] gui = ["panel"] hdfs = ["pyarrow (>=1)"] -http = ["requests", "aiohttp"] +http = ["aiohttp", "requests"] libarchive = ["libarchive-c"] oci = ["ocifs"] s3 = ["s3fs"] @@ -393,6 +574,10 @@ description = "" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "google-analytics-data-0.12.1.tar.gz", hash = "sha256:8d5436797338683ff80988d6303e1bbeca01a1d7ece73c248fe2315aa2ae70dc"}, + {file = "google_analytics_data-0.12.1-py2.py3-none-any.whl", hash = "sha256:320a16df6624606abbceef85c6b0a67727eff48f27da347630929b3ee28cd5ff"}, +] [package.dependencies] google-api-core = {version = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} @@ -406,6 +591,10 @@ description = "Google API client core library" category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +files = [ + {file = "google-api-core-1.31.5.tar.gz", hash = "sha256:85d2074f2c8f9c07e614d7f978767d71ceb7d40647814ef4236d3a0ef671ee75"}, + {file = "google_api_core-1.31.5-py2.py3-none-any.whl", hash = "sha256:6815207a8b422e9da42c200681603f304b25f98c98b675a9db9fdc3717e44280"}, +] [package.dependencies] google-auth = ">=1.25.0,<2.0dev" @@ -415,6 +604,7 @@ packaging = ">=14.3" protobuf = {version = ">=3.12.0", markers = "python_version > \"3\""} pytz = "*" requests = ">=2.18.0,<3.0.0dev" +setuptools = ">=40.3.0" six = ">=1.13.0" [package.extras] @@ -429,6 +619,10 @@ description = "Google API Client Library for Python" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "google-api-python-client-2.58.0.tar.gz", hash = "sha256:3af6a181763a8cb18f2b9d973760ba32e4fe2af09e4ce06626ff6a53777c33fa"}, + {file = "google_api_python_client-2.58.0-py2.py3-none-any.whl", hash = "sha256:8f4eeed1b46f3f445307719aa3e9678e429d90c0af4f22ada707a72ba10fe02d"}, +] [package.dependencies] google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev" @@ -444,15 +638,20 @@ description = "Google Authentication Library" category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +files = [ + {file = "google-auth-1.35.0.tar.gz", hash = "sha256:b7033be9028c188ee30200b204ea00ed82ea1162e8ac1df4aa6ded19a191d88e"}, + {file = "google_auth-1.35.0-py2.py3-none-any.whl", hash = "sha256:997516b42ecb5b63e8d80f5632c1a61dddf41d2a4c2748057837e06e00014258"}, +] [package.dependencies] cachetools = ">=2.0.0,<5.0" pyasn1-modules = ">=0.2.1" rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} +setuptools = ">=40.3.0" six = ">=1.9.0" [package.extras] -aiohttp = ["requests (>=2.20.0,<3.0.0dev)", "aiohttp (>=3.6.2,<4.0.0dev)"] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] pyopenssl = ["pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] @@ -463,6 +662,10 @@ description = "Google Authentication Library: httplib2 transport" category = "main" optional = false python-versions = "*" +files = [ + {file = "google-auth-httplib2-0.1.0.tar.gz", hash = "sha256:a07c39fd632becacd3f07718dfd6021bf396978f03ad3ce4321d060015cc30ac"}, + {file = "google_auth_httplib2-0.1.0-py2.py3-none-any.whl", hash = "sha256:31e49c36c6b5643b57e82617cb3e021e3e1d2df9da63af67252c02fa9c1f4a10"}, +] [package.dependencies] google-auth = "*" @@ -476,6 +679,10 @@ description = "Google Authentication Library" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "google-auth-oauthlib-0.4.6.tar.gz", hash = "sha256:a90a072f6993f2c327067bf65270046384cda5a8ecb20b94ea9a687f1f233a7a"}, + {file = "google_auth_oauthlib-0.4.6-py2.py3-none-any.whl", hash = "sha256:3f2a6e802eebbb6fb736a370fbf3b055edcb6b52878bf2f26330b5e041316c73"}, +] [package.dependencies] google-auth = ">=1.0.0" @@ -491,6 +698,10 @@ description = "Google BigQuery API client library" category = "main" optional = false python-versions = ">=3.6, <3.11" +files = [ + {file = "google-cloud-bigquery-2.30.1.tar.gz", hash = "sha256:4e3b5e3dcc475d5a601d84872ac0b63e059540be2251b1c4165c51106d572855"}, + {file = "google_cloud_bigquery-2.30.1-py2.py3-none-any.whl", hash = "sha256:c62d601aa0f62388e1909d11de40db7597b02fb8602ccb7f21a3ac2a0997495b"}, +] [package.dependencies] google-api-core = {version = ">=1.29.0,<3.0.0dev", extras = ["grpc"]} @@ -504,11 +715,11 @@ python-dateutil = ">=2.7.2,<3.0dev" requests = ">=2.18.0,<3.0.0dev" [package.extras] -all = ["google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.38.1,<2.0dev)", "pyarrow (>=3.0.0,<7.0dev)", "geopandas (>=0.9.0,<1.0dev)", "Shapely (>=1.6.0,<2.0dev)", "pandas (>=0.24.2)", "tqdm (>=4.7.4,<5.0.0dev)", "opentelemetry-api (>=0.11b0)", "opentelemetry-sdk (>=0.11b0)", "opentelemetry-instrumentation (>=0.11b0)"] -bignumeric_type = ["pyarrow (>=3.0.0,<7.0dev)"] +all = ["Shapely (>=1.6.0,<2.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.38.1,<2.0dev)", "opentelemetry-api (>=0.11b0)", "opentelemetry-instrumentation (>=0.11b0)", "opentelemetry-sdk (>=0.11b0)", "pandas (>=0.24.2)", "pyarrow (>=3.0.0,<7.0dev)", "tqdm (>=4.7.4,<5.0.0dev)"] +bignumeric-type = ["pyarrow (>=3.0.0,<7.0dev)"] bqstorage = ["google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.38.1,<2.0dev)", "pyarrow (>=3.0.0,<7.0dev)"] -geopandas = ["geopandas (>=0.9.0,<1.0dev)", "Shapely (>=1.6.0,<2.0dev)"] -opentelemetry = ["opentelemetry-api (>=0.11b0)", "opentelemetry-sdk (>=0.11b0)", "opentelemetry-instrumentation (>=0.11b0)"] +geopandas = ["Shapely (>=1.6.0,<2.0dev)", "geopandas (>=0.9.0,<1.0dev)"] +opentelemetry = ["opentelemetry-api (>=0.11b0)", "opentelemetry-instrumentation (>=0.11b0)", "opentelemetry-sdk (>=0.11b0)"] pandas = ["pandas (>=0.24.2)", "pyarrow (>=3.0.0,<7.0dev)"] tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] @@ -519,6 +730,10 @@ description = "BigQuery Storage API API client library" category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +files = [ + {file = "google-cloud-bigquery-storage-1.1.0.tar.gz", hash = "sha256:c92533cedbb672f1a35555c112d4d5cccb9f8f6d0e98a604fbf98223773adad3"}, + {file = "google_cloud_bigquery_storage-1.1.0-py2.py3-none-any.whl", hash = "sha256:fc543e9d2343d34c043ad48984333ba84de10be31b7af8435548aaf8555507c4"}, +] [package.dependencies] google-api-core = {version = ">=1.14.0,<2.0.0dev", extras = ["grpc"]} @@ -535,6 +750,10 @@ description = "Google Cloud API client core library" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "google-cloud-core-2.2.1.tar.gz", hash = "sha256:476d1f71ab78089e0638e0aaf34bfdc99bab4fce8f4170ba6321a5243d13c5c7"}, + {file = "google_cloud_core-2.2.1-py2.py3-none-any.whl", hash = "sha256:ab6cee07791afe4e210807ceeab749da6a076ab16d496ac734bf7e6ffea27486"}, +] [package.dependencies] google-api-core = ">=1.21.0,<3.0.0dev" @@ -550,6 +769,10 @@ description = "Google Cloud Storage API client library" category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +files = [ + {file = "google-cloud-storage-1.42.3.tar.gz", hash = "sha256:7754d4dcaa45975514b404ece0da2bb4292acbc67ca559a69e12a19d54fcdb06"}, + {file = "google_cloud_storage-1.42.3-py2.py3-none-any.whl", hash = "sha256:71ee3a0dcf2c139f034a054181cd7658f1ec8f12837d2769c450a8a00fcd4c6d"}, +] [package.dependencies] google-api-core = {version = ">=1.29.0,<3.0dev", markers = "python_version >= \"3.6\""} @@ -567,6 +790,51 @@ description = "A python wrapper of the C library 'Google CRC32C'" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "google-crc32c-1.3.0.tar.gz", hash = "sha256:276de6273eb074a35bc598f8efbc00c7869c5cf2e29c90748fccc8c898c244df"}, + {file = "google_crc32c-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cb6994fff247987c66a8a4e550ef374671c2b82e3c0d2115e689d21e511a652d"}, + {file = "google_crc32c-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9da0a39b53d2fab3e5467329ed50e951eb91386e9d0d5b12daf593973c3b168"}, + {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:eb0b14523758e37802f27b7f8cd973f5f3d33be7613952c0df904b68c4842f0e"}, + {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:95c68a4b9b7828ba0428f8f7e3109c5d476ca44996ed9a5f8aac6269296e2d59"}, + {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c3cf890c3c0ecfe1510a452a165431b5831e24160c5fcf2071f0f85ca5a47cd"}, + {file = "google_crc32c-1.3.0-cp310-cp310-win32.whl", hash = "sha256:3bbce1be3687bbfebe29abdb7631b83e6b25da3f4e1856a1611eb21854b689ea"}, + {file = "google_crc32c-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:c124b8c8779bf2d35d9b721e52d4adb41c9bfbde45e6a3f25f0820caa9aba73f"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:42ae4781333e331a1743445931b08ebdad73e188fd554259e772556fc4937c48"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ff71073ebf0e42258a42a0b34f2c09ec384977e7f6808999102eedd5b49920e3"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fe31de3002e7b08eb20823b3735b97c86c5926dd0581c7710a680b418a8709d4"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd7760a88a8d3d705ff562aa93f8445ead54f58fd482e4f9e2bafb7e177375d4"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0b9e622c3b2b8d0ce32f77eba617ab0d6768b82836391e4f8f9e2074582bf02"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-win32.whl", hash = "sha256:779cbf1ce375b96111db98fca913c1f5ec11b1d870e529b1dc7354b2681a8c3a"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:04e7c220798a72fd0f08242bc8d7a05986b2a08a0573396187fd32c1dcdd58b3"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e7a539b9be7b9c00f11ef16b55486141bc2cdb0c54762f84e3c6fc091917436d"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ca60076c388728d3b6ac3846842474f4250c91efbfe5afa872d3ffd69dd4b318"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05340b60bf05b574159e9bd940152a47d38af3fb43803ffe71f11d704b7696a6"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:318f73f5484b5671f0c7f5f63741ab020a599504ed81d209b5c7129ee4667407"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f58099ad7affc0754ae42e6d87443299f15d739b0ce03c76f515153a5cda06c"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-win32.whl", hash = "sha256:f52a4ad2568314ee713715b1e2d79ab55fab11e8b304fd1462ff5cccf4264b3e"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bab4aebd525218bab4ee615786c4581952eadc16b1ff031813a2fd51f0cc7b08"}, + {file = "google_crc32c-1.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dda4d8a3bb0b50f540f6ff4b6033f3a74e8bf0bd5320b70fab2c03e512a62812"}, + {file = "google_crc32c-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fec221a051150eeddfdfcff162e6db92c65ecf46cb0f7bb1bf812a1520ec026b"}, + {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:226f2f9b8e128a6ca6a9af9b9e8384f7b53a801907425c9a292553a3a7218ce0"}, + {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a7f9cbea4245ee36190f85fe1814e2d7b1e5f2186381b082f5d59f99b7f11328"}, + {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a4db36f9721fdf391646685ecffa404eb986cbe007a3289499020daf72e88a2"}, + {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:12674a4c3b56b706153a358eaa1018c4137a5a04635b92b4652440d3d7386206"}, + {file = "google_crc32c-1.3.0-cp38-cp38-win32.whl", hash = "sha256:650e2917660e696041ab3dcd7abac160b4121cd9a484c08406f24c5964099829"}, + {file = "google_crc32c-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:58be56ae0529c664cc04a9c76e68bb92b091e0194d6e3c50bea7e0f266f73713"}, + {file = "google_crc32c-1.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:96a8918a78d5d64e07c8ea4ed2bc44354e3f93f46a4866a40e8db934e4c0d74b"}, + {file = "google_crc32c-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:13af315c3a0eec8bb8b8d80b8b128cb3fcd17d7e4edafc39647846345a3f003a"}, + {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6311853aa2bba4064d0c28ca54e7b50c4d48e3de04f6770f6c60ebda1e975267"}, + {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ed447680ff21c14aaceb6a9f99a5f639f583ccfe4ce1a5e1d48eb41c3d6b3217"}, + {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1c1d6236feab51200272d79b3d3e0f12cf2cbb12b208c835b175a21efdb0a73"}, + {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e0f1ff55dde0ebcfbef027edc21f71c205845585fffe30d4ec4979416613e9b3"}, + {file = "google_crc32c-1.3.0-cp39-cp39-win32.whl", hash = "sha256:fbd60c6aaa07c31d7754edbc2334aef50601b7f1ada67a96eb1eb57c7c72378f"}, + {file = "google_crc32c-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:127f9cc3ac41b6a859bd9dc4321097b1a4f6aa7fdf71b4f9227b9e3ebffb4422"}, + {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fc28e0db232c62ca0c3600884933178f0825c99be4474cdd645e378a10588125"}, + {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1926fd8de0acb9d15ee757175ce7242e235482a783cd4ec711cc999fc103c24e"}, + {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5da2c81575cc3ccf05d9830f9e8d3c70954819ca9a63828210498c0774fda1a3"}, + {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:891f712ce54e0d631370e1f4997b3f182f3368179198efc30d477c75d1f44942"}, + {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:7f6fe42536d9dcd3e2ffb9d3053f5d05221ae3bbcefbe472bdf2c71c793e3183"}, +] [package.extras] testing = ["pytest"] @@ -578,6 +846,10 @@ description = "Utilities for Google Media Downloads and Resumable Uploads" category = "main" optional = false python-versions = ">= 3.6" +files = [ + {file = "google-resumable-media-2.1.0.tar.gz", hash = "sha256:725b989e0dd387ef2703d1cc8e86217474217f4549593c477fd94f4024a0f911"}, + {file = "google_resumable_media-2.1.0-py2.py3-none-any.whl", hash = "sha256:cdc75ea0361e39704dc7df7da59fbd419e73c8bc92eac94d8a020d36baa9944b"}, +] [package.dependencies] google-crc32c = ">=1.0,<2.0dev" @@ -593,6 +865,10 @@ description = "Common protobufs used in Google APIs" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "googleapis-common-protos-1.53.0.tar.gz", hash = "sha256:a88ee8903aa0a81f6c3cec2d5cf62d3c8aa67c06439b0496b49048fb1854ebf4"}, + {file = "googleapis_common_protos-1.53.0-py2.py3-none-any.whl", hash = "sha256:f6d561ab8fb16b30020b940e2dd01cd80082f4762fa9f3ee670f4419b4b8dbd0"}, +] [package.dependencies] protobuf = ">=3.12.0" @@ -607,6 +883,52 @@ description = "HTTP/2-based RPC framework" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "grpcio-1.42.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:6e5eec67909795f7b1ff2bd941bd6c2661ca5217ea9c35003d73314100786f60"}, + {file = "grpcio-1.42.0-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:8e8cd9909fdd232ecffb954936fd90c935ebe0b5fce36c88813f8247ce54019c"}, + {file = "grpcio-1.42.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:b4d7115ee08a36f3f50a6233bd78280e40847e078d2a5bb39c0ab0db4490d58f"}, + {file = "grpcio-1.42.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b781f412546830be55644f7c48251d30860f4725981862d4a1ea322f80d9cd34"}, + {file = "grpcio-1.42.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e62140c46d8125927c673c72c960cb387c02b2a1a3c6985a8b0a3914d27c0018"}, + {file = "grpcio-1.42.0-cp310-cp310-win32.whl", hash = "sha256:6b69726d7bbb633133c1b0d780b1357aa9b7a7f714fead6470bab1feb8012806"}, + {file = "grpcio-1.42.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6c0b159b38fcc3bbc3331105197c1f58ac0d294eb83910d136a325a85def88f"}, + {file = "grpcio-1.42.0-cp36-cp36m-linux_armv7l.whl", hash = "sha256:53e10d07e541073eb9a84d49ecffb831c3cbb970bcd8cd8de8431e935bf66c2e"}, + {file = "grpcio-1.42.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:7a3c9b8e13365529f9426d4754085e8a9c2ad718a41a46a97e4e30e87bb45eae"}, + {file = "grpcio-1.42.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:66f910b6324ae69625e63db2eb29d833c307cfa36736fe13d2f841656c5f658f"}, + {file = "grpcio-1.42.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:59163b8d2e0d85f0ecbee52b348f867eec7e0f909177564fb3956363f7e616e5"}, + {file = "grpcio-1.42.0-cp36-cp36m-manylinux_2_17_aarch64.whl", hash = "sha256:d92c1721c7981812d0f42dfc8248b15d3b6a2ea79eb8870776364423de2aa245"}, + {file = "grpcio-1.42.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65720d2bf05e2b78c4bffe372f13c41845bae5658fd3f5dd300c374dd240e5cb"}, + {file = "grpcio-1.42.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f385e40846ff81d1c6dce98dcc192c7988a46540758804c4a2e6da5a0e3e3e05"}, + {file = "grpcio-1.42.0-cp36-cp36m-win32.whl", hash = "sha256:ea3560ffbfe08327024380508190103937fef25e355d2259f8b5c003a0732f55"}, + {file = "grpcio-1.42.0-cp36-cp36m-win_amd64.whl", hash = "sha256:29fc36c99161ff307c8ca438346b2e36f81dac5ecdbabc983d0b255d7913fb19"}, + {file = "grpcio-1.42.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:76b5fa4c6d88f804456e763461cf7a1db38b200669f1ba00c579014ab5aa7965"}, + {file = "grpcio-1.42.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:d1451a8c0c01c5b5fdfeb8f777820cb277fb5d797d972f57a41bb82483c44a79"}, + {file = "grpcio-1.42.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6655df5f31664bac4cd6c9b52f389fd92cd10025504ad83685038f47e11e29d8"}, + {file = "grpcio-1.42.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:5b9f0c4822e3a52a1663a315752c6bbdbed0ec15a660d3e64137335acbb5b7ce"}, + {file = "grpcio-1.42.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:7742606ac2bc03ed10360f4f630e0cc01dce864fe63557254e9adea21bb51416"}, + {file = "grpcio-1.42.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:603d71de14ab1f1fd1254b69ceda73545943461b1f51f82fda9477503330b6ea"}, + {file = "grpcio-1.42.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d08ce780bbd8d1a442d855bd681ed0f7483c65d2c8ed83701a9ea4f13678411f"}, + {file = "grpcio-1.42.0-cp37-cp37m-win32.whl", hash = "sha256:2aba7f93671ec971c5c70db81633b49a2f974aa09a2d811aede344a32bad1896"}, + {file = "grpcio-1.42.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2956da789d74fc35d2c869b3aa45dbf41c5d862c056ca8b5e35a688347ede809"}, + {file = "grpcio-1.42.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:21aa4a111b3381d3dd982a3df62348713b29f651aa9f6dfbc9415adbfe28d2ba"}, + {file = "grpcio-1.42.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a6f9ed5320b93c029615b75f6c8caf2c76aa6545d8845f3813908892cfc5f84e"}, + {file = "grpcio-1.42.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:3a13953e12dc40ee247b5fe6ef22b5fac8f040a76b814a11bf9f423e82402f28"}, + {file = "grpcio-1.42.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:f721b42a20d886c03d9b1f461b228cdaf02ccf6c4550e263f7fd3ce3ff19a8f1"}, + {file = "grpcio-1.42.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:e2d9c6690d4c88cd51ee395d7ba5bd1d26d7c37e94cb59e7fd62ff21ecaf891d"}, + {file = "grpcio-1.42.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7f66eb220898787d7821a7931e35ae2512ed74f79f75adcd7ea2fb3119ca87d"}, + {file = "grpcio-1.42.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2e3f250e5398bf474c6e140df1b67494bf1e31c5277b5bf93841a564cbc22d0"}, + {file = "grpcio-1.42.0-cp38-cp38-win32.whl", hash = "sha256:06d5364e85e0fa50ee68bffd9c93a6aff869a91c68f1fd7ba1b944e063a0ff9f"}, + {file = "grpcio-1.42.0-cp38-cp38-win_amd64.whl", hash = "sha256:d58b3774ee2084c31aad140586a42e18328d9823959ca006a0b85ad7937fe405"}, + {file = "grpcio-1.42.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:b74bbac7e039cf23ed0c8edd820c31e90a52a22e28a03d45274a0956addde8d2"}, + {file = "grpcio-1.42.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2b264cf303a22c46f8d455f42425c546ad6ce22f183debb8d64226ddf1e039f4"}, + {file = "grpcio-1.42.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:64f2b3e6474e2ad865478b64f0850d15842acbb2623de5f78a60ceabe00c63e0"}, + {file = "grpcio-1.42.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:bf916ee93ea2fd52b5286ed4e19cbbde5e82754914379ea91dc5748550df3b4e"}, + {file = "grpcio-1.42.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:6ef72f0abdb89fb7c366a99e04823ecae5cda9f762f2234f42fc280447277cd6"}, + {file = "grpcio-1.42.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47ab65be9ba7a0beee94bbe2fb1dd03cb7832db9df4d1f8fae215a16b3edeb5e"}, + {file = "grpcio-1.42.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0209f30741de1875413f40e89bec9c647e7afad4a3549a6a1682c1ee23da68ca"}, + {file = "grpcio-1.42.0-cp39-cp39-win32.whl", hash = "sha256:5441d343602ce10ba48fcb36bb5de197a15a01dc9ee0f71c2a73cd5cd3d7f5ac"}, + {file = "grpcio-1.42.0-cp39-cp39-win_amd64.whl", hash = "sha256:17433f7eb01737240581b33fbc2eae7b7fa6d3429571782580bceaf05ec56cb8"}, + {file = "grpcio-1.42.0.tar.gz", hash = "sha256:4a8f2c7490fe3696e0cdd566e2f099fb91b51bc75446125175c55581c2f7bc11"}, +] [package.dependencies] six = ">=1.5.2" @@ -621,6 +943,10 @@ description = "a heap with decrease-key and increase-key operations" category = "main" optional = false python-versions = "*" +files = [ + {file = "HeapDict-1.0.1-py3-none-any.whl", hash = "sha256:6065f90933ab1bb7e50db403b90cab653c853690c5992e69294c2de2b253fc92"}, + {file = "HeapDict-1.0.1.tar.gz", hash = "sha256:8495f57b3e03d8e46d5f1b2cc62ca881aca392fd5cc048dc0aa2e1a6d23ecdb6"}, +] [[package]] name = "httplib2" @@ -629,6 +955,10 @@ description = "A comprehensive HTTP client library." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "httplib2-0.20.4-py3-none-any.whl", hash = "sha256:8b6a905cb1c79eefd03f8669fd993c36dc341f7c558f056cb5a33b5c2f458543"}, + {file = "httplib2-0.20.4.tar.gz", hash = "sha256:58a98e45b4b1a48273073f905d2961666ecf0fbac4250ea5b47aef259eb5c585"}, +] [package.dependencies] pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""} @@ -640,6 +970,10 @@ description = "HashiCorp Vault API client" category = "main" optional = false python-versions = ">=2.7" +files = [ + {file = "hvac-0.11.2-py2.py3-none-any.whl", hash = "sha256:3e8a34804b1e20954a2b4991cc13ed9c09b32e50dadd9d3438224481150f6568"}, + {file = "hvac-0.11.2.tar.gz", hash = "sha256:f905c59d32d88d3f67571fe5a8a78de4659e04798ad809de439f667247d13626"}, +] [package.dependencies] requests = ">=2.21.0" @@ -655,6 +989,10 @@ description = "File identification library for Python" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "identify-2.5.3-py2.py3-none-any.whl", hash = "sha256:25851c8c1370effb22aaa3c987b30449e9ff0cece408f810ae6ce408fdd20893"}, + {file = "identify-2.5.3.tar.gz", hash = "sha256:887e7b91a1be152b0d46bbf072130235a8117392b9f1828446079a816a05ef44"}, +] [package.extras] license = ["ukkonen"] @@ -666,6 +1004,10 @@ description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, +] [[package]] name = "importlib-metadata" @@ -674,14 +1016,18 @@ description = "Read metadata from Python packages" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, + {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, +] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] [[package]] name = "iniconfig" @@ -690,6 +1036,10 @@ description = "iniconfig: brain-dead simple config-ini parsing" category = "dev" optional = false python-versions = "*" +files = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] [[package]] name = "ipeadatapy" @@ -698,6 +1048,10 @@ description = "" category = "main" optional = false python-versions = "*" +files = [ + {file = "ipeadatapy-0.1.7-py3-none-any.whl", hash = "sha256:0de48658c0cd49d30fa23f69ef33ea954aea05b888051acca98afffc22b07ed5"}, + {file = "ipeadatapy-0.1.7.tar.gz", hash = "sha256:f5eff1d34769ea14f7cb26ed6899991f18df9dfa20d9a3c134d1ebcb72424dbc"}, +] [[package]] name = "jinja2" @@ -706,6 +1060,10 @@ description = "A very fast and expressive template engine." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, + {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -720,6 +1078,51 @@ description = "A fast implementation of the Cassowary constraint solver" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e395ece147f0692ca7cdb05a028d31b83b72c369f7b4a2c1798f4b96af1e3d8"}, + {file = "kiwisolver-1.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b7f50a1a25361da3440f07c58cd1d79957c2244209e4f166990e770256b6b0b"}, + {file = "kiwisolver-1.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c032c41ae4c3a321b43a3650e6ecc7406b99ff3e5279f24c9b310f41bc98479"}, + {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1dcade8f6fe12a2bb4efe2cbe22116556e3b6899728d3b2a0d3b367db323eacc"}, + {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e45e780a74416ef2f173189ef4387e44b5494f45e290bcb1f03735faa6779bf"}, + {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d2bb56309fb75a811d81ed55fbe2208aa77a3a09ff5f546ca95e7bb5fac6eff"}, + {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b2d6c12f2ad5f55104a36a356192cfb680c049fe5e7c1f6620fc37f119cdc2"}, + {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:262c248c60f22c2b547683ad521e8a3db5909c71f679b93876921549107a0c24"}, + {file = "kiwisolver-1.4.2-cp310-cp310-win32.whl", hash = "sha256:1008346a7741620ab9cc6c96e8ad9b46f7a74ce839dbb8805ddf6b119d5fc6c2"}, + {file = "kiwisolver-1.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:6ece2e12e4b57bc5646b354f436416cd2a6f090c1dadcd92b0ca4542190d7190"}, + {file = "kiwisolver-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b978afdb913ca953cf128d57181da2e8798e8b6153be866ae2a9c446c6162f40"}, + {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f88c4b8e449908eeddb3bbd4242bd4dc2c7a15a7aa44bb33df893203f02dc2d"}, + {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e348f1904a4fab4153407f7ccc27e43b2a139752e8acf12e6640ba683093dd96"}, + {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c839bf28e45d7ddad4ae8f986928dbf5a6d42ff79760d54ec8ada8fb263e097c"}, + {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8ae5a071185f1a93777c79a9a1e67ac46544d4607f18d07131eece08d415083a"}, + {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c222f91a45da9e01a9bc4f760727ae49050f8e8345c4ff6525495f7a164c8973"}, + {file = "kiwisolver-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:a4e8f072db1d6fb7a7cc05a6dbef8442c93001f4bb604f1081d8c2db3ca97159"}, + {file = "kiwisolver-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:be9a650890fb60393e60aacb65878c4a38bb334720aa5ecb1c13d0dac54dd73b"}, + {file = "kiwisolver-1.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ec2e55bf31b43aabe32089125dca3b46fdfe9f50afbf0756ae11e14c97b80ca"}, + {file = "kiwisolver-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d1078ba770d6165abed3d9a1be1f9e79b61515de1dd00d942fa53bba79f01ae"}, + {file = "kiwisolver-1.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cbb5eb4a2ea1ffec26268d49766cafa8f957fe5c1b41ad00733763fae77f9436"}, + {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e6cda72db409eefad6b021e8a4f964965a629f577812afc7860c69df7bdb84a"}, + {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1605c7c38cc6a85212dfd6a641f3905a33412e49f7c003f35f9ac6d71f67720"}, + {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81237957b15469ea9151ec8ca08ce05656090ffabc476a752ef5ad7e2644c526"}, + {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:240009fdf4fa87844f805e23f48995537a8cb8f8c361e35fda6b5ac97fcb906f"}, + {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:240c2d51d098395c012ddbcb9bd7b3ba5de412a1d11840698859f51d0e643c4f"}, + {file = "kiwisolver-1.4.2-cp38-cp38-win32.whl", hash = "sha256:8b6086aa6936865962b2cee0e7aaecf01ab6778ce099288354a7229b4d9f1408"}, + {file = "kiwisolver-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:0d98dca86f77b851350c250f0149aa5852b36572514d20feeadd3c6b1efe38d0"}, + {file = "kiwisolver-1.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:91eb4916271655dfe3a952249cb37a5c00b6ba68b4417ee15af9ba549b5ba61d"}, + {file = "kiwisolver-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa4d97d7d2b2c082e67907c0b8d9f31b85aa5d3ba0d33096b7116f03f8061261"}, + {file = "kiwisolver-1.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:71469b5845b9876b8d3d252e201bef6f47bf7456804d2fbe9a1d6e19e78a1e65"}, + {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8ff3033e43e7ca1389ee59fb7ecb8303abb8713c008a1da49b00869e92e3dd7c"}, + {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89b57c2984f4464840e4b768affeff6b6809c6150d1166938ade3e22fbe22db8"}, + {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffbdb9a96c536f0405895b5e21ee39ec579cb0ed97bdbd169ae2b55f41d73219"}, + {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a830a03970c462d1a2311c90e05679da56d3bd8e78a4ba9985cb78ef7836c9f"}, + {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f74f2a13af201559e3d32b9ddfc303c94ae63d63d7f4326d06ce6fe67e7a8255"}, + {file = "kiwisolver-1.4.2-cp39-cp39-win32.whl", hash = "sha256:e677cc3626287f343de751e11b1e8a5b915a6ac897e8aecdbc996cd34de753a0"}, + {file = "kiwisolver-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b3e251e5c38ac623c5d786adb21477f018712f8c6fa54781bd38aa1c60b60fc2"}, + {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c380bb5ae20d829c1a5473cfcae64267b73aaa4060adc091f6df1743784aae0"}, + {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:484f2a5f0307bc944bc79db235f41048bae4106ffa764168a068d88b644b305d"}, + {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8afdf533b613122e4bbaf3c1e42c2a5e9e2d1dd3a0a017749a7658757cb377"}, + {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42f6ef9b640deb6f7d438e0a371aedd8bef6ddfde30683491b2e6f568b4e884e"}, + {file = "kiwisolver-1.4.2.tar.gz", hash = "sha256:7f606d91b8a8816be476513a77fd30abe66227039bd6f8b406c348cb0247dcc9"}, +] [[package]] name = "locket" @@ -728,6 +1131,10 @@ description = "File-based locks for Python for Linux and Windows" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "locket-0.2.1-py2.py3-none-any.whl", hash = "sha256:12b6ada59d1f50710bca9704dbadd3f447dbf8dac6664575c1281cadab8e6449"}, + {file = "locket-0.2.1.tar.gz", hash = "sha256:3e1faba403619fe201552f083f1ecbf23f550941bc51985ac6ed4d02d25056dd"}, +] [[package]] name = "loguru" @@ -736,13 +1143,17 @@ description = "Python logging made (stupidly) simple" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "loguru-0.6.0-py3-none-any.whl", hash = "sha256:4e2414d534a2ab57573365b3e6d0234dfb1d84b68b7f3b948e6fb743860a77c3"}, + {file = "loguru-0.6.0.tar.gz", hash = "sha256:066bd06758d0a513e9836fd9c6b5a75bfb3fd36841f4b996bc60b547a309d41c"}, +] [package.dependencies] colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} [package.extras] -dev = ["colorama (>=0.3.4)", "docutils (==0.16)", "flake8 (>=3.7.7)", "tox (>=3.9.0)", "pytest (>=4.6.2)", "pytest-cov (>=2.7.1)", "black (>=19.10b0)", "isort (>=5.1.1)", "Sphinx (>=4.1.1)", "sphinx-autobuild (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)"] +dev = ["Sphinx (>=4.1.1)", "black (>=19.10b0)", "colorama (>=0.3.4)", "docutils (==0.16)", "flake8 (>=3.7.7)", "isort (>=5.1.1)", "pytest (>=4.6.2)", "pytest-cov (>=2.7.1)", "sphinx-autobuild (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "tox (>=3.9.0)"] [[package]] name = "markupsafe" @@ -751,6 +1162,77 @@ description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, +] [[package]] name = "marshmallow" @@ -759,11 +1241,15 @@ description = "A lightweight library for converting complex datatypes to and fro category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "marshmallow-3.14.1-py3-none-any.whl", hash = "sha256:04438610bc6dadbdddb22a4a55bcc7f6f8099e69580b2e67f5a681933a1f4400"}, + {file = "marshmallow-3.14.1.tar.gz", hash = "sha256:4c05c1684e0e97fe779c62b91878f173b937fe097b356cd82f793464f5bc6138"}, +] [package.extras] -dev = ["pytest", "pytz", "simplejson", "mypy (==0.910)", "flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "pre-commit (>=2.4,<3.0)", "tox"] -docs = ["sphinx (==4.3.0)", "sphinx-issues (==1.2.0)", "alabaster (==0.7.12)", "sphinx-version-warning (==1.1.2)", "autodocsumm (==0.2.7)"] -lint = ["mypy (==0.910)", "flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "pre-commit (>=2.4,<3.0)"] +dev = ["flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.7)", "sphinx (==4.3.0)", "sphinx-issues (==1.2.0)", "sphinx-version-warning (==1.1.2)"] +lint = ["flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)"] tests = ["pytest", "pytz", "simplejson"] [[package]] @@ -773,14 +1259,18 @@ description = "marshmallow multiplexing schema" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "marshmallow-oneofschema-3.0.1.tar.gz", hash = "sha256:62cd2099b29188c92493c2940ee79d1bf2f2619a71721664e5a98ec2faa58237"}, + {file = "marshmallow_oneofschema-3.0.1-py2.py3-none-any.whl", hash = "sha256:bd29410a9f2f7457a2b428286e2a80ef76b8ddc3701527dc1f935a88914b02f2"}, +] [package.dependencies] marshmallow = ">=3.0.0,<4.0.0" [package.extras] -dev = ["pytest", "mock", "flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.7,<3.0)", "tox"] +dev = ["flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "mock", "pre-commit (>=2.7,<3.0)", "pytest", "tox"] lint = ["flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.7,<3.0)"] -tests = ["pytest", "mock"] +tests = ["mock", "pytest"] [[package]] name = "matplotlib" @@ -789,6 +1279,43 @@ description = "Python plotting package" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "matplotlib-3.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:03bbb3f5f78836855e127b5dab228d99551ad0642918ccbf3067fcd52ac7ac5e"}, + {file = "matplotlib-3.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49a5938ed6ef9dda560f26ea930a2baae11ea99e1c2080c8714341ecfda72a89"}, + {file = "matplotlib-3.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:77157be0fc4469cbfb901270c205e7d8adb3607af23cef8bd11419600647ceed"}, + {file = "matplotlib-3.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5844cea45d804174bf0fac219b4ab50774e504bef477fc10f8f730ce2d623441"}, + {file = "matplotlib-3.5.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c87973ddec10812bddc6c286b88fdd654a666080fbe846a1f7a3b4ba7b11ab78"}, + {file = "matplotlib-3.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a05f2b37222319753a5d43c0a4fd97ed4ff15ab502113e3f2625c26728040cf"}, + {file = "matplotlib-3.5.2-cp310-cp310-win32.whl", hash = "sha256:9776e1a10636ee5f06ca8efe0122c6de57ffe7e8c843e0fb6e001e9d9256ec95"}, + {file = "matplotlib-3.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:b4fedaa5a9aa9ce14001541812849ed1713112651295fdddd640ea6620e6cf98"}, + {file = "matplotlib-3.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ee175a571e692fc8ae8e41ac353c0e07259113f4cb063b0ec769eff9717e84bb"}, + {file = "matplotlib-3.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e8bda1088b941ead50caabd682601bece983cadb2283cafff56e8fcddbf7d7f"}, + {file = "matplotlib-3.5.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9480842d5aadb6e754f0b8f4ebeb73065ac8be1855baa93cd082e46e770591e9"}, + {file = "matplotlib-3.5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6c623b355d605a81c661546af7f24414165a8a2022cddbe7380a31a4170fa2e9"}, + {file = "matplotlib-3.5.2-cp37-cp37m-win32.whl", hash = "sha256:a91426ae910819383d337ba0dc7971c7cefdaa38599868476d94389a329e599b"}, + {file = "matplotlib-3.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c4b82c2ae6d305fcbeb0eb9c93df2602ebd2f174f6e8c8a5d92f9445baa0c1d3"}, + {file = "matplotlib-3.5.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ebc27ad11df3c1661f4677a7762e57a8a91dd41b466c3605e90717c9a5f90c82"}, + {file = "matplotlib-3.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a32ea6e12e80dedaca2d4795d9ed40f97bfa56e6011e14f31502fdd528b9c89"}, + {file = "matplotlib-3.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2a0967d4156adbd0d46db06bc1a877f0370bce28d10206a5071f9ecd6dc60b79"}, + {file = "matplotlib-3.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2b696699386766ef171a259d72b203a3c75d99d03ec383b97fc2054f52e15cf"}, + {file = "matplotlib-3.5.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7f409716119fa39b03da3d9602bd9b41142fab7a0568758cd136cd80b1bf36c8"}, + {file = "matplotlib-3.5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b8d3f4e71e26307e8c120b72c16671d70c5cd08ae412355c11254aa8254fb87f"}, + {file = "matplotlib-3.5.2-cp38-cp38-win32.whl", hash = "sha256:b6c63cd01cad0ea8704f1fd586e9dc5777ccedcd42f63cbbaa3eae8dd41172a1"}, + {file = "matplotlib-3.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:75c406c527a3aa07638689586343f4b344fcc7ab1f79c396699eb550cd2b91f7"}, + {file = "matplotlib-3.5.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4a44cdfdb9d1b2f18b1e7d315eb3843abb097869cd1ef89cfce6a488cd1b5182"}, + {file = "matplotlib-3.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3d8e129af95b156b41cb3be0d9a7512cc6d73e2b2109f82108f566dbabdbf377"}, + {file = "matplotlib-3.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:364e6bca34edc10a96aa3b1d7cd76eb2eea19a4097198c1b19e89bee47ed5781"}, + {file = "matplotlib-3.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea75df8e567743207e2b479ba3d8843537be1c146d4b1e3e395319a4e1a77fe9"}, + {file = "matplotlib-3.5.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:44c6436868186564450df8fd2fc20ed9daaef5caad699aa04069e87099f9b5a8"}, + {file = "matplotlib-3.5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d7705022df2c42bb02937a2a824f4ec3cca915700dd80dc23916af47ff05f1a"}, + {file = "matplotlib-3.5.2-cp39-cp39-win32.whl", hash = "sha256:ee0b8e586ac07f83bb2950717e66cb305e2859baf6f00a9c39cc576e0ce9629c"}, + {file = "matplotlib-3.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:c772264631e5ae61f0bd41313bbe48e1b9bcc95b974033e1118c9caa1a84d5c6"}, + {file = "matplotlib-3.5.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:751d3815b555dcd6187ad35b21736dc12ce6925fc3fa363bbc6dc0f86f16484f"}, + {file = "matplotlib-3.5.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:31fbc2af27ebb820763f077ec7adc79b5a031c2f3f7af446bd7909674cd59460"}, + {file = "matplotlib-3.5.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4fa28ca76ac5c2b2d54bc058b3dad8e22ee85d26d1ee1b116a6fd4d2277b6a04"}, + {file = "matplotlib-3.5.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:24173c23d1bcbaed5bf47b8785d27933a1ac26a5d772200a0f3e0e38f471b001"}, + {file = "matplotlib-3.5.2.tar.gz", hash = "sha256:48cf850ce14fa18067f2d9e0d646763681948487a8080ec0af2686468b4607a2"}, +] [package.dependencies] cycler = ">=0.10" @@ -799,7 +1326,6 @@ packaging = ">=20.0" pillow = ">=6.2.0" pyparsing = ">=2.2.1" python-dateutil = ">=2.7" -setuptools_scm = ">=4" [[package]] name = "more-itertools" @@ -808,6 +1334,10 @@ description = "More routines for operating on iterables, beyond itertools" category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "more-itertools-8.13.0.tar.gz", hash = "sha256:a42901a0a5b169d925f6f217cd5a190e32ef54360905b9c39ee7db5313bfec0f"}, + {file = "more_itertools-8.13.0-py3-none-any.whl", hash = "sha256:c5122bffc5f104d37c1626b8615b511f3427aa5389b94d61e5ef8236bfbc3ddb"}, +] [[package]] name = "msgpack" @@ -816,6 +1346,42 @@ description = "MessagePack (de)serializer." category = "main" optional = false python-versions = "*" +files = [ + {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:96acc674bb9c9be63fa8b6dabc3248fdc575c4adc005c440ad02f87ca7edd079"}, + {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c3ca57c96c8e69c1a0d2926a6acf2d9a522b41dc4253a8945c4c6cd4981a4e3"}, + {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0a792c091bac433dfe0a70ac17fc2087d4595ab835b47b89defc8bbabcf5c73"}, + {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c58cdec1cb5fcea8c2f1771d7b5fec79307d056874f746690bd2bdd609ab147"}, + {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f97c0f35b3b096a330bb4a1a9247d0bd7e1f3a2eba7ab69795501504b1c2c39"}, + {file = "msgpack-1.0.3-cp310-cp310-win32.whl", hash = "sha256:36a64a10b16c2ab31dcd5f32d9787ed41fe68ab23dd66957ca2826c7f10d0b85"}, + {file = "msgpack-1.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c1ba333b4024c17c7591f0f372e2daa3c31db495a9b2af3cf664aef3c14354f7"}, + {file = "msgpack-1.0.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c2140cf7a3ec475ef0938edb6eb363fa704159e0bf71dde15d953bacc1cf9d7d"}, + {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f4c22717c74d44bcd7af353024ce71c6b55346dad5e2cc1ddc17ce8c4507c6b"}, + {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d733a15ade190540c703de209ffbc42a3367600421b62ac0c09fde594da6ec"}, + {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7e03b06f2982aa98d4ddd082a210c3db200471da523f9ac197f2828e80e7770"}, + {file = "msgpack-1.0.3-cp36-cp36m-win32.whl", hash = "sha256:3d875631ecab42f65f9dce6f55ce6d736696ced240f2634633188de2f5f21af9"}, + {file = "msgpack-1.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:40fb89b4625d12d6027a19f4df18a4de5c64f6f3314325049f219683e07e678a"}, + {file = "msgpack-1.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6eef0cf8db3857b2b556213d97dd82de76e28a6524853a9beb3264983391dc1a"}, + {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d8c332f53ffff01953ad25131272506500b14750c1d0ce8614b17d098252fbc"}, + {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c0903bd93cbd34653dd63bbfcb99d7539c372795201f39d16fdfde4418de43a"}, + {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf1e6bfed4860d72106f4e0a1ab519546982b45689937b40257cfd820650b920"}, + {file = "msgpack-1.0.3-cp37-cp37m-win32.whl", hash = "sha256:d02cea2252abc3756b2ac31f781f7a98e89ff9759b2e7450a1c7a0d13302ff50"}, + {file = "msgpack-1.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f30dd0dc4dfe6231ad253b6f9f7128ac3202ae49edd3f10d311adc358772dba"}, + {file = "msgpack-1.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f201d34dc89342fabb2a10ed7c9a9aaaed9b7af0f16a5923f1ae562b31258dea"}, + {file = "msgpack-1.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bb87f23ae7d14b7b3c21009c4b1705ec107cb21ee71975992f6aca571fb4a42a"}, + {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a3a5c4b16e9d0edb823fe54b59b5660cc8d4782d7bf2c214cb4b91a1940a8ef"}, + {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74da1e5fcf20ade12c6bf1baa17a2dc3604958922de8dc83cbe3eff22e8b611"}, + {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73a80bd6eb6bcb338c1ec0da273f87420829c266379c8c82fa14c23fb586cfa1"}, + {file = "msgpack-1.0.3-cp38-cp38-win32.whl", hash = "sha256:9fce00156e79af37bb6db4e7587b30d11e7ac6a02cb5bac387f023808cd7d7f4"}, + {file = "msgpack-1.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:9b6f2d714c506e79cbead331de9aae6837c8dd36190d02da74cb409b36162e8a"}, + {file = "msgpack-1.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:89908aea5f46ee1474cc37fbc146677f8529ac99201bc2faf4ef8edc023c2bf3"}, + {file = "msgpack-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:973ad69fd7e31159eae8f580f3f707b718b61141838321c6fa4d891c4a2cca52"}, + {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da24375ab4c50e5b7486c115a3198d207954fe10aaa5708f7b65105df09109b2"}, + {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a598d0685e4ae07a0672b59792d2cc767d09d7a7f39fd9bd37ff84e060b1a996"}, + {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4c309a68cb5d6bbd0c50d5c71a25ae81f268c2dc675c6f4ea8ab2feec2ac4e2"}, + {file = "msgpack-1.0.3-cp39-cp39-win32.whl", hash = "sha256:494471d65b25a8751d19c83f1a482fd411d7ca7a3b9e17d25980a74075ba0e88"}, + {file = "msgpack-1.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:f01b26c2290cbd74316990ba84a14ac3d599af9cebefc543d241a66e785cf17d"}, + {file = "msgpack-1.0.3.tar.gz", hash = "sha256:51fdc7fb93615286428ee7758cecc2f374d5ff363bdd884c7ea622a7a327a81e"}, +] [[package]] name = "mypy-extensions" @@ -824,6 +1390,10 @@ description = "Experimental type system extensions for programs checked with the category = "main" optional = false python-versions = "*" +files = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] [[package]] name = "nodeenv" @@ -832,6 +1402,13 @@ description = "Node.js virtual environment builder" category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, + {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, +] + +[package.dependencies] +setuptools = "*" [[package]] name = "numpy" @@ -840,6 +1417,38 @@ description = "NumPy is the fundamental package for array computing with Python. category = "main" optional = false python-versions = ">=3.7,<3.11" +files = [ + {file = "numpy-1.21.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8890b3360f345e8360133bc078d2dacc2843b6ee6059b568781b15b97acbe39f"}, + {file = "numpy-1.21.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:69077388c5a4b997442b843dbdc3a85b420fb693ec8e33020bb24d647c164fa5"}, + {file = "numpy-1.21.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e89717274b41ebd568cd7943fc9418eeb49b1785b66031bc8a7f6300463c5898"}, + {file = "numpy-1.21.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b78ecfa070460104934e2caf51694ccd00f37d5e5dbe76f021b1b0b0d221823"}, + {file = "numpy-1.21.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:615d4e328af7204c13ae3d4df7615a13ff60a49cb0d9106fde07f541207883ca"}, + {file = "numpy-1.21.4-cp310-cp310-win_amd64.whl", hash = "sha256:1403b4e2181fc72664737d848b60e65150f272fe5a1c1cbc16145ed43884065a"}, + {file = "numpy-1.21.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:74b85a17528ca60cf98381a5e779fc0264b4a88b46025e6bcbe9621f46bb3e63"}, + {file = "numpy-1.21.4-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92aafa03da8658609f59f18722b88f0a73a249101169e28415b4fa148caf7e41"}, + {file = "numpy-1.21.4-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5d95668e727c75b3f5088ec7700e260f90ec83f488e4c0aaccb941148b2cd377"}, + {file = "numpy-1.21.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5162ec777ba7138906c9c274353ece5603646c6965570d82905546579573f73"}, + {file = "numpy-1.21.4-cp37-cp37m-win32.whl", hash = "sha256:81225e58ef5fce7f1d80399575576fc5febec79a8a2742e8ef86d7b03beef49f"}, + {file = "numpy-1.21.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32fe5b12061f6446adcbb32cf4060a14741f9c21e15aaee59a207b6ce6423469"}, + {file = "numpy-1.21.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c449eb870616a7b62e097982c622d2577b3dbc800aaf8689254ec6e0197cbf1e"}, + {file = "numpy-1.21.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2e4ed57f45f0aa38beca2a03b6532e70e548faf2debbeb3291cfc9b315d9be8f"}, + {file = "numpy-1.21.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1247ef28387b7bb7f21caf2dbe4767f4f4175df44d30604d42ad9bd701ebb31f"}, + {file = "numpy-1.21.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34f3456f530ae8b44231c63082c8899fe9c983fd9b108c997c4b1c8c2d435333"}, + {file = "numpy-1.21.4-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c9c23158b87ed0e70d9a50c67e5c0b3f75bcf2581a8e34668d4e9d7474d76c6"}, + {file = "numpy-1.21.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4799be6a2d7d3c33699a6f77201836ac975b2e1b98c2a07f66a38f499cb50ce"}, + {file = "numpy-1.21.4-cp38-cp38-win32.whl", hash = "sha256:bc988afcea53e6156546e5b2885b7efab089570783d9d82caf1cfd323b0bb3dd"}, + {file = "numpy-1.21.4-cp38-cp38-win_amd64.whl", hash = "sha256:170b2a0805c6891ca78c1d96ee72e4c3ed1ae0a992c75444b6ab20ff038ba2cd"}, + {file = "numpy-1.21.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fde96af889262e85aa033f8ee1d3241e32bf36228318a61f1ace579df4e8170d"}, + {file = "numpy-1.21.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c885bfc07f77e8fee3dc879152ba993732601f1f11de248d4f357f0ffea6a6d4"}, + {file = "numpy-1.21.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e6f5f50d1eff2f2f752b3089a118aee1ea0da63d56c44f3865681009b0af162"}, + {file = "numpy-1.21.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ad010846cdffe7ec27e3f933397f8a8d6c801a48634f419e3d075db27acf5880"}, + {file = "numpy-1.21.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c74c699b122918a6c4611285cc2cad4a3aafdb135c22a16ec483340ef97d573c"}, + {file = "numpy-1.21.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9864424631775b0c052f3bd98bc2712d131b3e2cd95d1c0c68b91709170890b0"}, + {file = "numpy-1.21.4-cp39-cp39-win32.whl", hash = "sha256:b1e2312f5b8843a3e4e8224b2b48fe16119617b8fc0a54df8f50098721b5bed2"}, + {file = "numpy-1.21.4-cp39-cp39-win_amd64.whl", hash = "sha256:e3c3e990274444031482a31280bf48674441e0a5b55ddb168f3a6db3e0c38ec8"}, + {file = "numpy-1.21.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a3deb31bc84f2b42584b8c4001c85d1934dbfb4030827110bc36bfd11509b7bf"}, + {file = "numpy-1.21.4.zip", hash = "sha256:e6c76a87633aa3fa16614b61ccedfae45b91df2767cf097aa9c933932a7ed1e0"}, +] [[package]] name = "oauth2client" @@ -848,6 +1457,10 @@ description = "OAuth 2.0 client library" category = "main" optional = false python-versions = "*" +files = [ + {file = "oauth2client-4.1.3-py2.py3-none-any.whl", hash = "sha256:b8a81cc5d60e2d364f0b1b98f958dbd472887acaf1a5b05e21c28c31a2d6d3ac"}, + {file = "oauth2client-4.1.3.tar.gz", hash = "sha256:d486741e451287f69568a4d26d70d9acd73a2bbfa275746c535b4209891cccc6"}, +] [package.dependencies] httplib2 = ">=0.9.1" @@ -863,6 +1476,10 @@ description = "A generic, spec-compliant, thorough implementation of the OAuth r category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "oauthlib-3.1.1-py2.py3-none-any.whl", hash = "sha256:42bf6354c2ed8c6acb54d971fce6f88193d97297e18602a3a886603f9d7730cc"}, + {file = "oauthlib-3.1.1.tar.gz", hash = "sha256:8f0215fcc533dd8dd1bee6f4c412d4f0cd7297307d43ac61666389e3bc3198a3"}, +] [package.extras] rsa = ["cryptography (>=3.0.0,<4)"] @@ -876,6 +1493,10 @@ description = "Core utilities for Python packages" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] [package.dependencies] pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" @@ -887,6 +1508,35 @@ description = "Powerful data structures for data analysis, time series, and stat category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "pandas-1.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e9dbacd22555c2d47f262ef96bb4e30880e5956169741400af8b306bbb24a273"}, + {file = "pandas-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e2b83abd292194f350bb04e188f9379d36b8dfac24dd445d5c87575f3beaf789"}, + {file = "pandas-1.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2552bffc808641c6eb471e55aa6899fa002ac94e4eebfa9ec058649122db5824"}, + {file = "pandas-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fc87eac0541a7d24648a001d553406f4256e744d92df1df8ebe41829a915028"}, + {file = "pandas-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0d8fd58df5d17ddb8c72a5075d87cd80d71b542571b5f78178fb067fa4e9c72"}, + {file = "pandas-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:4aed257c7484d01c9a194d9a94758b37d3d751849c05a0050c087a358c41ad1f"}, + {file = "pandas-1.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:375262829c8c700c3e7cbb336810b94367b9c4889818bbd910d0ecb4e45dc261"}, + {file = "pandas-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc3cd122bea268998b79adebbb8343b735a5511ec14efb70a39e7acbc11ccbdc"}, + {file = "pandas-1.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4f5a82afa4f1ff482ab8ded2ae8a453a2cdfde2001567b3ca24a4c5c5ca0db3"}, + {file = "pandas-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8092a368d3eb7116e270525329a3e5c15ae796ccdf7ccb17839a73b4f5084a39"}, + {file = "pandas-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6257b314fc14958f8122779e5a1557517b0f8e500cfb2bd53fa1f75a8ad0af2"}, + {file = "pandas-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:82ae615826da838a8e5d4d630eb70c993ab8636f0eff13cb28aafc4291b632b5"}, + {file = "pandas-1.5.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:457d8c3d42314ff47cc2d6c54f8fc0d23954b47977b2caed09cd9635cb75388b"}, + {file = "pandas-1.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c009a92e81ce836212ce7aa98b219db7961a8b95999b97af566b8dc8c33e9519"}, + {file = "pandas-1.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:71f510b0efe1629bf2f7c0eadb1ff0b9cf611e87b73cd017e6b7d6adb40e2b3a"}, + {file = "pandas-1.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a40dd1e9f22e01e66ed534d6a965eb99546b41d4d52dbdb66565608fde48203f"}, + {file = "pandas-1.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ae7e989f12628f41e804847a8cc2943d362440132919a69429d4dea1f164da0"}, + {file = "pandas-1.5.2-cp38-cp38-win32.whl", hash = "sha256:530948945e7b6c95e6fa7aa4be2be25764af53fba93fe76d912e35d1c9ee46f5"}, + {file = "pandas-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:73f219fdc1777cf3c45fde7f0708732ec6950dfc598afc50588d0d285fddaefc"}, + {file = "pandas-1.5.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9608000a5a45f663be6af5c70c3cbe634fa19243e720eb380c0d378666bc7702"}, + {file = "pandas-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:315e19a3e5c2ab47a67467fc0362cb36c7c60a93b6457f675d7d9615edad2ebe"}, + {file = "pandas-1.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e18bc3764cbb5e118be139b3b611bc3fbc5d3be42a7e827d1096f46087b395eb"}, + {file = "pandas-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0183cb04a057cc38fde5244909fca9826d5d57c4a5b7390c0cc3fa7acd9fa883"}, + {file = "pandas-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:344021ed3e639e017b452aa8f5f6bf38a8806f5852e217a7594417fb9bbfa00e"}, + {file = "pandas-1.5.2-cp39-cp39-win32.whl", hash = "sha256:e7469271497960b6a781eaa930cba8af400dd59b62ec9ca2f4d31a19f2f91090"}, + {file = "pandas-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:c218796d59d5abd8780170c937b812c9637e84c32f8271bbf9845970f8c1351f"}, + {file = "pandas-1.5.2.tar.gz", hash = "sha256:220b98d15cee0b2cd839a6358bd1f273d0356bf964c1a1aeb32d47db0215488b"}, +] [package.dependencies] numpy = [ @@ -906,6 +1556,10 @@ description = "Google BigQuery connector for pandas" category = "main" optional = false python-versions = ">=3.7, <3.11" +files = [ + {file = "pandas-gbq-0.17.4.tar.gz", hash = "sha256:70ac57cc6ebf9d1e1c1c810f5ccac710163acd4c3d13e8badea27bb66fae19f7"}, + {file = "pandas_gbq-0.17.4-py2.py3-none-any.whl", hash = "sha256:3b3714167bdc4b1a6013ff6286a452727efbceb412922a2ca39aa996e8e8b129"}, +] [package.dependencies] db-dtypes = ">=0.3.1,<2.0.0" @@ -918,6 +1572,7 @@ numpy = ">=1.16.6" pandas = ">=0.24.2" pyarrow = ">=3.0.0,<8.0dev" pydata-google-auth = "*" +setuptools = "*" [package.extras] tqdm = ["tqdm (>=4.23.0)"] @@ -929,6 +1584,9 @@ description = "The interface between Avro and pandas DataFrame" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pandavro-1.6.0.tar.gz", hash = "sha256:d098da34529fbb20de5fd1a6f231918d1b60941b25bea5dc87897ef0d472cb6f"}, +] [package.dependencies] fastavro = ">=0.14.11" @@ -946,13 +1604,17 @@ description = "Appendable key-value storage" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "partd-1.2.0-py3-none-any.whl", hash = "sha256:5c3a5d70da89485c27916328dc1e26232d0e270771bd4caef4a5124b6a457288"}, + {file = "partd-1.2.0.tar.gz", hash = "sha256:aa67897b84d522dcbc86a98b942afab8c6aa2f7f677d904a616b74ef5ddbc3eb"}, +] [package.dependencies] locket = "*" toolz = "*" [package.extras] -complete = ["numpy (>=1.9.0)", "pandas (>=0.19.0)", "pyzmq", "blosc"] +complete = ["blosc", "numpy (>=1.9.0)", "pandas (>=0.19.0)", "pyzmq"] [[package]] name = "pendulum" @@ -961,6 +1623,29 @@ description = "Python datetimes made easy" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, + {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, + {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, + {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, + {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, + {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, + {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, + {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, + {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, + {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, + {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, +] [package.dependencies] python-dateutil = ">=2.6,<3.0" @@ -973,6 +1658,46 @@ description = "Python Imaging Library (Fork)" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "Pillow-9.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af79d3fde1fc2e33561166d62e3b63f0cc3e47b5a3a2e5fea40d4917754734ea"}, + {file = "Pillow-9.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:55dd1cf09a1fd7c7b78425967aacae9b0d70125f7d3ab973fadc7b5abc3de652"}, + {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66822d01e82506a19407d1afc104c3fcea3b81d5eb11485e593ad6b8492f995a"}, + {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5eaf3b42df2bcda61c53a742ee2c6e63f777d0e085bbc6b2ab7ed57deb13db7"}, + {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01ce45deec9df310cbbee11104bae1a2a43308dd9c317f99235b6d3080ddd66e"}, + {file = "Pillow-9.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aea7ce61328e15943d7b9eaca87e81f7c62ff90f669116f857262e9da4057ba3"}, + {file = "Pillow-9.1.0-cp310-cp310-win32.whl", hash = "sha256:7a053bd4d65a3294b153bdd7724dce864a1d548416a5ef61f6d03bf149205160"}, + {file = "Pillow-9.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:97bda660702a856c2c9e12ec26fc6d187631ddfd896ff685814ab21ef0597033"}, + {file = "Pillow-9.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:21dee8466b42912335151d24c1665fcf44dc2ee47e021d233a40c3ca5adae59c"}, + {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b6d4050b208c8ff886fd3db6690bf04f9a48749d78b41b7a5bf24c236ab0165"}, + {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5cfca31ab4c13552a0f354c87fbd7f162a4fafd25e6b521bba93a57fe6a3700a"}, + {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed742214068efa95e9844c2d9129e209ed63f61baa4d54dbf4cf8b5e2d30ccf2"}, + {file = "Pillow-9.1.0-cp37-cp37m-win32.whl", hash = "sha256:c9efef876c21788366ea1f50ecb39d5d6f65febe25ad1d4c0b8dff98843ac244"}, + {file = "Pillow-9.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:de344bcf6e2463bb25179d74d6e7989e375f906bcec8cb86edb8b12acbc7dfef"}, + {file = "Pillow-9.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:17869489de2fce6c36690a0c721bd3db176194af5f39249c1ac56d0bb0fcc512"}, + {file = "Pillow-9.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:25023a6209a4d7c42154073144608c9a71d3512b648a2f5d4465182cb93d3477"}, + {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8782189c796eff29dbb37dd87afa4ad4d40fc90b2742704f94812851b725964b"}, + {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:463acf531f5d0925ca55904fa668bb3461c3ef6bc779e1d6d8a488092bdee378"}, + {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f42364485bfdab19c1373b5cd62f7c5ab7cc052e19644862ec8f15bb8af289e"}, + {file = "Pillow-9.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3fddcdb619ba04491e8f771636583a7cc5a5051cd193ff1aa1ee8616d2a692c5"}, + {file = "Pillow-9.1.0-cp38-cp38-win32.whl", hash = "sha256:4fe29a070de394e449fd88ebe1624d1e2d7ddeed4c12e0b31624561b58948d9a"}, + {file = "Pillow-9.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c24f718f9dd73bb2b31a6201e6db5ea4a61fdd1d1c200f43ee585fc6dcd21b34"}, + {file = "Pillow-9.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fb89397013cf302f282f0fc998bb7abf11d49dcff72c8ecb320f76ea6e2c5717"}, + {file = "Pillow-9.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c870193cce4b76713a2b29be5d8327c8ccbe0d4a49bc22968aa1e680930f5581"}, + {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69e5ddc609230d4408277af135c5b5c8fe7a54b2bdb8ad7c5100b86b3aab04c6"}, + {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35be4a9f65441d9982240e6966c1eaa1c654c4e5e931eaf580130409e31804d4"}, + {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82283af99c1c3a5ba1da44c67296d5aad19f11c535b551a5ae55328a317ce331"}, + {file = "Pillow-9.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a325ac71914c5c043fa50441b36606e64a10cd262de12f7a179620f579752ff8"}, + {file = "Pillow-9.1.0-cp39-cp39-win32.whl", hash = "sha256:a598d8830f6ef5501002ae85c7dbfcd9c27cc4efc02a1989369303ba85573e58"}, + {file = "Pillow-9.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0c51cb9edac8a5abd069fd0758ac0a8bfe52c261ee0e330f363548aca6893595"}, + {file = "Pillow-9.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a336a4f74baf67e26f3acc4d61c913e378e931817cd1e2ef4dfb79d3e051b481"}, + {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb1b89b11256b5b6cad5e7593f9061ac4624f7651f7a8eb4dfa37caa1dfaa4d0"}, + {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:255c9d69754a4c90b0ee484967fc8818c7ff8311c6dddcc43a4340e10cd1636a"}, + {file = "Pillow-9.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5a3ecc026ea0e14d0ad7cd990ea7f48bfcb3eb4271034657dc9d06933c6629a7"}, + {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5b0ff59785d93b3437c3703e3c64c178aabada51dea2a7f2c5eccf1bcf565a3"}, + {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7110ec1701b0bf8df569a7592a196c9d07c764a0a74f65471ea56816f10e2c8"}, + {file = "Pillow-9.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8d79c6f468215d1a8415aa53d9868a6b40c4682165b8cb62a221b1baa47db458"}, + {file = "Pillow-9.1.0.tar.gz", hash = "sha256:f401ed2bbb155e1ade150ccc63db1a4f6c1909d3d378f7d1235a44e90d75fb97"}, +] [package.extras] docs = ["olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinx-rtd-theme (>=1.0)", "sphinxext-opengraph"] @@ -985,10 +1710,14 @@ description = "A small Python module for determining appropriate platform-specif category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, +] [package.extras] -docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] -test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] +test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] [[package]] name = "pluggy" @@ -997,6 +1726,10 @@ description = "plugin and hook calling mechanisms for python" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, + {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, +] [package.extras] dev = ["pre-commit", "tox"] @@ -1008,6 +1741,10 @@ description = "A framework for managing and maintaining multi-language pre-commi category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pre_commit-2.20.0-py2.py3-none-any.whl", hash = "sha256:51a5ba7c480ae8072ecdb6933df22d2f812dc897d5fe848778116129a681aac7"}, + {file = "pre_commit-2.20.0.tar.gz", hash = "sha256:a978dac7bc9ec0bcee55c18a277d553b0f419d259dadb4b9418ff2d00eb43959"}, +] [package.dependencies] cfgv = ">=2.0.0" @@ -1024,6 +1761,10 @@ description = "The Prefect Core automation and scheduling engine." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "prefect-0.15.9-py3-none-any.whl", hash = "sha256:595c9f229349528f7bcd2aa866c9c10dcfbf059a20803526924339d45604ec76"}, + {file = "prefect-0.15.9.tar.gz", hash = "sha256:52d4d28493cd1a90e1acf96b5a92b2902950849b481a49f762998448a41cf127"}, +] [package.dependencies] click = ">=7.0,<9.0" @@ -1049,26 +1790,26 @@ urllib3 = ">=1.24.3" [package.extras] airtable = ["airtable-python-wrapper (>=0.11,<0.12)"] -all_extras = ["airtable-python-wrapper (>=0.11,<0.12)", "boto3 (>=1.9,<2.0)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "azure-cosmos (>=3.1.1,<3.2)", "atlassian-python-api (>=2.0.1)", "dask-cloudprovider[aws] (>=0.2.0)", "black", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "mypy (>=0.600,<0.813)", "Pygments (>=2.2,<3.0)", "pytest (>=6.0)", "testfixtures (>=6.10.3)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "flaky (>=3.0)", "responses (>=0.14.0)", "dropbox (>=9.0,<10.0)", "great-expectations (>=0.11.1)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-auth (>=2.0,<3.0)", "dulwich (>=0.19.7)", "PyGithub (>=1.51,<2.0)", "python-gitlab (>=2.5.0,<3.0)", "gspread (>=3.6.0)", "jira (>=2.0.0)", "papermill (>=2.2.0)", "nbconvert (>=6.0.7)", "confluent-kafka (>=1.7.0)", "dask-kubernetes (>=0.8.0)", "kubernetes (>=9.0.0a1,<=13.0)", "pandas (>=1.0.1)", "psycopg2-binary (>=2.8.2)", "prometheus-client (>=0.9.0)", "pymysql (>=0.9.3)", "pyodbc (>=4.0.30)", "pushbullet.py (>=0.11.0)", "redis (>=3.2.1)", "feedparser (>=5.0.1,<6.0)", "snowflake-connector-python (>=1.8.2,<2.5)", "spacy (>=2.0.0,<3.0.0)", "hvac (>=0.10)", "graphviz (>=0.8.3)", "tweepy (>=3.5,<4.0)", "pyarrow (>=5.0.0)", "pyexasol (>=0.16.1)", "soda-sql (>=2.0.0b25)", "sendgrid (>=6.7.0)"] -all_orchestration_extras = ["boto3 (>=1.9,<2.0)", "azure-storage-blob (>=12.1.0,<13.0)", "atlassian-python-api (>=2.0.1)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-auth (>=2.0,<3.0)", "dulwich (>=0.19.7)", "PyGithub (>=1.51,<2.0)", "python-gitlab (>=2.5.0,<3.0)", "kubernetes (>=9.0.0a1,<=13.0)"] +all-extras = ["PyGithub (>=1.51,<2.0)", "Pygments (>=2.2,<3.0)", "airtable-python-wrapper (>=0.11,<0.12)", "atlassian-python-api (>=2.0.1)", "azure-cosmos (>=3.1.1,<3.2)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "black", "boto3 (>=1.9,<2.0)", "confluent-kafka (>=1.7.0)", "dask-cloudprovider[aws] (>=0.2.0)", "dask-kubernetes (>=0.8.0)", "dropbox (>=9.0,<10.0)", "dulwich (>=0.19.7)", "feedparser (>=5.0.1,<6.0)", "flaky (>=3.0)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "graphviz (>=0.8)", "graphviz (>=0.8.3)", "great-expectations (>=0.11.1)", "gspread (>=3.6.0)", "hvac (>=0.10)", "jinja2 (>=2.0,<4.0)", "jira (>=2.0.0)", "kubernetes (>=9.0.0a1,<=13.0)", "mypy (>=0.600,<0.813)", "nbconvert (>=6.0.7)", "pandas (>=1.0.1)", "papermill (>=2.2.0)", "prometheus-client (>=0.9.0)", "psycopg2-binary (>=2.8.2)", "pushbullet.py (>=0.11.0)", "pyarrow (>=5.0.0)", "pyexasol (>=0.16.1)", "pymysql (>=0.9.3)", "pyodbc (>=4.0.30)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "python-gitlab (>=2.5.0,<3.0)", "redis (>=3.2.1)", "responses (>=0.14.0)", "sendgrid (>=6.7.0)", "snowflake-connector-python (>=1.8.2,<2.5)", "soda-sql (>=2.0.0b25)", "spacy (>=2.0.0,<3.0.0)", "testfixtures (>=6.10.3)", "tweepy (>=3.5,<4.0)"] +all-orchestration-extras = ["PyGithub (>=1.51,<2.0)", "atlassian-python-api (>=2.0.1)", "azure-storage-blob (>=12.1.0,<13.0)", "boto3 (>=1.9,<2.0)", "dulwich (>=0.19.7)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "kubernetes (>=9.0.0a1,<=13.0)", "python-gitlab (>=2.5.0,<3.0)"] aws = ["boto3 (>=1.9,<2.0)"] -azure = ["azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "azure-cosmos (>=3.1.1,<3.2)"] -base_library_ci = ["boto3 (>=1.9,<2.0)", "azure-storage-blob (>=12.1.0,<13.0)", "atlassian-python-api (>=2.0.1)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-auth (>=2.0,<3.0)", "dulwich (>=0.19.7)", "PyGithub (>=1.51,<2.0)", "python-gitlab (>=2.5.0,<3.0)", "kubernetes (>=9.0.0a1,<=13.0)", "black", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "mypy (>=0.600,<0.813)", "Pygments (>=2.2,<3.0)", "pytest (>=6.0)", "testfixtures (>=6.10.3)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "flaky (>=3.0)", "responses (>=0.14.0)", "pandas (>=1.0.1)", "jira (>=2.0.0)"] +azure = ["azure-cosmos (>=3.1.1,<3.2)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)"] +base-library-ci = ["PyGithub (>=1.51,<2.0)", "Pygments (>=2.2,<3.0)", "atlassian-python-api (>=2.0.1)", "azure-storage-blob (>=12.1.0,<13.0)", "black", "boto3 (>=1.9,<2.0)", "dulwich (>=0.19.7)", "flaky (>=3.0)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "jira (>=2.0.0)", "kubernetes (>=9.0.0a1,<=13.0)", "mypy (>=0.600,<0.813)", "pandas (>=1.0.1)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "python-gitlab (>=2.5.0,<3.0)", "responses (>=0.14.0)", "testfixtures (>=6.10.3)"] bitbucket = ["atlassian-python-api (>=2.0.1)"] -dask_cloudprovider = ["dask-cloudprovider[aws] (>=0.2.0)"] -dev = ["black", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "mypy (>=0.600,<0.813)", "Pygments (>=2.2,<3.0)", "pytest (>=6.0)", "testfixtures (>=6.10.3)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "flaky (>=3.0)", "responses (>=0.14.0)"] +dask-cloudprovider = ["dask-cloudprovider[aws] (>=0.2.0)"] +dev = ["Pygments (>=2.2,<3.0)", "black", "flaky (>=3.0)", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "mypy (>=0.600,<0.813)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "responses (>=0.14.0)", "testfixtures (>=6.10.3)"] dremio = ["pyarrow (>=5.0.0)"] dropbox = ["dropbox (>=9.0,<10.0)"] exasol = ["pyexasol (>=0.16.1)"] -gcp = ["google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-auth (>=2.0,<3.0)"] +gcp = ["google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)"] ge = ["great-expectations (>=0.11.1)"] git = ["dulwich (>=0.19.7)"] github = ["PyGithub (>=1.51,<2.0)"] gitlab = ["python-gitlab (>=2.5.0,<3.0)"] -google = ["google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-auth (>=2.0,<3.0)"] +google = ["google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)"] gsheets = ["gspread (>=3.6.0)"] jira = ["jira (>=2.0.0)"] -jupyter = ["papermill (>=2.2.0)", "nbconvert (>=6.0.7)"] +jupyter = ["nbconvert (>=6.0.7)", "papermill (>=2.2.0)"] kafka = ["confluent-kafka (>=1.7.0)"] kubernetes = ["dask-kubernetes (>=0.8.0)", "kubernetes (>=9.0.0a1,<=13.0)"] mysql = ["pymysql (>=0.9.3)"] @@ -1082,10 +1823,10 @@ sendgrid = ["sendgrid (>=6.7.0)"] snowflake = ["snowflake-connector-python (>=1.8.2,<2.5)"] sodasql = ["soda-sql (>=2.0.0b25)"] spacy = ["spacy (>=2.0.0,<3.0.0)"] -sql_server = ["pyodbc (>=4.0.30)"] -task_library_ci = ["airtable-python-wrapper (>=0.11,<0.12)", "boto3 (>=1.9,<2.0)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "azure-cosmos (>=3.1.1,<3.2)", "atlassian-python-api (>=2.0.1)", "black", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "mypy (>=0.600,<0.813)", "Pygments (>=2.2,<3.0)", "pytest (>=6.0)", "testfixtures (>=6.10.3)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "flaky (>=3.0)", "responses (>=0.14.0)", "dropbox (>=9.0,<10.0)", "great-expectations (>=0.11.1)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-auth (>=2.0,<3.0)", "dulwich (>=0.19.7)", "PyGithub (>=1.51,<2.0)", "python-gitlab (>=2.5.0,<3.0)", "gspread (>=3.6.0)", "jira (>=2.0.0)", "papermill (>=2.2.0)", "nbconvert (>=6.0.7)", "confluent-kafka (>=1.7.0)", "dask-kubernetes (>=0.8.0)", "kubernetes (>=9.0.0a1,<=13.0)", "pandas (>=1.0.1)", "psycopg2-binary (>=2.8.2)", "prometheus-client (>=0.9.0)", "pymysql (>=0.9.3)", "pushbullet.py (>=0.11.0)", "redis (>=3.2.1)", "feedparser (>=5.0.1,<6.0)", "snowflake-connector-python (>=1.8.2,<2.5)", "spacy (>=2.0.0,<3.0.0)", "hvac (>=0.10)", "graphviz (>=0.8.3)", "tweepy (>=3.5,<4.0)", "pyarrow (>=5.0.0)", "pyexasol (>=0.16.1)", "soda-sql (>=2.0.0b25)", "sendgrid (>=6.7.0)"] +sql-server = ["pyodbc (>=4.0.30)"] +task-library-ci = ["PyGithub (>=1.51,<2.0)", "Pygments (>=2.2,<3.0)", "airtable-python-wrapper (>=0.11,<0.12)", "atlassian-python-api (>=2.0.1)", "azure-cosmos (>=3.1.1,<3.2)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "black", "boto3 (>=1.9,<2.0)", "confluent-kafka (>=1.7.0)", "dask-kubernetes (>=0.8.0)", "dropbox (>=9.0,<10.0)", "dulwich (>=0.19.7)", "feedparser (>=5.0.1,<6.0)", "flaky (>=3.0)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "graphviz (>=0.8)", "graphviz (>=0.8.3)", "great-expectations (>=0.11.1)", "gspread (>=3.6.0)", "hvac (>=0.10)", "jinja2 (>=2.0,<4.0)", "jira (>=2.0.0)", "kubernetes (>=9.0.0a1,<=13.0)", "mypy (>=0.600,<0.813)", "nbconvert (>=6.0.7)", "pandas (>=1.0.1)", "papermill (>=2.2.0)", "prometheus-client (>=0.9.0)", "psycopg2-binary (>=2.8.2)", "pushbullet.py (>=0.11.0)", "pyarrow (>=5.0.0)", "pyexasol (>=0.16.1)", "pymysql (>=0.9.3)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "python-gitlab (>=2.5.0,<3.0)", "redis (>=3.2.1)", "responses (>=0.14.0)", "sendgrid (>=6.7.0)", "snowflake-connector-python (>=1.8.2,<2.5)", "soda-sql (>=2.0.0b25)", "spacy (>=2.0.0,<3.0.0)", "testfixtures (>=6.10.3)", "tweepy (>=3.5,<4.0)"] templates = ["jinja2 (>=2.0,<4.0)"] -test = ["pytest (>=6.0)", "testfixtures (>=6.10.3)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "flaky (>=3.0)", "responses (>=0.14.0)"] +test = ["flaky (>=3.0)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "responses (>=0.14.0)", "testfixtures (>=6.10.3)"] twitter = ["tweepy (>=3.5,<4.0)"] vault = ["hvac (>=0.10)"] viz = ["graphviz (>=0.8.3)"] @@ -1097,6 +1838,10 @@ description = "Beautiful, Pythonic protocol buffers." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "proto-plus-1.19.8.tar.gz", hash = "sha256:bdf45f0e0be71510eb2ec9db4da78afde7b5fb8b0a507a36340a9b6ce8e48e58"}, + {file = "proto_plus-1.19.8-py3-none-any.whl", hash = "sha256:3434eadaed845a337d6c488d2b7d055d733aaa231c0c0d4c778ec720bb91cf87"}, +] [package.dependencies] protobuf = ">=3.19.0" @@ -1111,6 +1856,32 @@ description = "Protocol Buffers" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "protobuf-3.19.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d80f80eb175bf5f1169139c2e0c5ada98b1c098e2b3c3736667f28cbbea39fc8"}, + {file = "protobuf-3.19.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a529e7df52204565bcd33738a7a5f288f3d2d37d86caa5d78c458fa5fabbd54d"}, + {file = "protobuf-3.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28ccea56d4dc38d35cd70c43c2da2f40ac0be0a355ef882242e8586c6d66666f"}, + {file = "protobuf-3.19.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b30a7de128c46b5ecb343917d9fa737612a6e8280f440874e5cc2ba0d79b8f6"}, + {file = "protobuf-3.19.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5935c8ce02e3d89c7900140a8a42b35bc037ec07a6aeb61cc108be8d3c9438a6"}, + {file = "protobuf-3.19.1-cp36-cp36m-win32.whl", hash = "sha256:74f33edeb4f3b7ed13d567881da8e5a92a72b36495d57d696c2ea1ae0cfee80c"}, + {file = "protobuf-3.19.1-cp36-cp36m-win_amd64.whl", hash = "sha256:038daf4fa38a7e818dd61f51f22588d61755160a98db087a046f80d66b855942"}, + {file = "protobuf-3.19.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e51561d72efd5bd5c91490af1f13e32bcba8dab4643761eb7de3ce18e64a853"}, + {file = "protobuf-3.19.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:6e8ea9173403219239cdfd8d946ed101f2ab6ecc025b0fda0c6c713c35c9981d"}, + {file = "protobuf-3.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db3532d9f7a6ebbe2392041350437953b6d7a792de10e629c1e4f5a6b1fe1ac6"}, + {file = "protobuf-3.19.1-cp37-cp37m-win32.whl", hash = "sha256:615b426a177780ce381ecd212edc1e0f70db8557ed72560b82096bd36b01bc04"}, + {file = "protobuf-3.19.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d8919368410110633717c406ab5c97e8df5ce93020cfcf3012834f28b1fab1ea"}, + {file = "protobuf-3.19.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:71b0250b0cfb738442d60cab68abc166de43411f2a4f791d31378590bfb71bd7"}, + {file = "protobuf-3.19.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3cd0458870ea7d1c58e948ac8078f6ba8a7ecc44a57e03032ed066c5bb318089"}, + {file = "protobuf-3.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:655264ed0d0efe47a523e2255fc1106a22f6faab7cc46cfe99b5bae085c2a13e"}, + {file = "protobuf-3.19.1-cp38-cp38-win32.whl", hash = "sha256:b691d996c6d0984947c4cf8b7ae2fe372d99b32821d0584f0b90277aa36982d3"}, + {file = "protobuf-3.19.1-cp38-cp38-win_amd64.whl", hash = "sha256:e7e8d2c20921f8da0dea277dfefc6abac05903ceac8e72839b2da519db69206b"}, + {file = "protobuf-3.19.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fd390367fc211cc0ffcf3a9e149dfeca78fecc62adb911371db0cec5c8b7472d"}, + {file = "protobuf-3.19.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d83e1ef8cb74009bebee3e61cc84b1c9cd04935b72bca0cbc83217d140424995"}, + {file = "protobuf-3.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36d90676d6f426718463fe382ec6274909337ca6319d375eebd2044e6c6ac560"}, + {file = "protobuf-3.19.1-cp39-cp39-win32.whl", hash = "sha256:e7b24c11df36ee8e0c085e5b0dc560289e4b58804746fb487287dda51410f1e2"}, + {file = "protobuf-3.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:77d2fadcf369b3f22859ab25bd12bb8e98fb11e05d9ff9b7cd45b711c719c002"}, + {file = "protobuf-3.19.1-py2.py3-none-any.whl", hash = "sha256:e813b1c9006b6399308e917ac5d298f345d95bb31f46f02b60cd92970a9afa17"}, + {file = "protobuf-3.19.1.tar.gz", hash = "sha256:62a8e4baa9cb9e064eb62d1002eca820857ab2138440cb4b3ea4243830f94ca7"}, +] [[package]] name = "psutil" @@ -1119,9 +1890,39 @@ description = "Cross-platform lib for process and system monitoring in Python." category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "psutil-5.8.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64"}, + {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0ae6f386d8d297177fd288be6e8d1afc05966878704dad9847719650e44fc49c"}, + {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:12d844996d6c2b1d3881cfa6fa201fd635971869a9da945cf6756105af73d2df"}, + {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:02b8292609b1f7fcb34173b25e48d0da8667bc85f81d7476584d889c6e0f2131"}, + {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6ffe81843131ee0ffa02c317186ed1e759a145267d54fdef1bc4ea5f5931ab60"}, + {file = "psutil-5.8.0-cp27-none-win32.whl", hash = "sha256:ea313bb02e5e25224e518e4352af4bf5e062755160f77e4b1767dd5ccb65f876"}, + {file = "psutil-5.8.0-cp27-none-win_amd64.whl", hash = "sha256:5da29e394bdedd9144c7331192e20c1f79283fb03b06e6abd3a8ae45ffecee65"}, + {file = "psutil-5.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:74fb2557d1430fff18ff0d72613c5ca30c45cdbfcddd6a5773e9fc1fe9364be8"}, + {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:74f2d0be88db96ada78756cb3a3e1b107ce8ab79f65aa885f76d7664e56928f6"}, + {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99de3e8739258b3c3e8669cb9757c9a861b2a25ad0955f8e53ac662d66de61ac"}, + {file = "psutil-5.8.0-cp36-cp36m-win32.whl", hash = "sha256:36b3b6c9e2a34b7d7fbae330a85bf72c30b1c827a4366a07443fc4b6270449e2"}, + {file = "psutil-5.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:52de075468cd394ac98c66f9ca33b2f54ae1d9bff1ef6b67a212ee8f639ec06d"}, + {file = "psutil-5.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c6a5fd10ce6b6344e616cf01cc5b849fa8103fbb5ba507b6b2dee4c11e84c935"}, + {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:61f05864b42fedc0771d6d8e49c35f07efd209ade09a5afe6a5059e7bb7bf83d"}, + {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:0dd4465a039d343925cdc29023bb6960ccf4e74a65ad53e768403746a9207023"}, + {file = "psutil-5.8.0-cp37-cp37m-win32.whl", hash = "sha256:1bff0d07e76114ec24ee32e7f7f8d0c4b0514b3fae93e3d2aaafd65d22502394"}, + {file = "psutil-5.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:fcc01e900c1d7bee2a37e5d6e4f9194760a93597c97fee89c4ae51701de03563"}, + {file = "psutil-5.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6223d07a1ae93f86451d0198a0c361032c4c93ebd4bf6d25e2fb3edfad9571ef"}, + {file = "psutil-5.8.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d225cd8319aa1d3c85bf195c4e07d17d3cd68636b8fc97e6cf198f782f99af28"}, + {file = "psutil-5.8.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:28ff7c95293ae74bf1ca1a79e8805fcde005c18a122ca983abf676ea3466362b"}, + {file = "psutil-5.8.0-cp38-cp38-win32.whl", hash = "sha256:ce8b867423291cb65cfc6d9c4955ee9bfc1e21fe03bb50e177f2b957f1c2469d"}, + {file = "psutil-5.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:90f31c34d25b1b3ed6c40cdd34ff122b1887a825297c017e4cbd6796dd8b672d"}, + {file = "psutil-5.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6323d5d845c2785efb20aded4726636546b26d3b577aded22492908f7c1bdda7"}, + {file = "psutil-5.8.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:245b5509968ac0bd179287d91210cd3f37add77dad385ef238b275bad35fa1c4"}, + {file = "psutil-5.8.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:90d4091c2d30ddd0a03e0b97e6a33a48628469b99585e2ad6bf21f17423b112b"}, + {file = "psutil-5.8.0-cp39-cp39-win32.whl", hash = "sha256:ea372bcc129394485824ae3e3ddabe67dc0b118d262c568b4d2602a7070afdb0"}, + {file = "psutil-5.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3"}, + {file = "psutil-5.8.0.tar.gz", hash = "sha256:0c9ccb99ab76025f2f0bbecf341d4656e9c1351db8cc8a03ccd62e318ab4b5c6"}, +] [package.extras] -test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"] +test = ["enum34", "ipaddress", "mock", "pywin32", "unittest2", "wmi"] [[package]] name = "py" @@ -1130,6 +1931,10 @@ description = "library with cross-python path, ini-parsing, io, code, log facili category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] [[package]] name = "pyaml" @@ -1138,6 +1943,10 @@ description = "PyYAML-based module to produce pretty and readable YAML-serialize category = "main" optional = false python-versions = "*" +files = [ + {file = "pyaml-20.4.0-py2.py3-none-any.whl", hash = "sha256:67081749a82b72c45e5f7f812ee3a14a03b3f5c25ff36ec3b290514f8c4c4b99"}, + {file = "pyaml-20.4.0.tar.gz", hash = "sha256:29a5c2a68660a799103d6949167bd6c7953d031449d08802386372de1db6ad71"}, +] [package.dependencies] PyYAML = "*" @@ -1149,6 +1958,44 @@ description = "Python library for Apache Arrow" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_13_universal2.whl", hash = "sha256:c7a6e7e0bf8779e9c3428ced85507541f3da9a0675e2f4781d4eb2c7042cbf81"}, + {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:7a683f71b848eb6310b4ec48c0def55dac839e9994c1ac874c9b2d3d5625def1"}, + {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5144bd9db2920c7cb566c96462d62443cc239104f94771d110f74393f2fb42a2"}, + {file = "pyarrow-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed0be080cf595ea15ff1c9ff4097bbf1fcc4b50847d98c0a3c0412fbc6ede7e9"}, + {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:072c1a0fca4509eefd7d018b78542fb7e5c63aaf5698f1c0a6e45628ae17ba44"}, + {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5bed4f948c032c40597302e9bdfa65f62295240306976ecbe43a54924c6f94f"}, + {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:465f87fa0be0b2928b2beeba22b5813a0203fb05d90fd8563eea48e08ecc030e"}, + {file = "pyarrow-6.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:ddf2e6e3b321adaaf716f2d5af8e92d205a9671e0cb7c0779710a567fd1dd580"}, + {file = "pyarrow-6.0.0-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:0204e80777ab8f4e9abd3a765a8ec07ed1e3c4630bacda50d2ce212ef0f3826f"}, + {file = "pyarrow-6.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:82fe80309e01acf29e3943a1f6d3c98ec109fe1d356bc1ac37d639bcaadcf684"}, + {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:281ce5fa03621d786a9beb514abb09846db7f0221b50eabf543caa24037eaacd"}, + {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5408fa8d623e66a0445f3fb0e4027fd219bf99bfb57422d543d7b7876e2c5b55"}, + {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a19e58dfb04e451cd8b7bdec3ac8848373b95dfc53492c9a69789aa9074a3c1b"}, + {file = "pyarrow-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b86d175262db1eb46afdceb36d459409eb6f8e532d3dec162f8bf572c7f57623"}, + {file = "pyarrow-6.0.0-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:2d2c681659396c745e4f1988d5dd41dcc3ad557bb8d4a8c2e44030edafc08a91"}, + {file = "pyarrow-6.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c666bc6a1cebf01206e2dc1ab05f25f39f35d3a499e0ef5cd635225e07306ca"}, + {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8d41dfb09ba9236cca6245f33088eb42f3c54023da281139241e0f9f3b4b754e"}, + {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477c746ef42c039348a288584800e299456c80c5691401bb9b19aa9c02a427b7"}, + {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c38263ea438a1666b13372e7565450cfeec32dbcd1c2595749476a58465eaec"}, + {file = "pyarrow-6.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e81508239a71943759cee272ce625ae208092dd36ef2c6713fccee30bbcf52bb"}, + {file = "pyarrow-6.0.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:a50d2f77b86af38ceabf45617208b9105d20e7a5eebc584e7c8c0acededd82ce"}, + {file = "pyarrow-6.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbda7595f24a639bcef3419ecfac17216efacb09f7b0f1b4c4c97f900d65ca0e"}, + {file = "pyarrow-6.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bf3400780c4d3c9cb43b1e8a1aaf2e1b7199a0572d0a645529d2784e4d0d8497"}, + {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:15dc0d673d3f865ca63c877bd7a2eced70b0a08969fb733a28247134b8a1f18b"}, + {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1d9a2f4ee812ed0bd4182cabef99ea914ac297274f0de086f2488093d284ef"}, + {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d046dc78a9337baa6415be915c5a16222505233e238a1017f368243c89817eea"}, + {file = "pyarrow-6.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:ea64a48a85c631eb2a0ea13ccdec5143c85b5897836b16331ee4289d27a57247"}, + {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_13_universal2.whl", hash = "sha256:cc1d4a70efd583befe92d4ea6f74ed2e0aa31ccdde767cd5cae8e77c65a1c2d4"}, + {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:004185e0babc6f3c3fba6ba4f106e406a0113d0f82bb9ad9a8571a1978c45d04"}, + {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c23f8cdecd3d9e49f9b0f9a651ae5549d1d32fd4901fb1bdc2d327edfba844f"}, + {file = "pyarrow-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fb701ec4a94b92102606d4e88f0b8eba34f09a5ad8e014eaa4af76f42b7f62ae"}, + {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da7860688c33ca88ac05f1a487d32d96d9caa091412496c35f3d1d832145675a"}, + {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac941a147d14993987cc8b605b721735a34b3e54d167302501fb4db1ad7382c7"}, + {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6163d82cca7541774b00503c295fe86a1722820eddb958b57f091bb6f5b0a6db"}, + {file = "pyarrow-6.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:376c4b5f248ae63df21fe15c194e9013753164be2d38f4b3fb8bde63ac5a1958"}, + {file = "pyarrow-6.0.0.tar.gz", hash = "sha256:5be62679201c441356d3f2a739895dcc8d4d299f2a6eabcd2163bfb6a898abba"}, +] [package.dependencies] numpy = ">=1.16.6" @@ -1160,6 +2007,10 @@ description = "ASN.1 types and codecs" category = "main" optional = false python-versions = "*" +files = [ + {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, + {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, +] [[package]] name = "pyasn1-modules" @@ -1168,6 +2019,10 @@ description = "A collection of ASN.1-based protocols modules." category = "main" optional = false python-versions = "*" +files = [ + {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, + {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, +] [package.dependencies] pyasn1 = ">=0.4.6,<0.5.0" @@ -1179,10 +2034,15 @@ description = "PyData helpers for authenticating to Google APIs" category = "main" optional = false python-versions = "*" +files = [ + {file = "pydata-google-auth-1.2.0.tar.gz", hash = "sha256:076411ecd7a5ac927ba9741c32ea599bc66e54170dffc1259f3cd353cf25cbd7"}, + {file = "pydata_google_auth-1.2.0-py2.py3-none-any.whl", hash = "sha256:2e2b27425d6f8a9ead496c0fd677a09448cbca2b71055abe3ee72c7f8f1774f4"}, +] [package.dependencies] google-auth = "*" google-auth-oauthlib = "*" +setuptools = "*" [[package]] name = "pymssql" @@ -1191,6 +2051,59 @@ description = "DB-API interface to Microsoft SQL Server for Python. (new Cython- category = "main" optional = false python-versions = "*" +files = [ + {file = "pymssql-2.2.5-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:6462017183f05ae231c3f84efce4e9a8d085b4a2e9e3ed5c407ee643494a0842"}, + {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6a013c82f7320c92039ac20db935e897a3fcd7423435705cef177f863dbb32e4"}, + {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:45e9bba4870103363c865d2b867de8de082745dd753083f27927ded3d15df587"}, + {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20de2f718f3c99040637a0e7d3b81f22e62211bcac01fb65641b964e70f26e20"}, + {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18eb4fcb55b67aaa2811e124eb8750fd84eeba1668a695908c6cc13682f6be5d"}, + {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_24_i686.whl", hash = "sha256:9969971117401096a8a7c1e08d84ea3d5d3f598ee482822583a44e2e6d3791d0"}, + {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:bb858c8a64990dd0145d874ef01af4b6fe39e9202ee0a74a8dff8285b801db21"}, + {file = "pymssql-2.2.5-cp310-cp310-win32.whl", hash = "sha256:da78a94908d42aa0f8af1b917c49c4dea38273035f81ea168b095e0b3ba8e486"}, + {file = "pymssql-2.2.5-cp310-cp310-win_amd64.whl", hash = "sha256:b691779a450ebbbb98cd2ad89ae9f17799b0bf0c9dd2e65b316efcc74246716e"}, + {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92262bf5d21b6d80e887d6fd0f03ab6337dad39b642b1887416cc67b1bd04cbf"}, + {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00f5b7e22bf7eb0faa5c6693e02c00f10ecc89fe505bbe84d553352681c2a749"}, + {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac80d1d11703120b986c604ddf4993c3dcbcbe907b04e34729c5aae2891399c0"}, + {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bf813ea0e4a0bfbb53a3469125eed06635222ea729339403585fd45f18a7812"}, + {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_24_i686.whl", hash = "sha256:73b747261cdf8d69395823cf650cf143d618ada412cbec90a88e4d449e7fa7f8"}, + {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_24_x86_64.whl", hash = "sha256:ce9e7ed16793c72d28e80506abd59a06b594fc55fe24f6256b7007b5b5e26120"}, + {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b5dcb4e4ceb16592a5d9ea3868162f21e7c215dde5c5e7f992709696c84a69b0"}, + {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9c90bc134a0c5c60e9acf651d87275c7e6dc6682981f62d574fa3dd441acb0f2"}, + {file = "pymssql-2.2.5-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:29d647ef61641cebc0e16d4a549b3f793f32bab88e7ba7c7550772a7aba9dea3"}, + {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:633079e248cdefef2207c0a55608637d0f3410f53e5679c589b37ea7965a2cca"}, + {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e373764cc81719f830b113ce6fee6849f2c4e5dfe1037804864b7dfb9946817e"}, + {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b47c05da0fffd6dd77141c1c37975a8469334f63e6faf03f5eab6d83c9001cc"}, + {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc245011aad9c018105193585469461c35fb35e7255b8e66fa27479f835742aa"}, + {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_24_i686.whl", hash = "sha256:72bbccdaf4938db7ff99db1f82ecdf6dc78778d8b7bbe6080590dd01024988de"}, + {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:395ec9e512a8d5b707aea8f516eebf51291b6fb6bc18fe4da88b222843bd4d46"}, + {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bb912b4681d55dce63f940becb7f4533661cfdb99cd6cd3daa7d7b5e285e977"}, + {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14dee37da84653d1e483236d51bc0545e6442e0642ee362526db6599fd3c1733"}, + {file = "pymssql-2.2.5-cp37-cp37m-win32.whl", hash = "sha256:5e2cd5a6da441aa3e8ee13e8811f884791d77a4cb17028381543bf50d010c919"}, + {file = "pymssql-2.2.5-cp37-cp37m-win_amd64.whl", hash = "sha256:ba43efd1057018ab404c8603bbce643347b9165c08364df8a8c03d54dffc4453"}, + {file = "pymssql-2.2.5-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:ac8d6b7e0dc97a9261b7500f086772ff5cf2bf9a0340d0aaee4dff5b217dd526"}, + {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ed7c5e58cd0ffcf3448cc38dfd2a6011f657759fcae9509748320cd89a0b8d32"}, + {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:30c4ab08cff619c7fe4d309fa6a05219b343082a1f46ca368deab5841632b8bf"}, + {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49806c343a6dea5221e98cabed1532fdd14535c5e5bb183001e0ffad31e11032"}, + {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15cc71762ec75a66bcb3751c2534ba4151b8512252b0377b842efec7cae6d953"}, + {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_24_i686.whl", hash = "sha256:e42c7043c472d45db686ae67601c6680596a2f12ceaa99fb136e647d3d8cd643"}, + {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:c738d51181ab4b3332631644ef7b561543837d1d942a291f8bc36a9e2dfb65db"}, + {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e33770ad113a646a45e4fc75f30683e92c9b929431e12977f824d6c810f28162"}, + {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8c5ad8d09f9035009ccb6f20bc9829ef60c03c436efb4b5c33af395c4030ea3d"}, + {file = "pymssql-2.2.5-cp38-cp38-win32.whl", hash = "sha256:c0611a3ea2a7ac496df30506fd28e4f7389808c59743b2eac0069e89af7289b8"}, + {file = "pymssql-2.2.5-cp38-cp38-win_amd64.whl", hash = "sha256:45c1519c94f9915911075c95fc63d62ba612e152248093aa12b7e902499c6416"}, + {file = "pymssql-2.2.5-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:1089cd5871daedc9918f8958605bbd2621006c29c06b571b419be53ea46c113a"}, + {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8ac2b3213462f078671806702dfadb8e459923f0f5013d371febebf4caf598ba"}, + {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9b707e5867bb49ad9d8945231112dfa3e9588b98f6f1248714d1f1af88321230"}, + {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:538a8e7ce255cabf093b25b72f8037b1d5fd3ba28b13a34c761a029840dc1880"}, + {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b9f5ec7896fd2f19393cd564d8ef562b26692218a84088ce1b10e9fe1215032"}, + {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_24_i686.whl", hash = "sha256:6086f0b695b7ceb4603cdc2f66356a58e367a3f1828d1ca99255c4d92d1f0932"}, + {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:e0b1bcb8465d787d5141bfc02d98e1e507d02155848b1b5622528402760f5dbf"}, + {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ebb7867207cf4cd497ea1d01b42590ed1db3561ef3ab8e135239301b6ee2695e"}, + {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8b32ad436f293c8cbadc1ba3aaf2621ab82303d169b1ab6f30f55053640ab5b1"}, + {file = "pymssql-2.2.5-cp39-cp39-win32.whl", hash = "sha256:cc523bfd26671346faccb1273b16a74dcdf1a8ac81c93c6bfebdb240e4d5a042"}, + {file = "pymssql-2.2.5-cp39-cp39-win_amd64.whl", hash = "sha256:e9cce9c47e6d550992936f91f8f2e97a8f5132749bad1cd4f5f7923bf8732d1f"}, + {file = "pymssql-2.2.5.tar.gz", hash = "sha256:857411c308ecb584a3ca633be30f1971d2a8cc0bcd978709b1abf96ff43767ad"}, +] [[package]] name = "pyparsing" @@ -1199,6 +2112,10 @@ description = "Python parsing module" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, + {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, +] [package.extras] diagrams = ["jinja2", "railroad-diagrams"] @@ -1210,6 +2127,10 @@ description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "pytest-6.0.2-py3-none-any.whl", hash = "sha256:0e37f61339c4578776e090c3b8f6b16ce4db333889d65d0efb305243ec544b40"}, + {file = "pytest-6.0.2.tar.gz", hash = "sha256:c8f57c2a30983f469bf03e68cdfa74dc474ce56b8f280ddcb080dfd91df01043"}, +] [package.dependencies] atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} @@ -1223,7 +2144,7 @@ py = ">=1.8.2" toml = "*" [package.extras] -checkqa_mypy = ["mypy (==0.780)"] +checkqa-mypy = ["mypy (==0.780)"] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] [[package]] @@ -1233,13 +2154,17 @@ description = "Pytest plugin for measuring coverage." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, + {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, +] [package.dependencies] coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] -testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] [[package]] name = "python-box" @@ -1248,12 +2173,16 @@ description = "Advanced Python dictionaries with dot notation access" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "python-box-5.4.1.tar.gz", hash = "sha256:b68e0f8abc86f3deda751b3390f64df64a0989459de51ba4db949662a7b4d8ac"}, + {file = "python_box-5.4.1-py3-none-any.whl", hash = "sha256:60ae9156de34cf92b899bd099580950df70a5b0813e67a3310a1cdd1976457fa"}, +] [package.extras] -pyyaml = ["pyyaml"] -all = ["ruamel.yaml", "toml", "msgpack"] +all = ["msgpack", "ruamel.yaml", "toml"] msgpack = ["msgpack"] -"ruamel.yaml" = ["ruamel.yaml"] +pyyaml = ["PyYAML"] +ruamel-yaml = ["ruamel.yaml"] toml = ["toml"] yaml = ["ruamel.yaml"] @@ -1264,6 +2193,10 @@ description = "Extensions to the standard Python datetime module" category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] [package.dependencies] six = ">=1.5" @@ -1275,6 +2208,10 @@ description = "A Python Slugify application that handles Unicode" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "python-slugify-5.0.2.tar.gz", hash = "sha256:f13383a0b9fcbe649a1892b9c8eb4f8eab1d6d84b84bb7a624317afa98159cab"}, + {file = "python_slugify-5.0.2-py2.py3-none-any.whl", hash = "sha256:6d8c5df75cd4a7c3a2d21e257633de53f52ab0265cd2d1dc62a730e8194a7380"}, +] [package.dependencies] text-unidecode = ">=1.3" @@ -1289,6 +2226,10 @@ description = "World timezone definitions, modern and historical" category = "main" optional = false python-versions = "*" +files = [ + {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, + {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, +] [[package]] name = "pytzdata" @@ -1297,6 +2238,10 @@ description = "The Olson timezone database for Python." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, + {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, +] [[package]] name = "pywin32" @@ -1305,6 +2250,20 @@ description = "Python for Window Extensions" category = "main" optional = false python-versions = "*" +files = [ + {file = "pywin32-227-cp27-cp27m-win32.whl", hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"}, + {file = "pywin32-227-cp27-cp27m-win_amd64.whl", hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"}, + {file = "pywin32-227-cp35-cp35m-win32.whl", hash = "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"}, + {file = "pywin32-227-cp35-cp35m-win_amd64.whl", hash = "sha256:a929a4af626e530383a579431b70e512e736e9588106715215bf685a3ea508d4"}, + {file = "pywin32-227-cp36-cp36m-win32.whl", hash = "sha256:300a2db938e98c3e7e2093e4491439e62287d0d493fe07cce110db070b54c0be"}, + {file = "pywin32-227-cp36-cp36m-win_amd64.whl", hash = "sha256:9b31e009564fb95db160f154e2aa195ed66bcc4c058ed72850d047141b36f3a2"}, + {file = "pywin32-227-cp37-cp37m-win32.whl", hash = "sha256:47a3c7551376a865dd8d095a98deba954a98f326c6fe3c72d8726ca6e6b15507"}, + {file = "pywin32-227-cp37-cp37m-win_amd64.whl", hash = "sha256:31f88a89139cb2adc40f8f0e65ee56a8c585f629974f9e07622ba80199057511"}, + {file = "pywin32-227-cp38-cp38-win32.whl", hash = "sha256:7f18199fbf29ca99dff10e1f09451582ae9e372a892ff03a28528a24d55875bc"}, + {file = "pywin32-227-cp38-cp38-win_amd64.whl", hash = "sha256:7c1ae32c489dc012930787f06244426f8356e129184a02c25aef163917ce158e"}, + {file = "pywin32-227-cp39-cp39-win32.whl", hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"}, + {file = "pywin32-227-cp39-cp39-win_amd64.whl", hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"}, +] [[package]] name = "pyyaml" @@ -1313,6 +2272,48 @@ description = "YAML parser and emitter for Python" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] [[package]] name = "rarfile" @@ -1321,6 +2322,10 @@ description = "RAR archive reader for Python" category = "main" optional = false python-versions = "*" +files = [ + {file = "rarfile-4.0-py3-none-any.whl", hash = "sha256:1094869119012f95c31a6f22cc3a9edbdca61861b805241116adbe2d737b68f8"}, + {file = "rarfile-4.0.tar.gz", hash = "sha256:67548769229c5bda0827c1663dce3f54644f9dbfba4ae86d4da2b2afd3e602a1"}, +] [[package]] name = "redis" @@ -1329,6 +2334,10 @@ description = "Python client for Redis database and key-value store" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "redis-4.3.4-py3-none-any.whl", hash = "sha256:a52d5694c9eb4292770084fa8c863f79367ca19884b329ab574d5cb2036b3e54"}, + {file = "redis-4.3.4.tar.gz", hash = "sha256:ddf27071df4adf3821c4f2ca59d67525c3a82e5f268bed97b813cb4fabf87880"}, +] [package.dependencies] async-timeout = ">=4.0.2" @@ -1346,6 +2355,10 @@ description = "Store things in Redis without worrying about types or anything, j category = "main" optional = false python-versions = ">=3.8,<4.0" +files = [ + {file = "redis-pal-1.0.0.tar.gz", hash = "sha256:8e20caf8127056a2d1208d6dd0873643efb8357602193e26c1ada8ed6737fa88"}, + {file = "redis_pal-1.0.0-py3-none-any.whl", hash = "sha256:8cbf55c926c761ce9d60803ed66ef2575f351b43c9554fd66f6458d323430bf0"}, +] [package.dependencies] dill = ">=0.3.5,<0.4.0" @@ -1358,6 +2371,10 @@ description = "Python HTTP for Humans." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, + {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, +] [package.dependencies] certifi = ">=2017.4.17" @@ -1367,7 +2384,7 @@ urllib3 = ">=1.21.1,<1.27" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<5)"] [[package]] name = "requests-oauthlib" @@ -1376,6 +2393,10 @@ description = "OAuthlib authentication support for Requests." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-oauthlib-1.3.0.tar.gz", hash = "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a"}, + {file = "requests_oauthlib-1.3.0-py2.py3-none-any.whl", hash = "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d"}, +] [package.dependencies] oauthlib = ">=3.0.0" @@ -1391,6 +2412,10 @@ description = "Pure-Python RSA implementation" category = "main" optional = false python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.8-py3-none-any.whl", hash = "sha256:95c5d300c4e879ee69708c428ba566c59478fd653cc3a22243eeb8ed846950bb"}, + {file = "rsa-4.8.tar.gz", hash = "sha256:5c6bd9dc7a543b7fe4304a631f8a8a3b674e2bbfc49c2ae96200cdbe55df6b17"}, +] [package.dependencies] pyasn1 = ">=0.1.3" @@ -1402,6 +2427,10 @@ description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip pres category = "main" optional = false python-versions = ">=3" +files = [ + {file = "ruamel.yaml-0.17.10-py3-none-any.whl", hash = "sha256:ffb9b703853e9e8b7861606dfdab1026cf02505bade0653d1880f4b2db47f815"}, + {file = "ruamel.yaml-0.17.10.tar.gz", hash = "sha256:106bc8d6dc6a0ff7c9196a47570432036f41d556b779c6b4e618085f57e39e67"}, +] [package.dependencies] "ruamel.yaml.clib" = {version = ">=0.1.2", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.10\""} @@ -1417,6 +2446,38 @@ description = "C version of reader, parser and emitter for ruamel.yaml derived f category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e7be2c5bcb297f5b82fee9c665eb2eb7001d1050deaba8471842979293a80b0"}, + {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:066f886bc90cc2ce44df8b5f7acfc6a7e2b2e672713f027136464492b0c34d7c"}, + {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:221eca6f35076c6ae472a531afa1c223b9c29377e62936f61bc8e6e8bdc5f9e7"}, + {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win32.whl", hash = "sha256:1070ba9dd7f9370d0513d649420c3b362ac2d687fe78c6e888f5b12bf8bc7bee"}, + {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:77df077d32921ad46f34816a9a16e6356d8100374579bc35e15bab5d4e9377de"}, + {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:cfdb9389d888c5b74af297e51ce357b800dd844898af9d4a547ffc143fa56751"}, + {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7b2927e92feb51d830f531de4ccb11b320255ee95e791022555971c466af4527"}, + {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win32.whl", hash = "sha256:ada3f400d9923a190ea8b59c8f60680c4ef8a4b0dfae134d2f2ff68429adfab5"}, + {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win_amd64.whl", hash = "sha256:de9c6b8a1ba52919ae919f3ae96abb72b994dd0350226e28f3686cb4f142165c"}, + {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d67f273097c368265a7b81e152e07fb90ed395df6e552b9fa858c6d2c9f42502"}, + {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:72a2b8b2ff0a627496aad76f37a652bcef400fd861721744201ef1b45199ab78"}, + {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d3c620a54748a3d4cf0bcfe623e388407c8e85a4b06b8188e126302bcab93ea8"}, + {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win32.whl", hash = "sha256:9efef4aab5353387b07f6b22ace0867032b900d8e91674b5d8ea9150db5cae94"}, + {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win_amd64.whl", hash = "sha256:846fc8336443106fe23f9b6d6b8c14a53d38cef9a375149d61f99d78782ea468"}, + {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0847201b767447fc33b9c235780d3aa90357d20dd6108b92be544427bea197dd"}, + {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:78988ed190206672da0f5d50c61afef8f67daa718d614377dcd5e3ed85ab4a99"}, + {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:210c8fcfeff90514b7133010bf14e3bad652c8efde6b20e00c43854bf94fa5a6"}, + {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win32.whl", hash = "sha256:a49e0161897901d1ac9c4a79984b8410f450565bbad64dbfcbf76152743a0cdb"}, + {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win_amd64.whl", hash = "sha256:bf75d28fa071645c529b5474a550a44686821decebdd00e21127ef1fd566eabe"}, + {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a32f8d81ea0c6173ab1b3da956869114cae53ba1e9f72374032e33ba3118c233"}, + {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7f7ecb53ae6848f959db6ae93bdff1740e651809780822270eab111500842a84"}, + {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:61bc5e5ca632d95925907c569daa559ea194a4d16084ba86084be98ab1cec1c6"}, + {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win32.whl", hash = "sha256:89221ec6d6026f8ae859c09b9718799fea22c0e8da8b766b0b2c9a9ba2db326b"}, + {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win_amd64.whl", hash = "sha256:31ea73e564a7b5fbbe8188ab8b334393e06d997914a4e184975348f204790277"}, + {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc6a613d6c74eef5a14a214d433d06291526145431c3b964f5e16529b1842bed"}, + {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1866cf2c284a03b9524a5cc00daca56d80057c5ce3cdc86a52020f4c720856f0"}, + {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1b4139a6ffbca8ef60fdaf9b33dec05143ba746a6f0ae0f9d11d38239211d335"}, + {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win32.whl", hash = "sha256:3fb9575a5acd13031c57a62cc7823e5d2ff8bc3835ba4d94b921b4e6ee664104"}, + {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win_amd64.whl", hash = "sha256:825d5fccef6da42f3c8eccd4281af399f21c02b32d98e113dbc631ea6a6ecbc7"}, + {file = "ruamel.yaml.clib-0.2.6.tar.gz", hash = "sha256:4ff604ce439abb20794f05613c374759ce10e3595d1867764dd1ae675b85acbd"}, +] [[package]] name = "scipy" @@ -1425,6 +2486,31 @@ description = "SciPy: Scientific Library for Python" category = "main" optional = false python-versions = ">=3.8,<3.11" +files = [ + {file = "scipy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:87b01c7d5761e8a266a0fbdb9d88dcba0910d63c1c671bdb4d99d29f469e9e03"}, + {file = "scipy-1.8.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ae3e327da323d82e918e593460e23babdce40d7ab21490ddf9fc06dec6b91a18"}, + {file = "scipy-1.8.0-cp310-cp310-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:16e09ef68b352d73befa8bcaf3ebe25d3941fe1a58c82909d5589856e6bc8174"}, + {file = "scipy-1.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c17a1878d00a5dd2797ccd73623ceca9d02375328f6218ee6d921e1325e61aff"}, + {file = "scipy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937d28722f13302febde29847bbe554b89073fbb924a30475e5ed7b028898b5f"}, + {file = "scipy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:8f4d059a97b29c91afad46b1737274cb282357a305a80bdd9e8adf3b0ca6a3f0"}, + {file = "scipy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:38aa39b6724cb65271e469013aeb6f2ce66fd44f093e241c28a9c6bc64fd79ed"}, + {file = "scipy-1.8.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:559a8a4c03a5ba9fe3232f39ed24f86457e4f3f6c0abbeae1fb945029f092720"}, + {file = "scipy-1.8.0-cp38-cp38-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:f4a6d3b9f9797eb2d43938ac2c5d96d02aed17ef170c8b38f11798717523ddba"}, + {file = "scipy-1.8.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92b2c2af4183ed09afb595709a8ef5783b2baf7f41e26ece24e1329c109691a7"}, + {file = "scipy-1.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a279e27c7f4566ef18bab1b1e2c37d168e365080974758d107e7d237d3f0f484"}, + {file = "scipy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad5be4039147c808e64f99c0e8a9641eb5d2fa079ff5894dcd8240e94e347af4"}, + {file = "scipy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:3d9dd6c8b93a22bf9a3a52d1327aca7e092b1299fb3afc4f89e8eba381be7b59"}, + {file = "scipy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:5e73343c5e0d413c1f937302b2e04fb07872f5843041bcfd50699aef6e95e399"}, + {file = "scipy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:de2e80ee1d925984c2504812a310841c241791c5279352be4707cdcd7c255039"}, + {file = "scipy-1.8.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:c2bae431d127bf0b1da81fc24e4bba0a84d058e3a96b9dd6475dfcb3c5e8761e"}, + {file = "scipy-1.8.0-cp39-cp39-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:723b9f878095ed994756fa4ee3060c450e2db0139c5ba248ee3f9628bd64e735"}, + {file = "scipy-1.8.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:011d4386b53b933142f58a652aa0f149c9b9242abd4f900b9f4ea5fbafc86b89"}, + {file = "scipy-1.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6f0cd9c0bd374ef834ee1e0f0999678d49dcc400ea6209113d81528958f97c7"}, + {file = "scipy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3720d0124aced49f6f2198a6900304411dbbeed12f56951d7c66ebef05e3df6"}, + {file = "scipy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:3d573228c10a3a8c32b9037be982e6440e411b443a6267b067cac72f690b8d56"}, + {file = "scipy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb7088e89cd751acf66195d2f00cf009a1ea113f3019664032d9075b1e727b6c"}, + {file = "scipy-1.8.0.tar.gz", hash = "sha256:31d4f2d6b724bc9a98e527b5849b8a7e589bf1ea630c33aa563eda912c9ff0bd"}, +] [package.dependencies] numpy = ">=1.17.3,<1.25.0" @@ -1436,6 +2522,10 @@ description = "seaborn: statistical data visualization" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "seaborn-0.11.2-py3-none-any.whl", hash = "sha256:85a6baa9b55f81a0623abddc4a26b334653ff4c6b18c418361de19dbba0ef283"}, + {file = "seaborn-0.11.2.tar.gz", hash = "sha256:cf45e9286d40826864be0e3c066f98536982baf701a7caa386511792d61ff4f6"}, +] [package.dependencies] matplotlib = ">=2.2" @@ -1444,20 +2534,21 @@ pandas = ">=0.23" scipy = ">=1.0" [[package]] -name = "setuptools-scm" -version = "6.4.2" -description = "the blessed package to manage your versions by scm tags" +name = "setuptools" +version = "67.6.1" +description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "main" optional = false -python-versions = ">=3.6" - -[package.dependencies] -packaging = ">=20.0" -tomli = ">=1.0.0" +python-versions = ">=3.7" +files = [ + {file = "setuptools-67.6.1-py3-none-any.whl", hash = "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078"}, + {file = "setuptools-67.6.1.tar.gz", hash = "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a"}, +] [package.extras] -test = ["pytest (>=6.2)", "virtualenv (>20)"] -toml = ["setuptools (>=42)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -1466,6 +2557,10 @@ description = "Python 2 and 3 compatibility utilities" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "sortedcontainers" @@ -1474,6 +2569,10 @@ description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" category = "main" optional = false python-versions = "*" +files = [ + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, +] [[package]] name = "soupsieve" @@ -1482,6 +2581,10 @@ description = "A modern CSS selector implementation for Beautiful Soup." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, + {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, +] [[package]] name = "tabulate" @@ -1490,6 +2593,10 @@ description = "Pretty-print tabular data" category = "main" optional = false python-versions = "*" +files = [ + {file = "tabulate-0.8.9-py3-none-any.whl", hash = "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4"}, + {file = "tabulate-0.8.9.tar.gz", hash = "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7"}, +] [package.extras] widechars = ["wcwidth"] @@ -1501,6 +2608,10 @@ description = "Traceback serialization library." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "tblib-1.7.0-py2.py3-none-any.whl", hash = "sha256:289fa7359e580950e7d9743eab36b0691f0310fce64dee7d9c31065b8f723e23"}, + {file = "tblib-1.7.0.tar.gz", hash = "sha256:059bd77306ea7b419d4f76016aef6d7027cc8a0785579b5aad198803435f882c"}, +] [[package]] name = "text-unidecode" @@ -1509,6 +2620,10 @@ description = "The most basic Text::Unidecode port" category = "main" optional = false python-versions = "*" +files = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] [[package]] name = "toml" @@ -1517,14 +2632,22 @@ description = "Python Library for Tom's Obvious, Minimal Language" category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] [[package]] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] [[package]] name = "tomlkit" @@ -1533,6 +2656,10 @@ description = "Style preserving TOML library" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "tomlkit-0.7.0-py2.py3-none-any.whl", hash = "sha256:6babbd33b17d5c9691896b0e68159215a9387ebfa938aa3ac42f4a4beeb2b831"}, + {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, +] [[package]] name = "toolz" @@ -1541,6 +2668,10 @@ description = "List processing tools and functional utilities" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "toolz-0.11.2-py3-none-any.whl", hash = "sha256:a5700ce83414c64514d82d60bcda8aabfde092d1c1a8663f9200c07fdcc6da8f"}, + {file = "toolz-0.11.2.tar.gz", hash = "sha256:6b312d5e15138552f1bda8a4e66c30e236c831b612b2bf0005f8a1df10a4bc33"}, +] [[package]] name = "tornado" @@ -1549,6 +2680,49 @@ description = "Tornado is a Python web framework and asynchronous networking lib category = "main" optional = false python-versions = ">= 3.5" +files = [ + {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, + {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, + {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, + {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, + {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, + {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, + {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, + {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, + {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, + {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, + {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, + {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, + {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, + {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, + {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, + {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, + {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, + {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, + {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, + {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, + {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, + {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, + {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, + {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, + {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, + {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, + {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, + {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, + {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, + {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, + {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, + {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, +] [[package]] name = "tqdm" @@ -1557,9 +2731,13 @@ description = "Fast, Extensible Progress Meter" category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*" +files = [ + {file = "tqdm-4.50.2-py2.py3-none-any.whl", hash = "sha256:43ca183da3367578ebf2f1c2e3111d51ea161ed1dc4e6345b86e27c2a93beff7"}, + {file = "tqdm-4.50.2.tar.gz", hash = "sha256:69dfa6714dee976e2425a9aab84b622675b7b1742873041e3db8a8e86132a4af"}, +] [package.extras] -dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] +dev = ["argopt", "py-make (>=0.1.0)", "pydoc-markdown", "twine"] [[package]] name = "tweepy" @@ -1568,6 +2746,10 @@ description = "Twitter library for Python" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "tweepy-4.4.0-py2.py3-none-any.whl", hash = "sha256:cf02c4fbbd027fbc7172c24d03f53f061329ac040b22d201e59592a1cff86364"}, + {file = "tweepy-4.4.0.tar.gz", hash = "sha256:8d4b4520271b796fa7efc4c5d5ef3228af4d79f6a4d3ace3900b2778ed8f6f1c"}, +] [package.dependencies] requests = ">=2.11.1,<3" @@ -1586,6 +2768,10 @@ description = "ASCII transliterations of Unicode text" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "Unidecode-1.3.4-py3-none-any.whl", hash = "sha256:afa04efcdd818a93237574791be9b2817d7077c25a068b00f8cff7baa4e59257"}, + {file = "Unidecode-1.3.4.tar.gz", hash = "sha256:8e4352fb93d5a735c788110d2e7ac8e8031eb06ccbfe8d324ab71735015f9342"}, +] [[package]] name = "uritemplate" @@ -1594,6 +2780,10 @@ description = "Implementation of RFC 6570 URI Templates" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, + {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, +] [[package]] name = "urllib3" @@ -1602,10 +2792,14 @@ description = "HTTP library with thread-safe connection pooling, file post, and category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +files = [ + {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, + {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, +] [package.extras] brotli = ["brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] @@ -1615,6 +2809,10 @@ description = "Virtual Python Environment builder" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "virtualenv-20.16.3-py2.py3-none-any.whl", hash = "sha256:4193b7bc8a6cd23e4eb251ac64f29b4398ab2c233531e66e40b19a6b7b0d30c1"}, + {file = "virtualenv-20.16.3.tar.gz", hash = "sha256:d86ea0bb50e06252d79e6c241507cb904fcd66090c3271381372d6221a3970f9"}, +] [package.dependencies] distlib = ">=0.3.5,<1" @@ -1632,6 +2830,10 @@ description = "WebSocket client for Python with low level API options" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "websocket-client-1.2.1.tar.gz", hash = "sha256:8dfb715d8a992f5712fff8c843adae94e22b22a99b2c5e6b0ec4a1a981cc4e0d"}, + {file = "websocket_client-1.2.1-py2.py3-none-any.whl", hash = "sha256:0133d2f784858e59959ce82ddac316634229da55b498aac311f1620567a710ec"}, +] [package.extras] optional = ["python-socks", "wsaccel"] @@ -1644,6 +2846,9 @@ description = "pure python download utility" category = "main" optional = false python-versions = "*" +files = [ + {file = "wget-3.2.zip", hash = "sha256:35e630eca2aa50ce998b9b1a127bb26b30dfee573702782aa982f875e3f16061"}, +] [[package]] name = "win32-setctime" @@ -1652,9 +2857,13 @@ description = "A small Python utility to set file creation time on Windows" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, + {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, +] [package.extras] -dev = ["pytest (>=4.6.2)", "black (>=19.3b0)"] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] [[package]] name = "wrapt" @@ -1663,6 +2872,72 @@ description = "Module for decorators, wrappers and monkey patching." category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, + {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, + {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, + {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, + {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, + {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, + {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, + {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, + {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, + {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, + {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, + {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, + {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, + {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, + {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, + {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, +] [[package]] name = "zict" @@ -1671,6 +2946,10 @@ description = "Mutable mapping tools" category = "main" optional = false python-versions = "*" +files = [ + {file = "zict-2.0.0-py3-none-any.whl", hash = "sha256:26aa1adda8250a78dfc6a78d200bfb2ea43a34752cf58980bca75dde0ba0c6e9"}, + {file = "zict-2.0.0.tar.gz", hash = "sha256:8e2969797627c8a663575c2fc6fcb53a05e37cdb83ee65f341fc6e0c3d0ced16"}, +] [package.dependencies] heapdict = "*" @@ -1682,145 +2961,16 @@ description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, + {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, +] [package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] +docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] +testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] -lock-version = "1.1" +lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "386708a680c12b63843df69173e9193fc9a88adce420ddadd1c4351236fb6756" - -[metadata.files] -async-timeout = [] -atomicwrites = [] -attrs = [] -basedosdados = [] -beautifulsoup4 = [] -cachetools = [] -certifi = [] -cfgv = [] -charset-normalizer = [] -ckanapi = [] -click = [] -cloudpickle = [] -colorama = [] -coverage = [] -croniter = [] -cycler = [] -dask = [] -db-dtypes = [] -dbt-client = [] -deprecated = [] -dill = [] -distlib = [] -distributed = [] -docker = [] -docopt = [] -fastavro = [] -filelock = [] -fonttools = [] -fsspec = [] -google-analytics-data = [] -google-api-core = [] -google-api-python-client = [] -google-auth = [] -google-auth-httplib2 = [] -google-auth-oauthlib = [] -google-cloud-bigquery = [] -google-cloud-bigquery-storage = [] -google-cloud-core = [] -google-cloud-storage = [] -google-crc32c = [] -google-resumable-media = [] -googleapis-common-protos = [] -grpcio = [] -heapdict = [] -httplib2 = [] -hvac = [] -identify = [] -idna = [] -importlib-metadata = [] -iniconfig = [] -ipeadatapy = [] -jinja2 = [] -kiwisolver = [] -locket = [] -loguru = [] -markupsafe = [] -marshmallow = [] -marshmallow-oneofschema = [] -matplotlib = [] -more-itertools = [] -msgpack = [] -mypy-extensions = [] -nodeenv = [] -numpy = [] -oauth2client = [] -oauthlib = [] -packaging = [] -pandas = [] -pandas-gbq = [] -pandavro = [] -partd = [] -pendulum = [] -pillow = [] -platformdirs = [] -pluggy = [] -pre-commit = [] -prefect = [] -proto-plus = [] -protobuf = [] -psutil = [] -py = [] -pyaml = [] -pyarrow = [] -pyasn1 = [] -pyasn1-modules = [] -pydata-google-auth = [] -pymssql = [] -pyparsing = [] -pytest = [] -pytest-cov = [] -python-box = [] -python-dateutil = [] -python-slugify = [] -pytz = [] -pytzdata = [] -pywin32 = [] -pyyaml = [] -rarfile = [] -redis = [] -redis-pal = [] -requests = [] -requests-oauthlib = [] -rsa = [] -"ruamel.yaml" = [] -"ruamel.yaml.clib" = [] -scipy = [] -seaborn = [] -setuptools-scm = [] -six = [] -sortedcontainers = [] -soupsieve = [] -tabulate = [] -tblib = [] -text-unidecode = [] -toml = [] -tomli = [] -tomlkit = [] -toolz = [] -tornado = [] -tqdm = [] -tweepy = [] -unidecode = [] -uritemplate = [] -urllib3 = [] -virtualenv = [] -websocket-client = [] -wget = [] -win32-setctime = [] -wrapt = [] -zict = [] -zipp = [] +content-hash = "53567a347be523a08cfbd7f65e1c74e6e9009b7622b685043971cd4e02af915d" diff --git a/pyproject.toml b/pyproject.toml index 5160e0077..80ac31818 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -98,6 +98,7 @@ google-api-python-client = "^2.58.0" oauth2client = "^4.1.3" redis-pal = "^1.0.0" rarfile = "^4.0" +setuptools = "^67.6.1" [tool.poetry.dev-dependencies] pytest_cov = "^3.0.0" From b9faf9ab1c7dd4ec28090a301710250e96d5397d Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 28 Mar 2023 17:57:15 -0300 Subject: [PATCH 008/265] Testing basics --- poetry.lock | 74 +++++++++++++++++--------------------------------- pyproject.toml | 3 ++ 2 files changed, 28 insertions(+), 49 deletions(-) diff --git a/poetry.lock b/poetry.lock index ac53e631b..552c28da8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -12,18 +12,6 @@ files = [ {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, ] -[[package]] -name = "atomicwrites" -version = "1.4.0" -description = "Atomic file writes." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] - [[package]] name = "attrs" version = "21.4.0" @@ -459,6 +447,21 @@ files = [ {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, ] +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + [[package]] name = "fastavro" version = "1.4.11" @@ -1327,18 +1330,6 @@ pillow = ">=6.2.0" pyparsing = ">=2.2.1" python-dateutil = ">=2.7" -[[package]] -name = "more-itertools" -version = "8.13.0" -description = "More routines for operating on iterables, beyond itertools" -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "more-itertools-8.13.0.tar.gz", hash = "sha256:a42901a0a5b169d925f6f217cd5a190e32ef54360905b9c39ee7db5313bfec0f"}, - {file = "more_itertools-8.13.0-py3-none-any.whl", hash = "sha256:c5122bffc5f104d37c1626b8615b511f3427aa5389b94d61e5ef8236bfbc3ddb"}, -] - [[package]] name = "msgpack" version = "1.0.3" @@ -1924,18 +1915,6 @@ files = [ [package.extras] test = ["enum34", "ipaddress", "mock", "pywin32", "unittest2", "wmi"] -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] - [[package]] name = "pyaml" version = "20.4.0" @@ -2122,30 +2101,27 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "6.0.2" +version = "7.2.2" description = "pytest: simple powerful testing with Python" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" files = [ - {file = "pytest-6.0.2-py3-none-any.whl", hash = "sha256:0e37f61339c4578776e090c3b8f6b16ce4db333889d65d0efb305243ec544b40"}, - {file = "pytest-6.0.2.tar.gz", hash = "sha256:c8f57c2a30983f469bf03e68cdfa74dc474ce56b8f280ddcb080dfd91df01043"}, + {file = "pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"}, + {file = "pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"}, ] [package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=17.4.0" +attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" -more-itertools = ">=4.0.0" packaging = "*" -pluggy = ">=0.12,<1.0" -py = ">=1.8.2" -toml = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] -checkqa-mypy = ["mypy (==0.780)"] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] [[package]] name = "pytest-cov" @@ -2973,4 +2949,4 @@ testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>= [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "53567a347be523a08cfbd7f65e1c74e6e9009b7622b685043971cd4e02af915d" +content-hash = "0304f0713d13aaa626a639a75b4def629dc9d5b53f1c47f4f3442f55036e8e62" diff --git a/pyproject.toml b/pyproject.toml index 80ac31818..1eba9aefd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -103,6 +103,9 @@ setuptools = "^67.6.1" [tool.poetry.dev-dependencies] pytest_cov = "^3.0.0" +[tool.poetry.group.dev.dependencies] +pytest = "^7.2.2" + [build-system] build-backend = "poetry.core.masonry.api" requires = ["poetry-core>=1.0.0"] From b2d5511f721ce14bd089ebf8cd572c6f47646c1b Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 28 Mar 2023 18:25:43 -0300 Subject: [PATCH 009/265] No invalid month --- br_denatran_frota/code/download_frota.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index d12cd9856..9484725ec 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -28,6 +28,9 @@ def download_frota( month=None, year=None, tempdir=None, dir=None): url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-Senatran/frota-de-veiculos-{year}" else: raise ValueError("Utilize a função download_frota_old()") + + if month not in months.values(): + raise ValueError('Mês inválido.') if not tempdir: tempdir = tempfile.gettempdir() From 5ae0b1a91ecb8f98cacf8d15846b065c2731ed0b Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 28 Mar 2023 18:33:36 -0300 Subject: [PATCH 010/265] Tests where I want them. --- br_denatran_frota/code/test/download_frota_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/br_denatran_frota/code/test/download_frota_test.py b/br_denatran_frota/code/test/download_frota_test.py index f88ce1e99..d6e71e71d 100644 --- a/br_denatran_frota/code/test/download_frota_test.py +++ b/br_denatran_frota/code/test/download_frota_test.py @@ -24,7 +24,7 @@ def test_download_frota_with_invalid_year(self): download_frota(month=1, year=2010) def test_download_frota_with_invalid_month(self): - with self.assertRaises(HTTPError): + with self.assertRaises(ValueError): download_frota(month=13, year=2022, dir=self.test_dir) def test_download_frota_with_missing_directory(self): From 86bd42318dad2591b8b34dd87bd500f9337dbf3c Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 28 Mar 2023 18:44:54 -0300 Subject: [PATCH 011/265] Black reformat --- br_denatran_frota/code/download_frota.py | 35 +++++++------ poetry.lock | 64 +++++++++++++++++++++++- 2 files changed, 82 insertions(+), 17 deletions(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index 9484725ec..ead3761d2 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -8,7 +8,7 @@ from collections import defaultdict -def download_frota( month=None, year=None, tempdir=None, dir=None): +def download_frota(month=None, year=None, tempdir=None, dir=None): months = { "janeiro": 1, "fevereiro": 2, @@ -28,9 +28,9 @@ def download_frota( month=None, year=None, tempdir=None, dir=None): url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-Senatran/frota-de-veiculos-{year}" else: raise ValueError("Utilize a função download_frota_old()") - + if month not in months.values(): - raise ValueError('Mês inválido.') + raise ValueError("Mês inválido.") if not tempdir: tempdir = tempfile.gettempdir() @@ -78,27 +78,32 @@ def handle_compact(i): os.rename(filepath, dest_path_file) else: os.remove(filepath) - + def download_file(i): - if i['filetype'] in ['rar', 'zip']: + if i["filetype"] in ["rar", "zip"]: handle_compact(i) - elif i['filetype'] in ['xlsx', 'xls']: + elif i["filetype"] in ["xlsx", "xls"]: handle_xl(i) - + soup = BeautifulSoup(urlopen(url), "html.parser") nodes = soup.select("p > a") - - data = defaultdict(list) for node in nodes: txt = node.text - href = node.get('href') - match = re.search(r"(?i)\/([\w-]+)\/(\d{4})\/(\w+)\/([\w-]+)\.(?:xls|xlsx|rar|zip)$", href) + href = node.get("href") + match = re.search( + r"(?i)\/([\w-]+)\/(\d{4})\/(\w+)\/([\w-]+)\.(?:xls|xlsx|rar|zip)$", href + ) if match: matched_month = match.group(3) matched_year = match.group(2) if months.get(matched_month) == month and matched_year == str(year): - filetype = match.group(0).split('.')[-1].lower() - info = {'txt': txt, 'href': href, 'mes_name': matched_month, 'mes': month, 'ano': year, 'filetype': filetype} + filetype = match.group(0).split(".")[-1].lower() + info = { + "txt": txt, + "href": href, + "mes_name": matched_month, + "mes": month, + "ano": year, + "filetype": filetype, + } download_file(info) - -download_frota(year=2022, month = 12) \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 552c28da8..892fed80a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -80,6 +80,42 @@ soupsieve = ">1.2" html5lib = ["html5lib"] lxml = ["lxml"] +[[package]] +name = "black" +version = "22.12.0" +description = "The uncompromising code formatter." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, + {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, + {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, + {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, + {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, + {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, + {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, + {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, + {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, + {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, + {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, + {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + [[package]] name = "cachetools" version = "4.2.4" @@ -1607,6 +1643,18 @@ toolz = "*" [package.extras] complete = ["blosc", "numpy (>=1.9.0)", "pandas (>=0.19.0)", "pyzmq"] +[[package]] +name = "pathspec" +version = "0.11.1" +description = "Utility library for gitignore style pattern matching of file paths." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] + [[package]] name = "pendulum" version = "2.1.2" @@ -2617,7 +2665,7 @@ files = [ name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2737,6 +2785,18 @@ dev = ["coveralls (>=2.1.0)", "tox (>=3.14.0)"] socks = ["requests[socks] (>=2.11.1,<3)"] test = ["vcrpy (>=1.10.3)"] +[[package]] +name = "typing-extensions" +version = "4.5.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, + {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, +] + [[package]] name = "unidecode" version = "1.3.4" @@ -2949,4 +3009,4 @@ testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>= [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "0304f0713d13aaa626a639a75b4def629dc9d5b53f1c47f4f3442f55036e8e62" +content-hash = "e2ddd4fc39e83bcf7162fa18653c18a75e8f3b7117f990d6c540bca848d06edb" From ac5aeda36e799bcb0006f0868e4f90c27e16d481 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 28 Mar 2023 20:04:57 -0300 Subject: [PATCH 012/265] Get only frota data (for now) --- br_denatran_frota/code/download_frota.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index ead3761d2..10a355079 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -86,7 +86,7 @@ def download_file(i): handle_xl(i) soup = BeautifulSoup(urlopen(url), "html.parser") - nodes = soup.select("p > a") + nodes = soup.select("p:contains('Frota por ') > a") for node in nodes: txt = node.text href = node.get("href") From eb4d8338685d0a1773c1529452964c5aeb1324d6 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 28 Mar 2023 20:21:13 -0300 Subject: [PATCH 013/265] Begin encapsulation + documentation --- br_denatran_frota/code/download_frota.py | 39 ++++++++++++++++-------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index 10a355079..91196b825 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -8,7 +8,28 @@ from collections import defaultdict -def download_frota(month=None, year=None, tempdir=None, dir=None): +def make_filename(i: dict, ext: bool = True) -> str: + """Cria o nome do arquivo usando o dicionário enviado. + + Args: + i (dict): Dicionário com todas as informações do arquivo. + ext (bool, optional): Especifica se o nome de arquivo gerado precisa do tipo de arquivo no fim. Defaults to True. + + Returns: + str: O nome completo do arquivo. + """ + txt = i["txt"] + mes = i["mes"] + ano = i["ano"] + filetype = i["filetype"] + filename = re.sub("\\s+", "_", txt, flags=re.UNICODE).lower() + filename = f"{filename}_{mes}-{ano}" + if ext: + filename += f".{filetype}" + return filename + + +def download_frota(month: int = None, year: int = None, tempdir=None, dir=None): months = { "janeiro": 1, "fevereiro": 2, @@ -27,7 +48,7 @@ def download_frota(month=None, year=None, tempdir=None, dir=None): if year > 2012: url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-Senatran/frota-de-veiculos-{year}" else: - raise ValueError("Utilize a função download_frota_old()") + raise ValueError("Para anos anteriores eu não implementei a função ainda.") if month not in months.values(): raise ValueError("Mês inválido.") @@ -37,17 +58,6 @@ def download_frota(month=None, year=None, tempdir=None, dir=None): if not dir: dir = os.getcwd() - def make_filename(i, ext=True): - txt = i["txt"] - mes = i["mes"] - ano = i["ano"] - filetype = i["filetype"] - filename = re.sub("\\s+", "_", txt, flags=re.UNICODE).lower() - filename = f"{filename}_{mes}-{ano}" - if ext: - filename += f".{filetype}" - return filename - def handle_xl(i): dest_path_file = os.path.join(dir, f"{i['mes']}-{i['ano']}.{i['filetype']}") if not os.path.isfile(dest_path_file): @@ -107,3 +117,6 @@ def download_file(i): "filetype": filetype, } download_file(info) + + +download_frota(year=2022, month=2) From d7f5445534765fedf45b6f3e5eb457112be9c58c Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 28 Mar 2023 20:36:55 -0300 Subject: [PATCH 014/265] Better and cleaner code --- br_denatran_frota/code/download_frota.py | 87 ++++++++++--------- .../code/test/download_frota_test.py | 14 +-- 2 files changed, 53 insertions(+), 48 deletions(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index 91196b825..e68379470 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -5,7 +5,41 @@ from zipfile import ZipFile from rarfile import RarFile from bs4 import BeautifulSoup -from collections import defaultdict + + +def handle_xl(i: dict): + tempdir = i["tempdir"] + dest_path_file = os.path.join(tempdir, make_filename(i)) + if not os.path.isfile(dest_path_file): + urlretrieve(i["href"], dest_path_file) + + +def handle_compact(i: dict): + tempdir = i["tempdir"] + path_file_zip = os.path.join(tempdir, make_filename(i)) + dir_file = os.path.join(tempdir, make_filename(i, ext=False)) + + if not os.path.isfile(path_file_zip): + urlretrieve(i["href"], path_file_zip) + + if i["filetype"] == "rar": + with RarFile(path_file_zip) as rar_file: + rar_file.extractall(dir_file) + else: + with ZipFile(path_file_zip) as zip_file: + zip_file.extractall(dir_file) + + for filename in os.listdir(dir_file): + filepath = os.path.join(dir_file, filename) + if os.path.isfile(filepath): + if filename.endswith((".xlsx", ".xls")): + dest_path_file = os.path.join( + dir_name, f"{i['mes']}-{i['ano']}.{filename.split('.')[-1]}" + ) + if not os.path.isfile(dest_path_file): + os.rename(filepath, dest_path_file) + else: + os.remove(filepath) def make_filename(i: dict, ext: bool = True) -> str: @@ -29,7 +63,14 @@ def make_filename(i: dict, ext: bool = True) -> str: return filename -def download_frota(month: int = None, year: int = None, tempdir=None, dir=None): +def download_file(i): + if i["filetype"] in ["rar", "zip"]: + handle_compact(i) + elif i["filetype"] in ["xlsx", "xls"]: + handle_xl(i) + + +def download_frota(month: int = None, year: int = None, tempdir=None, dir_name=None): months = { "janeiro": 1, "fevereiro": 2, @@ -55,45 +96,8 @@ def download_frota(month: int = None, year: int = None, tempdir=None, dir=None): if not tempdir: tempdir = tempfile.gettempdir() - if not dir: - dir = os.getcwd() - - def handle_xl(i): - dest_path_file = os.path.join(dir, f"{i['mes']}-{i['ano']}.{i['filetype']}") - if not os.path.isfile(dest_path_file): - urlretrieve(i["href"], dest_path_file) - - def handle_compact(i): - path_file_zip = os.path.join(tempdir, make_filename(i)) - dir_file = os.path.join(tempdir, make_filename(i, ext=False)) - - if not os.path.isfile(path_file_zip): - urlretrieve(i["href"], path_file_zip) - - if i["filetype"] == "rar": - with RarFile(path_file_zip) as rar_file: - rar_file.extractall(dir_file) - else: - with ZipFile(path_file_zip) as zip_file: - zip_file.extractall(dir_file) - - for filename in os.listdir(dir_file): - filepath = os.path.join(dir_file, filename) - if os.path.isfile(filepath): - if filename.endswith((".xlsx", ".xls")): - dest_path_file = os.path.join( - dir, f"{i['mes']}-{i['ano']}.{filename.split('.')[-1]}" - ) - if not os.path.isfile(dest_path_file): - os.rename(filepath, dest_path_file) - else: - os.remove(filepath) - - def download_file(i): - if i["filetype"] in ["rar", "zip"]: - handle_compact(i) - elif i["filetype"] in ["xlsx", "xls"]: - handle_xl(i) + if not dir_name: + dir_name = os.getcwd() soup = BeautifulSoup(urlopen(url), "html.parser") nodes = soup.select("p:contains('Frota por ') > a") @@ -115,6 +119,7 @@ def download_file(i): "mes": month, "ano": year, "filetype": filetype, + "tempdir": tempdir, } download_file(info) diff --git a/br_denatran_frota/code/test/download_frota_test.py b/br_denatran_frota/code/test/download_frota_test.py index d6e71e71d..1a6dddc39 100644 --- a/br_denatran_frota/code/test/download_frota_test.py +++ b/br_denatran_frota/code/test/download_frota_test.py @@ -7,7 +7,6 @@ class TestDownloadFrota(unittest.TestCase): - def setUp(self): self.test_dir = tempfile.mkdtemp() @@ -15,8 +14,8 @@ def tearDown(self): os.rmdir(self.test_dir) def test_download_frota_with_valid_args(self): - with patch('urllib.request.urlretrieve') as mock_urlretrieve: - download_frota(month=2, year=2022, dir=self.test_dir) + with patch("urllib.request.urlretrieve") as mock_urlretrieve: + download_frota(month=2, year=2022, dir_name=self.test_dir) mock_urlretrieve.assert_called_once() def test_download_frota_with_invalid_year(self): @@ -25,15 +24,16 @@ def test_download_frota_with_invalid_year(self): def test_download_frota_with_invalid_month(self): with self.assertRaises(ValueError): - download_frota(month=13, year=2022, dir=self.test_dir) + download_frota(month=13, year=2022, dir_name=self.test_dir) def test_download_frota_with_missing_directory(self): with self.assertRaises(FileNotFoundError): - download_frota(month=1, year=2022, dir='invalid_directory') + download_frota(month=1, year=2022, dir_name="invalid_directory") def test_download_frota_with_missing_temp_directory(self): with self.assertRaises(FileNotFoundError): - download_frota(month=1, year=2022, tempdir='invalid_directory') + download_frota(month=1, year=2022, tempdir="invalid_directory") + -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() From 9cd6d486192fb5a840f40110682656f5bf62e412 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 28 Mar 2023 20:45:24 -0300 Subject: [PATCH 015/265] More cleanup. Compact is not useful as of now --- br_denatran_frota/code/download_frota.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index e68379470..265b2f551 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -33,9 +33,7 @@ def handle_compact(i: dict): filepath = os.path.join(dir_file, filename) if os.path.isfile(filepath): if filename.endswith((".xlsx", ".xls")): - dest_path_file = os.path.join( - dir_name, f"{i['mes']}-{i['ano']}.{filename.split('.')[-1]}" - ) + dest_path_file = os.path.join(tempdir, make_filename(i)) if not os.path.isfile(dest_path_file): os.rename(filepath, dest_path_file) else: @@ -100,10 +98,12 @@ def download_frota(month: int = None, year: int = None, tempdir=None, dir_name=N dir_name = os.getcwd() soup = BeautifulSoup(urlopen(url), "html.parser") + # Só queremos os dados de frota nacional. nodes = soup.select("p:contains('Frota por ') > a") for node in nodes: txt = node.text href = node.get("href") + # Pega a parte relevante do arquivo em questão. match = re.search( r"(?i)\/([\w-]+)\/(\d{4})\/(\w+)\/([\w-]+)\.(?:xls|xlsx|rar|zip)$", href ) From 46f3c2c03a126d78676f224e16ddb4f480e824ac Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 28 Mar 2023 21:06:26 -0300 Subject: [PATCH 016/265] Clean and good python code. --- br_denatran_frota/code/download_frota.py | 34 +++++++++++++++++------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index 265b2f551..6919ac70c 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -7,9 +7,17 @@ from bs4 import BeautifulSoup -def handle_xl(i: dict): - tempdir = i["tempdir"] - dest_path_file = os.path.join(tempdir, make_filename(i)) +def handle_xl(i: dict) -> None: + """Efetivamente baixa e lida com arquivos excel. + + Args: + i (dict): Dicionário com as informações do arquivo a ser baixado. + """ + dir_name = os.getcwd() + # TODO: Isso aqui NÃO ESTÁ muito limpo ou genérico, e não sei onde deveriam ficar os arquivos por hora. + dest_path_file = os.path.join( + dir_name, "br_denatran_frota", "files", make_filename(i) + ) if not os.path.isfile(dest_path_file): urlretrieve(i["href"], dest_path_file) @@ -62,13 +70,23 @@ def make_filename(i: dict, ext: bool = True) -> str: def download_file(i): - if i["filetype"] in ["rar", "zip"]: - handle_compact(i) - elif i["filetype"] in ["xlsx", "xls"]: + if i["filetype"] in ["xlsx", "xls"]: handle_xl(i) + else: + raise ValueError("A função handle_compact tá bem esquisita por hora.") -def download_frota(month: int = None, year: int = None, tempdir=None, dir_name=None): +def download_frota(month: int, year: int): + """Função principal para baixar os dados de frota por município e tipo e também por UF e tipo. + + Args: + month (int): Mês desejado. + year (int): Ano desejado. + + Raises: + ValueError: Dá erro caso o ano desejado seja anterior ao que a função consegue no momento. + ValueError: Dá erro caso o mês desejado não seja um mês válido. + """ months = { "janeiro": 1, "fevereiro": 2, @@ -94,8 +112,6 @@ def download_frota(month: int = None, year: int = None, tempdir=None, dir_name=N if not tempdir: tempdir = tempfile.gettempdir() - if not dir_name: - dir_name = os.getcwd() soup = BeautifulSoup(urlopen(url), "html.parser") # Só queremos os dados de frota nacional. From 2bba044474ec973f9f61ad101c3e6858802292e4 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 28 Mar 2023 21:08:36 -0300 Subject: [PATCH 017/265] More cleanup after the cleanup --- br_denatran_frota/code/download_frota.py | 4 ---- br_denatran_frota/code/test/download_frota_test.py | 12 ++---------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index 6919ac70c..e4dbff033 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -110,9 +110,6 @@ def download_frota(month: int, year: int): if month not in months.values(): raise ValueError("Mês inválido.") - if not tempdir: - tempdir = tempfile.gettempdir() - soup = BeautifulSoup(urlopen(url), "html.parser") # Só queremos os dados de frota nacional. nodes = soup.select("p:contains('Frota por ') > a") @@ -135,7 +132,6 @@ def download_frota(month: int, year: int): "mes": month, "ano": year, "filetype": filetype, - "tempdir": tempdir, } download_file(info) diff --git a/br_denatran_frota/code/test/download_frota_test.py b/br_denatran_frota/code/test/download_frota_test.py index 1a6dddc39..6c258a2f9 100644 --- a/br_denatran_frota/code/test/download_frota_test.py +++ b/br_denatran_frota/code/test/download_frota_test.py @@ -15,7 +15,7 @@ def tearDown(self): def test_download_frota_with_valid_args(self): with patch("urllib.request.urlretrieve") as mock_urlretrieve: - download_frota(month=2, year=2022, dir_name=self.test_dir) + download_frota(month=2, year=2022) mock_urlretrieve.assert_called_once() def test_download_frota_with_invalid_year(self): @@ -24,15 +24,7 @@ def test_download_frota_with_invalid_year(self): def test_download_frota_with_invalid_month(self): with self.assertRaises(ValueError): - download_frota(month=13, year=2022, dir_name=self.test_dir) - - def test_download_frota_with_missing_directory(self): - with self.assertRaises(FileNotFoundError): - download_frota(month=1, year=2022, dir_name="invalid_directory") - - def test_download_frota_with_missing_temp_directory(self): - with self.assertRaises(FileNotFoundError): - download_frota(month=1, year=2022, tempdir="invalid_directory") + download_frota(month=13, year=2022) if __name__ == "__main__": From 5bb9ce6fd8985754123e92bfebb3d1fb758e2474 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 28 Mar 2023 21:10:30 -0300 Subject: [PATCH 018/265] Remove line for testing --- br_denatran_frota/code/download_frota.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index e4dbff033..7596b899e 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -134,6 +134,3 @@ def download_frota(month: int, year: int): "filetype": filetype, } download_file(info) - - -download_frota(year=2022, month=2) From b520f2dc0793fe2a0dabd789122bc3d3aa96305a Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 28 Mar 2023 21:41:06 -0300 Subject: [PATCH 019/265] Working (badly) tests --- br_denatran_frota/code/test/download_frota_test.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/br_denatran_frota/code/test/download_frota_test.py b/br_denatran_frota/code/test/download_frota_test.py index 6c258a2f9..93ca1b9e0 100644 --- a/br_denatran_frota/code/test/download_frota_test.py +++ b/br_denatran_frota/code/test/download_frota_test.py @@ -14,9 +14,17 @@ def tearDown(self): os.rmdir(self.test_dir) def test_download_frota_with_valid_args(self): - with patch("urllib.request.urlretrieve") as mock_urlretrieve: - download_frota(month=2, year=2022) - mock_urlretrieve.assert_called_once() + # TODO: Since there is no teardown, this test doesn't have the same effect running twice. + # It could always download the file twice in download_frota OR we implement cleanup? + # Or we generalize with tempd irs. This might just be overkill anyway. + download_frota(month=2, year=2022) + expected_file_path = os.path.join( + os.getcwd(), + "br_denatran_frota", + "files", + "frota_por_município_e_tipo_2-2022.xls", + ) + self.assertTrue(os.path.isfile(expected_file_path)) def test_download_frota_with_invalid_year(self): with self.assertRaises(ValueError): From c0eaac008cfbe1de992324b68cfc007f8d6e0faf Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 29 Mar 2023 17:24:47 -0300 Subject: [PATCH 020/265] Improving code quality --- br_denatran_frota/code/download_frota.py | 3 +-- br_denatran_frota/code/test/download_frota_test.py | 10 +++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index 7596b899e..a9e77d478 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -18,8 +18,7 @@ def handle_xl(i: dict) -> None: dest_path_file = os.path.join( dir_name, "br_denatran_frota", "files", make_filename(i) ) - if not os.path.isfile(dest_path_file): - urlretrieve(i["href"], dest_path_file) + urlretrieve(i["href"], dest_path_file) def handle_compact(i: dict): diff --git a/br_denatran_frota/code/test/download_frota_test.py b/br_denatran_frota/code/test/download_frota_test.py index 93ca1b9e0..27a83bd8c 100644 --- a/br_denatran_frota/code/test/download_frota_test.py +++ b/br_denatran_frota/code/test/download_frota_test.py @@ -14,15 +14,15 @@ def tearDown(self): os.rmdir(self.test_dir) def test_download_frota_with_valid_args(self): - # TODO: Since there is no teardown, this test doesn't have the same effect running twice. - # It could always download the file twice in download_frota OR we implement cleanup? - # Or we generalize with tempd irs. This might just be overkill anyway. - download_frota(month=2, year=2022) + # TODO: This is always assuming a structure of having a files dir under the denatran directory... + month = 2 + year = 2022 + download_frota(month, year) expected_file_path = os.path.join( os.getcwd(), "br_denatran_frota", "files", - "frota_por_município_e_tipo_2-2022.xls", + f"frota_por_município_e_tipo_{month}-{year}.xls", ) self.assertTrue(os.path.isfile(expected_file_path)) From 3365cc18a0f7911b2cd31a2c7c14abf3c7ddda4a Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 29 Mar 2023 17:34:52 -0300 Subject: [PATCH 021/265] Start translating pre-2012 data --- br_denatran_frota/code/download_frota_old.py | 104 ++++++++++++++++++ .../code/test/download_frota_old_test.py | 30 +++++ 2 files changed, 134 insertions(+) create mode 100644 br_denatran_frota/code/download_frota_old.py create mode 100644 br_denatran_frota/code/test/download_frota_old_test.py diff --git a/br_denatran_frota/code/download_frota_old.py b/br_denatran_frota/code/download_frota_old.py new file mode 100644 index 000000000..184d7707d --- /dev/null +++ b/br_denatran_frota/code/download_frota_old.py @@ -0,0 +1,104 @@ +import os +import re +import requests +from zipfile import ZipFile +import shutil + + +def download_frota_old(key=None, prefix=None, year=None, tempdir=None, dir=None): + def create_directory(path): + if not os.path.exists(path): + os.makedirs(path) + + def extract_files_from_zip(zip_file, extract_path): + with ZipFile(zip_file, "r") as zip: + zip.extractall(extract_path) + + if year > 2012: + raise ValueError("Utilize download_frota()") + + mi_url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-denatran/estatisticas/renavam/{year}/frota{'_' if year > 2008 else ''}{year}.zip" + + create_directory(tempdir) + create_directory(dir) + + dir_temp = os.path.join(tempdir, f"frota__{year}") + path_file = os.path.join(dir_temp, ".zip") + + if not os.path.exists(path_file): + try: + response = requests.get(mi_url) + with open(path_file, "wb") as f: + f.write(response.content) + except Exception as e: + if os.path.exists(path_file): + os.remove(path_file) + + extract_files_from_zip(path_file, dir_temp) + + months = { + "jan": 1, + "fev": 2, + "mar": 3, + "abr": 4, + "mai": 5, + "jun": 6, + "jul": 7, + "ago": 8, + "set": 9, + "out": 10, + "nov": 11, + "dez": 12, + } + + for root, dirs, files in os.walk(dir_temp): + for name in files: + if name.endswith(".zip"): + extract_files_from_zip( + os.path.join(root, name), os.path.dirname(os.path.join(root, name)) + ) + + for root, dirs, files in os.walk(dir_temp): + for name in files: + file_path = os.path.join(root, name) + + get_by = { + "regiao": "(frota tipo uf)|(frota uf)|(frota regiao uf)|(frota regiao tipo uf)", + "municipio": "(frota munic)|(frota mun)", + } + + new_name = ( + os.path.basename(file_path) + .lower() + .replace("regiões", "regiao") + .replace("_", " ") + .replace("-", " ") + .replace(".xlsx", "") + .replace(".xls", "") + .replace("internet", "") + .strip() + ) + new_name = re.sub(r"^(\\d\\_|\\d)+", "", new_name) + + # Match jan|fev|... or number of month (two digits) + get_month = re.search( + rf"({'|'.join(months.keys())})|\d{{2}}(?=\d{{4}})", + new_name, + re.IGNORECASE, + ) + if get_month: + month_i = int(get_month.group(0)) + if get_month.group(1): + month_i = months[get_month.group(1)] + + file_ext = re.search(r"\.[a-zA-Z0-9]+$", new_name).group(0) + + if ( + key + and prefix + and re.search(get_by[key], new_name, re.IGNORECASE) + and name.endswith(("xls", "xlsx")) + ): + shutil.copy( + file_path, os.path.join(dir, f"{prefix}_{month_i}-{year}{file_ext}") + ) diff --git a/br_denatran_frota/code/test/download_frota_old_test.py b/br_denatran_frota/code/test/download_frota_old_test.py new file mode 100644 index 000000000..affee1619 --- /dev/null +++ b/br_denatran_frota/code/test/download_frota_old_test.py @@ -0,0 +1,30 @@ +import os +import shutil +import tempfile +import unittest + +from download_frota_old import download_frota_old + + +class TestDownloadFrotaOld(unittest.TestCase): + def setUp(self): + self.temp_dir = tempfile.mkdtemp() + self.dir = os.getcwd() + + def tearDown(self): + shutil.rmtree(self.temp_dir) + os.chdir(self.dir) + + def test_download_frota_old(self): + download_frota_old(year=2009, tempdir=self.temp_dir, dir=self.dir) + self.assertTrue(os.path.exists(os.path.join(self.dir, "frota_12-2009.xlsx"))) + self.assertTrue(os.path.exists(os.path.join(self.dir, "frota_1-2009.xlsx"))) + self.assertTrue(os.path.exists(os.path.join(self.dir, "frota_2-2009.xlsx"))) + + def test_download_frota_old_year_above_2012(self): + with self.assertRaises(ValueError): + download_frota_old(year=2013, tempdir=self.temp_dir, dir=self.dir) + + +if __name__ == "__main__": + unittest.main() From 988f35de59c0075f2795d65fb3b2fb41f9fa127a Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 29 Mar 2023 18:21:40 -0300 Subject: [PATCH 022/265] Break down into individual functions: beg --- br_denatran_frota/code/download_frota_old.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/br_denatran_frota/code/download_frota_old.py b/br_denatran_frota/code/download_frota_old.py index 184d7707d..ed5c15d88 100644 --- a/br_denatran_frota/code/download_frota_old.py +++ b/br_denatran_frota/code/download_frota_old.py @@ -5,14 +5,17 @@ import shutil -def download_frota_old(key=None, prefix=None, year=None, tempdir=None, dir=None): - def create_directory(path): - if not os.path.exists(path): - os.makedirs(path) +def create_directory(path): + if not os.path.exists(path): + os.makedirs(path) + + +def extract_files_from_zip(zip_file, extract_path): + with ZipFile(zip_file, "r") as zip: + zip.extractall(extract_path) - def extract_files_from_zip(zip_file, extract_path): - with ZipFile(zip_file, "r") as zip: - zip.extractall(extract_path) + +def download_frota_old(key=None, prefix=None, year=None, tempdir=None, dir=None): if year > 2012: raise ValueError("Utilize download_frota()") From 7fc3888b29e46862dc1bc628491ccc25aee3b7f9 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 2 Apr 2023 02:09:16 -0300 Subject: [PATCH 023/265] Wrong url fixed, download not well done yet --- br_denatran_frota/code/download_frota_old.py | 33 ++++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/br_denatran_frota/code/download_frota_old.py b/br_denatran_frota/code/download_frota_old.py index ed5c15d88..1ce4fe19c 100644 --- a/br_denatran_frota/code/download_frota_old.py +++ b/br_denatran_frota/code/download_frota_old.py @@ -4,6 +4,21 @@ from zipfile import ZipFile import shutil +months = { + "jan": 1, + "fev": 2, + "mar": 3, + "abr": 4, + "mai": 5, + "jun": 6, + "jul": 7, + "ago": 8, + "set": 9, + "out": 10, + "nov": 11, + "dez": 12, +} + def create_directory(path): if not os.path.exists(path): @@ -20,8 +35,7 @@ def download_frota_old(key=None, prefix=None, year=None, tempdir=None, dir=None) if year > 2012: raise ValueError("Utilize download_frota()") - mi_url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-denatran/estatisticas/renavam/{year}/frota{'_' if year > 2008 else ''}{year}.zip" - + mi_url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-senatran/estatisticas/renavam/{year}/frota{'_' if year > 2008 else ''}{year}.zip" create_directory(tempdir) create_directory(dir) @@ -39,21 +53,6 @@ def download_frota_old(key=None, prefix=None, year=None, tempdir=None, dir=None) extract_files_from_zip(path_file, dir_temp) - months = { - "jan": 1, - "fev": 2, - "mar": 3, - "abr": 4, - "mai": 5, - "jun": 6, - "jul": 7, - "ago": 8, - "set": 9, - "out": 10, - "nov": 11, - "dez": 12, - } - for root, dirs, files in os.walk(dir_temp): for name in files: if name.endswith(".zip"): From 97d1fbe9a33f19448e19ec7bdfe9d5e27332d40e Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 4 Apr 2023 20:30:08 -0300 Subject: [PATCH 024/265] Significant improvements to post 2012 data --- br_denatran_frota/code/download_frota.py | 126 ++++++++++++------ .../code/test/download_frota_test.py | 6 - 2 files changed, 82 insertions(+), 50 deletions(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index a9e77d478..891c6c739 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -1,23 +1,37 @@ import os import re -import tempfile +import glob from urllib.request import urlopen, urlretrieve from zipfile import ZipFile from rarfile import RarFile from bs4 import BeautifulSoup +MONTHS = { + "janeiro": 1, + "fevereiro": 2, + "marco": 3, + "abril": 4, + "maio": 5, + "junho": 6, + "julho": 7, + "agosto": 8, + "setembro": 9, + "outubro": 10, + "novembro": 11, + "dezembro": 12, +} + +DATASET = "br_denatran_frota" + + def handle_xl(i: dict) -> None: - """Efetivamente baixa e lida com arquivos excel. + """Actually downloads and deals with Excel files. Args: - i (dict): Dicionário com as informações do arquivo a ser baixado. + i (dict): Dictionary with all the desired downloadable file's info. """ - dir_name = os.getcwd() - # TODO: Isso aqui NÃO ESTÁ muito limpo ou genérico, e não sei onde deveriam ficar os arquivos por hora. - dest_path_file = os.path.join( - dir_name, "br_denatran_frota", "files", make_filename(i) - ) + dest_path_file = make_filename(i) urlretrieve(i["href"], dest_path_file) @@ -48,14 +62,14 @@ def handle_compact(i: dict): def make_filename(i: dict, ext: bool = True) -> str: - """Cria o nome do arquivo usando o dicionário enviado. + """Creates the filename using the sent dictionary. Args: - i (dict): Dicionário com todas as informações do arquivo. - ext (bool, optional): Especifica se o nome de arquivo gerado precisa do tipo de arquivo no fim. Defaults to True. + i (dict): Dictionary with all the file's info. + ext (bool, optional): Specifies if the generated file name needs the filetype at the end. Defaults to True. Returns: - str: O nome completo do arquivo. + str: The full filename. """ txt = i["txt"] mes = i["mes"] @@ -75,40 +89,14 @@ def download_file(i): raise ValueError("A função handle_compact tá bem esquisita por hora.") -def download_frota(month: int, year: int): - """Função principal para baixar os dados de frota por município e tipo e também por UF e tipo. +def download_post_2012(year: int, month: int): + """_summary_ Args: - month (int): Mês desejado. - year (int): Ano desejado. - - Raises: - ValueError: Dá erro caso o ano desejado seja anterior ao que a função consegue no momento. - ValueError: Dá erro caso o mês desejado não seja um mês válido. + year (int): _description_ + month (int): _description_ """ - months = { - "janeiro": 1, - "fevereiro": 2, - "marco": 3, - "abril": 4, - "maio": 5, - "junho": 6, - "julho": 7, - "agosto": 8, - "setembro": 9, - "outubro": 10, - "novembro": 11, - "dezembro": 12, - } - - if year > 2012: - url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-Senatran/frota-de-veiculos-{year}" - else: - raise ValueError("Para anos anteriores eu não implementei a função ainda.") - - if month not in months.values(): - raise ValueError("Mês inválido.") - + url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-Senatran/frota-de-veiculos-{year}" soup = BeautifulSoup(urlopen(url), "html.parser") # Só queremos os dados de frota nacional. nodes = soup.select("p:contains('Frota por ') > a") @@ -122,7 +110,7 @@ def download_frota(month: int, year: int): if match: matched_month = match.group(3) matched_year = match.group(2) - if months.get(matched_month) == month and matched_year == str(year): + if MONTHS.get(matched_month) == month and matched_year == str(year): filetype = match.group(0).split(".")[-1].lower() info = { "txt": txt, @@ -133,3 +121,53 @@ def download_frota(month: int, year: int): "filetype": filetype, } download_file(info) + + +def make_dir_when_not_exists(dir_name: str): + """Auxiliary function to create a subdirectory when it is not present. + + Args: + dir_name (str): Name of the subdirectory to be created. + """ + if not os.path.exists(dir_name): + os.mkdir(dir_name) + + +def download_frota(month: int, year: int): + """Função principal para baixar os dados de frota por município e tipo e também por UF e tipo. + + Args: + month (int): Mês desejado. + year (int): Ano desejado. + + Raises: + ValueError: Dá erro caso o mês desejado não seja um mês válido. + """ + + if month not in MONTHS.values(): + raise ValueError("Mês inválido.") + + dir_list = glob.glob(f"**/{DATASET}", recursive=True) + if dir_list: + # I always want to be in the actual folder for this dataset: + os.chdir(dir_list[0]) + + # I always need a files directory inside my dataset folder. + make_dir_when_not_exists("files") + year_dir_name = f"{year}" + desired_dir_name = os.path.join("files", year_dir_name) + + # Cria pasta para aquele ano de arquivos caso seja necessário. + make_dir_when_not_exists(desired_dir_name) + os.chdir(desired_dir_name) + if year > 2012: + download_post_2012(year, month) + else: + url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-senatran/estatisticas/renavam/{year}/frota{'_' if year > 2008 else ''}{year}.zip" + + generic_zip_filename = f"geral_{year}.zip" + urlretrieve(url, generic_zip_filename) + with ZipFile(generic_zip_filename) as zip_file: + zip_file.extractall() + + print(2) diff --git a/br_denatran_frota/code/test/download_frota_test.py b/br_denatran_frota/code/test/download_frota_test.py index 27a83bd8c..9495132b9 100644 --- a/br_denatran_frota/code/test/download_frota_test.py +++ b/br_denatran_frota/code/test/download_frota_test.py @@ -20,16 +20,10 @@ def test_download_frota_with_valid_args(self): download_frota(month, year) expected_file_path = os.path.join( os.getcwd(), - "br_denatran_frota", - "files", f"frota_por_município_e_tipo_{month}-{year}.xls", ) self.assertTrue(os.path.isfile(expected_file_path)) - def test_download_frota_with_invalid_year(self): - with self.assertRaises(ValueError): - download_frota(month=1, year=2010) - def test_download_frota_with_invalid_month(self): with self.assertRaises(ValueError): download_frota(month=13, year=2022) From 2340f2bd22e0037cc6d84d106a23cb9c848906a3 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 5 Apr 2023 05:41:54 -0300 Subject: [PATCH 025/265] Add coverage --- poetry.lock | 950 +++++++++++++++++++++++++------------------------ pyproject.toml | 1 + 2 files changed, 481 insertions(+), 470 deletions(-) diff --git a/poetry.lock b/poetry.lock index 892fed80a..6c8e85754 100644 --- a/poetry.lock +++ b/poetry.lock @@ -14,21 +14,22 @@ files = [ [[package]] name = "attrs" -version = "21.4.0" +version = "22.2.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" files = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, + {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, + {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, ] [package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] -docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] -tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] +cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] +tests = ["attrs[tests-no-zope]", "zope.interface"] +tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] [[package]] name = "basedosdados" @@ -80,42 +81,6 @@ soupsieve = ">1.2" html5lib = ["html5lib"] lxml = ["lxml"] -[[package]] -name = "black" -version = "22.12.0" -description = "The uncompromising code formatter." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, - {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, - {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, - {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, - {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, - {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, - {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, - {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, - {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, - {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, - {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, - {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} -typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - [[package]] name = "cachetools" version = "4.2.4" @@ -214,16 +179,91 @@ files = [ [[package]] name = "colorama" -version = "0.4.4" +version = "0.4.6" description = "Cross-platform colored terminal text." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "contourpy" +version = "1.0.7" +description = "Python library for calculating contours of 2D quadrilateral grids" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d"}, + {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab"}, + {file = "contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69"}, + {file = "contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3"}, + {file = "contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566"}, + {file = "contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0"}, + {file = "contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc"}, + {file = "contourpy-1.0.7-cp38-cp38-win32.whl", hash = "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66"}, + {file = "contourpy-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967"}, + {file = "contourpy-1.0.7-cp39-cp39-win32.whl", hash = "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693"}, + {file = "contourpy-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd"}, + {file = "contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e"}, +] + +[package.dependencies] +numpy = ">=1.16" + +[package.extras] +bokeh = ["bokeh", "chromedriver", "selenium"] +docs = ["furo", "sphinx-copybutton"] +mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"] +test = ["Pillow", "matplotlib", "pytest"] +test-no-images = ["pytest"] + [[package]] name = "coverage" version = "7.2.2" @@ -348,21 +388,21 @@ test = ["pre-commit", "pytest", "pytest-rerunfailures", "pytest-xdist"] [[package]] name = "db-dtypes" -version = "1.0.1" +version = "1.1.1" description = "Pandas Data Types for SQL systems (BigQuery, Spanner)" category = "main" optional = false -python-versions = ">=3.6, <3.11" +python-versions = ">=3.7" files = [ - {file = "db-dtypes-1.0.1.tar.gz", hash = "sha256:3eb5931c9f8c314a1a4aeb698a7eb1d713cddaed4a7a13f0408a8785c4a72330"}, - {file = "db_dtypes-1.0.1-py2.py3-none-any.whl", hash = "sha256:b26b295773d2a4b445f6a7f297ec04dd9eb5d3fb26622032550da013486ba7b7"}, + {file = "db-dtypes-1.1.1.tar.gz", hash = "sha256:ab485c85fef2454f3182427def0b0a3ab179b2871542787d33ba519d62078883"}, + {file = "db_dtypes-1.1.1-py2.py3-none-any.whl", hash = "sha256:23be34ea2bc91065447ecea4d5f107e46d1de223d152e69fa73673a62d5bd27d"}, ] [package.dependencies] -numpy = ">=1.16.6,<2.0dev" +numpy = ">=1.16.6" packaging = ">=17.0" -pandas = ">=0.24.2,<2.0dev" -pyarrow = ">=3.0.0,<9.0dev" +pandas = ">=0.24.2" +pyarrow = ">=3.0.0" [[package]] name = "dbt-client" @@ -379,34 +419,16 @@ files = [ [package.dependencies] requests = ">=2.26.0,<3.0.0" -[[package]] -name = "deprecated" -version = "1.2.13" -description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "Deprecated-1.2.13-py2.py3-none-any.whl", hash = "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d"}, - {file = "Deprecated-1.2.13.tar.gz", hash = "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d"}, -] - -[package.dependencies] -wrapt = ">=1.10,<2" - -[package.extras] -dev = ["PyTest", "PyTest (<5)", "PyTest-Cov", "PyTest-Cov (<2.6)", "bump2version (<1)", "configparser (<5)", "importlib-metadata (<3)", "importlib-resources (<4)", "sphinx (<2)", "sphinxcontrib-websupport (<2)", "tox", "zipp (<2)"] - [[package]] name = "dill" -version = "0.3.5.1" +version = "0.3.6" description = "serialize all of python" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +python-versions = ">=3.7" files = [ - {file = "dill-0.3.5.1-py2.py3-none-any.whl", hash = "sha256:33501d03270bbe410c72639b350e941882a8b0fd55357580fbc873fba0c59302"}, - {file = "dill-0.3.5.1.tar.gz", hash = "sha256:d75e41f3eff1eee599d738e76ba8f4ad98ea229db8b085318aa2b3333a208c86"}, + {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, + {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, ] [package.extras] @@ -414,14 +436,14 @@ graph = ["objgraph (>=1.7.2)"] [[package]] name = "distlib" -version = "0.3.5" +version = "0.3.6" description = "Distribution utilities" category = "main" optional = false python-versions = "*" files = [ - {file = "distlib-0.3.5-py2.py3-none-any.whl", hash = "sha256:b710088c59f06338ca514800ad795a132da19fda270e3ce4affc74abf955a26c"}, - {file = "distlib-0.3.5.tar.gz", hash = "sha256:a7f75737c70be3b25e2bee06288cec4e4c221de18455b2dd037fe2a795cab2fe"}, + {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, + {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, ] [[package]] @@ -500,28 +522,29 @@ test = ["pytest (>=6)"] [[package]] name = "fastavro" -version = "1.4.11" +version = "1.5.4" description = "Fast read/write of AVRO files" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "fastavro-1.4.11-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:44f01008f95d685edacc4b10366c755d25612df00924349f7d34a29f08522ce3"}, - {file = "fastavro-1.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f5e736d12e67348f253da8a332d7c3b483ca04f2b6e772befa79d1a46bac9d"}, - {file = "fastavro-1.4.11-cp310-cp310-win_amd64.whl", hash = "sha256:8dca11bc3191cd7de0a3c4b76a70dac493356a219e96ebcde0def1f06faddef7"}, - {file = "fastavro-1.4.11-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7a2a0bf03686f9d860e8f8476be000f5b3e6cc9af6853dbabab2ef9cfa5dc3a0"}, - {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c17e3decfac260e1be4d02d1903d2483eec2f3ce7f92c9b808a0f6a81572c4b"}, - {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ba25c6529f50722a7618cc4ca24c7d265def57fd9f94e4e554e1df8cce38d2"}, - {file = "fastavro-1.4.11-cp37-cp37m-win_amd64.whl", hash = "sha256:ceaba04da9419f40899a670eb62eb373a127b511bb8e3ae4f6f1f23ec49bd0e4"}, - {file = "fastavro-1.4.11-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:732eab3a1ae5d2c3f4b52e747c55bcc41c4df0eb7e8a395038080741a3c0a934"}, - {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03d3c802b71f44e7b3442abae961bba996258244bd222b242ad1e5cb7754e57"}, - {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cb7475a9b25b9f8aebe7eb756dafedd0369434571062f3883d894281befd7c"}, - {file = "fastavro-1.4.11-cp38-cp38-win_amd64.whl", hash = "sha256:ce0776f54591aef90bcd02bd919964abe4c2ad2a10a4336c3a1b66cef289b41c"}, - {file = "fastavro-1.4.11-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:621e72cc365c9539d7590e7b43e48a62e6bfb4c2de7c16837fed54d113d7312c"}, - {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842b25782f911ee8c626f9d9fedc2ef01aeac272536fe90ee6d45b2ae7cdb024"}, - {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8491bfcba25c9d661289f884688e5a4f56f2ee389a240d0ad02692495a9a087"}, - {file = "fastavro-1.4.11-cp39-cp39-win_amd64.whl", hash = "sha256:c94130a8c8d80073eb0276844915aa5e928ae322024e76dc57943542ccda211c"}, - {file = "fastavro-1.4.11.tar.gz", hash = "sha256:7c64332ad52de0134be9a933ca986514c3ff85c63d54bc5398c31f0498ac1820"}, + {file = "fastavro-1.5.4-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:d316cc476b2b24ef06402b8bfa047f8f72a9d6df2de777bb30d9ededda7e3a02"}, + {file = "fastavro-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8459faec46e34f2dfeb9b70ee8c36e935e626cff8608d675724718987a5f9ce5"}, + {file = "fastavro-1.5.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd44636d7ff8365a57b88707b747371fffb676c8c1f68c0d423ec36623888668"}, + {file = "fastavro-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:2402428b26d3c08a58acfa723833e19fb75077872bcb2475a4c81195cdae6a5d"}, + {file = "fastavro-1.5.4-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:5afc14398f4191d1a807aa59d2fba5ed869b31343679ec43dbc289db0a8e35c5"}, + {file = "fastavro-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5217e9713a3ea03205532394fba4d743749155b04b10b12a12fc26d225b89792"}, + {file = "fastavro-1.5.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e93a5eecb28cc35d670c9c4df70223fa9bcd6d9ca21b38b1b7ae13ece60c7fb"}, + {file = "fastavro-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:1a2f2465efd0e7de557c4034e8d4d88a132750cfa51e1582362a1b3a1a9fa911"}, + {file = "fastavro-1.5.4-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f7d5bc76c03c692d9acea0e5d5baceec19e1c059b26cb8ae9f4481e842be95a5"}, + {file = "fastavro-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80fe920229ab1f40eccb1b4918481cdd8a20e5e7dce19308ab38b23732da8a70"}, + {file = "fastavro-1.5.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3d190aee86ab73caa1aa550eba850be2ca5dd29d814b38720f4e300184e01d5"}, + {file = "fastavro-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:b6c30299a49b11f42251cb81c8e15db67750642eac7ba5c194a5ee95c83ebb11"}, + {file = "fastavro-1.5.4-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:1f7685f3a3c38352abab432bad2f9f2229a0e5f5f8548831e887c30f8396f2e9"}, + {file = "fastavro-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd021ec850fd30020b7c4fa868466fb7f95450f1f06eac92bd2204cbd8e45fb8"}, + {file = "fastavro-1.5.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06a7b5602dfa032c92f20ca90b8bde88251573773e501bedf5e8b76b9feb14a3"}, + {file = "fastavro-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:18250aa2ab0f7a095b1865565cf9976ea4605c201129636e6defe24ec3ef112c"}, + {file = "fastavro-1.5.4.tar.gz", hash = "sha256:d86f72c966713fb699570a18f7960cf4110b069c70681d7538be8d671c9db7c8"}, ] [package.extras] @@ -532,34 +555,34 @@ zstandard = ["zstandard"] [[package]] name = "filelock" -version = "3.7.1" +version = "3.10.7" description = "A platform independent file lock." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "filelock-3.7.1-py3-none-any.whl", hash = "sha256:37def7b658813cda163b56fc564cdc75e86d338246458c4c28ae84cabefa2404"}, - {file = "filelock-3.7.1.tar.gz", hash = "sha256:3a0fd85166ad9dbab54c9aec96737b744106dc5f15c0b09a6744a445299fcf04"}, + {file = "filelock-3.10.7-py3-none-any.whl", hash = "sha256:bde48477b15fde2c7e5a0713cbe72721cb5a5ad32ee0b8f419907960b9d75536"}, + {file = "filelock-3.10.7.tar.gz", hash = "sha256:892be14aa8efc01673b5ed6589dbccb95f9a8596f0507e232626155495c18105"}, ] [package.extras] -docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] -testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] +docs = ["furo (>=2022.12.7)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.2)", "diff-cover (>=7.5)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] [[package]] name = "fonttools" -version = "4.33.3" +version = "4.39.3" description = "Tools to manipulate font files" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "fonttools-4.33.3-py3-none-any.whl", hash = "sha256:f829c579a8678fa939a1d9e9894d01941db869de44390adb49ce67055a06cc2a"}, - {file = "fonttools-4.33.3.zip", hash = "sha256:c0fdcfa8ceebd7c1b2021240bd46ef77aa8e7408cf10434be55df52384865f8e"}, + {file = "fonttools-4.39.3-py3-none-any.whl", hash = "sha256:64c0c05c337f826183637570ac5ab49ee220eec66cf50248e8df527edfa95aeb"}, + {file = "fonttools-4.39.3.zip", hash = "sha256:9234b9f57b74e31b192c3fc32ef1a40750a8fbc1cd9837a7b7bfc4ca4a5c51d7"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=14.0.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres", "scipy"] lxml = ["lxml (>=4.0,<5)"] @@ -569,7 +592,7 @@ repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=14.0.0)"] +unicode = ["unicodedata2 (>=15.0.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] @@ -653,14 +676,14 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2)"] [[package]] name = "google-api-python-client" -version = "2.58.0" +version = "2.83.0" description = "Google API Client Library for Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-python-client-2.58.0.tar.gz", hash = "sha256:3af6a181763a8cb18f2b9d973760ba32e4fe2af09e4ce06626ff6a53777c33fa"}, - {file = "google_api_python_client-2.58.0-py2.py3-none-any.whl", hash = "sha256:8f4eeed1b46f3f445307719aa3e9678e429d90c0af4f22ada707a72ba10fe02d"}, + {file = "google-api-python-client-2.83.0.tar.gz", hash = "sha256:d07509f1b2d2b2427363b454db996f7a15e1751a48cfcaf28427050560dd51cf"}, + {file = "google_api_python_client-2.83.0-py2.py3-none-any.whl", hash = "sha256:afa7fe2a5d77e8f136cdb8f40a120dd6660c2292f791c1b22734dfe786bd1dac"}, ] [package.dependencies] @@ -989,14 +1012,14 @@ files = [ [[package]] name = "httplib2" -version = "0.20.4" +version = "0.22.0" description = "A comprehensive HTTP client library." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "httplib2-0.20.4-py3-none-any.whl", hash = "sha256:8b6a905cb1c79eefd03f8669fd993c36dc341f7c558f056cb5a33b5c2f458543"}, - {file = "httplib2-0.20.4.tar.gz", hash = "sha256:58a98e45b4b1a48273073f905d2961666ecf0fbac4250ea5b47aef259eb5c585"}, + {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, + {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, ] [package.dependencies] @@ -1023,14 +1046,14 @@ parser = ["pyhcl (>=0.3.10)"] [[package]] name = "identify" -version = "2.5.3" +version = "2.5.22" description = "File identification library for Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "identify-2.5.3-py2.py3-none-any.whl", hash = "sha256:25851c8c1370effb22aaa3c987b30449e9ff0cece408f810ae6ce408fdd20893"}, - {file = "identify-2.5.3.tar.gz", hash = "sha256:887e7b91a1be152b0d46bbf072130235a8117392b9f1828446079a816a05ef44"}, + {file = "identify-2.5.22-py2.py3-none-any.whl", hash = "sha256:f0faad595a4687053669c112004178149f6c326db71ee999ae4636685753ad2f"}, + {file = "identify-2.5.22.tar.gz", hash = "sha256:f7a93d6cf98e29bd07663c60728e7a4057615068d7a639d132dc883b2d54d31e"}, ] [package.extras] @@ -1050,48 +1073,71 @@ files = [ [[package]] name = "importlib-metadata" -version = "4.11.3" +version = "4.13.0" description = "Read metadata from Python packages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, + {file = "importlib_metadata-4.13.0-py3-none-any.whl", hash = "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116"}, + {file = "importlib_metadata-4.13.0.tar.gz", hash = "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] + +[[package]] +name = "importlib-resources" +version = "5.12.0" +description = "Read resources from Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, + {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] [[package]] name = "ipeadatapy" -version = "0.1.7" -description = "" +version = "0.1.9" +description = "An API wrapper for Ipeadata" category = "main" optional = false python-versions = "*" files = [ - {file = "ipeadatapy-0.1.7-py3-none-any.whl", hash = "sha256:0de48658c0cd49d30fa23f69ef33ea954aea05b888051acca98afffc22b07ed5"}, - {file = "ipeadatapy-0.1.7.tar.gz", hash = "sha256:f5eff1d34769ea14f7cb26ed6899991f18df9dfa20d9a3c134d1ebcb72424dbc"}, + {file = "ipeadatapy-0.1.9-py3-none-any.whl", hash = "sha256:0bfd5a180599f77106421477d3cc505e4478ac0f4e3d5eb688dd8696fce906e3"}, + {file = "ipeadatapy-0.1.9.tar.gz", hash = "sha256:396c3f7d723a70667fd5a64714d7252f7f234c34c9f63e77751b02123691d8ad"}, ] +[package.dependencies] +pandas = "*" +requests = "*" + [[package]] name = "jinja2" version = "3.0.3" @@ -1112,55 +1158,80 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "kiwisolver" -version = "1.4.2" +version = "1.4.4" description = "A fast implementation of the Cassowary constraint solver" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "kiwisolver-1.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e395ece147f0692ca7cdb05a028d31b83b72c369f7b4a2c1798f4b96af1e3d8"}, - {file = "kiwisolver-1.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b7f50a1a25361da3440f07c58cd1d79957c2244209e4f166990e770256b6b0b"}, - {file = "kiwisolver-1.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c032c41ae4c3a321b43a3650e6ecc7406b99ff3e5279f24c9b310f41bc98479"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1dcade8f6fe12a2bb4efe2cbe22116556e3b6899728d3b2a0d3b367db323eacc"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e45e780a74416ef2f173189ef4387e44b5494f45e290bcb1f03735faa6779bf"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d2bb56309fb75a811d81ed55fbe2208aa77a3a09ff5f546ca95e7bb5fac6eff"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b2d6c12f2ad5f55104a36a356192cfb680c049fe5e7c1f6620fc37f119cdc2"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:262c248c60f22c2b547683ad521e8a3db5909c71f679b93876921549107a0c24"}, - {file = "kiwisolver-1.4.2-cp310-cp310-win32.whl", hash = "sha256:1008346a7741620ab9cc6c96e8ad9b46f7a74ce839dbb8805ddf6b119d5fc6c2"}, - {file = "kiwisolver-1.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:6ece2e12e4b57bc5646b354f436416cd2a6f090c1dadcd92b0ca4542190d7190"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b978afdb913ca953cf128d57181da2e8798e8b6153be866ae2a9c446c6162f40"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f88c4b8e449908eeddb3bbd4242bd4dc2c7a15a7aa44bb33df893203f02dc2d"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e348f1904a4fab4153407f7ccc27e43b2a139752e8acf12e6640ba683093dd96"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c839bf28e45d7ddad4ae8f986928dbf5a6d42ff79760d54ec8ada8fb263e097c"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8ae5a071185f1a93777c79a9a1e67ac46544d4607f18d07131eece08d415083a"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c222f91a45da9e01a9bc4f760727ae49050f8e8345c4ff6525495f7a164c8973"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:a4e8f072db1d6fb7a7cc05a6dbef8442c93001f4bb604f1081d8c2db3ca97159"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:be9a650890fb60393e60aacb65878c4a38bb334720aa5ecb1c13d0dac54dd73b"}, - {file = "kiwisolver-1.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ec2e55bf31b43aabe32089125dca3b46fdfe9f50afbf0756ae11e14c97b80ca"}, - {file = "kiwisolver-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d1078ba770d6165abed3d9a1be1f9e79b61515de1dd00d942fa53bba79f01ae"}, - {file = "kiwisolver-1.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cbb5eb4a2ea1ffec26268d49766cafa8f957fe5c1b41ad00733763fae77f9436"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e6cda72db409eefad6b021e8a4f964965a629f577812afc7860c69df7bdb84a"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1605c7c38cc6a85212dfd6a641f3905a33412e49f7c003f35f9ac6d71f67720"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81237957b15469ea9151ec8ca08ce05656090ffabc476a752ef5ad7e2644c526"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:240009fdf4fa87844f805e23f48995537a8cb8f8c361e35fda6b5ac97fcb906f"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:240c2d51d098395c012ddbcb9bd7b3ba5de412a1d11840698859f51d0e643c4f"}, - {file = "kiwisolver-1.4.2-cp38-cp38-win32.whl", hash = "sha256:8b6086aa6936865962b2cee0e7aaecf01ab6778ce099288354a7229b4d9f1408"}, - {file = "kiwisolver-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:0d98dca86f77b851350c250f0149aa5852b36572514d20feeadd3c6b1efe38d0"}, - {file = "kiwisolver-1.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:91eb4916271655dfe3a952249cb37a5c00b6ba68b4417ee15af9ba549b5ba61d"}, - {file = "kiwisolver-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa4d97d7d2b2c082e67907c0b8d9f31b85aa5d3ba0d33096b7116f03f8061261"}, - {file = "kiwisolver-1.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:71469b5845b9876b8d3d252e201bef6f47bf7456804d2fbe9a1d6e19e78a1e65"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8ff3033e43e7ca1389ee59fb7ecb8303abb8713c008a1da49b00869e92e3dd7c"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89b57c2984f4464840e4b768affeff6b6809c6150d1166938ade3e22fbe22db8"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffbdb9a96c536f0405895b5e21ee39ec579cb0ed97bdbd169ae2b55f41d73219"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a830a03970c462d1a2311c90e05679da56d3bd8e78a4ba9985cb78ef7836c9f"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f74f2a13af201559e3d32b9ddfc303c94ae63d63d7f4326d06ce6fe67e7a8255"}, - {file = "kiwisolver-1.4.2-cp39-cp39-win32.whl", hash = "sha256:e677cc3626287f343de751e11b1e8a5b915a6ac897e8aecdbc996cd34de753a0"}, - {file = "kiwisolver-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b3e251e5c38ac623c5d786adb21477f018712f8c6fa54781bd38aa1c60b60fc2"}, - {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c380bb5ae20d829c1a5473cfcae64267b73aaa4060adc091f6df1743784aae0"}, - {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:484f2a5f0307bc944bc79db235f41048bae4106ffa764168a068d88b644b305d"}, - {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8afdf533b613122e4bbaf3c1e42c2a5e9e2d1dd3a0a017749a7658757cb377"}, - {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42f6ef9b640deb6f7d438e0a371aedd8bef6ddfde30683491b2e6f568b4e884e"}, - {file = "kiwisolver-1.4.2.tar.gz", hash = "sha256:7f606d91b8a8816be476513a77fd30abe66227039bd6f8b406c348cb0247dcc9"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, + {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, + {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, + {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, + {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, + {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, + {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, + {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, ] [[package]] @@ -1313,57 +1384,65 @@ tests = ["mock", "pytest"] [[package]] name = "matplotlib" -version = "3.5.2" +version = "3.7.1" description = "Python plotting package" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "matplotlib-3.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:03bbb3f5f78836855e127b5dab228d99551ad0642918ccbf3067fcd52ac7ac5e"}, - {file = "matplotlib-3.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49a5938ed6ef9dda560f26ea930a2baae11ea99e1c2080c8714341ecfda72a89"}, - {file = "matplotlib-3.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:77157be0fc4469cbfb901270c205e7d8adb3607af23cef8bd11419600647ceed"}, - {file = "matplotlib-3.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5844cea45d804174bf0fac219b4ab50774e504bef477fc10f8f730ce2d623441"}, - {file = "matplotlib-3.5.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c87973ddec10812bddc6c286b88fdd654a666080fbe846a1f7a3b4ba7b11ab78"}, - {file = "matplotlib-3.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a05f2b37222319753a5d43c0a4fd97ed4ff15ab502113e3f2625c26728040cf"}, - {file = "matplotlib-3.5.2-cp310-cp310-win32.whl", hash = "sha256:9776e1a10636ee5f06ca8efe0122c6de57ffe7e8c843e0fb6e001e9d9256ec95"}, - {file = "matplotlib-3.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:b4fedaa5a9aa9ce14001541812849ed1713112651295fdddd640ea6620e6cf98"}, - {file = "matplotlib-3.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ee175a571e692fc8ae8e41ac353c0e07259113f4cb063b0ec769eff9717e84bb"}, - {file = "matplotlib-3.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e8bda1088b941ead50caabd682601bece983cadb2283cafff56e8fcddbf7d7f"}, - {file = "matplotlib-3.5.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9480842d5aadb6e754f0b8f4ebeb73065ac8be1855baa93cd082e46e770591e9"}, - {file = "matplotlib-3.5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6c623b355d605a81c661546af7f24414165a8a2022cddbe7380a31a4170fa2e9"}, - {file = "matplotlib-3.5.2-cp37-cp37m-win32.whl", hash = "sha256:a91426ae910819383d337ba0dc7971c7cefdaa38599868476d94389a329e599b"}, - {file = "matplotlib-3.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c4b82c2ae6d305fcbeb0eb9c93df2602ebd2f174f6e8c8a5d92f9445baa0c1d3"}, - {file = "matplotlib-3.5.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ebc27ad11df3c1661f4677a7762e57a8a91dd41b466c3605e90717c9a5f90c82"}, - {file = "matplotlib-3.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a32ea6e12e80dedaca2d4795d9ed40f97bfa56e6011e14f31502fdd528b9c89"}, - {file = "matplotlib-3.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2a0967d4156adbd0d46db06bc1a877f0370bce28d10206a5071f9ecd6dc60b79"}, - {file = "matplotlib-3.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2b696699386766ef171a259d72b203a3c75d99d03ec383b97fc2054f52e15cf"}, - {file = "matplotlib-3.5.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7f409716119fa39b03da3d9602bd9b41142fab7a0568758cd136cd80b1bf36c8"}, - {file = "matplotlib-3.5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b8d3f4e71e26307e8c120b72c16671d70c5cd08ae412355c11254aa8254fb87f"}, - {file = "matplotlib-3.5.2-cp38-cp38-win32.whl", hash = "sha256:b6c63cd01cad0ea8704f1fd586e9dc5777ccedcd42f63cbbaa3eae8dd41172a1"}, - {file = "matplotlib-3.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:75c406c527a3aa07638689586343f4b344fcc7ab1f79c396699eb550cd2b91f7"}, - {file = "matplotlib-3.5.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4a44cdfdb9d1b2f18b1e7d315eb3843abb097869cd1ef89cfce6a488cd1b5182"}, - {file = "matplotlib-3.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3d8e129af95b156b41cb3be0d9a7512cc6d73e2b2109f82108f566dbabdbf377"}, - {file = "matplotlib-3.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:364e6bca34edc10a96aa3b1d7cd76eb2eea19a4097198c1b19e89bee47ed5781"}, - {file = "matplotlib-3.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea75df8e567743207e2b479ba3d8843537be1c146d4b1e3e395319a4e1a77fe9"}, - {file = "matplotlib-3.5.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:44c6436868186564450df8fd2fc20ed9daaef5caad699aa04069e87099f9b5a8"}, - {file = "matplotlib-3.5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d7705022df2c42bb02937a2a824f4ec3cca915700dd80dc23916af47ff05f1a"}, - {file = "matplotlib-3.5.2-cp39-cp39-win32.whl", hash = "sha256:ee0b8e586ac07f83bb2950717e66cb305e2859baf6f00a9c39cc576e0ce9629c"}, - {file = "matplotlib-3.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:c772264631e5ae61f0bd41313bbe48e1b9bcc95b974033e1118c9caa1a84d5c6"}, - {file = "matplotlib-3.5.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:751d3815b555dcd6187ad35b21736dc12ce6925fc3fa363bbc6dc0f86f16484f"}, - {file = "matplotlib-3.5.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:31fbc2af27ebb820763f077ec7adc79b5a031c2f3f7af446bd7909674cd59460"}, - {file = "matplotlib-3.5.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4fa28ca76ac5c2b2d54bc058b3dad8e22ee85d26d1ee1b116a6fd4d2277b6a04"}, - {file = "matplotlib-3.5.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:24173c23d1bcbaed5bf47b8785d27933a1ac26a5d772200a0f3e0e38f471b001"}, - {file = "matplotlib-3.5.2.tar.gz", hash = "sha256:48cf850ce14fa18067f2d9e0d646763681948487a8080ec0af2686468b4607a2"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:95cbc13c1fc6844ab8812a525bbc237fa1470863ff3dace7352e910519e194b1"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:08308bae9e91aca1ec6fd6dda66237eef9f6294ddb17f0d0b3c863169bf82353"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:544764ba51900da4639c0f983b323d288f94f65f4024dc40ecb1542d74dc0500"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d94989191de3fcc4e002f93f7f1be5da476385dde410ddafbb70686acf00ea"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99bc9e65901bb9a7ce5e7bb24af03675cbd7c70b30ac670aa263240635999a4"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb7d248c34a341cd4c31a06fd34d64306624c8cd8d0def7abb08792a5abfd556"}, + {file = "matplotlib-3.7.1-cp310-cp310-win32.whl", hash = "sha256:ce463ce590f3825b52e9fe5c19a3c6a69fd7675a39d589e8b5fbe772272b3a24"}, + {file = "matplotlib-3.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:3d7bc90727351fb841e4d8ae620d2d86d8ed92b50473cd2b42ce9186104ecbba"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:770a205966d641627fd5cf9d3cb4b6280a716522cd36b8b284a8eb1581310f61"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f67bfdb83a8232cb7a92b869f9355d677bce24485c460b19d01970b64b2ed476"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2bf092f9210e105f414a043b92af583c98f50050559616930d884387d0772aba"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89768d84187f31717349c6bfadc0e0d8c321e8eb34522acec8a67b1236a66332"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83111e6388dec67822e2534e13b243cc644c7494a4bb60584edbff91585a83c6"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a867bf73a7eb808ef2afbca03bcdb785dae09595fbe550e1bab0cd023eba3de0"}, + {file = "matplotlib-3.7.1-cp311-cp311-win32.whl", hash = "sha256:fbdeeb58c0cf0595efe89c05c224e0a502d1aa6a8696e68a73c3efc6bc354304"}, + {file = "matplotlib-3.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c0bd19c72ae53e6ab979f0ac6a3fafceb02d2ecafa023c5cca47acd934d10be7"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:6eb88d87cb2c49af00d3bbc33a003f89fd9f78d318848da029383bfc08ecfbfb"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:cf0e4f727534b7b1457898c4f4ae838af1ef87c359b76dcd5330fa31893a3ac7"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:46a561d23b91f30bccfd25429c3c706afe7d73a5cc64ef2dfaf2b2ac47c1a5dc"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8704726d33e9aa8a6d5215044b8d00804561971163563e6e6591f9dcf64340cc"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4cf327e98ecf08fcbb82685acaf1939d3338548620ab8dfa02828706402c34de"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:617f14ae9d53292ece33f45cba8503494ee199a75b44de7717964f70637a36aa"}, + {file = "matplotlib-3.7.1-cp38-cp38-win32.whl", hash = "sha256:7c9a4b2da6fac77bcc41b1ea95fadb314e92508bf5493ceff058e727e7ecf5b0"}, + {file = "matplotlib-3.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:14645aad967684e92fc349493fa10c08a6da514b3d03a5931a1bac26e6792bd1"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:81a6b377ea444336538638d31fdb39af6be1a043ca5e343fe18d0f17e098770b"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:28506a03bd7f3fe59cd3cd4ceb2a8d8a2b1db41afede01f66c42561b9be7b4b7"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c587963b85ce41e0a8af53b9b2de8dddbf5ece4c34553f7bd9d066148dc719c"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8bf26ade3ff0f27668989d98c8435ce9327d24cffb7f07d24ef609e33d582439"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:def58098f96a05f90af7e92fd127d21a287068202aa43b2a93476170ebd99e87"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f883a22a56a84dba3b588696a2b8a1ab0d2c3d41be53264115c71b0a942d8fdb"}, + {file = "matplotlib-3.7.1-cp39-cp39-win32.whl", hash = "sha256:4f99e1b234c30c1e9714610eb0c6d2f11809c9c78c984a613ae539ea2ad2eb4b"}, + {file = "matplotlib-3.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:3ba2af245e36990facf67fde840a760128ddd71210b2ab6406e640188d69d136"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3032884084f541163f295db8a6536e0abb0db464008fadca6c98aaf84ccf4717"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a2cb34336110e0ed8bb4f650e817eed61fa064acbefeb3591f1b33e3a84fd96"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b867e2f952ed592237a1828f027d332d8ee219ad722345b79a001f49df0936eb"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:57bfb8c8ea253be947ccb2bc2d1bb3862c2bccc662ad1b4626e1f5e004557042"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:438196cdf5dc8d39b50a45cb6e3f6274edbcf2254f85fa9b895bf85851c3a613"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21e9cff1a58d42e74d01153360de92b326708fb205250150018a52c70f43c290"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75d4725d70b7c03e082bbb8a34639ede17f333d7247f56caceb3801cb6ff703d"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:97cc368a7268141afb5690760921765ed34867ffb9655dd325ed207af85c7529"}, + {file = "matplotlib-3.7.1.tar.gz", hash = "sha256:7b73305f25eab4541bd7ee0b96d87e53ae9c9f1823be5659b806cd85786fe882"}, ] [package.dependencies] +contourpy = ">=1.0.1" cycler = ">=0.10" fonttools = ">=4.22.0" +importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} kiwisolver = ">=1.0.1" -numpy = ">=1.17" +numpy = ">=1.20" packaging = ">=20.0" pillow = ">=6.2.0" -pyparsing = ">=2.2.1" +pyparsing = ">=2.3.1" python-dateutil = ">=2.7" [[package]] @@ -1530,39 +1609,39 @@ pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pandas" -version = "1.5.2" +version = "1.5.3" description = "Powerful data structures for data analysis, time series, and statistics" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "pandas-1.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e9dbacd22555c2d47f262ef96bb4e30880e5956169741400af8b306bbb24a273"}, - {file = "pandas-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e2b83abd292194f350bb04e188f9379d36b8dfac24dd445d5c87575f3beaf789"}, - {file = "pandas-1.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2552bffc808641c6eb471e55aa6899fa002ac94e4eebfa9ec058649122db5824"}, - {file = "pandas-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fc87eac0541a7d24648a001d553406f4256e744d92df1df8ebe41829a915028"}, - {file = "pandas-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0d8fd58df5d17ddb8c72a5075d87cd80d71b542571b5f78178fb067fa4e9c72"}, - {file = "pandas-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:4aed257c7484d01c9a194d9a94758b37d3d751849c05a0050c087a358c41ad1f"}, - {file = "pandas-1.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:375262829c8c700c3e7cbb336810b94367b9c4889818bbd910d0ecb4e45dc261"}, - {file = "pandas-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc3cd122bea268998b79adebbb8343b735a5511ec14efb70a39e7acbc11ccbdc"}, - {file = "pandas-1.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4f5a82afa4f1ff482ab8ded2ae8a453a2cdfde2001567b3ca24a4c5c5ca0db3"}, - {file = "pandas-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8092a368d3eb7116e270525329a3e5c15ae796ccdf7ccb17839a73b4f5084a39"}, - {file = "pandas-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6257b314fc14958f8122779e5a1557517b0f8e500cfb2bd53fa1f75a8ad0af2"}, - {file = "pandas-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:82ae615826da838a8e5d4d630eb70c993ab8636f0eff13cb28aafc4291b632b5"}, - {file = "pandas-1.5.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:457d8c3d42314ff47cc2d6c54f8fc0d23954b47977b2caed09cd9635cb75388b"}, - {file = "pandas-1.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c009a92e81ce836212ce7aa98b219db7961a8b95999b97af566b8dc8c33e9519"}, - {file = "pandas-1.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:71f510b0efe1629bf2f7c0eadb1ff0b9cf611e87b73cd017e6b7d6adb40e2b3a"}, - {file = "pandas-1.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a40dd1e9f22e01e66ed534d6a965eb99546b41d4d52dbdb66565608fde48203f"}, - {file = "pandas-1.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ae7e989f12628f41e804847a8cc2943d362440132919a69429d4dea1f164da0"}, - {file = "pandas-1.5.2-cp38-cp38-win32.whl", hash = "sha256:530948945e7b6c95e6fa7aa4be2be25764af53fba93fe76d912e35d1c9ee46f5"}, - {file = "pandas-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:73f219fdc1777cf3c45fde7f0708732ec6950dfc598afc50588d0d285fddaefc"}, - {file = "pandas-1.5.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9608000a5a45f663be6af5c70c3cbe634fa19243e720eb380c0d378666bc7702"}, - {file = "pandas-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:315e19a3e5c2ab47a67467fc0362cb36c7c60a93b6457f675d7d9615edad2ebe"}, - {file = "pandas-1.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e18bc3764cbb5e118be139b3b611bc3fbc5d3be42a7e827d1096f46087b395eb"}, - {file = "pandas-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0183cb04a057cc38fde5244909fca9826d5d57c4a5b7390c0cc3fa7acd9fa883"}, - {file = "pandas-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:344021ed3e639e017b452aa8f5f6bf38a8806f5852e217a7594417fb9bbfa00e"}, - {file = "pandas-1.5.2-cp39-cp39-win32.whl", hash = "sha256:e7469271497960b6a781eaa930cba8af400dd59b62ec9ca2f4d31a19f2f91090"}, - {file = "pandas-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:c218796d59d5abd8780170c937b812c9637e84c32f8271bbf9845970f8c1351f"}, - {file = "pandas-1.5.2.tar.gz", hash = "sha256:220b98d15cee0b2cd839a6358bd1f273d0356bf964c1a1aeb32d47db0215488b"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, + {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, + {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, + {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, + {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, + {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, + {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, + {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, ] [package.dependencies] @@ -1606,23 +1685,23 @@ tqdm = ["tqdm (>=4.23.0)"] [[package]] name = "pandavro" -version = "1.6.0" +version = "1.7.2" description = "The interface between Avro and pandas DataFrame" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6.1" files = [ - {file = "pandavro-1.6.0.tar.gz", hash = "sha256:d098da34529fbb20de5fd1a6f231918d1b60941b25bea5dc87897ef0d472cb6f"}, + {file = "pandavro-1.7.2-py3-none-any.whl", hash = "sha256:5b4a2fbc86fb2b102e5b2b24490084e4775a5ac546fc8981931abecf6bb4a34b"}, + {file = "pandavro-1.7.2.tar.gz", hash = "sha256:4f2b7b6823522f54e8bfe33c091fb29898349892b70634f46c928e6a42a76e69"}, ] [package.dependencies] -fastavro = ">=0.14.11" -numpy = ">=1.7.0" -pandas = ">=1.1.5" -six = ">=1.9" +fastavro = ">=1.5.1,<1.6.0" +numpy = ">=1.15.4" +pandas = ">=1.1" [package.extras] -tests = ["pytest"] +tests = ["pytest (==7.1.2)"] [[package]] name = "partd" @@ -1643,18 +1722,6 @@ toolz = "*" [package.extras] complete = ["blosc", "numpy (>=1.9.0)", "pandas (>=0.19.0)", "pyzmq"] -[[package]] -name = "pathspec" -version = "0.11.1" -description = "Utility library for gitignore style pattern matching of file paths." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, - {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, -] - [[package]] name = "pendulum" version = "2.1.2" @@ -1692,97 +1759,126 @@ pytzdata = ">=2020.1" [[package]] name = "pillow" -version = "9.1.0" +version = "9.5.0" description = "Python Imaging Library (Fork)" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "Pillow-9.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af79d3fde1fc2e33561166d62e3b63f0cc3e47b5a3a2e5fea40d4917754734ea"}, - {file = "Pillow-9.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:55dd1cf09a1fd7c7b78425967aacae9b0d70125f7d3ab973fadc7b5abc3de652"}, - {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66822d01e82506a19407d1afc104c3fcea3b81d5eb11485e593ad6b8492f995a"}, - {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5eaf3b42df2bcda61c53a742ee2c6e63f777d0e085bbc6b2ab7ed57deb13db7"}, - {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01ce45deec9df310cbbee11104bae1a2a43308dd9c317f99235b6d3080ddd66e"}, - {file = "Pillow-9.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aea7ce61328e15943d7b9eaca87e81f7c62ff90f669116f857262e9da4057ba3"}, - {file = "Pillow-9.1.0-cp310-cp310-win32.whl", hash = "sha256:7a053bd4d65a3294b153bdd7724dce864a1d548416a5ef61f6d03bf149205160"}, - {file = "Pillow-9.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:97bda660702a856c2c9e12ec26fc6d187631ddfd896ff685814ab21ef0597033"}, - {file = "Pillow-9.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:21dee8466b42912335151d24c1665fcf44dc2ee47e021d233a40c3ca5adae59c"}, - {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b6d4050b208c8ff886fd3db6690bf04f9a48749d78b41b7a5bf24c236ab0165"}, - {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5cfca31ab4c13552a0f354c87fbd7f162a4fafd25e6b521bba93a57fe6a3700a"}, - {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed742214068efa95e9844c2d9129e209ed63f61baa4d54dbf4cf8b5e2d30ccf2"}, - {file = "Pillow-9.1.0-cp37-cp37m-win32.whl", hash = "sha256:c9efef876c21788366ea1f50ecb39d5d6f65febe25ad1d4c0b8dff98843ac244"}, - {file = "Pillow-9.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:de344bcf6e2463bb25179d74d6e7989e375f906bcec8cb86edb8b12acbc7dfef"}, - {file = "Pillow-9.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:17869489de2fce6c36690a0c721bd3db176194af5f39249c1ac56d0bb0fcc512"}, - {file = "Pillow-9.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:25023a6209a4d7c42154073144608c9a71d3512b648a2f5d4465182cb93d3477"}, - {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8782189c796eff29dbb37dd87afa4ad4d40fc90b2742704f94812851b725964b"}, - {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:463acf531f5d0925ca55904fa668bb3461c3ef6bc779e1d6d8a488092bdee378"}, - {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f42364485bfdab19c1373b5cd62f7c5ab7cc052e19644862ec8f15bb8af289e"}, - {file = "Pillow-9.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3fddcdb619ba04491e8f771636583a7cc5a5051cd193ff1aa1ee8616d2a692c5"}, - {file = "Pillow-9.1.0-cp38-cp38-win32.whl", hash = "sha256:4fe29a070de394e449fd88ebe1624d1e2d7ddeed4c12e0b31624561b58948d9a"}, - {file = "Pillow-9.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c24f718f9dd73bb2b31a6201e6db5ea4a61fdd1d1c200f43ee585fc6dcd21b34"}, - {file = "Pillow-9.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fb89397013cf302f282f0fc998bb7abf11d49dcff72c8ecb320f76ea6e2c5717"}, - {file = "Pillow-9.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c870193cce4b76713a2b29be5d8327c8ccbe0d4a49bc22968aa1e680930f5581"}, - {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69e5ddc609230d4408277af135c5b5c8fe7a54b2bdb8ad7c5100b86b3aab04c6"}, - {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35be4a9f65441d9982240e6966c1eaa1c654c4e5e931eaf580130409e31804d4"}, - {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82283af99c1c3a5ba1da44c67296d5aad19f11c535b551a5ae55328a317ce331"}, - {file = "Pillow-9.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a325ac71914c5c043fa50441b36606e64a10cd262de12f7a179620f579752ff8"}, - {file = "Pillow-9.1.0-cp39-cp39-win32.whl", hash = "sha256:a598d8830f6ef5501002ae85c7dbfcd9c27cc4efc02a1989369303ba85573e58"}, - {file = "Pillow-9.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0c51cb9edac8a5abd069fd0758ac0a8bfe52c261ee0e330f363548aca6893595"}, - {file = "Pillow-9.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a336a4f74baf67e26f3acc4d61c913e378e931817cd1e2ef4dfb79d3e051b481"}, - {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb1b89b11256b5b6cad5e7593f9061ac4624f7651f7a8eb4dfa37caa1dfaa4d0"}, - {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:255c9d69754a4c90b0ee484967fc8818c7ff8311c6dddcc43a4340e10cd1636a"}, - {file = "Pillow-9.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5a3ecc026ea0e14d0ad7cd990ea7f48bfcb3eb4271034657dc9d06933c6629a7"}, - {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5b0ff59785d93b3437c3703e3c64c178aabada51dea2a7f2c5eccf1bcf565a3"}, - {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7110ec1701b0bf8df569a7592a196c9d07c764a0a74f65471ea56816f10e2c8"}, - {file = "Pillow-9.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8d79c6f468215d1a8415aa53d9868a6b40c4682165b8cb62a221b1baa47db458"}, - {file = "Pillow-9.1.0.tar.gz", hash = "sha256:f401ed2bbb155e1ade150ccc63db1a4f6c1909d3d378f7d1235a44e90d75fb97"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, + {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, + {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, + {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, + {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, + {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, + {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, + {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, + {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, + {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, + {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, + {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, + {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, + {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, + {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, + {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, ] [package.extras] -docs = ["olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinx-rtd-theme (>=1.0)", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] [[package]] name = "platformdirs" -version = "2.5.2" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "3.2.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, - {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, + {file = "platformdirs-3.2.0-py3-none-any.whl", hash = "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e"}, + {file = "platformdirs-3.2.0.tar.gz", hash = "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08"}, ] [package.extras] -docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" -version = "0.13.1" +version = "1.0.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" files = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] [package.extras] dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" -version = "2.20.0" +version = "2.21.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pre_commit-2.20.0-py2.py3-none-any.whl", hash = "sha256:51a5ba7c480ae8072ecdb6933df22d2f812dc897d5fe848778116129a681aac7"}, - {file = "pre_commit-2.20.0.tar.gz", hash = "sha256:a978dac7bc9ec0bcee55c18a277d553b0f419d259dadb4b9418ff2d00eb43959"}, + {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, + {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, ] [package.dependencies] @@ -1790,8 +1886,7 @@ cfgv = ">=2.0.0" identify = ">=1.0.0" nodeenv = ">=0.11.1" pyyaml = ">=5.1" -toml = "*" -virtualenv = ">=20.0.8" +virtualenv = ">=20.10.0" [[package]] name = "prefect" @@ -2173,14 +2268,14 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2. [[package]] name = "pytest-cov" -version = "3.0.0" +version = "4.0.0" description = "Pytest plugin for measuring coverage." category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, - {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, + {file = "pytest-cov-4.0.0.tar.gz", hash = "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470"}, + {file = "pytest_cov-4.0.0-py3-none-any.whl", hash = "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b"}, ] [package.dependencies] @@ -2353,20 +2448,18 @@ files = [ [[package]] name = "redis" -version = "4.3.4" +version = "4.5.4" description = "Python client for Redis database and key-value store" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "redis-4.3.4-py3-none-any.whl", hash = "sha256:a52d5694c9eb4292770084fa8c863f79367ca19884b329ab574d5cb2036b3e54"}, - {file = "redis-4.3.4.tar.gz", hash = "sha256:ddf27071df4adf3821c4f2ca59d67525c3a82e5f268bed97b813cb4fabf87880"}, + {file = "redis-4.5.4-py3-none-any.whl", hash = "sha256:2c19e6767c474f2e85167909061d525ed65bea9301c0770bb151e041b7ac89a2"}, + {file = "redis-4.5.4.tar.gz", hash = "sha256:73ec35da4da267d6847e47f68730fdd5f62e2ca69e3ef5885c6a78a9374c3893"}, ] [package.dependencies] -async-timeout = ">=4.0.2" -deprecated = ">=1.2.3" -packaging = ">=20.4" +async-timeout = {version = ">=4.0.2", markers = "python_version <= \"3.11.2\""} [package.extras] hiredis = ["hiredis (>=1.0.0)"] @@ -2445,7 +2538,7 @@ files = [ pyasn1 = ">=0.1.3" [[package]] -name = "ruamel.yaml" +name = "ruamel-yaml" version = "0.17.10" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" category = "main" @@ -2464,7 +2557,7 @@ docs = ["ryd"] jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [[package]] -name = "ruamel.yaml.clib" +name = "ruamel-yaml-clib" version = "0.2.6" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" category = "main" @@ -2505,39 +2598,42 @@ files = [ [[package]] name = "scipy" -version = "1.8.0" -description = "SciPy: Scientific Library for Python" -category = "main" -optional = false -python-versions = ">=3.8,<3.11" -files = [ - {file = "scipy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:87b01c7d5761e8a266a0fbdb9d88dcba0910d63c1c671bdb4d99d29f469e9e03"}, - {file = "scipy-1.8.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ae3e327da323d82e918e593460e23babdce40d7ab21490ddf9fc06dec6b91a18"}, - {file = "scipy-1.8.0-cp310-cp310-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:16e09ef68b352d73befa8bcaf3ebe25d3941fe1a58c82909d5589856e6bc8174"}, - {file = "scipy-1.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c17a1878d00a5dd2797ccd73623ceca9d02375328f6218ee6d921e1325e61aff"}, - {file = "scipy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937d28722f13302febde29847bbe554b89073fbb924a30475e5ed7b028898b5f"}, - {file = "scipy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:8f4d059a97b29c91afad46b1737274cb282357a305a80bdd9e8adf3b0ca6a3f0"}, - {file = "scipy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:38aa39b6724cb65271e469013aeb6f2ce66fd44f093e241c28a9c6bc64fd79ed"}, - {file = "scipy-1.8.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:559a8a4c03a5ba9fe3232f39ed24f86457e4f3f6c0abbeae1fb945029f092720"}, - {file = "scipy-1.8.0-cp38-cp38-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:f4a6d3b9f9797eb2d43938ac2c5d96d02aed17ef170c8b38f11798717523ddba"}, - {file = "scipy-1.8.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92b2c2af4183ed09afb595709a8ef5783b2baf7f41e26ece24e1329c109691a7"}, - {file = "scipy-1.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a279e27c7f4566ef18bab1b1e2c37d168e365080974758d107e7d237d3f0f484"}, - {file = "scipy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad5be4039147c808e64f99c0e8a9641eb5d2fa079ff5894dcd8240e94e347af4"}, - {file = "scipy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:3d9dd6c8b93a22bf9a3a52d1327aca7e092b1299fb3afc4f89e8eba381be7b59"}, - {file = "scipy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:5e73343c5e0d413c1f937302b2e04fb07872f5843041bcfd50699aef6e95e399"}, - {file = "scipy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:de2e80ee1d925984c2504812a310841c241791c5279352be4707cdcd7c255039"}, - {file = "scipy-1.8.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:c2bae431d127bf0b1da81fc24e4bba0a84d058e3a96b9dd6475dfcb3c5e8761e"}, - {file = "scipy-1.8.0-cp39-cp39-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:723b9f878095ed994756fa4ee3060c450e2db0139c5ba248ee3f9628bd64e735"}, - {file = "scipy-1.8.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:011d4386b53b933142f58a652aa0f149c9b9242abd4f900b9f4ea5fbafc86b89"}, - {file = "scipy-1.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6f0cd9c0bd374ef834ee1e0f0999678d49dcc400ea6209113d81528958f97c7"}, - {file = "scipy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3720d0124aced49f6f2198a6900304411dbbeed12f56951d7c66ebef05e3df6"}, - {file = "scipy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:3d573228c10a3a8c32b9037be982e6440e411b443a6267b067cac72f690b8d56"}, - {file = "scipy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb7088e89cd751acf66195d2f00cf009a1ea113f3019664032d9075b1e727b6c"}, - {file = "scipy-1.8.0.tar.gz", hash = "sha256:31d4f2d6b724bc9a98e527b5849b8a7e589bf1ea630c33aa563eda912c9ff0bd"}, -] - -[package.dependencies] -numpy = ">=1.17.3,<1.25.0" +version = "1.10.1" +description = "Fundamental algorithms for scientific computing in Python" +category = "main" +optional = false +python-versions = "<3.12,>=3.8" +files = [ + {file = "scipy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7354fd7527a4b0377ce55f286805b34e8c54b91be865bac273f527e1b839019"}, + {file = "scipy-1.10.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4b3f429188c66603a1a5c549fb414e4d3bdc2a24792e061ffbd607d3d75fd84e"}, + {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1553b5dcddd64ba9a0d95355e63fe6c3fc303a8fd77c7bc91e77d61363f7433f"}, + {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c0ff64b06b10e35215abce517252b375e580a6125fd5fdf6421b98efbefb2d2"}, + {file = "scipy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:fae8a7b898c42dffe3f7361c40d5952b6bf32d10c4569098d276b4c547905ee1"}, + {file = "scipy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f1564ea217e82c1bbe75ddf7285ba0709ecd503f048cb1236ae9995f64217bd"}, + {file = "scipy-1.10.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d925fa1c81b772882aa55bcc10bf88324dadb66ff85d548c71515f6689c6dac5"}, + {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaea0a6be54462ec027de54fca511540980d1e9eea68b2d5c1dbfe084797be35"}, + {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15a35c4242ec5f292c3dd364a7c71a61be87a3d4ddcc693372813c0b73c9af1d"}, + {file = "scipy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:43b8e0bcb877faf0abfb613d51026cd5cc78918e9530e375727bf0625c82788f"}, + {file = "scipy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5678f88c68ea866ed9ebe3a989091088553ba12c6090244fdae3e467b1139c35"}, + {file = "scipy-1.10.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:39becb03541f9e58243f4197584286e339029e8908c46f7221abeea4b749fa88"}, + {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bce5869c8d68cf383ce240e44c1d9ae7c06078a9396df68ce88a1230f93a30c1"}, + {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07c3457ce0b3ad5124f98a86533106b643dd811dd61b548e78cf4c8786652f6f"}, + {file = "scipy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:049a8bbf0ad95277ffba9b3b7d23e5369cc39e66406d60422c8cfef40ccc8415"}, + {file = "scipy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd9f1027ff30d90618914a64ca9b1a77a431159df0e2a195d8a9e8a04c78abf9"}, + {file = "scipy-1.10.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:79c8e5a6c6ffaf3a2262ef1be1e108a035cf4f05c14df56057b64acc5bebffb6"}, + {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51af417a000d2dbe1ec6c372dfe688e041a7084da4fdd350aeb139bd3fb55353"}, + {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b4735d6c28aad3cdcf52117e0e91d6b39acd4272f3f5cd9907c24ee931ad601"}, + {file = "scipy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ff7f37b1bf4417baca958d254e8e2875d0cc23aaadbe65b3d5b3077b0eb23ea"}, + {file = "scipy-1.10.1.tar.gz", hash = "sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5"}, +] + +[package.dependencies] +numpy = ">=1.19.5,<1.27.0" + +[package.extras] +dev = ["click", "doit (>=0.36.0)", "flake8", "mypy", "pycodestyle", "pydevtool", "rich-click", "typing_extensions"] +doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "seaborn" @@ -2600,14 +2696,14 @@ files = [ [[package]] name = "soupsieve" -version = "2.3.2.post1" +version = "2.4" description = "A modern CSS selector implementation for Beautiful Soup." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, - {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, + {file = "soupsieve-2.4-py3-none-any.whl", hash = "sha256:49e5368c2cda80ee7e84da9dbe3e110b70a4575f196efb74e51b94549d921955"}, + {file = "soupsieve-2.4.tar.gz", hash = "sha256:e28dba9ca6c7c00173e34e4ba57448f0688bb681b7c5e8bf4971daafc093d69a"}, ] [[package]] @@ -2665,7 +2761,7 @@ files = [ name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2785,28 +2881,16 @@ dev = ["coveralls (>=2.1.0)", "tox (>=3.14.0)"] socks = ["requests[socks] (>=2.11.1,<3)"] test = ["vcrpy (>=1.10.3)"] -[[package]] -name = "typing-extensions" -version = "4.5.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, - {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, -] - [[package]] name = "unidecode" -version = "1.3.4" +version = "1.3.6" description = "ASCII transliterations of Unicode text" category = "main" optional = false python-versions = ">=3.5" files = [ - {file = "Unidecode-1.3.4-py3-none-any.whl", hash = "sha256:afa04efcdd818a93237574791be9b2817d7077c25a068b00f8cff7baa4e59257"}, - {file = "Unidecode-1.3.4.tar.gz", hash = "sha256:8e4352fb93d5a735c788110d2e7ac8e8031eb06ccbfe8d324ab71735015f9342"}, + {file = "Unidecode-1.3.6-py3-none-any.whl", hash = "sha256:547d7c479e4f377b430dd91ac1275d593308dce0fc464fb2ab7d41f82ec653be"}, + {file = "Unidecode-1.3.6.tar.gz", hash = "sha256:fed09cf0be8cf415b391642c2a5addfc72194407caee4f98719e40ec2a72b830"}, ] [[package]] @@ -2840,24 +2924,24 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.16.3" +version = "20.21.0" description = "Virtual Python Environment builder" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "virtualenv-20.16.3-py2.py3-none-any.whl", hash = "sha256:4193b7bc8a6cd23e4eb251ac64f29b4398ab2c233531e66e40b19a6b7b0d30c1"}, - {file = "virtualenv-20.16.3.tar.gz", hash = "sha256:d86ea0bb50e06252d79e6c241507cb904fcd66090c3271381372d6221a3970f9"}, + {file = "virtualenv-20.21.0-py3-none-any.whl", hash = "sha256:31712f8f2a17bd06234fa97fdf19609e789dd4e3e4bf108c3da71d710651adbc"}, + {file = "virtualenv-20.21.0.tar.gz", hash = "sha256:f50e3e60f990a0757c9b68333c9fdaa72d7188caa417f96af9e52407831a3b68"}, ] [package.dependencies] -distlib = ">=0.3.5,<1" +distlib = ">=0.3.6,<1" filelock = ">=3.4.1,<4" -platformdirs = ">=2.4,<3" +platformdirs = ">=2.4,<4" [package.extras] -docs = ["proselint (>=0.13)", "sphinx (>=5.1.1)", "sphinx-argparse (>=0.3.1)", "sphinx-rtd-theme (>=1)", "towncrier (>=21.9)"] -testing = ["coverage (>=6.2)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=21.3)", "pytest (>=7.0.1)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.6.1)", "pytest-randomly (>=3.10.3)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] +test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23)", "pytest (>=7.2.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"] [[package]] name = "websocket-client" @@ -2901,80 +2985,6 @@ files = [ [package.extras] dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] -[[package]] -name = "wrapt" -version = "1.14.1" -description = "Module for decorators, wrappers and monkey patching." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -files = [ - {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, - {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, - {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, - {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, - {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, - {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, - {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, - {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, - {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, - {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, - {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, - {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, - {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, - {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, - {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, - {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, -] - [[package]] name = "zict" version = "2.0.0" @@ -2992,21 +3002,21 @@ heapdict = "*" [[package]] name = "zipp" -version = "3.8.0" +version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, - {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, ] [package.extras] -docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] -testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "e2ddd4fc39e83bcf7162fa18653c18a75e8f3b7117f990d6c540bca848d06edb" +content-hash = "b66b159eb704ec9ed5c49fbec70a4f8bed1c3eae80635aafb95c09f7b2c0455b" diff --git a/pyproject.toml b/pyproject.toml index 1eba9aefd..b76cdee1f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -105,6 +105,7 @@ pytest_cov = "^3.0.0" [tool.poetry.group.dev.dependencies] pytest = "^7.2.2" +pytest-cov = "^4.0.0" [build-system] build-backend = "poetry.core.masonry.api" From 9e2fdc5525cd378ab0238a504262ae00b4e9d630 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 5 Apr 2023 05:42:05 -0300 Subject: [PATCH 026/265] Remove unnecessary testing --- .../code/test/download_frota_old_test.py | 30 ------------------- 1 file changed, 30 deletions(-) delete mode 100644 br_denatran_frota/code/test/download_frota_old_test.py diff --git a/br_denatran_frota/code/test/download_frota_old_test.py b/br_denatran_frota/code/test/download_frota_old_test.py deleted file mode 100644 index affee1619..000000000 --- a/br_denatran_frota/code/test/download_frota_old_test.py +++ /dev/null @@ -1,30 +0,0 @@ -import os -import shutil -import tempfile -import unittest - -from download_frota_old import download_frota_old - - -class TestDownloadFrotaOld(unittest.TestCase): - def setUp(self): - self.temp_dir = tempfile.mkdtemp() - self.dir = os.getcwd() - - def tearDown(self): - shutil.rmtree(self.temp_dir) - os.chdir(self.dir) - - def test_download_frota_old(self): - download_frota_old(year=2009, tempdir=self.temp_dir, dir=self.dir) - self.assertTrue(os.path.exists(os.path.join(self.dir, "frota_12-2009.xlsx"))) - self.assertTrue(os.path.exists(os.path.join(self.dir, "frota_1-2009.xlsx"))) - self.assertTrue(os.path.exists(os.path.join(self.dir, "frota_2-2009.xlsx"))) - - def test_download_frota_old_year_above_2012(self): - with self.assertRaises(ValueError): - download_frota_old(year=2013, tempdir=self.temp_dir, dir=self.dir) - - -if __name__ == "__main__": - unittest.main() From e7bfcb06075231b075aa9d1a63a045b67734ad12 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 5 Apr 2023 05:44:42 -0300 Subject: [PATCH 027/265] No need for a separate file now --- br_denatran_frota/code/download_frota_old.py | 106 ------------------- 1 file changed, 106 deletions(-) delete mode 100644 br_denatran_frota/code/download_frota_old.py diff --git a/br_denatran_frota/code/download_frota_old.py b/br_denatran_frota/code/download_frota_old.py deleted file mode 100644 index 1ce4fe19c..000000000 --- a/br_denatran_frota/code/download_frota_old.py +++ /dev/null @@ -1,106 +0,0 @@ -import os -import re -import requests -from zipfile import ZipFile -import shutil - -months = { - "jan": 1, - "fev": 2, - "mar": 3, - "abr": 4, - "mai": 5, - "jun": 6, - "jul": 7, - "ago": 8, - "set": 9, - "out": 10, - "nov": 11, - "dez": 12, -} - - -def create_directory(path): - if not os.path.exists(path): - os.makedirs(path) - - -def extract_files_from_zip(zip_file, extract_path): - with ZipFile(zip_file, "r") as zip: - zip.extractall(extract_path) - - -def download_frota_old(key=None, prefix=None, year=None, tempdir=None, dir=None): - - if year > 2012: - raise ValueError("Utilize download_frota()") - - mi_url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-senatran/estatisticas/renavam/{year}/frota{'_' if year > 2008 else ''}{year}.zip" - create_directory(tempdir) - create_directory(dir) - - dir_temp = os.path.join(tempdir, f"frota__{year}") - path_file = os.path.join(dir_temp, ".zip") - - if not os.path.exists(path_file): - try: - response = requests.get(mi_url) - with open(path_file, "wb") as f: - f.write(response.content) - except Exception as e: - if os.path.exists(path_file): - os.remove(path_file) - - extract_files_from_zip(path_file, dir_temp) - - for root, dirs, files in os.walk(dir_temp): - for name in files: - if name.endswith(".zip"): - extract_files_from_zip( - os.path.join(root, name), os.path.dirname(os.path.join(root, name)) - ) - - for root, dirs, files in os.walk(dir_temp): - for name in files: - file_path = os.path.join(root, name) - - get_by = { - "regiao": "(frota tipo uf)|(frota uf)|(frota regiao uf)|(frota regiao tipo uf)", - "municipio": "(frota munic)|(frota mun)", - } - - new_name = ( - os.path.basename(file_path) - .lower() - .replace("regiões", "regiao") - .replace("_", " ") - .replace("-", " ") - .replace(".xlsx", "") - .replace(".xls", "") - .replace("internet", "") - .strip() - ) - new_name = re.sub(r"^(\\d\\_|\\d)+", "", new_name) - - # Match jan|fev|... or number of month (two digits) - get_month = re.search( - rf"({'|'.join(months.keys())})|\d{{2}}(?=\d{{4}})", - new_name, - re.IGNORECASE, - ) - if get_month: - month_i = int(get_month.group(0)) - if get_month.group(1): - month_i = months[get_month.group(1)] - - file_ext = re.search(r"\.[a-zA-Z0-9]+$", new_name).group(0) - - if ( - key - and prefix - and re.search(get_by[key], new_name, re.IGNORECASE) - and name.endswith(("xls", "xlsx")) - ): - shutil.copy( - file_path, os.path.join(dir, f"{prefix}_{month_i}-{year}{file_ext}") - ) From 46ae51973f2af6ef35fc25e03f0bb7c05dc6d9f0 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 5 Apr 2023 05:45:09 -0300 Subject: [PATCH 028/265] Cleanup + new tests --- br_denatran_frota/code/download_frota.py | 32 +------- .../code/test/download_frota_test.py | 82 +++++++++++++++---- 2 files changed, 69 insertions(+), 45 deletions(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index 891c6c739..f152264d3 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -35,32 +35,6 @@ def handle_xl(i: dict) -> None: urlretrieve(i["href"], dest_path_file) -def handle_compact(i: dict): - tempdir = i["tempdir"] - path_file_zip = os.path.join(tempdir, make_filename(i)) - dir_file = os.path.join(tempdir, make_filename(i, ext=False)) - - if not os.path.isfile(path_file_zip): - urlretrieve(i["href"], path_file_zip) - - if i["filetype"] == "rar": - with RarFile(path_file_zip) as rar_file: - rar_file.extractall(dir_file) - else: - with ZipFile(path_file_zip) as zip_file: - zip_file.extractall(dir_file) - - for filename in os.listdir(dir_file): - filepath = os.path.join(dir_file, filename) - if os.path.isfile(filepath): - if filename.endswith((".xlsx", ".xls")): - dest_path_file = os.path.join(tempdir, make_filename(i)) - if not os.path.isfile(dest_path_file): - os.rename(filepath, dest_path_file) - else: - os.remove(filepath) - - def make_filename(i: dict, ext: bool = True) -> str: """Creates the filename using the sent dictionary. @@ -141,7 +115,7 @@ def download_frota(month: int, year: int): year (int): Ano desejado. Raises: - ValueError: Dá erro caso o mês desejado não seja um mês válido. + ValueError: Errors if the month is not a valid one. """ if month not in MONTHS.values(): @@ -157,7 +131,7 @@ def download_frota(month: int, year: int): year_dir_name = f"{year}" desired_dir_name = os.path.join("files", year_dir_name) - # Cria pasta para aquele ano de arquivos caso seja necessário. + # Create dir for that specific year should it be necessary. make_dir_when_not_exists(desired_dir_name) os.chdir(desired_dir_name) if year > 2012: @@ -169,5 +143,3 @@ def download_frota(month: int, year: int): urlretrieve(url, generic_zip_filename) with ZipFile(generic_zip_filename) as zip_file: zip_file.extractall() - - print(2) diff --git a/br_denatran_frota/code/test/download_frota_test.py b/br_denatran_frota/code/test/download_frota_test.py index 9495132b9..9226c83dc 100644 --- a/br_denatran_frota/code/test/download_frota_test.py +++ b/br_denatran_frota/code/test/download_frota_test.py @@ -1,32 +1,84 @@ import os +import shutil import tempfile import unittest -from unittest.mock import patch -from urllib.error import HTTPError -from download_frota import * +from download_frota import ( + DATASET, + MONTHS, + make_filename, + make_dir_when_not_exists, + download_frota, + download_post_2012, +) -class TestDownloadFrota(unittest.TestCase): + +class TestMakeFilename(unittest.TestCase): def setUp(self): - self.test_dir = tempfile.mkdtemp() + self.temp_dir = tempfile.mkdtemp() def tearDown(self): - os.rmdir(self.test_dir) + shutil.rmtree(self.temp_dir) + + def test_make_filename(self): + month = 2 + year = 2013 + i = { + "txt": "frota-de-veiculos-por-municipio-tipo-e-combustivel", + "mes": month, + "ano": year, + "filetype": "xlsx", + } + filename = make_filename(i) + self.assertEqual( + filename, + f"frota-de-veiculos-por-municipio-tipo-e-combustivel_{month}-{year}.xlsx", + ) - def test_download_frota_with_valid_args(self): - # TODO: This is always assuming a structure of having a files dir under the denatran directory... + def test_make_filename_without_ext(self): month = 2 - year = 2022 - download_frota(month, year) - expected_file_path = os.path.join( - os.getcwd(), - f"frota_por_município_e_tipo_{month}-{year}.xls", + year = 2013 + i = { + "txt": "frota-de-veiculos-por-municipio-tipo-e-combustivel", + "mes": 2, + "ano": 2013, + "filetype": "xlsx", + } + filename = make_filename(i, ext=False) + self.assertEqual( + filename, + f"frota-de-veiculos-por-municipio-tipo-e-combustivel_{month}-{year}", ) - self.assertTrue(os.path.isfile(expected_file_path)) + + +class TestMakeDirWhenNotExists(unittest.TestCase): + def test_make_dir_when_not_exists(self): + new_dir = os.path.join(self.temp_dir, "new_dir") + self.assertFalse(os.path.exists(new_dir)) + make_dir_when_not_exists(new_dir) + self.assertTrue(os.path.exists(new_dir)) + + def test_download_frota_with_valid_month(self): + download_frota(MONTHS["fevereiro"], 2013) + expected_files = { + "frota_de_veiculos_por_municipio_tipo_e_combustivel_2-2013.xlsx", + "frota_de_veiculos_por_uf_e_tipo_2-2013.xlsx", + } + files = set(os.listdir(os.path.join(self.temp_dir, DATASET, "files", "2013"))) + self.assertEqual(files, expected_files) def test_download_frota_with_invalid_month(self): with self.assertRaises(ValueError): - download_frota(month=13, year=2022) + download_frota(13, 2013) + + def test_download_post_2012(self): + download_post_2012(2018, MONTHS["fevereiro"]) + expected_files = { + "Frota por UF e tipo_2-2018.xlsx", + "Frota por Município e tipo e combustível_2-2018.xlsx", + } + files = set(os.listdir(os.path.join(self.temp_dir, DATASET, "files", "2018"))) + self.assertEqual(files, expected_files) if __name__ == "__main__": From 4ae29a6457f74baad78beb305445b0d55108dfba Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 5 Apr 2023 06:44:44 -0300 Subject: [PATCH 029/265] 2018 is literally a different design and this is terrible --- br_denatran_frota/code/download_frota.py | 13 +++---- .../code/test/download_frota_test.py | 34 +++++++++++++++---- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index f152264d3..b16452882 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -63,7 +63,7 @@ def download_file(i): raise ValueError("A função handle_compact tá bem esquisita por hora.") -def download_post_2012(year: int, month: int): +def download_post_2012(month: int, year: int): """_summary_ Args: @@ -73,7 +73,7 @@ def download_post_2012(year: int, month: int): url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-Senatran/frota-de-veiculos-{year}" soup = BeautifulSoup(urlopen(url), "html.parser") # Só queremos os dados de frota nacional. - nodes = soup.select("p:contains('Frota por ') > a") + nodes = soup.select("p:contains('rota por ') > a") for node in nodes: txt = node.text href = node.get("href") @@ -107,7 +107,7 @@ def make_dir_when_not_exists(dir_name: str): os.mkdir(dir_name) -def download_frota(month: int, year: int): +def download_frota(month: int, year: int, temp_dir: None): """Função principal para baixar os dados de frota por município e tipo e também por UF e tipo. Args: @@ -125,17 +125,18 @@ def download_frota(month: int, year: int): if dir_list: # I always want to be in the actual folder for this dataset: os.chdir(dir_list[0]) - + if temp_dir: + os.chdir(temp_dir) # I always need a files directory inside my dataset folder. make_dir_when_not_exists("files") year_dir_name = f"{year}" - desired_dir_name = os.path.join("files", year_dir_name) + desired_dir_name = os.path.join(os.getcwd(), temp_dir, "files", year_dir_name) # Create dir for that specific year should it be necessary. make_dir_when_not_exists(desired_dir_name) os.chdir(desired_dir_name) if year > 2012: - download_post_2012(year, month) + download_post_2012(month, year) else: url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-senatran/estatisticas/renavam/{year}/frota{'_' if year > 2008 else ''}{year}.zip" diff --git a/br_denatran_frota/code/test/download_frota_test.py b/br_denatran_frota/code/test/download_frota_test.py index 9226c83dc..291c09590 100644 --- a/br_denatran_frota/code/test/download_frota_test.py +++ b/br_denatran_frota/code/test/download_frota_test.py @@ -2,6 +2,7 @@ import shutil import tempfile import unittest +import glob from download_frota import ( DATASET, @@ -12,14 +13,13 @@ download_post_2012, ) +dir_list = glob.glob(f"**/{DATASET}", recursive=True) +if dir_list: + # I always want to be in the actual folder for this dataset: + os.chdir(dir_list[0]) -class TestMakeFilename(unittest.TestCase): - def setUp(self): - self.temp_dir = tempfile.mkdtemp() - - def tearDown(self): - shutil.rmtree(self.temp_dir) +class TestMakeFilename(unittest.TestCase): def test_make_filename(self): month = 2 year = 2013 @@ -52,12 +52,32 @@ def test_make_filename_without_ext(self): class TestMakeDirWhenNotExists(unittest.TestCase): + def setUp(self): + self.temp_dir = tempfile.mkdtemp() + + def tearDown(self): + shutil.rmtree(self.temp_dir) + def test_make_dir_when_not_exists(self): new_dir = os.path.join(self.temp_dir, "new_dir") self.assertFalse(os.path.exists(new_dir)) make_dir_when_not_exists(new_dir) self.assertTrue(os.path.exists(new_dir)) + +class TestDownloadFrota(unittest.TestCase): + def setUp(self): + # Create a simple temporary directory for files, as opposed to the real one? + # Problema aqui é que a minha estrutura sempre assume que BR DENATRAN FROTA é um repo, e ai vai criando conforme for files, ano, etc. + # Idealmente, o teste nesse caso só teria o tear down pro ano testado SÓ QUE isso é mei burro né + # Pq? Pq oras, se vc rodou 2012, aí testou 2012, vc ia perder tudo q fez pré teste. Seu teste apagar sua execução é meio esquisito. + # OK, então qual que é a maneira + self.temp_dir = tempfile.mkdtemp(dir=os.getcwd()) + + def tearDown(self): + shutil.rmtree(self.temp_dir) + + @unittest.skip("demonstrating skipping") def test_download_frota_with_valid_month(self): download_frota(MONTHS["fevereiro"], 2013) expected_files = { @@ -72,7 +92,7 @@ def test_download_frota_with_invalid_month(self): download_frota(13, 2013) def test_download_post_2012(self): - download_post_2012(2018, MONTHS["fevereiro"]) + download_frota(MONTHS["fevereiro"], 2018, self.temp_dir) expected_files = { "Frota por UF e tipo_2-2018.xlsx", "Frota por Município e tipo e combustível_2-2018.xlsx", From f1cc15be5daf0d2b9ff2b39226b8c29304382b76 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sat, 8 Apr 2023 21:14:54 -0300 Subject: [PATCH 030/265] 404 but works and god knows why --- br_denatran_frota/code/download_frota.py | 19 +++++++++++++++---- .../code/test/download_frota_test.py | 7 +++++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index b16452882..a4a914e3f 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -5,7 +5,7 @@ from zipfile import ZipFile from rarfile import RarFile from bs4 import BeautifulSoup - +import requests MONTHS = { "janeiro": 1, @@ -25,6 +25,17 @@ DATASET = "br_denatran_frota" +def download_file(url, filename): + # Send a GET request to the URL + response = requests.get(url) + + # Save the contents of the response to a file + with open(filename, "wb") as f: + f.write(response.content) + + print(f"Download of {filename} complete") + + def handle_xl(i: dict) -> None: """Actually downloads and deals with Excel files. @@ -32,7 +43,7 @@ def handle_xl(i: dict) -> None: i (dict): Dictionary with all the desired downloadable file's info. """ dest_path_file = make_filename(i) - urlretrieve(i["href"], dest_path_file) + download_file(i["href"], dest_path_file) def make_filename(i: dict, ext: bool = True) -> str: @@ -56,7 +67,7 @@ def make_filename(i: dict, ext: bool = True) -> str: return filename -def download_file(i): +def call_downloader(i): if i["filetype"] in ["xlsx", "xls"]: handle_xl(i) else: @@ -94,7 +105,7 @@ def download_post_2012(month: int, year: int): "ano": year, "filetype": filetype, } - download_file(info) + call_downloader(info) def make_dir_when_not_exists(dir_name: str): diff --git a/br_denatran_frota/code/test/download_frota_test.py b/br_denatran_frota/code/test/download_frota_test.py index 291c09590..27718b538 100644 --- a/br_denatran_frota/code/test/download_frota_test.py +++ b/br_denatran_frota/code/test/download_frota_test.py @@ -92,12 +92,15 @@ def test_download_frota_with_invalid_month(self): download_frota(13, 2013) def test_download_post_2012(self): - download_frota(MONTHS["fevereiro"], 2018, self.temp_dir) + year = 2019 + download_frota(MONTHS["fevereiro"], year, self.temp_dir) expected_files = { "Frota por UF e tipo_2-2018.xlsx", "Frota por Município e tipo e combustível_2-2018.xlsx", } - files = set(os.listdir(os.path.join(self.temp_dir, DATASET, "files", "2018"))) + files = set( + os.listdir(os.path.join(self.temp_dir, DATASET, "files", f"{year}")) + ) self.assertEqual(files, expected_files) From b6b50bc85dfbb89acc53de1e27c73b3bef592877 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sat, 8 Apr 2023 23:36:30 -0300 Subject: [PATCH 031/265] Fix tests and parametrize them --- br_denatran_frota/code/download_frota.py | 2 +- .../code/test/download_frota_test.py | 29 ++-- poetry.lock | 127 ++++++++++-------- pyproject.toml | 2 +- 4 files changed, 91 insertions(+), 69 deletions(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index a4a914e3f..144aa0a16 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -118,7 +118,7 @@ def make_dir_when_not_exists(dir_name: str): os.mkdir(dir_name) -def download_frota(month: int, year: int, temp_dir: None): +def download_frota(month: int, year: int, temp_dir: str = None): """Função principal para baixar os dados de frota por município e tipo e também por UF e tipo. Args: diff --git a/br_denatran_frota/code/test/download_frota_test.py b/br_denatran_frota/code/test/download_frota_test.py index 27718b538..b7b971667 100644 --- a/br_denatran_frota/code/test/download_frota_test.py +++ b/br_denatran_frota/code/test/download_frota_test.py @@ -3,6 +3,7 @@ import tempfile import unittest import glob +from parameterized import parameterized from download_frota import ( DATASET, @@ -13,6 +14,14 @@ download_post_2012, ) + +def custom_name_func(testcase_func, param_num, param): + return "%s_%s" % ( + testcase_func.__name__, + parameterized.to_safe_name("_".join(str(x) for x in param.args)), + ) + + dir_list = glob.glob(f"**/{DATASET}", recursive=True) if dir_list: # I always want to be in the actual folder for this dataset: @@ -67,11 +76,6 @@ def test_make_dir_when_not_exists(self): class TestDownloadFrota(unittest.TestCase): def setUp(self): - # Create a simple temporary directory for files, as opposed to the real one? - # Problema aqui é que a minha estrutura sempre assume que BR DENATRAN FROTA é um repo, e ai vai criando conforme for files, ano, etc. - # Idealmente, o teste nesse caso só teria o tear down pro ano testado SÓ QUE isso é mei burro né - # Pq? Pq oras, se vc rodou 2012, aí testou 2012, vc ia perder tudo q fez pré teste. Seu teste apagar sua execução é meio esquisito. - # OK, então qual que é a maneira self.temp_dir = tempfile.mkdtemp(dir=os.getcwd()) def tearDown(self): @@ -91,15 +95,18 @@ def test_download_frota_with_invalid_month(self): with self.assertRaises(ValueError): download_frota(13, 2013) - def test_download_post_2012(self): - year = 2019 - download_frota(MONTHS["fevereiro"], year, self.temp_dir) + @parameterized.expand( + [(month, year) for year in range(2013, 2023) for month in range(1, 13)], + name_func=custom_name_func, + ) + def test_download_post_2012(self, month, year): + download_frota(month, year, self.temp_dir) expected_files = { - "Frota por UF e tipo_2-2018.xlsx", - "Frota por Município e tipo e combustível_2-2018.xlsx", + f"frota_por_uf_e_tipo_de_veículo_{month}-{year}.xls", + f"frota_por_município_e_tipo_{month}-{year}.xls", } files = set( - os.listdir(os.path.join(self.temp_dir, DATASET, "files", f"{year}")) + os.listdir(os.path.join(DATASET, self.temp_dir, "files", f"{year}")) ) self.assertEqual(files, expected_files) diff --git a/poetry.lock b/poetry.lock index 6c8e85754..33664c3d4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -266,63 +266,63 @@ test-no-images = ["pytest"] [[package]] name = "coverage" -version = "7.2.2" +version = "7.2.3" description = "Code coverage measurement for Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "coverage-7.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c90e73bdecb7b0d1cea65a08cb41e9d672ac6d7995603d6465ed4914b98b9ad7"}, - {file = "coverage-7.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e2926b8abedf750c2ecf5035c07515770944acf02e1c46ab08f6348d24c5f94d"}, - {file = "coverage-7.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57b77b9099f172804e695a40ebaa374f79e4fb8b92f3e167f66facbf92e8e7f5"}, - {file = "coverage-7.2.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efe1c0adad110bf0ad7fb59f833880e489a61e39d699d37249bdf42f80590169"}, - {file = "coverage-7.2.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2199988e0bc8325d941b209f4fd1c6fa007024b1442c5576f1a32ca2e48941e6"}, - {file = "coverage-7.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:81f63e0fb74effd5be736cfe07d710307cc0a3ccb8f4741f7f053c057615a137"}, - {file = "coverage-7.2.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:186e0fc9cf497365036d51d4d2ab76113fb74f729bd25da0975daab2e107fd90"}, - {file = "coverage-7.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:420f94a35e3e00a2b43ad5740f935358e24478354ce41c99407cddd283be00d2"}, - {file = "coverage-7.2.2-cp310-cp310-win32.whl", hash = "sha256:38004671848b5745bb05d4d621526fca30cee164db42a1f185615f39dc997292"}, - {file = "coverage-7.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:0ce383d5f56d0729d2dd40e53fe3afeb8f2237244b0975e1427bfb2cf0d32bab"}, - {file = "coverage-7.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3eb55b7b26389dd4f8ae911ba9bc8c027411163839dea4c8b8be54c4ee9ae10b"}, - {file = "coverage-7.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d2b96123a453a2d7f3995ddb9f28d01fd112319a7a4d5ca99796a7ff43f02af5"}, - {file = "coverage-7.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:299bc75cb2a41e6741b5e470b8c9fb78d931edbd0cd009c58e5c84de57c06731"}, - {file = "coverage-7.2.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e1df45c23d4230e3d56d04414f9057eba501f78db60d4eeecfcb940501b08fd"}, - {file = "coverage-7.2.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:006ed5582e9cbc8115d2e22d6d2144a0725db542f654d9d4fda86793832f873d"}, - {file = "coverage-7.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d683d230b5774816e7d784d7ed8444f2a40e7a450e5720d58af593cb0b94a212"}, - {file = "coverage-7.2.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8efb48fa743d1c1a65ee8787b5b552681610f06c40a40b7ef94a5b517d885c54"}, - {file = "coverage-7.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4c752d5264053a7cf2fe81c9e14f8a4fb261370a7bb344c2a011836a96fb3f57"}, - {file = "coverage-7.2.2-cp311-cp311-win32.whl", hash = "sha256:55272f33da9a5d7cccd3774aeca7a01e500a614eaea2a77091e9be000ecd401d"}, - {file = "coverage-7.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:92ebc1619650409da324d001b3a36f14f63644c7f0a588e331f3b0f67491f512"}, - {file = "coverage-7.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5afdad4cc4cc199fdf3e18088812edcf8f4c5a3c8e6cb69127513ad4cb7471a9"}, - {file = "coverage-7.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0484d9dd1e6f481b24070c87561c8d7151bdd8b044c93ac99faafd01f695c78e"}, - {file = "coverage-7.2.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d530191aa9c66ab4f190be8ac8cc7cfd8f4f3217da379606f3dd4e3d83feba69"}, - {file = "coverage-7.2.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac0f522c3b6109c4b764ffec71bf04ebc0523e926ca7cbe6c5ac88f84faced0"}, - {file = "coverage-7.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ba279aae162b20444881fc3ed4e4f934c1cf8620f3dab3b531480cf602c76b7f"}, - {file = "coverage-7.2.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:53d0fd4c17175aded9c633e319360d41a1f3c6e352ba94edcb0fa5167e2bad67"}, - {file = "coverage-7.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c99cb7c26a3039a8a4ee3ca1efdde471e61b4837108847fb7d5be7789ed8fd9"}, - {file = "coverage-7.2.2-cp37-cp37m-win32.whl", hash = "sha256:5cc0783844c84af2522e3a99b9b761a979a3ef10fb87fc4048d1ee174e18a7d8"}, - {file = "coverage-7.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:817295f06eacdc8623dc4df7d8b49cea65925030d4e1e2a7c7218380c0072c25"}, - {file = "coverage-7.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6146910231ece63facfc5984234ad1b06a36cecc9fd0c028e59ac7c9b18c38c6"}, - {file = "coverage-7.2.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:387fb46cb8e53ba7304d80aadca5dca84a2fbf6fe3faf6951d8cf2d46485d1e5"}, - {file = "coverage-7.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:046936ab032a2810dcaafd39cc4ef6dd295df1a7cbead08fe996d4765fca9fe4"}, - {file = "coverage-7.2.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e627dee428a176ffb13697a2c4318d3f60b2ccdde3acdc9b3f304206ec130ccd"}, - {file = "coverage-7.2.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fa54fb483decc45f94011898727802309a109d89446a3c76387d016057d2c84"}, - {file = "coverage-7.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3668291b50b69a0c1ef9f462c7df2c235da3c4073f49543b01e7eb1dee7dd540"}, - {file = "coverage-7.2.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7c20b731211261dc9739bbe080c579a1835b0c2d9b274e5fcd903c3a7821cf88"}, - {file = "coverage-7.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5764e1f7471cb8f64b8cda0554f3d4c4085ae4b417bfeab236799863703e5de2"}, - {file = "coverage-7.2.2-cp38-cp38-win32.whl", hash = "sha256:4f01911c010122f49a3e9bdc730eccc66f9b72bd410a3a9d3cb8448bb50d65d3"}, - {file = "coverage-7.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:c448b5c9e3df5448a362208b8d4b9ed85305528313fca1b479f14f9fe0d873b8"}, - {file = "coverage-7.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfe7085783cda55e53510482fa7b5efc761fad1abe4d653b32710eb548ebdd2d"}, - {file = "coverage-7.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9d22e94e6dc86de981b1b684b342bec5e331401599ce652900ec59db52940005"}, - {file = "coverage-7.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:507e4720791977934bba016101579b8c500fb21c5fa3cd4cf256477331ddd988"}, - {file = "coverage-7.2.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc4803779f0e4b06a2361f666e76f5c2e3715e8e379889d02251ec911befd149"}, - {file = "coverage-7.2.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db8c2c5ace167fd25ab5dd732714c51d4633f58bac21fb0ff63b0349f62755a8"}, - {file = "coverage-7.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4f68ee32d7c4164f1e2c8797535a6d0a3733355f5861e0f667e37df2d4b07140"}, - {file = "coverage-7.2.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d52f0a114b6a58305b11a5cdecd42b2e7f1ec77eb20e2b33969d702feafdd016"}, - {file = "coverage-7.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:797aad79e7b6182cb49c08cc5d2f7aa7b2128133b0926060d0a8889ac43843be"}, - {file = "coverage-7.2.2-cp39-cp39-win32.whl", hash = "sha256:db45eec1dfccdadb179b0f9ca616872c6f700d23945ecc8f21bb105d74b1c5fc"}, - {file = "coverage-7.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:8dbe2647bf58d2c5a6c5bcc685f23b5f371909a5624e9f5cd51436d6a9f6c6ef"}, - {file = "coverage-7.2.2-pp37.pp38.pp39-none-any.whl", hash = "sha256:872d6ce1f5be73f05bea4df498c140b9e7ee5418bfa2cc8204e7f9b817caa968"}, - {file = "coverage-7.2.2.tar.gz", hash = "sha256:36dd42da34fe94ed98c39887b86db9d06777b1c8f860520e21126a75507024f2"}, + {file = "coverage-7.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e58c0d41d336569d63d1b113bd573db8363bc4146f39444125b7f8060e4e04f5"}, + {file = "coverage-7.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:344e714bd0fe921fc72d97404ebbdbf9127bac0ca1ff66d7b79efc143cf7c0c4"}, + {file = "coverage-7.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:974bc90d6f6c1e59ceb1516ab00cf1cdfbb2e555795d49fa9571d611f449bcb2"}, + {file = "coverage-7.2.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0743b0035d4b0e32bc1df5de70fba3059662ace5b9a2a86a9f894cfe66569013"}, + {file = "coverage-7.2.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d0391fb4cfc171ce40437f67eb050a340fdbd0f9f49d6353a387f1b7f9dd4fa"}, + {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a42e1eff0ca9a7cb7dc9ecda41dfc7cbc17cb1d02117214be0561bd1134772b"}, + {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:be19931a8dcbe6ab464f3339966856996b12a00f9fe53f346ab3be872d03e257"}, + {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:72fcae5bcac3333a4cf3b8f34eec99cea1187acd55af723bcbd559adfdcb5535"}, + {file = "coverage-7.2.3-cp310-cp310-win32.whl", hash = "sha256:aeae2aa38395b18106e552833f2a50c27ea0000122bde421c31d11ed7e6f9c91"}, + {file = "coverage-7.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:83957d349838a636e768251c7e9979e899a569794b44c3728eaebd11d848e58e"}, + {file = "coverage-7.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfd393094cd82ceb9b40df4c77976015a314b267d498268a076e940fe7be6b79"}, + {file = "coverage-7.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:182eb9ac3f2b4874a1f41b78b87db20b66da6b9cdc32737fbbf4fea0c35b23fc"}, + {file = "coverage-7.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bb1e77a9a311346294621be905ea8a2c30d3ad371fc15bb72e98bfcfae532df"}, + {file = "coverage-7.2.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca0f34363e2634deffd390a0fef1aa99168ae9ed2af01af4a1f5865e362f8623"}, + {file = "coverage-7.2.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55416d7385774285b6e2a5feca0af9652f7f444a4fa3d29d8ab052fafef9d00d"}, + {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:06ddd9c0249a0546997fdda5a30fbcb40f23926df0a874a60a8a185bc3a87d93"}, + {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fff5aaa6becf2c6a1699ae6a39e2e6fb0672c2d42eca8eb0cafa91cf2e9bd312"}, + {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ea53151d87c52e98133eb8ac78f1206498c015849662ca8dc246255265d9c3c4"}, + {file = "coverage-7.2.3-cp311-cp311-win32.whl", hash = "sha256:8f6c930fd70d91ddee53194e93029e3ef2aabe26725aa3c2753df057e296b925"}, + {file = "coverage-7.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:fa546d66639d69aa967bf08156eb8c9d0cd6f6de84be9e8c9819f52ad499c910"}, + {file = "coverage-7.2.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2317d5ed777bf5a033e83d4f1389fd4ef045763141d8f10eb09a7035cee774c"}, + {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be9824c1c874b73b96288c6d3de793bf7f3a597770205068c6163ea1f326e8b9"}, + {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3b2803e730dc2797a017335827e9da6da0e84c745ce0f552e66400abdfb9a1"}, + {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f69770f5ca1994cb32c38965e95f57504d3aea96b6c024624fdd5bb1aa494a1"}, + {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1127b16220f7bfb3f1049ed4a62d26d81970a723544e8252db0efde853268e21"}, + {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:aa784405f0c640940595fa0f14064d8e84aff0b0f762fa18393e2760a2cf5841"}, + {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3146b8e16fa60427e03884301bf8209221f5761ac754ee6b267642a2fd354c48"}, + {file = "coverage-7.2.3-cp37-cp37m-win32.whl", hash = "sha256:1fd78b911aea9cec3b7e1e2622c8018d51c0d2bbcf8faaf53c2497eb114911c1"}, + {file = "coverage-7.2.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f3736a5d34e091b0a611964c6262fd68ca4363df56185902528f0b75dbb9c1f"}, + {file = "coverage-7.2.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:981b4df72c93e3bc04478153df516d385317628bd9c10be699c93c26ddcca8ab"}, + {file = "coverage-7.2.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0045f8f23a5fb30b2eb3b8a83664d8dc4fb58faddf8155d7109166adb9f2040"}, + {file = "coverage-7.2.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f760073fcf8f3d6933178d67754f4f2d4e924e321f4bb0dcef0424ca0215eba1"}, + {file = "coverage-7.2.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c86bd45d1659b1ae3d0ba1909326b03598affbc9ed71520e0ff8c31a993ad911"}, + {file = "coverage-7.2.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:172db976ae6327ed4728e2507daf8a4de73c7cc89796483e0a9198fd2e47b462"}, + {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d2a3a6146fe9319926e1d477842ca2a63fe99af5ae690b1f5c11e6af074a6b5c"}, + {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f649dd53833b495c3ebd04d6eec58479454a1784987af8afb77540d6c1767abd"}, + {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c4ed4e9f3b123aa403ab424430b426a1992e6f4c8fd3cb56ea520446e04d152"}, + {file = "coverage-7.2.3-cp38-cp38-win32.whl", hash = "sha256:eb0edc3ce9760d2f21637766c3aa04822030e7451981ce569a1b3456b7053f22"}, + {file = "coverage-7.2.3-cp38-cp38-win_amd64.whl", hash = "sha256:63cdeaac4ae85a179a8d6bc09b77b564c096250d759eed343a89d91bce8b6367"}, + {file = "coverage-7.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:20d1a2a76bb4eb00e4d36b9699f9b7aba93271c9c29220ad4c6a9581a0320235"}, + {file = "coverage-7.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ea748802cc0de4de92ef8244dd84ffd793bd2e7be784cd8394d557a3c751e21"}, + {file = "coverage-7.2.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21b154aba06df42e4b96fc915512ab39595105f6c483991287021ed95776d934"}, + {file = "coverage-7.2.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd214917cabdd6f673a29d708574e9fbdb892cb77eb426d0eae3490d95ca7859"}, + {file = "coverage-7.2.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2e58e45fe53fab81f85474e5d4d226eeab0f27b45aa062856c89389da2f0d9"}, + {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:87ecc7c9a1a9f912e306997ffee020297ccb5ea388421fe62a2a02747e4d5539"}, + {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:387065e420aed3c71b61af7e82c7b6bc1c592f7e3c7a66e9f78dd178699da4fe"}, + {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ea3f5bc91d7d457da7d48c7a732beaf79d0c8131df3ab278e6bba6297e23c6c4"}, + {file = "coverage-7.2.3-cp39-cp39-win32.whl", hash = "sha256:ae7863a1d8db6a014b6f2ff9c1582ab1aad55a6d25bac19710a8df68921b6e30"}, + {file = "coverage-7.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:3f04becd4fcda03c0160d0da9c8f0c246bc78f2f7af0feea1ec0930e7c93fa4a"}, + {file = "coverage-7.2.3-pp37.pp38.pp39-none-any.whl", hash = "sha256:965ee3e782c7892befc25575fa171b521d33798132692df428a09efacaffe8d0"}, + {file = "coverage-7.2.3.tar.gz", hash = "sha256:d298c2815fa4891edd9abe5ad6e6cb4207104c7dd9fd13aea3fdebf6f9b91259"}, ] [package.dependencies] @@ -1703,6 +1703,21 @@ pandas = ">=1.1" [package.extras] tests = ["pytest (==7.1.2)"] +[[package]] +name = "parameterized" +version = "0.9.0" +description = "Parameterized testing with any Python test framework" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "parameterized-0.9.0-py2.py3-none-any.whl", hash = "sha256:4e0758e3d41bea3bbd05ec14fc2c24736723f243b28d702081aef438c9372b1b"}, + {file = "parameterized-0.9.0.tar.gz", hash = "sha256:7fc905272cefa4f364c1a3429cbbe9c0f98b793988efb5bf90aac80f08db09b1"}, +] + +[package.extras] +dev = ["jinja2"] + [[package]] name = "partd" version = "1.2.0" @@ -2268,14 +2283,14 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2. [[package]] name = "pytest-cov" -version = "4.0.0" +version = "3.0.0" description = "Pytest plugin for measuring coverage." category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "pytest-cov-4.0.0.tar.gz", hash = "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470"}, - {file = "pytest_cov-4.0.0-py3-none-any.whl", hash = "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b"}, + {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, + {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, ] [package.dependencies] @@ -3019,4 +3034,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "b66b159eb704ec9ed5c49fbec70a4f8bed1c3eae80635aafb95c09f7b2c0455b" +content-hash = "a13e853a09285d3d58160ae08be07da2f7da18e0af92cf95cf46c90578e2fdb7" diff --git a/pyproject.toml b/pyproject.toml index b76cdee1f..0aefe089f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -105,7 +105,7 @@ pytest_cov = "^3.0.0" [tool.poetry.group.dev.dependencies] pytest = "^7.2.2" -pytest-cov = "^4.0.0" +parameterized = "^0.9.0" [build-system] build-backend = "poetry.core.masonry.api" From 09d17b619ec4dcfa2a7fdfe3b37748c95ef229f8 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 9 Apr 2023 22:24:56 -0300 Subject: [PATCH 032/265] Working simple tests, moving on --- br_denatran_frota/code/test/download_frota_test.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/br_denatran_frota/code/test/download_frota_test.py b/br_denatran_frota/code/test/download_frota_test.py index b7b971667..d718fb4b5 100644 --- a/br_denatran_frota/code/test/download_frota_test.py +++ b/br_denatran_frota/code/test/download_frota_test.py @@ -76,10 +76,11 @@ def test_make_dir_when_not_exists(self): class TestDownloadFrota(unittest.TestCase): def setUp(self): - self.temp_dir = tempfile.mkdtemp(dir=os.getcwd()) + self.temp_dir = tempfile.TemporaryDirectory() + print("im heir") def tearDown(self): - shutil.rmtree(self.temp_dir) + shutil.rmtree(self.temp_dir.name) @unittest.skip("demonstrating skipping") def test_download_frota_with_valid_month(self): @@ -96,17 +97,17 @@ def test_download_frota_with_invalid_month(self): download_frota(13, 2013) @parameterized.expand( - [(month, year) for year in range(2013, 2023) for month in range(1, 13)], + [(month, year) for year in range(2022, 2023) for month in range(1, 13)], name_func=custom_name_func, ) def test_download_post_2012(self, month, year): - download_frota(month, year, self.temp_dir) + download_frota(month, year, self.temp_dir.name) expected_files = { f"frota_por_uf_e_tipo_de_veículo_{month}-{year}.xls", f"frota_por_município_e_tipo_{month}-{year}.xls", } files = set( - os.listdir(os.path.join(DATASET, self.temp_dir, "files", f"{year}")) + os.listdir(os.path.join(DATASET, self.temp_dir.name, "files", f"{year}")) ) self.assertEqual(files, expected_files) From a0c631597f46a75ee568347acdc7002deb6b9c82 Mon Sep 17 00:00:00 2001 From: Tamir Date: Mon, 10 Apr 2023 21:02:14 -0300 Subject: [PATCH 033/265] The tests work!! --- .../code/test/download_frota_test.py | 20 +++++-------------- pytest.ini | 9 --------- 2 files changed, 5 insertions(+), 24 deletions(-) delete mode 100644 pytest.ini diff --git a/br_denatran_frota/code/test/download_frota_test.py b/br_denatran_frota/code/test/download_frota_test.py index d718fb4b5..272725349 100644 --- a/br_denatran_frota/code/test/download_frota_test.py +++ b/br_denatran_frota/code/test/download_frota_test.py @@ -77,21 +77,10 @@ def test_make_dir_when_not_exists(self): class TestDownloadFrota(unittest.TestCase): def setUp(self): self.temp_dir = tempfile.TemporaryDirectory() - print("im heir") def tearDown(self): shutil.rmtree(self.temp_dir.name) - @unittest.skip("demonstrating skipping") - def test_download_frota_with_valid_month(self): - download_frota(MONTHS["fevereiro"], 2013) - expected_files = { - "frota_de_veiculos_por_municipio_tipo_e_combustivel_2-2013.xlsx", - "frota_de_veiculos_por_uf_e_tipo_2-2013.xlsx", - } - files = set(os.listdir(os.path.join(self.temp_dir, DATASET, "files", "2013"))) - self.assertEqual(files, expected_files) - def test_download_frota_with_invalid_month(self): with self.assertRaises(ValueError): download_frota(13, 2013) @@ -103,12 +92,13 @@ def test_download_frota_with_invalid_month(self): def test_download_post_2012(self, month, year): download_frota(month, year, self.temp_dir.name) expected_files = { - f"frota_por_uf_e_tipo_de_veículo_{month}-{year}.xls", - f"frota_por_município_e_tipo_{month}-{year}.xls", + f"frota_por_uf_e_tipo_de_veículo_{month}-{year}", + f"frota_por_município_e_tipo_{month}-{year}", } - files = set( - os.listdir(os.path.join(DATASET, self.temp_dir.name, "files", f"{year}")) + list_of_files = os.listdir( + os.path.join(DATASET, self.temp_dir.name, "files", f"{year}") ) + files = set(os.path.splitext(file)[0] for file in list_of_files) self.assertEqual(files, expected_files) diff --git a/pytest.ini b/pytest.ini deleted file mode 100644 index 173ec65c1..000000000 --- a/pytest.ini +++ /dev/null @@ -1,9 +0,0 @@ -[pytest] -testpaths = - tests -norecursedirs=dist build .tox scripts -addopts = - --doctest-modules - --cov=pipelines - -r a - -v From f105cd29f47e624f442256dbc0b7fb9b1825c1e7 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 12 Apr 2023 03:11:44 -0300 Subject: [PATCH 034/265] hold the thought --- br_denatran_frota/code/download_frota.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index 144aa0a16..03f894692 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -36,6 +36,11 @@ def download_file(url, filename): print(f"Download of {filename} complete") +def extract_zip(dest_path_file): + with ZipFile(dest_path_file, "r") as z: + z.extractall(os.getcwd()) + + def handle_xl(i: dict) -> None: """Actually downloads and deals with Excel files. @@ -67,11 +72,15 @@ def make_filename(i: dict, ext: bool = True) -> str: return filename +def handle_compact(i): + print(2) + + def call_downloader(i): if i["filetype"] in ["xlsx", "xls"]: handle_xl(i) else: - raise ValueError("A função handle_compact tá bem esquisita por hora.") + handle_compact(i) def download_post_2012(month: int, year: int): From 92714e97c15ed82d5ad698b357443b3c1696dffd Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 16 Apr 2023 19:28:31 -0300 Subject: [PATCH 035/265] Tests handle directory change now --- br_denatran_frota/code/download_frota.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index 03f894692..bcf092dea 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -23,12 +23,16 @@ } DATASET = "br_denatran_frota" +headers = { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36" +} def download_file(url, filename): # Send a GET request to the URL - response = requests.get(url) + new_url = url.replace("arquivos-denatran", "arquivos-senatran") + response = requests.get(new_url, headers=headers) # Save the contents of the response to a file with open(filename, "wb") as f: f.write(response.content) @@ -77,10 +81,7 @@ def handle_compact(i): def call_downloader(i): - if i["filetype"] in ["xlsx", "xls"]: - handle_xl(i) - else: - handle_compact(i) + handle_xl(i) def download_post_2012(month: int, year: int): @@ -127,7 +128,7 @@ def make_dir_when_not_exists(dir_name: str): os.mkdir(dir_name) -def download_frota(month: int, year: int, temp_dir: str = None): +def download_frota(month: int, year: int, temp_dir: str = ""): """Função principal para baixar os dados de frota por município e tipo e também por UF e tipo. Args: From cc3d84bb83d3933ab73693378c0169f7a11f9d78 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 16 Apr 2023 19:28:53 -0300 Subject: [PATCH 036/265] And now we clean the broken URLs --- br_denatran_frota/code/test/download_frota_test.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/br_denatran_frota/code/test/download_frota_test.py b/br_denatran_frota/code/test/download_frota_test.py index 272725349..7991c3c57 100644 --- a/br_denatran_frota/code/test/download_frota_test.py +++ b/br_denatran_frota/code/test/download_frota_test.py @@ -76,9 +76,12 @@ def test_make_dir_when_not_exists(self): class TestDownloadFrota(unittest.TestCase): def setUp(self): - self.temp_dir = tempfile.TemporaryDirectory() + file_dir = os.path.dirname(os.path.abspath(__file__)) + os.chdir(file_dir) + self.temp_dir = tempfile.TemporaryDirectory(dir=file_dir) def tearDown(self): + print("Deleting temporary directory") shutil.rmtree(self.temp_dir.name) def test_download_frota_with_invalid_month(self): @@ -86,7 +89,7 @@ def test_download_frota_with_invalid_month(self): download_frota(13, 2013) @parameterized.expand( - [(month, year) for year in range(2022, 2023) for month in range(1, 13)], + [(month, year) for year in range(2021, 2022) for month in range(1, 4)], name_func=custom_name_func, ) def test_download_post_2012(self, month, year): From 673eb97e134521a9ec97451178f6258c17e8afca Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 18 Apr 2023 01:00:34 -0300 Subject: [PATCH 037/265] =?UTF-8?q?Agora=20j=C3=A1=20tratamos=20o=20zip=20?= =?UTF-8?q?direitinho?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- br_denatran_frota/code/download_frota.py | 9 +++++++-- br_denatran_frota/code/test/download_frota_test.py | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index bcf092dea..28952d0f6 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -42,7 +42,7 @@ def download_file(url, filename): def extract_zip(dest_path_file): with ZipFile(dest_path_file, "r") as z: - z.extractall(os.getcwd()) + z.extractall() def handle_xl(i: dict) -> None: @@ -81,7 +81,12 @@ def handle_compact(i): def call_downloader(i): - handle_xl(i) + filename = make_filename(i) + if i["filetype"] in ["xlsx", "xls"]: + download_file(i["href"], filename) + elif i["filetype"] == "zip": + download_file(i["href"], filename) + extract_zip(filename) def download_post_2012(month: int, year: int): diff --git a/br_denatran_frota/code/test/download_frota_test.py b/br_denatran_frota/code/test/download_frota_test.py index 7991c3c57..9972afb5b 100644 --- a/br_denatran_frota/code/test/download_frota_test.py +++ b/br_denatran_frota/code/test/download_frota_test.py @@ -89,7 +89,7 @@ def test_download_frota_with_invalid_month(self): download_frota(13, 2013) @parameterized.expand( - [(month, year) for year in range(2021, 2022) for month in range(1, 4)], + [(month, year) for year in range(2013, 2014) for month in range(1, 4)], name_func=custom_name_func, ) def test_download_post_2012(self, month, year): From 48fc127b3e0b92ac377022473c8f39e7186e7963 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 19 Apr 2023 04:09:36 -0300 Subject: [PATCH 038/265] Add packages (Polars and Excel readers) --- poetry.lock | 699 ++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 4 + 2 files changed, 702 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 33664c3d4..271795492 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,5 +1,35 @@ # This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. +[[package]] +name = "appnope" +version = "0.1.3" +description = "Disable App Nap on macOS >= 10.9" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] + +[[package]] +name = "asttokens" +version = "2.2.1" +description = "Annotate AST trees with source code positions" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, + {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, +] + +[package.dependencies] +six = "*" + +[package.extras] +test = ["astroid", "pytest"] + [[package]] name = "async-timeout" version = "4.0.2" @@ -31,6 +61,18 @@ docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib- tests = ["attrs[tests-no-zope]", "zope.interface"] tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] +[[package]] +name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] + [[package]] name = "basedosdados" version = "1.6.9" @@ -105,6 +147,83 @@ files = [ {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, ] +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + [[package]] name = "cfgv" version = "3.3.1" @@ -189,6 +308,26 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "comm" +version = "0.1.3" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "comm-0.1.3-py3-none-any.whl", hash = "sha256:16613c6211e20223f215fc6d3b266a247b6e2641bf4e0a3ad34cb1aff2aa3f37"}, + {file = "comm-0.1.3.tar.gz", hash = "sha256:a61efa9daffcfbe66fd643ba966f846a624e4e6d6767eda9cf6e993aadaab93e"}, +] + +[package.dependencies] +traitlets = ">=5.3" + +[package.extras] +lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] +test = ["pytest"] +typing = ["mypy (>=0.990)"] + [[package]] name = "contourpy" version = "1.0.7" @@ -419,6 +558,46 @@ files = [ [package.dependencies] requests = ">=2.26.0,<3.0.0" +[[package]] +name = "debugpy" +version = "1.6.7" +description = "An implementation of the Debug Adapter Protocol for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "debugpy-1.6.7-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b3e7ac809b991006ad7f857f016fa92014445085711ef111fdc3f74f66144096"}, + {file = "debugpy-1.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3876611d114a18aafef6383695dfc3f1217c98a9168c1aaf1a02b01ec7d8d1e"}, + {file = "debugpy-1.6.7-cp310-cp310-win32.whl", hash = "sha256:33edb4afa85c098c24cc361d72ba7c21bb92f501104514d4ffec1fb36e09c01a"}, + {file = "debugpy-1.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:ed6d5413474e209ba50b1a75b2d9eecf64d41e6e4501977991cdc755dc83ab0f"}, + {file = "debugpy-1.6.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:38ed626353e7c63f4b11efad659be04c23de2b0d15efff77b60e4740ea685d07"}, + {file = "debugpy-1.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279d64c408c60431c8ee832dfd9ace7c396984fd7341fa3116aee414e7dcd88d"}, + {file = "debugpy-1.6.7-cp37-cp37m-win32.whl", hash = "sha256:dbe04e7568aa69361a5b4c47b4493d5680bfa3a911d1e105fbea1b1f23f3eb45"}, + {file = "debugpy-1.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f90a2d4ad9a035cee7331c06a4cf2245e38bd7c89554fe3b616d90ab8aab89cc"}, + {file = "debugpy-1.6.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5224eabbbeddcf1943d4e2821876f3e5d7d383f27390b82da5d9558fd4eb30a9"}, + {file = "debugpy-1.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae1123dff5bfe548ba1683eb972329ba6d646c3a80e6b4c06cd1b1dd0205e9b"}, + {file = "debugpy-1.6.7-cp38-cp38-win32.whl", hash = "sha256:9cd10cf338e0907fdcf9eac9087faa30f150ef5445af5a545d307055141dd7a4"}, + {file = "debugpy-1.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:aaf6da50377ff4056c8ed470da24632b42e4087bc826845daad7af211e00faad"}, + {file = "debugpy-1.6.7-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0679b7e1e3523bd7d7869447ec67b59728675aadfc038550a63a362b63029d2c"}, + {file = "debugpy-1.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de86029696e1b3b4d0d49076b9eba606c226e33ae312a57a46dca14ff370894d"}, + {file = "debugpy-1.6.7-cp39-cp39-win32.whl", hash = "sha256:d71b31117779d9a90b745720c0eab54ae1da76d5b38c8026c654f4a066b0130a"}, + {file = "debugpy-1.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:c0ff93ae90a03b06d85b2c529eca51ab15457868a377c4cc40a23ab0e4e552a3"}, + {file = "debugpy-1.6.7-py2.py3-none-any.whl", hash = "sha256:53f7a456bc50706a0eaabecf2d3ce44c4d5010e46dfc65b6b81a518b42866267"}, + {file = "debugpy-1.6.7.zip", hash = "sha256:c4c2f0810fa25323abfdfa36cbbbb24e5c3b1a42cb762782de64439c575d67f2"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + [[package]] name = "dill" version = "0.3.6" @@ -505,6 +684,18 @@ files = [ {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, ] +[[package]] +name = "entrypoints" +version = "0.4" +description = "Discover and load entry points from installed packages." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, + {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, +] + [[package]] name = "exceptiongroup" version = "1.1.1" @@ -520,6 +711,21 @@ files = [ [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "executing" +version = "1.2.0" +description = "Get the currently executing AST node of a frame, and other information" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, + {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, +] + +[package.extras] +tests = ["asttokens", "littleutils", "pytest", "rich"] + [[package]] name = "fastavro" version = "1.5.4" @@ -1138,6 +1344,100 @@ files = [ pandas = "*" requests = "*" +[[package]] +name = "ipykernel" +version = "6.22.0" +description = "IPython Kernel for Jupyter" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.22.0-py3-none-any.whl", hash = "sha256:1ae6047c1277508933078163721bbb479c3e7292778a04b4bacf0874550977d6"}, + {file = "ipykernel-6.22.0.tar.gz", hash = "sha256:302558b81f1bc22dc259fb2a0c5c7cf2f4c0bdb21b50484348f7bafe7fb71421"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=20" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.12.0" +description = "IPython: Productive Interactive Computing" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipython-8.12.0-py3-none-any.whl", hash = "sha256:1c183bf61b148b00bcebfa5d9b39312733ae97f6dad90d7e9b4d86c8647f498c"}, + {file = "ipython-8.12.0.tar.gz", hash = "sha256:a950236df04ad75b5bc7f816f9af3d74dc118fd42f2ff7e80e8e60ca1f182e2d"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +backcall = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +pickleshare = "*" +prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] + +[[package]] +name = "jedi" +version = "0.18.2" +description = "An autocompletion tool for Python that can be used for text editors." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, + {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, +] + +[package.dependencies] +parso = ">=0.8.0,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + [[package]] name = "jinja2" version = "3.0.3" @@ -1156,6 +1456,52 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jupyter-client" +version = "7.3.4" +description = "Jupyter protocol implementation and client libraries" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyter_client-7.3.4-py3-none-any.whl", hash = "sha256:17d74b0d0a7b24f1c8c527b24fcf4607c56bee542ffe8e3418e50b21e514b621"}, + {file = "jupyter_client-7.3.4.tar.gz", hash = "sha256:aa9a6c32054b290374f95f73bb0cae91455c58dfb84f65c8591912b8f65e6d56"}, +] + +[package.dependencies] +entrypoints = "*" +jupyter-core = ">=4.9.2" +nest-asyncio = ">=1.5.4" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.0" +traitlets = "*" + +[package.extras] +doc = ["ipykernel", "myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] +test = ["codecov", "coverage", "ipykernel (>=6.5)", "ipython", "mypy", "pre-commit", "pytest", "pytest-asyncio (>=0.18)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.2.0" +description = "Jupyter core package. A base package on which Jupyter projects rely." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.2.0-py3-none-any.whl", hash = "sha256:4bdc2928c37f6917130c667d8b8708f20aee539d8283c6be72aabd2a4b4c83b0"}, + {file = "jupyter_core-5.2.0.tar.gz", hash = "sha256:1407cdb4c79ee467696c04b76633fc1884015fa109323365a6372c8e890cc83f"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] + [[package]] name = "kiwisolver" version = "1.4.4" @@ -1445,6 +1791,21 @@ pillow = ">=6.2.0" pyparsing = ">=2.3.1" python-dateutil = ">=2.7" +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +description = "Inline Matplotlib backend for Jupyter" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] + +[package.dependencies] +traitlets = "*" + [[package]] name = "msgpack" version = "1.0.3" @@ -1501,6 +1862,18 @@ files = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] +[[package]] +name = "nest-asyncio" +version = "1.5.6" +description = "Patch asyncio to allow nested event loops" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, + {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, +] + [[package]] name = "nodeenv" version = "1.7.0" @@ -1718,6 +2091,22 @@ files = [ [package.extras] dev = ["jinja2"] +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + [[package]] name = "partd" version = "1.2.0" @@ -1772,6 +2161,33 @@ files = [ python-dateutil = ">=2.6,<3.0" pytzdata = ">=2020.1" +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] + [[package]] name = "pillow" version = "9.5.0" @@ -1884,6 +2300,39 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "polars" +version = "0.17.5" +description = "Blazingly fast DataFrame library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "polars-0.17.5-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:3ec088bb68c2b833f1172b85dc1222ae88732ce0ae7de34590dd387204a84b1b"}, + {file = "polars-0.17.5-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:1f5389d29d5e5e993a9a361801d54dccd0399cedb72632274b341e27957c631c"}, + {file = "polars-0.17.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4518d2a70bf69eaae04437a241f6d81f2d576e4491d8d4b45c95eacb53415616"}, + {file = "polars-0.17.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fbe7dc6be495d1805f8252bc6bcfb0372134595bea0ebf7c46db21bad86bf58"}, + {file = "polars-0.17.5-cp37-abi3-win_amd64.whl", hash = "sha256:7f112d6cefb37a32fc723195f0be1f62ec528b5f83905ad2e614bc78585a0313"}, + {file = "polars-0.17.5.tar.gz", hash = "sha256:7db2da068e983312238799ad8263e80544151304aac0bc2e6511f91cb56af54d"}, +] + +[package.dependencies] +typing_extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +all = ["polars[connectorx,deltalake,fsspec,matplotlib,numpy,pandas,pyarrow,sqlalchemy,timezone,xlsx2csv,xlsxwriter]"] +connectorx = ["connectorx"] +deltalake = ["deltalake (>=0.8.0)"] +fsspec = ["fsspec"] +matplotlib = ["matplotlib"] +numpy = ["numpy (>=1.16.0)"] +pandas = ["pandas", "pyarrow (>=7.0.0)"] +pyarrow = ["pyarrow (>=7.0.0)"] +sqlalchemy = ["pandas", "sqlalchemy"] +timezone = ["backports.zoneinfo", "tzdata"] +xlsx2csv = ["xlsx2csv (>=0.8.0)"] +xlsxwriter = ["xlsxwriter"] + [[package]] name = "pre-commit" version = "2.21.0" @@ -1980,6 +2429,21 @@ twitter = ["tweepy (>=3.5,<4.0)"] vault = ["hvac (>=0.10)"] viz = ["graphviz (>=0.8.3)"] +[[package]] +name = "prompt-toolkit" +version = "3.0.38" +description = "Library for building powerful interactive command lines in Python" +category = "dev" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f"}, + {file = "prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b"}, +] + +[package.dependencies] +wcwidth = "*" + [[package]] name = "proto-plus" version = "1.19.8" @@ -2073,6 +2537,33 @@ files = [ [package.extras] test = ["enum34", "ipaddress", "mock", "pywin32", "unittest2", "wmi"] +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + [[package]] name = "pyaml" version = "20.4.0" @@ -2164,6 +2655,18 @@ files = [ [package.dependencies] pyasn1 = ">=0.4.6,<0.5.0" +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + [[package]] name = "pydata-google-auth" version = "1.2.0" @@ -2181,6 +2684,21 @@ google-auth = "*" google-auth-oauthlib = "*" setuptools = "*" +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + [[package]] name = "pymssql" version = "2.2.5" @@ -2449,6 +2967,96 @@ files = [ {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] +[[package]] +name = "pyzmq" +version = "25.0.2" +description = "Python bindings for 0MQ" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyzmq-25.0.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ac178e666c097c8d3deb5097b58cd1316092fc43e8ef5b5fdb259b51da7e7315"}, + {file = "pyzmq-25.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:659e62e1cbb063151c52f5b01a38e1df6b54feccfa3e2509d44c35ca6d7962ee"}, + {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8280ada89010735a12b968ec3ea9a468ac2e04fddcc1cede59cb7f5178783b9c"}, + {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9b5eeb5278a8a636bb0abdd9ff5076bcbb836cd2302565df53ff1fa7d106d54"}, + {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a2e5fe42dfe6b73ca120b97ac9f34bfa8414feb15e00e37415dbd51cf227ef6"}, + {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:827bf60e749e78acb408a6c5af6688efbc9993e44ecc792b036ec2f4b4acf485"}, + {file = "pyzmq-25.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7b504ae43d37e282301da586529e2ded8b36d4ee2cd5e6db4386724ddeaa6bbc"}, + {file = "pyzmq-25.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb1f69a0a2a2b1aae8412979dd6293cc6bcddd4439bf07e4758d864ddb112354"}, + {file = "pyzmq-25.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b9c9cc965cdf28381e36da525dcb89fc1571d9c54800fdcd73e3f73a2fc29bd"}, + {file = "pyzmq-25.0.2-cp310-cp310-win32.whl", hash = "sha256:24abbfdbb75ac5039205e72d6c75f10fc39d925f2df8ff21ebc74179488ebfca"}, + {file = "pyzmq-25.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6a821a506822fac55d2df2085a52530f68ab15ceed12d63539adc32bd4410f6e"}, + {file = "pyzmq-25.0.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:9af0bb0277e92f41af35e991c242c9c71920169d6aa53ade7e444f338f4c8128"}, + {file = "pyzmq-25.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:54a96cf77684a3a537b76acfa7237b1e79a8f8d14e7f00e0171a94b346c5293e"}, + {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88649b19ede1cab03b96b66c364cbbf17c953615cdbc844f7f6e5f14c5e5261c"}, + {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:715cff7644a80a7795953c11b067a75f16eb9fc695a5a53316891ebee7f3c9d5"}, + {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:312b3f0f066b4f1d17383aae509bacf833ccaf591184a1f3c7a1661c085063ae"}, + {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d488c5c8630f7e782e800869f82744c3aca4aca62c63232e5d8c490d3d66956a"}, + {file = "pyzmq-25.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:38d9f78d69bcdeec0c11e0feb3bc70f36f9b8c44fc06e5d06d91dc0a21b453c7"}, + {file = "pyzmq-25.0.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3059a6a534c910e1d5d068df42f60d434f79e6cc6285aa469b384fa921f78cf8"}, + {file = "pyzmq-25.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6526d097b75192f228c09d48420854d53dfbc7abbb41b0e26f363ccb26fbc177"}, + {file = "pyzmq-25.0.2-cp311-cp311-win32.whl", hash = "sha256:5c5fbb229e40a89a2fe73d0c1181916f31e30f253cb2d6d91bea7927c2e18413"}, + {file = "pyzmq-25.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:ed15e3a2c3c2398e6ae5ce86d6a31b452dfd6ad4cd5d312596b30929c4b6e182"}, + {file = "pyzmq-25.0.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:032f5c8483c85bf9c9ca0593a11c7c749d734ce68d435e38c3f72e759b98b3c9"}, + {file = "pyzmq-25.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:374b55516393bfd4d7a7daa6c3b36d6dd6a31ff9d2adad0838cd6a203125e714"}, + {file = "pyzmq-25.0.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:08bfcc21b5997a9be4fefa405341320d8e7f19b4d684fb9c0580255c5bd6d695"}, + {file = "pyzmq-25.0.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1a843d26a8da1b752c74bc019c7b20e6791ee813cd6877449e6a1415589d22ff"}, + {file = "pyzmq-25.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b48616a09d7df9dbae2f45a0256eee7b794b903ddc6d8657a9948669b345f220"}, + {file = "pyzmq-25.0.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d4427b4a136e3b7f85516c76dd2e0756c22eec4026afb76ca1397152b0ca8145"}, + {file = "pyzmq-25.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:26b0358e8933990502f4513c991c9935b6c06af01787a36d133b7c39b1df37fa"}, + {file = "pyzmq-25.0.2-cp36-cp36m-win32.whl", hash = "sha256:c8fedc3ccd62c6b77dfe6f43802057a803a411ee96f14e946f4a76ec4ed0e117"}, + {file = "pyzmq-25.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:2da6813b7995b6b1d1307329c73d3e3be2fd2d78e19acfc4eff2e27262732388"}, + {file = "pyzmq-25.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a35960c8b2f63e4ef67fd6731851030df68e4b617a6715dd11b4b10312d19fef"}, + {file = "pyzmq-25.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eef2a0b880ab40aca5a878933376cb6c1ec483fba72f7f34e015c0f675c90b20"}, + {file = "pyzmq-25.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:85762712b74c7bd18e340c3639d1bf2f23735a998d63f46bb6584d904b5e401d"}, + {file = "pyzmq-25.0.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:64812f29d6eee565e129ca14b0c785744bfff679a4727137484101b34602d1a7"}, + {file = "pyzmq-25.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:510d8e55b3a7cd13f8d3e9121edf0a8730b87d925d25298bace29a7e7bc82810"}, + {file = "pyzmq-25.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b164cc3c8acb3d102e311f2eb6f3c305865ecb377e56adc015cb51f721f1dda6"}, + {file = "pyzmq-25.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:28fdb9224a258134784a9cf009b59265a9dde79582fb750d4e88a6bcbc6fa3dc"}, + {file = "pyzmq-25.0.2-cp37-cp37m-win32.whl", hash = "sha256:dd771a440effa1c36d3523bc6ba4e54ff5d2e54b4adcc1e060d8f3ca3721d228"}, + {file = "pyzmq-25.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:9bdc40efb679b9dcc39c06d25629e55581e4c4f7870a5e88db4f1c51ce25e20d"}, + {file = "pyzmq-25.0.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:1f82906a2d8e4ee310f30487b165e7cc8ed09c009e4502da67178b03083c4ce0"}, + {file = "pyzmq-25.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:21ec0bf4831988af43c8d66ba3ccd81af2c5e793e1bf6790eb2d50e27b3c570a"}, + {file = "pyzmq-25.0.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbce982a17c88d2312ec2cf7673985d444f1beaac6e8189424e0a0e0448dbb3"}, + {file = "pyzmq-25.0.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e1d2f2d86fc75ed7f8845a992c5f6f1ab5db99747fb0d78b5e4046d041164d2"}, + {file = "pyzmq-25.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e92ff20ad5d13266bc999a29ed29a3b5b101c21fdf4b2cf420c09db9fb690e"}, + {file = "pyzmq-25.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edbbf06cc2719889470a8d2bf5072bb00f423e12de0eb9ffec946c2c9748e149"}, + {file = "pyzmq-25.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77942243ff4d14d90c11b2afd8ee6c039b45a0be4e53fb6fa7f5e4fd0b59da39"}, + {file = "pyzmq-25.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ab046e9cb902d1f62c9cc0eca055b1d11108bdc271caf7c2171487298f229b56"}, + {file = "pyzmq-25.0.2-cp38-cp38-win32.whl", hash = "sha256:ad761cfbe477236802a7ab2c080d268c95e784fe30cafa7e055aacd1ca877eb0"}, + {file = "pyzmq-25.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8560756318ec7c4c49d2c341012167e704b5a46d9034905853c3d1ade4f55bee"}, + {file = "pyzmq-25.0.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:ab2c056ac503f25a63f6c8c6771373e2a711b98b304614151dfb552d3d6c81f6"}, + {file = "pyzmq-25.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cca8524b61c0eaaa3505382dc9b9a3bc8165f1d6c010fdd1452c224225a26689"}, + {file = "pyzmq-25.0.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cfb9f7eae02d3ac42fbedad30006b7407c984a0eb4189a1322241a20944d61e5"}, + {file = "pyzmq-25.0.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5eaeae038c68748082137d6896d5c4db7927e9349237ded08ee1bbd94f7361c9"}, + {file = "pyzmq-25.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a31992a8f8d51663ebf79df0df6a04ffb905063083d682d4380ab8d2c67257c"}, + {file = "pyzmq-25.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6a979e59d2184a0c8f2ede4b0810cbdd86b64d99d9cc8a023929e40dce7c86cc"}, + {file = "pyzmq-25.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1f124cb73f1aa6654d31b183810febc8505fd0c597afa127c4f40076be4574e0"}, + {file = "pyzmq-25.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:65c19a63b4a83ae45d62178b70223adeee5f12f3032726b897431b6553aa25af"}, + {file = "pyzmq-25.0.2-cp39-cp39-win32.whl", hash = "sha256:83d822e8687621bed87404afc1c03d83fa2ce39733d54c2fd52d8829edb8a7ff"}, + {file = "pyzmq-25.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:24683285cc6b7bf18ad37d75b9db0e0fefe58404e7001f1d82bf9e721806daa7"}, + {file = "pyzmq-25.0.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a4b4261eb8f9ed71f63b9eb0198dd7c934aa3b3972dac586d0ef502ba9ab08b"}, + {file = "pyzmq-25.0.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:62ec8d979f56c0053a92b2b6a10ff54b9ec8a4f187db2b6ec31ee3dd6d3ca6e2"}, + {file = "pyzmq-25.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:affec1470351178e892121b3414c8ef7803269f207bf9bef85f9a6dd11cde264"}, + {file = "pyzmq-25.0.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffc71111433bd6ec8607a37b9211f4ef42e3d3b271c6d76c813669834764b248"}, + {file = "pyzmq-25.0.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6fadc60970714d86eff27821f8fb01f8328dd36bebd496b0564a500fe4a9e354"}, + {file = "pyzmq-25.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:269968f2a76c0513490aeb3ba0dc3c77b7c7a11daa894f9d1da88d4a0db09835"}, + {file = "pyzmq-25.0.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f7c8b8368e84381ae7c57f1f5283b029c888504aaf4949c32e6e6fb256ec9bf0"}, + {file = "pyzmq-25.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25e6873a70ad5aa31e4a7c41e5e8c709296edef4a92313e1cd5fc87bbd1874e2"}, + {file = "pyzmq-25.0.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b733076ff46e7db5504c5e7284f04a9852c63214c74688bdb6135808531755a3"}, + {file = "pyzmq-25.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a6f6ae12478fdc26a6d5fdb21f806b08fa5403cd02fd312e4cb5f72df078f96f"}, + {file = "pyzmq-25.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:67da1c213fbd208906ab3470cfff1ee0048838365135a9bddc7b40b11e6d6c89"}, + {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531e36d9fcd66f18de27434a25b51d137eb546931033f392e85674c7a7cea853"}, + {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34a6fddd159ff38aa9497b2e342a559f142ab365576284bc8f77cb3ead1f79c5"}, + {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b491998ef886662c1f3d49ea2198055a9a536ddf7430b051b21054f2a5831800"}, + {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5d496815074e3e3d183fe2c7fcea2109ad67b74084c254481f87b64e04e9a471"}, + {file = "pyzmq-25.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:56a94ab1d12af982b55ca96c6853db6ac85505e820d9458ac76364c1998972f4"}, + {file = "pyzmq-25.0.2.tar.gz", hash = "sha256:6b8c1bbb70e868dc88801aa532cae6bd4e3b5233784692b786f17ad2962e5149"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + [[package]] name = "rarfile" version = "4.0" @@ -2721,6 +3329,26 @@ files = [ {file = "soupsieve-2.4.tar.gz", hash = "sha256:e28dba9ca6c7c00173e34e4ba57448f0688bb681b7c5e8bf4971daafc093d69a"}, ] +[[package]] +name = "stack-data" +version = "0.6.2" +description = "Extract data from python stack frames and tracebacks for informative displays" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, + {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + [[package]] name = "tabulate" version = "0.8.9" @@ -2874,6 +3502,22 @@ files = [ [package.extras] dev = ["argopt", "py-make (>=0.1.0)", "pydoc-markdown", "twine"] +[[package]] +name = "traitlets" +version = "5.9.0" +description = "Traitlets Python configuration system" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, + {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] + [[package]] name = "tweepy" version = "4.4.0" @@ -2896,6 +3540,18 @@ dev = ["coveralls (>=2.1.0)", "tox (>=3.14.0)"] socks = ["requests[socks] (>=2.11.1,<3)"] test = ["vcrpy (>=1.10.3)"] +[[package]] +name = "typing-extensions" +version = "4.5.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, + {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, +] + [[package]] name = "unidecode" version = "1.3.6" @@ -2958,6 +3614,18 @@ platformdirs = ">=2.4,<4" docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23)", "pytest (>=7.2.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"] +[[package]] +name = "wcwidth" +version = "0.2.6" +description = "Measures the displayed width of unicode strings in a terminal" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, + {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, +] + [[package]] name = "websocket-client" version = "1.2.1" @@ -3000,6 +3668,35 @@ files = [ [package.extras] dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] +[[package]] +name = "xlrd" +version = "2.0.1" +description = "Library for developers to extract data from Microsoft Excel (tm) .xls spreadsheet files" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "xlrd-2.0.1-py2.py3-none-any.whl", hash = "sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd"}, + {file = "xlrd-2.0.1.tar.gz", hash = "sha256:f72f148f54442c6b056bf931dbc34f986fd0c3b0b6b5a58d013c9aef274d0c88"}, +] + +[package.extras] +build = ["twine", "wheel"] +docs = ["sphinx"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "xlsx2csv" +version = "0.8.1" +description = "xlsx to csv converter" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "xlsx2csv-0.8.1-py3-none-any.whl", hash = "sha256:6c36c0295d64f231570479e514d6163ce135af3c431a1705b073230bedaef9f2"}, + {file = "xlsx2csv-0.8.1.tar.gz", hash = "sha256:7ecd6d2bc2426f2e432f4fdac12211e1976d3cbb65f9033e1eda65edda2045e3"}, +] + [[package]] name = "zict" version = "2.0.0" @@ -3034,4 +3731,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "a13e853a09285d3d58160ae08be07da2f7da18e0af92cf95cf46c90578e2fdb7" +content-hash = "a06307115a26fddb569266cf3c030d7aad2fe2318ab9ce079581ffbc48e861bb" diff --git a/pyproject.toml b/pyproject.toml index 0aefe089f..b1ea4270f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -99,6 +99,9 @@ oauth2client = "^4.1.3" redis-pal = "^1.0.0" rarfile = "^4.0" setuptools = "^67.6.1" +polars = "^0.17.5" +xlsx2csv = "^0.8.1" +xlrd = "^2.0.1" [tool.poetry.dev-dependencies] pytest_cov = "^3.0.0" @@ -106,6 +109,7 @@ pytest_cov = "^3.0.0" [tool.poetry.group.dev.dependencies] pytest = "^7.2.2" parameterized = "^0.9.0" +ipykernel = "^6.22.0" [build-system] build-backend = "poetry.core.masonry.api" From b7b2db4a9fc51dd027b6a29fa3e60109e854f8af Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 19 Apr 2023 04:10:10 -0300 Subject: [PATCH 039/265] Create utility functions for processing files --- br_denatran_frota/code/utils.py | 60 +++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 br_denatran_frota/code/utils.py diff --git a/br_denatran_frota/code/utils.py b/br_denatran_frota/code/utils.py new file mode 100644 index 000000000..572cfd331 --- /dev/null +++ b/br_denatran_frota/code/utils.py @@ -0,0 +1,60 @@ +import pandas as pd +import re + +DICT_UFS = { + "AC": "Acre", + "AL": "Alagoas", + "AP": "Amapá", + "AM": "Amazonas", + "BA": "Bahia", + "CE": "Ceará", + "DF": "Distrito Federal", + "ES": "Espírito Santo", + "GO": "Goiás", + "MA": "Maranhão", + "MT": "Mato Grosso", + "MS": "Mato Grosso do Sul", + "MG": "Minas Gerais", + "PA": "Pará", + "PB": "Paraíba", + "PR": "Paraná", + "PE": "Pernambuco", + "PI": "Piauí", + "RJ": "Rio de Janeiro", + "RN": "Rio Grande do Norte", + "RS": "Rio Grande do Sul", + "RO": "Rondônia", + "RR": "Roraima", + "SC": "Santa Catarina", + "SP": "São Paulo", + "SE": "Sergipe", + "TO": "Tocantins", +} + + +def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int: + header_guess = 0 + while header_guess < max_header_guess: + # Iffy logic, but essentially: if all rows of the column are strings, then this is a good candidate for a header. + if all(df.iloc[header_guess].apply(lambda x: isinstance(x, str))): + return header_guess + + header_guess += 1 + return 0 # If nothing is ever found until the max, let's just assume it's the first row as per usual. + + +def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame: + new_header = df.iloc[header_row] + new_df = df[(header_row + 1) :].reset_index(drop=True) + new_df.rename(columns=new_header, inplace=True) + return new_df + + +def get_year_month_from_filename(filename: str) -> tuple[int, int]: + match = re.search(r"(\w+)_(\d{1,2})-(\d{4})\.(xls|xlsx)$", filename) + if match: + month = match.group(2) + year = match.group(3) + return month, year + else: + raise ValueError("No match found") From 47c6c976fae4ba1f79192b54fa7a25005b147dfa Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 19 Apr 2023 04:10:40 -0300 Subject: [PATCH 040/265] Notebook to demonstrate data cleaning --- br_denatran_frota/code/test_drive.ipynb | 229 ++++++++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 br_denatran_frota/code/test_drive.ipynb diff --git a/br_denatran_frota/code/test_drive.ipynb b/br_denatran_frota/code/test_drive.ipynb new file mode 100644 index 000000000..c2ff1c992 --- /dev/null +++ b/br_denatran_frota/code/test_drive.ipynb @@ -0,0 +1,229 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "import polars as pl\n", + "import pandas as pd \n", + "import os\n", + "import re\n", + "import glob\n", + "from urllib.request import urlopen, urlretrieve\n", + "from zipfile import ZipFile\n", + "from rarfile import RarFile\n", + "from bs4 import BeautifulSoup\n", + "import requests" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [], + "source": [ + "file = '../files/2022/frota_por_uf_e_tipo_de_veículo_2-2022.xls'\n", + "filename = os.path.split(file)[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_excel(file)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int:\n", + " header_guess = 0\n", + " while header_guess < max_header_guess:\n", + " # Iffy logic, but essentially: if all rows of the column are strings, then this is a good candidate for a header.\n", + " if all(df.iloc[header_guess].apply(lambda x: isinstance(x, str))):\n", + " return header_guess\n", + " \n", + " header_guess += 1\n", + " return 0 # If nothing is ever found until the max, let's just assume it's the first row as per usual. \n", + "\n", + "def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame:\n", + " new_header = df.iloc[header_row]\n", + " new_df = df[(header_row+1):].reset_index(drop=True)\n", + " new_df.rename(columns=new_header, inplace=True)\n", + " return new_df\n", + "\n", + "def get_year_month_from_filename(filename: str) -> tuple[int, int]:\n", + " match = re.search(r\"(\\w+)_(\\d{1,2})-(\\d{4})\\.(xls|xlsx)$\"\n", + "\n", + ", filename)\n", + "\n", + " if match:\n", + " month = match.group(2)\n", + " year = match.group(3)\n", + " return month, year\n", + " else:\n", + " raise ValueError(\"No match found\")" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [], + "source": [ + "DICT_UFS = {\n", + " \"AC\": \"Acre\",\n", + " \"AL\": \"Alagoas\",\n", + " \"AP\": \"Amapá\",\n", + " \"AM\": \"Amazonas\",\n", + " \"BA\": \"Bahia\",\n", + " \"CE\": \"Ceará\",\n", + " \"DF\": \"Distrito Federal\",\n", + " \"ES\": \"Espírito Santo\",\n", + " \"GO\": \"Goiás\",\n", + " \"MA\": \"Maranhão\",\n", + " \"MT\": \"Mato Grosso\",\n", + " \"MS\": \"Mato Grosso do Sul\",\n", + " \"MG\": \"Minas Gerais\",\n", + " \"PA\": \"Pará\",\n", + " \"PB\": \"Paraíba\",\n", + " \"PR\": \"Paraná\",\n", + " \"PE\": \"Pernambuco\",\n", + " \"PI\": \"Piauí\",\n", + " \"RJ\": \"Rio de Janeiro\",\n", + " \"RN\": \"Rio Grande do Norte\",\n", + " \"RS\": \"Rio Grande do Sul\",\n", + " \"RO\": \"Rondônia\",\n", + " \"RR\": \"Roraima\",\n", + " \"SC\": \"Santa Catarina\",\n", + " \"SP\": \"São Paulo\",\n", + " \"SE\": \"Sergipe\",\n", + " \"TO\": \"Tocantins\",\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "new_df = change_df_header(df, guess_header(df))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tratamento ad hoc necessário\n" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [], + "source": [ + "new_df.rename(columns={ new_df.columns[0]: \"sigla_uf\" }, inplace= True) # Rename for ease of use.\n", + "new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace.\n", + "clean_df = new_df[new_df.sigla_uf.isin(DICT_UFS.values())].reset_index(drop = True) # Now we get all the actual RELEVANT uf data.\n", + "month, year = get_year_month_from_filename(filename)" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "metadata": {}, + "outputs": [], + "source": [ + "clean_pl_df = pl.from_pandas(clean_df).lazy()\n", + "# Add year and month\n", + "clean_pl_df = clean_pl_df.with_columns(pl.lit(year, dtype = pl.Int64).alias('ano'), pl.lit(month, dtype = pl.Int64).alias('mes'))" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": {}, + "outputs": [], + "source": [ + "long_pl_df = clean_pl_df.melt(id_vars = ['ano', 'mes', 'sigla_uf'], variable_name= 'tipo_veiculo', value_name= 'quantidade') # Long format." + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "shape: (594, 5)
anomessigla_uftipo_veiculoquantidade
i64i64strstri64
20222"Acre""TOTAL"321989
20222"Amapá""TOTAL"225303
20222"Amazonas""TOTAL"1020046
20222"Pará""TOTAL"2367668
20222"Rondônia""TOTAL"1118903
20222"Roraima""TOTAL"252315
20222"Tocantins""TOTAL"796159
20222"Alagoas""TOTAL"988002
20222"Bahia""TOTAL"4720073
20222"Ceará""TOTAL"3529429
20222"Maranhão""TOTAL"1950201
20222"Paraíba""TOTAL"1477707
20222"Sergipe""UTILITÁRIO"7459
20222"Espírito Santo…"UTILITÁRIO"29102
20222"Minas Gerais""UTILITÁRIO"116020
20222"Rio de Janeiro…"UTILITÁRIO"88531
20222"São Paulo""UTILITÁRIO"410642
20222"Paraná""UTILITÁRIO"93204
20222"Rio Grande do …"UTILITÁRIO"93702
20222"Santa Catarina…"UTILITÁRIO"105113
20222"Distrito Feder…"UTILITÁRIO"39414
20222"Goiás""UTILITÁRIO"43899
20222"Mato Grosso""UTILITÁRIO"24451
20222"Mato Grosso do…"UTILITÁRIO"19279
" + ], + "text/plain": [ + "shape: (594, 5)\n", + "┌──────┬─────┬────────────────────┬──────────────┬────────────┐\n", + "│ ano ┆ mes ┆ sigla_uf ┆ tipo_veiculo ┆ quantidade │\n", + "│ --- ┆ --- ┆ --- ┆ --- ┆ --- │\n", + "│ i64 ┆ i64 ┆ str ┆ str ┆ i64 │\n", + "╞══════╪═════╪════════════════════╪══════════════╪════════════╡\n", + "│ 2022 ┆ 2 ┆ Acre ┆ TOTAL ┆ 321989 │\n", + "│ 2022 ┆ 2 ┆ Amapá ┆ TOTAL ┆ 225303 │\n", + "│ 2022 ┆ 2 ┆ Amazonas ┆ TOTAL ┆ 1020046 │\n", + "│ 2022 ┆ 2 ┆ Pará ┆ TOTAL ┆ 2367668 │\n", + "│ … ┆ … ┆ … ┆ … ┆ … │\n", + "│ 2022 ┆ 2 ┆ Distrito Federal ┆ UTILITÁRIO ┆ 39414 │\n", + "│ 2022 ┆ 2 ┆ Goiás ┆ UTILITÁRIO ┆ 43899 │\n", + "│ 2022 ┆ 2 ┆ Mato Grosso ┆ UTILITÁRIO ┆ 24451 │\n", + "│ 2022 ┆ 2 ┆ Mato Grosso do Sul ┆ UTILITÁRIO ┆ 19279 │\n", + "└──────┴─────┴────────────────────┴──────────────┴────────────┘" + ] + }, + "execution_count": 129, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "long_pl_df.collect()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pipelines-Fyk5jlG0-py3.10", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.6" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} From a854ccdc0d5bcb6dfd43d163fd4a13a74e5025f0 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 19 Apr 2023 04:23:53 -0300 Subject: [PATCH 041/265] Cleaning works for uf tipo --- br_denatran_frota/code/test_drive.ipynb | 202 ++++++++++-------------- 1 file changed, 86 insertions(+), 116 deletions(-) diff --git a/br_denatran_frota/code/test_drive.ipynb b/br_denatran_frota/code/test_drive.ipynb index c2ff1c992..576cd333a 100644 --- a/br_denatran_frota/code/test_drive.ipynb +++ b/br_denatran_frota/code/test_drive.ipynb @@ -15,70 +15,7 @@ "from zipfile import ZipFile\n", "from rarfile import RarFile\n", "from bs4 import BeautifulSoup\n", - "import requests" - ] - }, - { - "cell_type": "code", - "execution_count": 87, - "metadata": {}, - "outputs": [], - "source": [ - "file = '../files/2022/frota_por_uf_e_tipo_de_veículo_2-2022.xls'\n", - "filename = os.path.split(file)[1]" - ] - }, - { - "cell_type": "code", - "execution_count": 101, - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.read_excel(file)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 104, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int:\n", - " header_guess = 0\n", - " while header_guess < max_header_guess:\n", - " # Iffy logic, but essentially: if all rows of the column are strings, then this is a good candidate for a header.\n", - " if all(df.iloc[header_guess].apply(lambda x: isinstance(x, str))):\n", - " return header_guess\n", - " \n", - " header_guess += 1\n", - " return 0 # If nothing is ever found until the max, let's just assume it's the first row as per usual. \n", - "\n", - "def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame:\n", - " new_header = df.iloc[header_row]\n", - " new_df = df[(header_row+1):].reset_index(drop=True)\n", - " new_df.rename(columns=new_header, inplace=True)\n", - " return new_df\n", - "\n", - "def get_year_month_from_filename(filename: str) -> tuple[int, int]:\n", - " match = re.search(r\"(\\w+)_(\\d{1,2})-(\\d{4})\\.(xls|xlsx)$\"\n", - "\n", - ", filename)\n", - "\n", - " if match:\n", - " month = match.group(2)\n", - " year = match.group(3)\n", - " return month, year\n", - " else:\n", - " raise ValueError(\"No match found\")" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [], - "source": [ + "import requests\n", "DICT_UFS = {\n", " \"AC\": \"Acre\",\n", " \"AL\": \"Alagoas\",\n", @@ -112,56 +49,7 @@ }, { "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [], - "source": [ - "new_df = change_df_header(df, guess_header(df))" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Tratamento ad hoc necessário\n" - ] - }, - { - "cell_type": "code", - "execution_count": 120, - "metadata": {}, - "outputs": [], - "source": [ - "new_df.rename(columns={ new_df.columns[0]: \"sigla_uf\" }, inplace= True) # Rename for ease of use.\n", - "new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace.\n", - "clean_df = new_df[new_df.sigla_uf.isin(DICT_UFS.values())].reset_index(drop = True) # Now we get all the actual RELEVANT uf data.\n", - "month, year = get_year_month_from_filename(filename)" - ] - }, - { - "cell_type": "code", - "execution_count": 126, - "metadata": {}, - "outputs": [], - "source": [ - "clean_pl_df = pl.from_pandas(clean_df).lazy()\n", - "# Add year and month\n", - "clean_pl_df = clean_pl_df.with_columns(pl.lit(year, dtype = pl.Int64).alias('ano'), pl.lit(month, dtype = pl.Int64).alias('mes'))" - ] - }, - { - "cell_type": "code", - "execution_count": 127, - "metadata": {}, - "outputs": [], - "source": [ - "long_pl_df = clean_pl_df.melt(id_vars = ['ano', 'mes', 'sigla_uf'], variable_name= 'tipo_veiculo', value_name= 'quantidade') # Long format." - ] - }, - { - "cell_type": "code", - "execution_count": 129, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -194,14 +82,96 @@ "└──────┴─────┴────────────────────┴──────────────┴────────────┘" ] }, - "execution_count": 129, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "long_pl_df.collect()" + "\n", + "def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int:\n", + " header_guess = 0\n", + " while header_guess < max_header_guess:\n", + " # Iffy logic, but essentially: if all rows of the column are strings, then this is a good candidate for a header.\n", + " if all(df.iloc[header_guess].apply(lambda x: isinstance(x, str))):\n", + " return header_guess\n", + " \n", + " header_guess += 1\n", + " return 0 # If nothing is ever found until the max, let's just assume it's the first row as per usual. \n", + "\n", + "def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame:\n", + " new_header = df.iloc[header_row]\n", + " new_df = df[(header_row+1):].reset_index(drop=True)\n", + " new_df.rename(columns=new_header, inplace=True)\n", + " return new_df\n", + "\n", + "def get_year_month_from_filename(filename: str) -> tuple[int, int]:\n", + " match = re.search(r\"(\\w+)_(\\d{1,2})-(\\d{4})\\.(xls|xlsx)$\"\n", + "\n", + ", filename)\n", + "\n", + " if match:\n", + " month = match.group(2)\n", + " year = match.group(3)\n", + " return month, year\n", + " else:\n", + " raise ValueError(\"No match found\")\n", + "def treat_uf_tipo(file):\n", + " filename = os.path.split(file)[1]\n", + " df = pd.read_excel(file)\n", + " new_df = change_df_header(df, guess_header(df))\n", + " # This is ad hoc for UF_tipo.\n", + " new_df.rename(columns={ new_df.columns[0]: \"sigla_uf\" }, inplace= True) # Rename for ease of use.\n", + " new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace.\n", + " clean_df = new_df[new_df.sigla_uf.isin(DICT_UFS.values())].reset_index(drop = True) # Now we get all the actual RELEVANT uf data.\n", + " month, year = get_year_month_from_filename(filename)\n", + " clean_pl_df = pl.from_pandas(clean_df).lazy()\n", + "# Add year and month\n", + " clean_pl_df = clean_pl_df.with_columns(pl.lit(year, dtype = pl.Int64).alias('ano'), pl.lit(month, dtype = pl.Int64).alias('mes'))\n", + " clean_pl_df = clean_pl_df.melt(id_vars = ['ano', 'mes', 'sigla_uf'], variable_name= 'tipo_veiculo', value_name= 'quantidade') # Long format.\n", + " return clean_pl_df.collect()\n", + "treat_uf_tipo('../files/2022/frota_por_uf_e_tipo_de_veículo_2-2022.xls')" ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "shape: (0, 5)
anomessigla_uftipo_veiculoquantidade
i64i64strstrstr
" + ], + "text/plain": [ + "shape: (0, 5)\n", + "┌─────┬─────┬──────────┬──────────────┬────────────┐\n", + "│ ano ┆ mes ┆ sigla_uf ┆ tipo_veiculo ┆ quantidade │\n", + "│ --- ┆ --- ┆ --- ┆ --- ┆ --- │\n", + "│ i64 ┆ i64 ┆ str ┆ str ┆ str │\n", + "╞═════╪═════╪══════════╪══════════════╪════════════╡\n", + "└─────┴─────┴──────────┴──────────────┴────────────┘" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] } ], "metadata": { From f74c3e0b72bdc8247525a57fa32e926dead659d7 Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 20 Apr 2023 03:59:26 -0300 Subject: [PATCH 042/265] Start file for UF Tipo treatment --- br_denatran_frota/code/frota_uf_tipo.py | 62 +++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 br_denatran_frota/code/frota_uf_tipo.py diff --git a/br_denatran_frota/code/frota_uf_tipo.py b/br_denatran_frota/code/frota_uf_tipo.py new file mode 100644 index 000000000..3884c9349 --- /dev/null +++ b/br_denatran_frota/code/frota_uf_tipo.py @@ -0,0 +1,62 @@ +import polars as pl +import pandas as pd +import os +from utils import guess_header, change_df_header, get_year_month_from_filename + + +DICT_UFS = { + "AC": "Acre", + "AL": "Alagoas", + "AP": "Amapá", + "AM": "Amazonas", + "BA": "Bahia", + "CE": "Ceará", + "DF": "Distrito Federal", + "ES": "Espírito Santo", + "GO": "Goiás", + "MA": "Maranhão", + "MT": "Mato Grosso", + "MS": "Mato Grosso do Sul", + "MG": "Minas Gerais", + "PA": "Pará", + "PB": "Paraíba", + "PR": "Paraná", + "PE": "Pernambuco", + "PI": "Piauí", + "RJ": "Rio de Janeiro", + "RN": "Rio Grande do Norte", + "RS": "Rio Grande do Sul", + "RO": "Rondônia", + "RR": "Roraima", + "SC": "Santa Catarina", + "SP": "São Paulo", + "SE": "Sergipe", + "TO": "Tocantins", +} + + +def treat_uf_tipo(file) -> pl.DataFrame: + filename = os.path.split(file)[1] + df = pd.read_excel(file) + new_df = change_df_header(df, guess_header(df)) + # This is ad hoc for UF_tipo. + new_df.rename( + columns={new_df.columns[0]: "sigla_uf"}, inplace=True + ) # Rename for ease of use. + new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace. + clean_df = new_df[new_df.sigla_uf.isin(DICT_UFS.values())].reset_index( + drop=True + ) # Now we get all the actual RELEVANT uf data. + month, year = get_year_month_from_filename(filename) + clean_pl_df = pl.from_pandas(clean_df).lazy() + # Add year and month + clean_pl_df = clean_pl_df.with_columns( + pl.lit(year, dtype=pl.Int64).alias("ano"), + pl.lit(month, dtype=pl.Int64).alias("mes"), + ) + clean_pl_df = clean_pl_df.melt( + id_vars=["ano", "mes", "sigla_uf"], + variable_name="tipo_veiculo", + value_name="quantidade", + ) # Long format. + return clean_pl_df.collect() From 42b07d6257f6e027623827ea96f3ea9b0167ae82 Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 20 Apr 2023 04:41:30 -0300 Subject: [PATCH 043/265] Better handling of directory changes --- br_denatran_frota/code/download_frota.py | 26 ++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index 28952d0f6..52ce439e6 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -75,8 +75,6 @@ def make_filename(i: dict, ext: bool = True) -> str: filename += f".{filetype}" return filename - -def handle_compact(i): print(2) @@ -143,24 +141,29 @@ def download_frota(month: int, year: int, temp_dir: str = ""): Raises: ValueError: Errors if the month is not a valid one. """ - if month not in MONTHS.values(): raise ValueError("Mês inválido.") dir_list = glob.glob(f"**/{DATASET}", recursive=True) + # Get the directory where this Python file is located + initial_dir = os.path.dirname(os.path.abspath(__file__)) + + # Construct the path to the "files" directory relative to this directory + files_dir = os.path.join(initial_dir, "..", "files") if dir_list: - # I always want to be in the actual folder for this dataset: + # I always want to be in the actual folder for this dataset, because I might start in the pipelines full repo: os.chdir(dir_list[0]) if temp_dir: os.chdir(temp_dir) # I always need a files directory inside my dataset folder. - make_dir_when_not_exists("files") + make_dir_when_not_exists(files_dir) + # I should always switch to the files dir now and save stuff inside it. + os.chdir(files_dir) year_dir_name = f"{year}" - desired_dir_name = os.path.join(os.getcwd(), temp_dir, "files", year_dir_name) # Create dir for that specific year should it be necessary. - make_dir_when_not_exists(desired_dir_name) - os.chdir(desired_dir_name) + make_dir_when_not_exists(year_dir_name) + os.chdir(year_dir_name) if year > 2012: download_post_2012(month, year) else: @@ -170,3 +173,10 @@ def download_frota(month: int, year: int, temp_dir: str = ""): urlretrieve(url, generic_zip_filename) with ZipFile(generic_zip_filename) as zip_file: zip_file.extractall() + os.chdir(initial_dir) + + +year = 2022 +if __name__ == "__main__": + for month in range(1, 6): + download_frota(month, year) From 155d75ad43bd4d9f17827a009648267dae337bf1 Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 20 Apr 2023 04:55:35 -0300 Subject: [PATCH 044/265] Reorganize testing into two distinct types --- .../test/download_frota_integration_tests.py | 46 +++++++++++++++++++ ...a_test.py => download_frota_unit_tests.py} | 33 ------------- 2 files changed, 46 insertions(+), 33 deletions(-) create mode 100644 br_denatran_frota/code/test/download_frota_integration_tests.py rename br_denatran_frota/code/test/{download_frota_test.py => download_frota_unit_tests.py} (62%) diff --git a/br_denatran_frota/code/test/download_frota_integration_tests.py b/br_denatran_frota/code/test/download_frota_integration_tests.py new file mode 100644 index 000000000..6dab06b1e --- /dev/null +++ b/br_denatran_frota/code/test/download_frota_integration_tests.py @@ -0,0 +1,46 @@ +import os +import shutil +import tempfile +import unittest +import glob +from parameterized import parameterized +from download_frota import ( + DATASET, + MONTHS, + download_frota, +) + + +class TestDownloadFrota(unittest.TestCase): + def setUp(self): + file_dir = os.path.dirname(os.path.abspath(__file__)) + os.chdir(file_dir) + self.temp_dir = tempfile.TemporaryDirectory(dir=file_dir) + + def tearDown(self): + print("Deleting temporary directory") + shutil.rmtree(self.temp_dir.name) + + def test_download_frota_with_invalid_month(self): + with self.assertRaises(ValueError): + download_frota(13, 2013) + + @parameterized.expand( + [(month, year) for year in range(2021, 2023) for month in range(1, 12)], + name_func=custom_name_func, + ) + def test_download_post_2012(self, month, year): + download_frota(month, year, self.temp_dir.name) + expected_files = { + f"frota_por_uf_e_tipo_de_veículo_{month}-{year}", + f"frota_por_município_e_tipo_{month}-{year}", + } + list_of_files = os.listdir( + os.path.join(DATASET, self.temp_dir.name, "files", f"{year}") + ) + files = set(os.path.splitext(file)[0] for file in list_of_files) + self.assertEqual(files, expected_files) + + +if __name__ == "__main__": + unittest.main() diff --git a/br_denatran_frota/code/test/download_frota_test.py b/br_denatran_frota/code/test/download_frota_unit_tests.py similarity index 62% rename from br_denatran_frota/code/test/download_frota_test.py rename to br_denatran_frota/code/test/download_frota_unit_tests.py index 9972afb5b..cc212f612 100644 --- a/br_denatran_frota/code/test/download_frota_test.py +++ b/br_denatran_frota/code/test/download_frota_unit_tests.py @@ -10,8 +10,6 @@ MONTHS, make_filename, make_dir_when_not_exists, - download_frota, - download_post_2012, ) @@ -74,36 +72,5 @@ def test_make_dir_when_not_exists(self): self.assertTrue(os.path.exists(new_dir)) -class TestDownloadFrota(unittest.TestCase): - def setUp(self): - file_dir = os.path.dirname(os.path.abspath(__file__)) - os.chdir(file_dir) - self.temp_dir = tempfile.TemporaryDirectory(dir=file_dir) - - def tearDown(self): - print("Deleting temporary directory") - shutil.rmtree(self.temp_dir.name) - - def test_download_frota_with_invalid_month(self): - with self.assertRaises(ValueError): - download_frota(13, 2013) - - @parameterized.expand( - [(month, year) for year in range(2013, 2014) for month in range(1, 4)], - name_func=custom_name_func, - ) - def test_download_post_2012(self, month, year): - download_frota(month, year, self.temp_dir.name) - expected_files = { - f"frota_por_uf_e_tipo_de_veículo_{month}-{year}", - f"frota_por_município_e_tipo_{month}-{year}", - } - list_of_files = os.listdir( - os.path.join(DATASET, self.temp_dir.name, "files", f"{year}") - ) - files = set(os.path.splitext(file)[0] for file in list_of_files) - self.assertEqual(files, expected_files) - - if __name__ == "__main__": unittest.main() From 66afce1d6efcb16bd376e6b74de5d14d143630ff Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 20 Apr 2023 05:24:54 -0300 Subject: [PATCH 045/265] More test rearranging --- .../code/test/download_frota_integration_tests.py | 13 ++++++++----- .../code/test/download_frota_unit_tests.py | 14 +++++++------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/br_denatran_frota/code/test/download_frota_integration_tests.py b/br_denatran_frota/code/test/download_frota_integration_tests.py index 6dab06b1e..331b35be8 100644 --- a/br_denatran_frota/code/test/download_frota_integration_tests.py +++ b/br_denatran_frota/code/test/download_frota_integration_tests.py @@ -11,7 +11,14 @@ ) -class TestDownloadFrota(unittest.TestCase): +def custom_name_func(testcase_func, param_num, param): + return "%s_%s" % ( + testcase_func.__name__, + parameterized.to_safe_name("_".join(str(x) for x in param.args)), + ) + + +class TestAllPossibleYears(unittest.TestCase): def setUp(self): file_dir = os.path.dirname(os.path.abspath(__file__)) os.chdir(file_dir) @@ -21,10 +28,6 @@ def tearDown(self): print("Deleting temporary directory") shutil.rmtree(self.temp_dir.name) - def test_download_frota_with_invalid_month(self): - with self.assertRaises(ValueError): - download_frota(13, 2013) - @parameterized.expand( [(month, year) for year in range(2021, 2023) for month in range(1, 12)], name_func=custom_name_func, diff --git a/br_denatran_frota/code/test/download_frota_unit_tests.py b/br_denatran_frota/code/test/download_frota_unit_tests.py index cc212f612..a128bf894 100644 --- a/br_denatran_frota/code/test/download_frota_unit_tests.py +++ b/br_denatran_frota/code/test/download_frota_unit_tests.py @@ -10,16 +10,10 @@ MONTHS, make_filename, make_dir_when_not_exists, + download_frota, ) -def custom_name_func(testcase_func, param_num, param): - return "%s_%s" % ( - testcase_func.__name__, - parameterized.to_safe_name("_".join(str(x) for x in param.args)), - ) - - dir_list = glob.glob(f"**/{DATASET}", recursive=True) if dir_list: # I always want to be in the actual folder for this dataset: @@ -72,5 +66,11 @@ def test_make_dir_when_not_exists(self): self.assertTrue(os.path.exists(new_dir)) +class TestDownloadFrota(unittest.TestCase): + def test_download_frota_with_invalid_month(self): + with self.assertRaises(ValueError): + download_frota(13, 2013) + + if __name__ == "__main__": unittest.main() From 5aab93c98c120fe23531f1f1d0dd4be886cc232e Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 20 Apr 2023 07:28:33 -0300 Subject: [PATCH 046/265] Revert bugged discovery --- .../test/download_frota_integration_tests.py | 49 ------------------- ...a_unit_tests.py => download_frota_test.py} | 25 ++++++++++ 2 files changed, 25 insertions(+), 49 deletions(-) delete mode 100644 br_denatran_frota/code/test/download_frota_integration_tests.py rename br_denatran_frota/code/test/{download_frota_unit_tests.py => download_frota_test.py} (67%) diff --git a/br_denatran_frota/code/test/download_frota_integration_tests.py b/br_denatran_frota/code/test/download_frota_integration_tests.py deleted file mode 100644 index 331b35be8..000000000 --- a/br_denatran_frota/code/test/download_frota_integration_tests.py +++ /dev/null @@ -1,49 +0,0 @@ -import os -import shutil -import tempfile -import unittest -import glob -from parameterized import parameterized -from download_frota import ( - DATASET, - MONTHS, - download_frota, -) - - -def custom_name_func(testcase_func, param_num, param): - return "%s_%s" % ( - testcase_func.__name__, - parameterized.to_safe_name("_".join(str(x) for x in param.args)), - ) - - -class TestAllPossibleYears(unittest.TestCase): - def setUp(self): - file_dir = os.path.dirname(os.path.abspath(__file__)) - os.chdir(file_dir) - self.temp_dir = tempfile.TemporaryDirectory(dir=file_dir) - - def tearDown(self): - print("Deleting temporary directory") - shutil.rmtree(self.temp_dir.name) - - @parameterized.expand( - [(month, year) for year in range(2021, 2023) for month in range(1, 12)], - name_func=custom_name_func, - ) - def test_download_post_2012(self, month, year): - download_frota(month, year, self.temp_dir.name) - expected_files = { - f"frota_por_uf_e_tipo_de_veículo_{month}-{year}", - f"frota_por_município_e_tipo_{month}-{year}", - } - list_of_files = os.listdir( - os.path.join(DATASET, self.temp_dir.name, "files", f"{year}") - ) - files = set(os.path.splitext(file)[0] for file in list_of_files) - self.assertEqual(files, expected_files) - - -if __name__ == "__main__": - unittest.main() diff --git a/br_denatran_frota/code/test/download_frota_unit_tests.py b/br_denatran_frota/code/test/download_frota_test.py similarity index 67% rename from br_denatran_frota/code/test/download_frota_unit_tests.py rename to br_denatran_frota/code/test/download_frota_test.py index a128bf894..49fc203a6 100644 --- a/br_denatran_frota/code/test/download_frota_unit_tests.py +++ b/br_denatran_frota/code/test/download_frota_test.py @@ -67,10 +67,35 @@ def test_make_dir_when_not_exists(self): class TestDownloadFrota(unittest.TestCase): + def setUp(self): + file_dir = os.path.dirname(os.path.abspath(__file__)) + os.chdir(file_dir) + self.temp_dir = tempfile.TemporaryDirectory(dir=file_dir) + + def tearDown(self): + print("Deleting temporary directory") + shutil.rmtree(self.temp_dir.name) + def test_download_frota_with_invalid_month(self): with self.assertRaises(ValueError): download_frota(13, 2013) + @parameterized.expand( + [(month, year) for year in range(2013, 2014) for month in range(1, 4)], + name_func=custom_name_func, + ) + def test_download_post_2012(self, month, year): + download_frota(month, year, self.temp_dir.name) + expected_files = { + f"frota_por_uf_e_tipo_de_veículo_{month}-{year}", + f"frota_por_município_e_tipo_{month}-{year}", + } + list_of_files = os.listdir( + os.path.join(DATASET, self.temp_dir.name, "files", f"{year}") + ) + files = set(os.path.splitext(file)[0] for file in list_of_files) + self.assertEqual(files, expected_files) + if __name__ == "__main__": unittest.main() From 427ae9700de3e132da2fb5b2440cd8056105cde9 Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 20 Apr 2023 07:32:41 -0300 Subject: [PATCH 047/265] Revert "Revert bugged discovery" This reverts commit 5aab93c98c120fe23531f1f1d0dd4be886cc232e. --- .../test/download_frota_integration_tests.py | 49 +++++++++++++++++++ ...a_test.py => download_frota_unit_tests.py} | 25 ---------- 2 files changed, 49 insertions(+), 25 deletions(-) create mode 100644 br_denatran_frota/code/test/download_frota_integration_tests.py rename br_denatran_frota/code/test/{download_frota_test.py => download_frota_unit_tests.py} (67%) diff --git a/br_denatran_frota/code/test/download_frota_integration_tests.py b/br_denatran_frota/code/test/download_frota_integration_tests.py new file mode 100644 index 000000000..331b35be8 --- /dev/null +++ b/br_denatran_frota/code/test/download_frota_integration_tests.py @@ -0,0 +1,49 @@ +import os +import shutil +import tempfile +import unittest +import glob +from parameterized import parameterized +from download_frota import ( + DATASET, + MONTHS, + download_frota, +) + + +def custom_name_func(testcase_func, param_num, param): + return "%s_%s" % ( + testcase_func.__name__, + parameterized.to_safe_name("_".join(str(x) for x in param.args)), + ) + + +class TestAllPossibleYears(unittest.TestCase): + def setUp(self): + file_dir = os.path.dirname(os.path.abspath(__file__)) + os.chdir(file_dir) + self.temp_dir = tempfile.TemporaryDirectory(dir=file_dir) + + def tearDown(self): + print("Deleting temporary directory") + shutil.rmtree(self.temp_dir.name) + + @parameterized.expand( + [(month, year) for year in range(2021, 2023) for month in range(1, 12)], + name_func=custom_name_func, + ) + def test_download_post_2012(self, month, year): + download_frota(month, year, self.temp_dir.name) + expected_files = { + f"frota_por_uf_e_tipo_de_veículo_{month}-{year}", + f"frota_por_município_e_tipo_{month}-{year}", + } + list_of_files = os.listdir( + os.path.join(DATASET, self.temp_dir.name, "files", f"{year}") + ) + files = set(os.path.splitext(file)[0] for file in list_of_files) + self.assertEqual(files, expected_files) + + +if __name__ == "__main__": + unittest.main() diff --git a/br_denatran_frota/code/test/download_frota_test.py b/br_denatran_frota/code/test/download_frota_unit_tests.py similarity index 67% rename from br_denatran_frota/code/test/download_frota_test.py rename to br_denatran_frota/code/test/download_frota_unit_tests.py index 49fc203a6..a128bf894 100644 --- a/br_denatran_frota/code/test/download_frota_test.py +++ b/br_denatran_frota/code/test/download_frota_unit_tests.py @@ -67,35 +67,10 @@ def test_make_dir_when_not_exists(self): class TestDownloadFrota(unittest.TestCase): - def setUp(self): - file_dir = os.path.dirname(os.path.abspath(__file__)) - os.chdir(file_dir) - self.temp_dir = tempfile.TemporaryDirectory(dir=file_dir) - - def tearDown(self): - print("Deleting temporary directory") - shutil.rmtree(self.temp_dir.name) - def test_download_frota_with_invalid_month(self): with self.assertRaises(ValueError): download_frota(13, 2013) - @parameterized.expand( - [(month, year) for year in range(2013, 2014) for month in range(1, 4)], - name_func=custom_name_func, - ) - def test_download_post_2012(self, month, year): - download_frota(month, year, self.temp_dir.name) - expected_files = { - f"frota_por_uf_e_tipo_de_veículo_{month}-{year}", - f"frota_por_município_e_tipo_{month}-{year}", - } - list_of_files = os.listdir( - os.path.join(DATASET, self.temp_dir.name, "files", f"{year}") - ) - files = set(os.path.splitext(file)[0] for file in list_of_files) - self.assertEqual(files, expected_files) - if __name__ == "__main__": unittest.main() From 73c8cadb8de1c058dab11aa643f46d09c232e95a Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 20 Apr 2023 07:35:14 -0300 Subject: [PATCH 048/265] Discovery works --- ...ta_integration_tests.py => download_frota_integration_test.py} | 0 .../{download_frota_unit_tests.py => download_frota_unit_test.py} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename br_denatran_frota/code/test/{download_frota_integration_tests.py => download_frota_integration_test.py} (100%) rename br_denatran_frota/code/test/{download_frota_unit_tests.py => download_frota_unit_test.py} (100%) diff --git a/br_denatran_frota/code/test/download_frota_integration_tests.py b/br_denatran_frota/code/test/download_frota_integration_test.py similarity index 100% rename from br_denatran_frota/code/test/download_frota_integration_tests.py rename to br_denatran_frota/code/test/download_frota_integration_test.py diff --git a/br_denatran_frota/code/test/download_frota_unit_tests.py b/br_denatran_frota/code/test/download_frota_unit_test.py similarity index 100% rename from br_denatran_frota/code/test/download_frota_unit_tests.py rename to br_denatran_frota/code/test/download_frota_unit_test.py From 6df4a898d4d6a4685b6b8657e6fbed2b7186f73e Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 21 Apr 2023 03:36:15 -0300 Subject: [PATCH 049/265] Pre commit enforcing py 3.9 --- .pre-commit-config.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 834971b77..354a09d96 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,7 +12,6 @@ repos: rev: 22.12.0 hooks: - id: black - language_version: python3.9 exclude: 'pipelines\/\{\{cookiecutter\.project_name\}\}.*' - repo: https://github.com/PyCQA/flake8 rev: 6.0.0 From 1d43c57adaf020904de79e33a6fa6953078f5bd9 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 21 Apr 2023 03:36:56 -0300 Subject: [PATCH 050/265] Add function to verify denatran total --- br_denatran_frota/code/utils.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/br_denatran_frota/code/utils.py b/br_denatran_frota/code/utils.py index 572cfd331..40b73d2d9 100644 --- a/br_denatran_frota/code/utils.py +++ b/br_denatran_frota/code/utils.py @@ -1,4 +1,6 @@ +# -*- coding: utf-8 -*- import pandas as pd +import polars as pl import re DICT_UFS = { @@ -58,3 +60,18 @@ def get_year_month_from_filename(filename: str) -> tuple[int, int]: return month, year else: raise ValueError("No match found") + + +def verify_total(df: pl.DataFrame): + columns_for_total = df.select(pl.exclude("TOTAL")).select(pl.exclude([pl.Utf8])) + calculated_total = columns_for_total.select( + pl.fold( + acc=pl.lit(0), function=lambda acc, x: acc + x, exprs=pl.col("*") + ).alias("calculated_total") + )["calculated_total"] + + mask = df["TOTAL"] == calculated_total + if pl.sum(~mask) != 0: + raise ValueError( + "A coluna de TOTAL da base original tem inconsistências e não soma tudo das demais colunas." + ) From 30ca4cd610b05c97e6201b54aae2057d14356a74 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 21 Apr 2023 03:45:10 -0300 Subject: [PATCH 051/265] Wide to long now checks and removes total --- br_denatran_frota/code/frota_uf_tipo.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/br_denatran_frota/code/frota_uf_tipo.py b/br_denatran_frota/code/frota_uf_tipo.py index 3884c9349..213f52cc9 100644 --- a/br_denatran_frota/code/frota_uf_tipo.py +++ b/br_denatran_frota/code/frota_uf_tipo.py @@ -1,7 +1,13 @@ +# -*- coding: utf-8 -*- import polars as pl import pandas as pd import os -from utils import guess_header, change_df_header, get_year_month_from_filename +from utils import ( + guess_header, + change_df_header, + get_year_month_from_filename, + verify_total, +) DICT_UFS = { @@ -49,11 +55,13 @@ def treat_uf_tipo(file) -> pl.DataFrame: ) # Now we get all the actual RELEVANT uf data. month, year = get_year_month_from_filename(filename) clean_pl_df = pl.from_pandas(clean_df).lazy() + verify_total(clean_pl_df.collect()) # Add year and month clean_pl_df = clean_pl_df.with_columns( pl.lit(year, dtype=pl.Int64).alias("ano"), pl.lit(month, dtype=pl.Int64).alias("mes"), ) + clean_pl_df = clean_pl_df.select(pl.exclude("TOTAL")) clean_pl_df = clean_pl_df.melt( id_vars=["ano", "mes", "sigla_uf"], variable_name="tipo_veiculo", From 830ad07f1cf5b06973624e694d5126ba10b4eae2 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 21 Apr 2023 18:44:51 -0300 Subject: [PATCH 052/265] Adds packages for manage.py to work --- poetry.lock | 114 ++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 3 ++ 2 files changed, 116 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 271795492..ea7af3f74 100644 --- a/poetry.lock +++ b/poetry.lock @@ -12,6 +12,21 @@ files = [ {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, ] +[[package]] +name = "arrow" +version = "1.2.3" +description = "Better dates & times for Python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "arrow-1.2.3-py3-none-any.whl", hash = "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2"}, + {file = "arrow-1.2.3.tar.gz", hash = "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" + [[package]] name = "asttokens" version = "2.2.1" @@ -123,6 +138,21 @@ soupsieve = ">1.2" html5lib = ["html5lib"] lxml = ["lxml"] +[[package]] +name = "binaryornot" +version = "0.4.4" +description = "Ultra-lightweight pure Python package to check if a file is binary or text." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4"}, + {file = "binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061"}, +] + +[package.dependencies] +chardet = ">=3.0.2" + [[package]] name = "cachetools" version = "4.2.4" @@ -236,6 +266,18 @@ files = [ {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, ] +[[package]] +name = "chardet" +version = "5.1.0" +description = "Universal encoding detector for Python 3" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "chardet-5.1.0-py3-none-any.whl", hash = "sha256:362777fb014af596ad31334fde1e8c327dfdb076e1960d1694662d46a6917ab9"}, + {file = "chardet-5.1.0.tar.gz", hash = "sha256:0d62712b956bc154f85fb0a266e2a3c5913c2967e00348701b32411d6def31e5"}, +] + [[package]] name = "charset-normalizer" version = "2.0.8" @@ -403,6 +445,27 @@ mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"] test = ["Pillow", "matplotlib", "pytest"] test-no-images = ["pytest"] +[[package]] +name = "cookiecutter" +version = "2.1.1" +description = "A command-line utility that creates projects from project templates, e.g. creating a Python package project from a Python package project template." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cookiecutter-2.1.1-py2.py3-none-any.whl", hash = "sha256:9f3ab027cec4f70916e28f03470bdb41e637a3ad354b4d65c765d93aad160022"}, + {file = "cookiecutter-2.1.1.tar.gz", hash = "sha256:f3982be8d9c53dac1261864013fdec7f83afd2e42ede6f6dd069c5e149c540d5"}, +] + +[package.dependencies] +binaryornot = ">=0.4.4" +click = ">=7.0,<9.0.0" +Jinja2 = ">=2.7,<4.0.0" +jinja2-time = ">=0.2.0" +python-slugify = ">=4.0.0" +pyyaml = ">=5.3.1" +requests = ">=2.23.0" + [[package]] name = "coverage" version = "7.2.3" @@ -1456,6 +1519,22 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jinja2-time" +version = "0.2.0" +description = "Jinja2 Extension for Dates and Times" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "jinja2-time-0.2.0.tar.gz", hash = "sha256:d14eaa4d315e7688daa4969f616f226614350c48730bfa1692d2caebd8c90d40"}, + {file = "jinja2_time-0.2.0-py2.py3-none-any.whl", hash = "sha256:d3eab6605e3ec8b7a0863df09cc1d23714908fa61aa6986a845c20ba488b4efa"}, +] + +[package.dependencies] +arrow = "*" +jinja2 = "*" + [[package]] name = "jupyter-client" version = "7.3.4" @@ -2871,6 +2950,18 @@ text-unidecode = ">=1.3" [package.extras] unidecode = ["Unidecode (>=1.1.1)"] +[[package]] +name = "python-string-utils" +version = "1.0.0" +description = "Utility functions for strings validation and manipulation." +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "python-string-utils-1.0.0.tar.gz", hash = "sha256:dcf9060b03f07647c0a603408dc8b03f807f3b54a05c6e19eb14460256fac0cb"}, + {file = "python_string_utils-1.0.0-py3-none-any.whl", hash = "sha256:f1a88700baf99db1a9b6953f44181ad9ca56623c81e257e6009707e2e7851fa4"}, +] + [[package]] name = "pytz" version = "2021.3" @@ -3540,6 +3631,27 @@ dev = ["coveralls (>=2.1.0)", "tox (>=3.14.0)"] socks = ["requests[socks] (>=2.11.1,<3)"] test = ["vcrpy (>=1.10.3)"] +[[package]] +name = "typer" +version = "0.7.0" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "typer-0.7.0-py3-none-any.whl", hash = "sha256:b5e704f4e48ec263de1c0b3a2387cd405a13767d2f907f44c1a08cbad96f606d"}, + {file = "typer-0.7.0.tar.gz", hash = "sha256:ff797846578a9f2a201b53442aedeb543319466870fbe1c701eab66dd7681165"}, +] + +[package.dependencies] +click = ">=7.1.1,<9.0.0" + +[package.extras] +all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<13.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] +doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] +test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<13.0.0)", "shellingham (>=1.3.0,<2.0.0)"] + [[package]] name = "typing-extensions" version = "4.5.0" @@ -3731,4 +3843,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "a06307115a26fddb569266cf3c030d7aad2fe2318ab9ce079581ffbc48e861bb" +content-hash = "a3e71799a5863e871ed54be65449b470cc7a73f6aafea6cb4a192ed70ccc580f" diff --git a/pyproject.toml b/pyproject.toml index b1ea4270f..65a8f5a47 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -102,6 +102,9 @@ setuptools = "^67.6.1" polars = "^0.17.5" xlsx2csv = "^0.8.1" xlrd = "^2.0.1" +typer = "^0.7.0" +cookiecutter = "^2.1.1" +python-string-utils = "^1.0.0" [tool.poetry.dev-dependencies] pytest_cov = "^3.0.0" From 7e6303df2986741dde1f2b78f4c1b4bfaea58ba7 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 21 Apr 2023 18:45:33 -0300 Subject: [PATCH 053/265] Create pipeline folder structure --- pipelines/datasets/__init__.py | 1 + .../datasets/br_denatran_frota/__init__.py | 0 .../datasets/br_denatran_frota/constants.py | 42 +++++++++ pipelines/datasets/br_denatran_frota/flows.py | 81 +++++++++++++++++ .../datasets/br_denatran_frota/schedules.py | 88 +++++++++++++++++++ pipelines/datasets/br_denatran_frota/tasks.py | 60 +++++++++++++ pipelines/datasets/br_denatran_frota/utils.py | 31 +++++++ 7 files changed, 303 insertions(+) create mode 100644 pipelines/datasets/br_denatran_frota/__init__.py create mode 100644 pipelines/datasets/br_denatran_frota/constants.py create mode 100644 pipelines/datasets/br_denatran_frota/flows.py create mode 100644 pipelines/datasets/br_denatran_frota/schedules.py create mode 100644 pipelines/datasets/br_denatran_frota/tasks.py create mode 100644 pipelines/datasets/br_denatran_frota/utils.py diff --git a/pipelines/datasets/__init__.py b/pipelines/datasets/__init__.py index cb3fe714e..47a8fe679 100644 --- a/pipelines/datasets/__init__.py +++ b/pipelines/datasets/__init__.py @@ -24,3 +24,4 @@ from pipelines.datasets.br_me_caged.flows import * from pipelines.datasets.br_ibge_pnadc.flows import * from pipelines.datasets.cross_update.flows import * +from pipelines.datasets.br_denatran_frota.flows import * diff --git a/pipelines/datasets/br_denatran_frota/__init__.py b/pipelines/datasets/br_denatran_frota/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py new file mode 100644 index 000000000..a323827db --- /dev/null +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +""" +Constant values for the datasets projects +""" + + +############################################################################### +# +# Esse é um arquivo onde podem ser declaratas constantes que serão usadas +# pelo projeto br_denatran_frota. +# +# Por ser um arquivo opcional, pode ser removido sem prejuízo ao funcionamento +# do projeto, caos não esteja em uso. +# +# Para declarar constantes, basta fazer conforme o exemplo abaixo: +# +# ``` +# class constants(Enum): +# """ +# Constant values for the br_denatran_frota project +# """ +# FOO = "bar" +# ``` +# +# Para usá-las, basta fazer conforme o exemplo abaixo: +# +# ```py +# from pipelines.datasets.br_denatran_frota.constants import constants +# print(constants.FOO.value) +# ``` +# +############################################################################### + +from enum import Enum + + +class constants(Enum): # pylint: disable=c0103 + """ + Constant values for the br_denatran_frota project + """ + + FOO = "bar" diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py new file mode 100644 index 000000000..0d45deb50 --- /dev/null +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +""" +Flows for br_denatran_frota +""" + +############################################################################### +# +# Aqui é onde devem ser definidos os flows do projeto. +# Cada flow representa uma sequência de passos que serão executados +# em ordem. +# +# Mais informações sobre flows podem ser encontradas na documentação do +# Prefect: https://docs.prefect.io/core/concepts/flows.html +# +# De modo a manter consistência na codebase, todo o código escrito passará +# pelo pylint. Todos os warnings e erros devem ser corrigidos. +# +# Existem diversas maneiras de declarar flows. No entanto, a maneira mais +# conveniente e recomendada pela documentação é usar a API funcional. +# Em essência, isso implica simplesmente na chamada de funções, passando +# os parâmetros necessários para a execução em cada uma delas. +# +# Também, após a definição de um flow, para o adequado funcionamento, é +# mandatório configurar alguns parâmetros dele, os quais são: +# - storage: onde esse flow está armazenado. No caso, o storage é o +# próprio módulo Python que contém o flow. Sendo assim, deve-se +# configurar o storage como o pipelines.datasets +# - run_config: para o caso de execução em cluster Kubernetes, que é +# provavelmente o caso, é necessário configurar o run_config com a +# imagem Docker que será usada para executar o flow. Assim sendo, +# basta usar constants.DOCKER_IMAGE.value, que é automaticamente +# gerado. +# - schedule (opcional): para o caso de execução em intervalos regulares, +# deve-se utilizar algum dos schedules definidos em schedules.py +# +# Um exemplo de flow, considerando todos os pontos acima, é o seguinte: +# +# ----------------------------------------------------------------------------- +# from prefect import task +# from prefect import Flow +# from prefect.run_configs import KubernetesRun +# from prefect.storage import GCS +# from pipelines.constants import constants +# from my_tasks import my_task, another_task +# from my_schedules import some_schedule +# +# with Flow("my_flow") as flow: +# a = my_task(param1=1, param2=2) +# b = another_task(a, param3=3) +# +# flow.storage = GCS(constants.GCS_FLOWS_BUCKET.value) +# flow.run_config = KubernetesRun(image=constants.DOCKER_IMAGE.value) +# flow.schedule = some_schedule +# ----------------------------------------------------------------------------- +# +# Abaixo segue um código para exemplificação, que pode ser removido. +# +############################################################################### + + +from prefect.run_configs import KubernetesRun +from prefect.storage import GCS +from pipelines.constants import constants +from pipelines.datasets.br_denatran_frota.tasks import say_hello + +# from pipelines.datasets.br_denatran_frota.schedules import every_two_weeks +from pipelines.utils.decorators import Flow + +with Flow( + name="my_flow", + code_owners=[ + "discord-username", + ], +) as datasets_br_denatran_frota_flow: + say_hello() + +datasets_br_denatran_frota_flow.storage = GCS(constants.GCS_FLOWS_BUCKET.value) +datasets_br_denatran_frota_flow.run_config = KubernetesRun( + image=constants.DOCKER_IMAGE.value +) +# flow.schedule = every_two_weeks diff --git a/pipelines/datasets/br_denatran_frota/schedules.py b/pipelines/datasets/br_denatran_frota/schedules.py new file mode 100644 index 000000000..8967b8c93 --- /dev/null +++ b/pipelines/datasets/br_denatran_frota/schedules.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +""" +Schedules for br_denatran_frota +""" + +############################################################################### +# +# Aqui é onde devem ser definidos os schedules para os flows do projeto. +# Cada schedule indica o intervalo de tempo entre as execuções. +# Um schedule pode ser definido para um ou mais flows. +# Mais informações sobre schedules podem ser encontradas na documentação do +# Prefect: https://docs.prefect.io/core/concepts/schedules.html +# +# De modo a manter consistência na codebase, todo o código escrito passará +# pelo pylint. Todos os warnings e erros devem ser corrigidos. +# +# Os schedules devem ser definidos de acordo com a sintaxe do Prefect, como, +# por exemplo, o seguinte (para executar a cada 1 minuto): +# +# ----------------------------------------------------------------------------- +# from datetime import timedelta, datetime +# from prefect.schedules import Schedule +# from prefect.schedules.clocks import IntervalClock +# from pipelines.constants import constants +# +# minute_schedule = Schedule( +# clocks=[ +# IntervalClock( +# interval=timedelta(minutes=1), +# start_date=datetime(2021, 1, 1), +# labels=[ +# constants.DATASETS_AGENT_LABEL.value, +# ] +# ), +# ] +# ) +# ----------------------------------------------------------------------------- +# +# Vale notar que o parâmetro `labels` é obrigatório e deve ser uma lista com +# apenas um elemento, correspondendo ao label do agente que será executado. +# O label do agente é definido em `constants.py` e deve ter o formato +# `DATASETS_AGENT_LABEL`. +# +# Outro exemplo, para executar todos os dias à meia noite, segue abaixo: +# +# ----------------------------------------------------------------------------- +# from prefect import task +# from datetime import timedelta +# import pendulum +# from prefect.schedules import Schedule +# from prefect.schedules.clocks import IntervalClock +# from pipelines.constants import constants +# +# every_day_at_midnight = Schedule( +# clocks=[ +# IntervalClock( +# interval=timedelta(days=1), +# start_date=pendulum.datetime( +# 2021, 1, 1, 0, 0, 0, tz="America/Sao_Paulo"), +# labels=[ +# constants.K8S_AGENT_LABEL.value, +# ] +# ) +# ] +# ) +# ----------------------------------------------------------------------------- +# +# Abaixo segue um código para exemplificação, que pode ser removido. +# +############################################################################### + + +from datetime import timedelta, datetime +from prefect.schedules import Schedule +from prefect.schedules.clocks import IntervalClock +from pipelines.constants import constants + +every_two_weeks = Schedule( + clocks=[ + IntervalClock( + interval=timedelta(weeks=2), + start_date=datetime(2021, 1, 1), + labels=[ + constants.DATASETS_AGENT_LABEL.value, + ], + ), + ] +) diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py new file mode 100644 index 000000000..8ec526846 --- /dev/null +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +""" +Tasks for br_denatran_frota +""" + +############################################################################### +# +# Aqui é onde devem ser definidas as tasks para os flows do projeto. +# Cada task representa um passo da pipeline. Não é estritamente necessário +# tratar todas as exceções que podem ocorrer durante a execução de uma task, +# mas é recomendável, ainda que não vá implicar em uma quebra no sistema. +# Mais informações sobre tasks podem ser encontradas na documentação do +# Prefect: https://docs.prefect.io/core/concepts/tasks.html +# +# De modo a manter consistência na codebase, todo o código escrito passará +# pelo pylint. Todos os warnings e erros devem ser corrigidos. +# +# As tasks devem ser definidas como funções comuns ao Python, com o decorador +# @task acima. É recomendado inserir type hints para as variáveis. +# +# Um exemplo de task é o seguinte: +# +# ----------------------------------------------------------------------------- +# from prefect import task +# +# @task +# def my_task(param1: str, param2: int) -> str: +# """ +# My task description. +# """ +# return f'{param1} {param2}' +# ----------------------------------------------------------------------------- +# +# Você também pode usar pacotes Python arbitrários, como numpy, pandas, etc. +# +# ----------------------------------------------------------------------------- +# from prefect import task +# import numpy as np +# +# @task +# def my_task(a: np.ndarray, b: np.ndarray) -> str: +# """ +# My task description. +# """ +# return np.add(a, b) +# ----------------------------------------------------------------------------- +# +# Abaixo segue um código para exemplificação, que pode ser removido. +# +############################################################################### + +from prefect import task + + +@task # noqa +def say_hello(name: str = "World") -> str: + """ + Greeting task. + """ + return f"Hello, {name}!" diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py new file mode 100644 index 000000000..45810ab91 --- /dev/null +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +""" +General purpose functions for the br_denatran_frota project +""" + +############################################################################### +# +# Esse é um arquivo onde podem ser declaratas funções que serão usadas +# pelo projeto br_denatran_frota. +# +# Por ser um arquivo opcional, pode ser removido sem prejuízo ao funcionamento +# do projeto, caos não esteja em uso. +# +# Para declarar funções, basta fazer em código Python comum, como abaixo: +# +# ``` +# def foo(): +# """ +# Function foo +# """ +# print("foo") +# ``` +# +# Para usá-las, basta fazer conforme o exemplo abaixo: +# +# ```py +# from pipelines.datasets.br_denatran_frota.utils import foo +# foo() +# ``` +# +############################################################################### From 7779e0ad99bfe0122d2efbc41cc7af0613df1cf8 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sat, 22 Apr 2023 18:39:12 -0300 Subject: [PATCH 054/265] Just for stashing --- br_denatran_frota/code/test_drive.ipynb | 321 ++++++++++++------ ...ta_por_munic\303\255pio_e_tipo_2-2022.xls" | Bin 0 -> 1183744 bytes ...or_uf_e_tipo_de_ve\303\255culo_2-2022.xls" | Bin 0 -> 33792 bytes 3 files changed, 218 insertions(+), 103 deletions(-) create mode 100644 "br_denatran_frota/files/2022/frota_por_munic\303\255pio_e_tipo_2-2022.xls" create mode 100644 "br_denatran_frota/files/2022/frota_por_uf_e_tipo_de_ve\303\255culo_2-2022.xls" diff --git a/br_denatran_frota/code/test_drive.ipynb b/br_denatran_frota/code/test_drive.ipynb index 576cd333a..7bb9411db 100644 --- a/br_denatran_frota/code/test_drive.ipynb +++ b/br_denatran_frota/code/test_drive.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 8, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -15,7 +15,8 @@ "from zipfile import ZipFile\n", "from rarfile import RarFile\n", "from bs4 import BeautifulSoup\n", - "import requests\n", + "import difflib\n", + "from utils import guess_header, change_df_header, get_year_month_from_filename, treat_uf_tipo\n", "DICT_UFS = {\n", " \"AC\": \"Acre\",\n", " \"AL\": \"Alagoas\",\n", @@ -49,129 +50,243 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "#treat_uf_tipo('../files/2022/frota_por_uf_e_tipo_de_veículo_2-2022.xls')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from download_frota import download_frota" + ] + }, + { + "cell_type": "code", + "execution_count": 9, "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "
\n", - "shape: (594, 5)
anomessigla_uftipo_veiculoquantidade
i64i64strstri64
20222"Acre""TOTAL"321989
20222"Amapá""TOTAL"225303
20222"Amazonas""TOTAL"1020046
20222"Pará""TOTAL"2367668
20222"Rondônia""TOTAL"1118903
20222"Roraima""TOTAL"252315
20222"Tocantins""TOTAL"796159
20222"Alagoas""TOTAL"988002
20222"Bahia""TOTAL"4720073
20222"Ceará""TOTAL"3529429
20222"Maranhão""TOTAL"1950201
20222"Paraíba""TOTAL"1477707
20222"Sergipe""UTILITÁRIO"7459
20222"Espírito Santo…"UTILITÁRIO"29102
20222"Minas Gerais""UTILITÁRIO"116020
20222"Rio de Janeiro…"UTILITÁRIO"88531
20222"São Paulo""UTILITÁRIO"410642
20222"Paraná""UTILITÁRIO"93204
20222"Rio Grande do …"UTILITÁRIO"93702
20222"Santa Catarina…"UTILITÁRIO"105113
20222"Distrito Feder…"UTILITÁRIO"39414
20222"Goiás""UTILITÁRIO"43899
20222"Mato Grosso""UTILITÁRIO"24451
20222"Mato Grosso do…"UTILITÁRIO"19279
" - ], - "text/plain": [ - "shape: (594, 5)\n", - "┌──────┬─────┬────────────────────┬──────────────┬────────────┐\n", - "│ ano ┆ mes ┆ sigla_uf ┆ tipo_veiculo ┆ quantidade │\n", - "│ --- ┆ --- ┆ --- ┆ --- ┆ --- │\n", - "│ i64 ┆ i64 ┆ str ┆ str ┆ i64 │\n", - "╞══════╪═════╪════════════════════╪══════════════╪════════════╡\n", - "│ 2022 ┆ 2 ┆ Acre ┆ TOTAL ┆ 321989 │\n", - "│ 2022 ┆ 2 ┆ Amapá ┆ TOTAL ┆ 225303 │\n", - "│ 2022 ┆ 2 ┆ Amazonas ┆ TOTAL ┆ 1020046 │\n", - "│ 2022 ┆ 2 ┆ Pará ┆ TOTAL ┆ 2367668 │\n", - "│ … ┆ … ┆ … ┆ … ┆ … │\n", - "│ 2022 ┆ 2 ┆ Distrito Federal ┆ UTILITÁRIO ┆ 39414 │\n", - "│ 2022 ┆ 2 ┆ Goiás ┆ UTILITÁRIO ┆ 43899 │\n", - "│ 2022 ┆ 2 ┆ Mato Grosso ┆ UTILITÁRIO ┆ 24451 │\n", - "│ 2022 ┆ 2 ┆ Mato Grosso do Sul ┆ UTILITÁRIO ┆ 19279 │\n", - "└──────┴─────┴────────────────────┴──────────────┴────────────┘" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "Download of frota_por_uf_e_tipo_de_veículo_2-2022.xls complete\n", + "Download of frota_por_município_e_tipo_2-2022.xls complete\n" + ] } ], "source": [ + "download_frota(2, 2022)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/tamir/.cache/pypoetry/virtualenvs/pipelines-Fyk5jlG0-py3.10/lib/python3.10/site-packages/requests/__init__.py:102: RequestsDependencyWarning: urllib3 (1.26.7) or chardet (5.1.0)/charset_normalizer (2.0.8) doesn't match a supported version!\n", + " warnings.warn(\"urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported \"\n", + "Downloading: 100%|██████████| 5570/5570 [00:00<00:00, 10744.58rows/s]\n" + ] + } + ], + "source": [ + "import basedosdados as bd \n", + "municipios_query = \"\"\"SELECT nome, id_municipio, sigla_uf FROM `basedosdados.br_bd_diretorios_brasil.municipio`\n", + "\"\"\"\n", + "bd_municipios = bd.read_sql(municipios_query, 'tamir-pipelines')\n", + "bd_municipios = pl.from_pandas(bd_municipios)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "file = '../files/2022/frota_por_município_e_tipo_2-2022.xls'\n", + "filename = os.path.split(file)[1]\n", + "df = pd.read_excel(file)\n", + "new_df = change_df_header(df, guess_header(df))\n", + "new_df.rename(columns={ new_df.columns[0]: \"sigla_uf\" , new_df.columns[1]: 'nome_denatran'}, inplace= True) # Rename for ease of use.\n", + "new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace.\n", + "new_df = pl.from_pandas(new_df)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "uf = 'RN'" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# for uf in DICT_UFS:\n", + "denatran_uf = new_df.filter(pl.col('sigla_uf') == uf)\n", + "ibge_uf = bd_municipios.filter(pl.col('sigla_uf') == uf)\n", + "ibge_uf = ibge_uf.with_columns(pl.col('nome').str.to_lowercase())" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'denatran_uf' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m denatran_uf\n", + "\u001b[0;31mNameError\u001b[0m: name 'denatran_uf' is not defined" + ] + } + ], + "source": [ + "denatran_uf" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def get_city_name_ibge(denatran_name: str):\n", + " matches = difflib.get_close_matches(denatran_name.lower(), ibge_uf['nome'].str.to_lowercase(), n = 1)\n", + " if matches:\n", + " return matches[0]\n", + " else:\n", + " return '' # I don't want this to error out directly, because then I can get all municipalities.\n", + "x = denatran_uf['nome_denatran'].apply(get_city_name_ibge)\n", + "denatran_uf = denatran_uf.with_columns(x.alias('suggested_nome_ibge'))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def match_ibge(denatran_uf: pl.DataFrame, ibge_uf: pl.DataFrame):\n", + " joined_df = denatran_uf.join(ibge_uf, left_on=['suggested_nome_ibge', 'sigla_uf'], right_on=['nome', 'sigla_uf'], how='left')\n", + " mismatched_rows = joined_df.filter(pl.col('id_municipio').is_null())\n", "\n", - "def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int:\n", - " header_guess = 0\n", - " while header_guess < max_header_guess:\n", - " # Iffy logic, but essentially: if all rows of the column are strings, then this is a good candidate for a header.\n", - " if all(df.iloc[header_guess].apply(lambda x: isinstance(x, str))):\n", - " return header_guess\n", - " \n", - " header_guess += 1\n", - " return 0 # If nothing is ever found until the max, let's just assume it's the first row as per usual. \n", - "\n", - "def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame:\n", - " new_header = df.iloc[header_row]\n", - " new_df = df[(header_row+1):].reset_index(drop=True)\n", - " new_df.rename(columns=new_header, inplace=True)\n", - " return new_df\n", - "\n", - "def get_year_month_from_filename(filename: str) -> tuple[int, int]:\n", - " match = re.search(r\"(\\w+)_(\\d{1,2})-(\\d{4})\\.(xls|xlsx)$\"\n", - "\n", - ", filename)\n", + " if len(mismatched_rows) > 0:\n", + " error_message = \"Os seguintes municípios falharam: \\n\"\n", + " for row in mismatched_rows.rows(named = True):\n", + " error_message += f\"{row['nome_denatran']} ({row['sigla_uf']})\\n\"\n", + " raise ValueError(error_message)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "Os seguintes municípios falharam: \nASSU (RN)\n", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[9], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m match_ibge(denatran_uf, ibge_uf)\n", + "Cell \u001b[0;32mIn[8], line 9\u001b[0m, in \u001b[0;36mmatch_ibge\u001b[0;34m(denatran_uf, ibge_uf)\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[39mfor\u001b[39;00m row \u001b[39min\u001b[39;00m mismatched_rows\u001b[39m.\u001b[39mrows(named \u001b[39m=\u001b[39m \u001b[39mTrue\u001b[39;00m):\n\u001b[1;32m 8\u001b[0m error_message \u001b[39m+\u001b[39m\u001b[39m=\u001b[39m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m{\u001b[39;00mrow[\u001b[39m'\u001b[39m\u001b[39mnome_denatran\u001b[39m\u001b[39m'\u001b[39m]\u001b[39m}\u001b[39;00m\u001b[39m (\u001b[39m\u001b[39m{\u001b[39;00mrow[\u001b[39m'\u001b[39m\u001b[39msigla_uf\u001b[39m\u001b[39m'\u001b[39m]\u001b[39m}\u001b[39;00m\u001b[39m)\u001b[39m\u001b[39m\\n\u001b[39;00m\u001b[39m\"\u001b[39m\n\u001b[0;32m----> 9\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(error_message)\n", + "\u001b[0;31mValueError\u001b[0m: Os seguintes municípios falharam: \nASSU (RN)\n" + ] + } + ], + "source": [ + "match_ibge(denatran_uf, ibge_uf)" + ] + }, + { + "cell_type": "code", + "execution_count": 232, + "metadata": {}, + "outputs": [], + "source": [ + "joined_df = denatran_uf.join(ibge_uf, left_on=['suggested_nome_ibge', 'sigla_uf'], right_on=['nome', 'sigla_uf'], how='left')\n", "\n", - " if match:\n", - " month = match.group(2)\n", - " year = match.group(3)\n", - " return month, year\n", - " else:\n", - " raise ValueError(\"No match found\")\n", - "def treat_uf_tipo(file):\n", - " filename = os.path.split(file)[1]\n", - " df = pd.read_excel(file)\n", - " new_df = change_df_header(df, guess_header(df))\n", - " # This is ad hoc for UF_tipo.\n", - " new_df.rename(columns={ new_df.columns[0]: \"sigla_uf\" }, inplace= True) # Rename for ease of use.\n", - " new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace.\n", - " clean_df = new_df[new_df.sigla_uf.isin(DICT_UFS.values())].reset_index(drop = True) # Now we get all the actual RELEVANT uf data.\n", - " month, year = get_year_month_from_filename(filename)\n", - " clean_pl_df = pl.from_pandas(clean_df).lazy()\n", - "# Add year and month\n", - " clean_pl_df = clean_pl_df.with_columns(pl.lit(year, dtype = pl.Int64).alias('ano'), pl.lit(month, dtype = pl.Int64).alias('mes'))\n", - " clean_pl_df = clean_pl_df.melt(id_vars = ['ano', 'mes', 'sigla_uf'], variable_name= 'tipo_veiculo', value_name= 'quantidade') # Long format.\n", - " return clean_pl_df.collect()\n", - "treat_uf_tipo('../files/2022/frota_por_uf_e_tipo_de_veículo_2-2022.xls')" + "mismatched = joined_df.filter(pl.col('id_municipio').is_null())" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 146, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "def verify_total(df: pl.DataFrame):\n", + " columns_for_total = df.select( pl.exclude(\"TOTAL\")).select(pl.exclude([pl.Utf8]))\n", + " calculated_total = columns_for_total.select( pl.fold( acc=pl.lit(0), function=lambda acc, x: acc + x, exprs=pl.col(\"*\")\n", + " ).alias(\"calculated_total\"))['calculated_total']\n", + "\n", + " mask = df['TOTAL'] == calculated_total\n", + " if pl.sum(~mask) != 0:\n", + " raise ValueError('A coluna de TOTAL da base original tem inconsistências e não soma tudo das demais colunas.')\n", + " # Verifies that we can do drop total and do LONG. \n", + "verify_total(new_df)" + ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "
\n", - "shape: (0, 5)
anomessigla_uftipo_veiculoquantidade
i64i64strstrstr
" - ], - "text/plain": [ - "shape: (0, 5)\n", - "┌─────┬─────┬──────────┬──────────────┬────────────┐\n", - "│ ano ┆ mes ┆ sigla_uf ┆ tipo_veiculo ┆ quantidade │\n", - "│ --- ┆ --- ┆ --- ┆ --- ┆ --- │\n", - "│ i64 ┆ i64 ┆ str ┆ str ┆ str │\n", - "╞═════╪═════╪══════════╪══════════════╪════════════╡\n", - "└─────┴─────┴──────────┴──────────────┴────────────┘" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" + "ename": "TypeError", + "evalue": "DataFrame.apply() got an unexpected keyword argument 'predicate'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[12], line 12\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[39m# set id_municipio to 1 when nome_denatran is 'B' and sigla_uf is 'MG'\u001b[39;00m\n\u001b[1;32m 11\u001b[0m mask1 \u001b[39m=\u001b[39m (df[\u001b[39m'\u001b[39m\u001b[39mnome_denatran\u001b[39m\u001b[39m'\u001b[39m] \u001b[39m==\u001b[39m \u001b[39m'\u001b[39m\u001b[39mB\u001b[39m\u001b[39m'\u001b[39m) \u001b[39m&\u001b[39m (df[\u001b[39m'\u001b[39m\u001b[39msigla_uf\u001b[39m\u001b[39m'\u001b[39m] \u001b[39m==\u001b[39m \u001b[39m'\u001b[39m\u001b[39mMG\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[0;32m---> 12\u001b[0m df[\u001b[39m'\u001b[39m\u001b[39mid_municipio\u001b[39m\u001b[39m'\u001b[39m] \u001b[39m=\u001b[39m df\u001b[39m.\u001b[39;49mapply(\u001b[39mlambda\u001b[39;49;00m x: \u001b[39m1\u001b[39;49m \u001b[39mif\u001b[39;49;00m mask1[x] \u001b[39melse\u001b[39;49;00m x[\u001b[39m'\u001b[39;49m\u001b[39mid_municipio\u001b[39;49m\u001b[39m'\u001b[39;49m], predicate\u001b[39m=\u001b[39;49mmask1)\n\u001b[1;32m 14\u001b[0m \u001b[39m# set id_municipio to 23 when nome_denatran is 'C' and sigla_uf is 'RJ'\u001b[39;00m\n\u001b[1;32m 15\u001b[0m mask2 \u001b[39m=\u001b[39m (df[\u001b[39m'\u001b[39m\u001b[39mnome_denatran\u001b[39m\u001b[39m'\u001b[39m] \u001b[39m==\u001b[39m \u001b[39m'\u001b[39m\u001b[39mC\u001b[39m\u001b[39m'\u001b[39m) \u001b[39m&\u001b[39m (df[\u001b[39m'\u001b[39m\u001b[39msigla_uf\u001b[39m\u001b[39m'\u001b[39m] \u001b[39m==\u001b[39m \u001b[39m'\u001b[39m\u001b[39mRJ\u001b[39m\u001b[39m'\u001b[39m)\n", + "\u001b[0;31mTypeError\u001b[0m: DataFrame.apply() got an unexpected keyword argument 'predicate'" + ] } ], - "source": [] + "source": [ + "import polars as pl\n", + "\n", + "# create a sample polars data frame\n", + "df = pl.DataFrame({\n", + " 'nome_denatran': ['A', 'B', 'C', 'D'],\n", + " 'sigla_uf': ['SP', 'MG', 'RJ', 'ES'],\n", + " 'id_municipio': [0, 0, 0, 0]\n", + "})\n", + "\n", + "# set id_municipio to 1 when nome_denatran is 'B' and sigla_uf is 'MG'\n", + "mask1 = (df['nome_denatran'] == 'B') & (df['sigla_uf'] == 'MG')\n", + "df['id_municipio'] = df.apply(lambda x: 1 if mask1[x] else x['id_municipio'], predicate=mask1)\n", + "\n", + "# set id_municipio to 23 when nome_denatran is 'C' and sigla_uf is 'RJ'\n", + "mask2 = (df['nome_denatran'] == 'C') & (df['sigla_uf'] == 'RJ')\n", + "df['id_municipio'] = df.apply(lambda x: 23 if mask2[x] else x['id_municipio'], predicate=mask2)\n", + "\n", + "# print the updated data frame\n", + "print(df)\n" + ] } ], "metadata": { diff --git "a/br_denatran_frota/files/2022/frota_por_munic\303\255pio_e_tipo_2-2022.xls" "b/br_denatran_frota/files/2022/frota_por_munic\303\255pio_e_tipo_2-2022.xls" new file mode 100644 index 0000000000000000000000000000000000000000..fd37025cd0a73890779470bcf62c330fdf17bd2c GIT binary patch literal 1183744 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°#WVffS^hdaY5pVtF+e2! z3`u`(q@NM#wY={Oo$t4=(v(n7*bfI=7h)w!Xrp)7W;@y`@xH&Ak}^|q^_J%QLJ^rn z($A9g7e@M7kq*5U`c`L7>j>r*9czx&>W=aX)R((?eYOhB9%A=bz247XbXFs8KF>zH z6iNG#bhVN8A!+vW)u4ESvu)K=W4o(XA=kG=U#W={X*=g$W!O6FX5ZHiR$J>PODDZS z{V1JP3TKseae47_%ng5)L~9p_;v(tiNcu}7{hVxi|DDjWzOjVT!3RSUhKG934*eUT1iuPA(L>!4VV zJ-<-RszLR0b~Bo*o%;H+t^Ki#J&W^al^aNE}gyEPdiC^5w`8ffd%AV@ywpnN-~-Y2o;6xM&$e~hsd z&eb)A{;9r?nN%eGB1wN|q+cXy{o$TaPd4!x)<#W3S$}N;B;D5`oj;#P*^64)PPDGp z@igQgEkIgldDUMz6A~MhMd#bBB+V#O$#+^~eiuobNV>*In@HNZ!)JH?VyR>AKjJ*q zGx{Fn7t9W6wm0LKjBQ!Fe3$b&X3q^rd%pQQl-cJcl&_tKRCX+L+&k_PN_c(hb<%I^ zF~f0mz_n&m%sM0Kmq_}1BmI)@e&5@0Mqkv7e<7_O5c9Rek@sIV(X*$FZFwv`hCPe( z{?xo@)MJd)U(6dR=E9M5Lz4c%NH-*DHtA95Tc1{tj><8l8-lcbD$<^DNOe?C0ri#8 zc}rRHT%`W`w8Op-OSMJ~(qpZ72P4G{J(7Nzq(|BF$}h{Noi{>9+xbzG)xbVrJCV#r zL06bru_WW9L298~87!<;iOWBy@cj);;UD$nUJC05k#r-H{?Tl@kw{l8!WpAE3)R)y z-!h;kjsAt_KwO`+?)9P?(-frURn;C&<cK16`k9~)ZR?BzQLtZ`_Y4HsTNVKl9l%s}PNMS8lv1$v? zrOw3Nx3R!_6xO36XR!-KVFiT@bZqiYuE)G>&qOLat7=f%aJ}L;LzC=k^41 z^Qbd5?(=Bgqp(UANxw$YKO5=SMEaF3oUxa@G+BD+rKDT4<mohiap=>Id9|{VVk!3DGOboq8{l>5$)omA zEa%gsJ{OT_5L1@1_k#vUNnytg%a}jSpIKl-3)bHgFT;FnyQ7&rS7A$esp?t1xE_O!kIRc+Mp+g>}wIx-m)rYNQ*> zrk`PL@4LHi&vh!~Jq@XS-BWd{xA6Y7q?MjmpyOG3Ro(rz)2WrV>z<8#lO*&jJ;y>K4^(~xdA+@4UV;?WNz^c& zskrF#taXWzEjK)Kl1;HD97(@H(vOVv8?xyUk3rwB7Dui68#{Vie!?8cy=Syu%>Fa? zE}qrSGQ*+ZZ4vkt6I8|s?CVelj81wlJA3*!xgXnKFGHcvgU;B+X-2} zgzP&B*(M3ucN4OfgzS3>*`^8E_Y<=I3E5@|+2#q^4-&H0glvn1Y|DgftAuPoLbi26 zHZURECLtS?kZqfgZI_U3pO6hs$aYA`c1*~2T1$rKKxlul$CcUR{$V|?tRDBy<>)o- zXCt-VVR1DiHhb~w0rH}QakQ1*&AunGNz{<xX zJV+${Hc8hp(r=4&mnWd(uS=q)3Fk0R-~ZuUs8S*u?9FESqR%;Jh z8`c_@^TuXbj$vU|tT7CJEt2*l>AFVRPo$Gs+Xl|2^>)->;(SVb!0d^nY{44JwENvx zkyQ7(t3cOy(k{D*{QD2^*6IAql_@)l}#}QMAA)2x}K44Lek0|zd>#5yc0=REJR+b zB2RW9-~W<$v~@c2e50na;Va0uv9;EYjAcq}KdU(Z(iPW^a7V?yB_yL~7%4`kNcvrp ze%eUCE1T~15YAXri<%TEX*SZs9+g#jRQ`s~gVi3ia#7|S(c9hTu_L0+!fJu^h&O+q z8RKOnZ6WFI!TQ*7)k4zxf&qKVvrio@_dZy`u1b-4JT!m76siTN#h)sif@` z_1@EBzy>AOuUsIuh@_j6^s`2~DM@=?`$^E3ed(E~bvUh-u}3dtT&rg#vRB)A zC|PB@oBJa2i#XdVjfooS9J_1|tSk0&N?DUvRyo0JiijtYexIa$jP(1m>06zsLC<@| zVs-X|yfHS_y;E#jXWJ-oTqvwfkfQJoh+o6Ow4@kO!k^Vq7eV6O2+Kng{Tlek5`j1BH*Q_nBCwd6n!gYbsSw zZ-e zZD!LbN&Mw?vFDy2vyMo*1xdePq+5t|kDH-y>IG4&k&>&6Tz>V;*8I3;(nDXI>B_c> z8tjb=Z^y=V${rimT{Z4wE)+?(B3pmyTCFw2AdlY79k#sAPHW}$wBK_y8P+PX^(~+f}o=M--pM4qRb1&gh_T|3J zx1S8jr&J>f%$i zO?k}jY0y{Ng{kbK`$#+XU&h)d@aV8uM$bGfdem9G%7m43e~Q^`B;A^%8ye}>BJDE= zHB{73q;-4N$t$lPzN#q6D%0ra8{28gYEe7I96OQ@BJgisnnIqC}+&b+syzYdjAf6M1lnE6N2 zZAkj7FDvTXMx?L22(6barEcoTrZUgb@k2dZIVv8tIo0qW$)?mHFJFVS>dPF)@`IU* zYoNH1E_0D^duhVappF;ki$9R-ht~0joJ3C0SmwyBKRk|N8Zk&D-s*m^FiHCw>0sHkdM(bV&2*X+pVOv#yQc8eS*?#_R4d0|`@ZguPQxJP z)e=S5*!LyRBNVK@MbaHe`ZXinL8L3XpmmU*ml~FupJylALPp?BE7bTR8NF_ zud^o{ehe--4PsQ9|22E82}aT#Ns4!vF*n^&q>~px#~|EI{0pf)yq?MLlll67-9` z*vr+kD+jQru&Y>l0ajtD~U5)gG1SFNNIvtvr_~CNBfBLh50 zB;AFi-!Rf$M7mxlSbAt3v+2Q*C?YB!%e-P5Q79H+e6=3$M321jmMp0*U8@z2K-Ib(eBi&V`*KzjZzZKhkI%}qG?Y%Oqu}*y#xU@IQJkRx++HuHd zqj(m}Xb*v{yNYy^c+~EkM%(-^uVV~|q{B%1Eh8N!(nVSgn(j1lJPkbs_3Q5IZmLe! zp!jtmBS%}2^H!5JeUG9xW0W3A@;L!UrbxOQNt=yyH<3=^49m}6>`56ll}{osTcy<_ zf5VYq-{7rc3 z)-QMk^|U?2+DN*37W1UD@9;2MRXyd&Jj&VW*yYGCTu8}&OsPS8TC@VMvuwQJQR8LH z4Rayc6tP7l-Gik4jC2o?zWEwz*!_W6kKUBh>eUDIL){nXDAI09%10pojYpAY^l+Mg zi9&BWRvdd_H=}szx59ivq=7FG0j*;$3(yXJ-Iu{{TJ$20q)GHXL>M5U&TI|0i z%5Sm^X*)*;|5XWlcIDgYfT-W}=xF{v0OGJnx)(_|G19%%PFrq=j)fe-jr2%rNV+#kziXs>i}aPnsM&viH`|vi zw5jb1+KLj@pwWi?XFmI(t!THnGRk|K`n-{ra0U7LDq_}1I)bDvMmj>I_tsFu%IUEl zdk;mi6i3#=%6Wd*!dcz(aF)s!R^W9Hycd=QJ)`_q9!nvTj->mL^m|6Sk4QJ_L~Z_g zRd|XJBwCxcIhT($l&6={-$T~(s=_lL`TU)zM|6$;RP4EzLVO=d+eo^pk+zAnooi2p zzq+swYoPAh1m+84Atm&NQ`qax!}>DisG-<4ORz!Fvg-SobwtvAN&0;w-It`5zrGBu zqd9|>j{0oYvp>>0?{8^3C9I*$QNGG6_&Z|;c~2WJL~#PjR}PJ5723wml=ndzdYwoy z7mB1KN!s5?N6Mxz)^WxuxAAP&ld&G{;nvDUwLKm!oxwcYz+}b@`odkQEtaWNncpHx z3cEFRHEIt-j1)7pNV*?MH#5@xNSb|n-LP)e^V%Py)~|9Fpm$I7EOW*^Ji0m37WQ{N zO?&>QkPOla*ZioV|24=@ok`Pbuj9*@?p`=B9nmb8@{IBot%~7YZ+fgIM96OR8 zK+;2v^Z=4pI#)r*()*$&+mSv3lBO$=)@e1>P*oe;E6B5FUck}S=OQgB@+WD=yHa7F z)KgTyx7kQ}&$9e4T4UxPNe?9HSR*}wK1keT#qRNU!_- zMf%rH=%{J5p^iFZPqiYxc`HY z>rIE?Z$2)g^#NO@7oBg#lCZypSXey@Yl4w~+H>aLLJgI!-^F_N;#jD? zU{l%OzN^ucHFR){sGSzdXRp75vqsZ<*fVsNS;@B4CV!%Kt+p>lTGRG9onxd}sf?tD zk@QHj>0z>I=}y$PnzhMl{@I;qyt*Napth zD_W(#U{kgs>_4Y9t*;(g{X7j--7*w_cdN zl!rTidot@U!H(JNXHc6~eD$}1>?@{Ig1qOD-{R=E9zyD$hU?3$+Fz*mxH@^C%$oAI zyw;(Y87VwSBt3$p#~A4m^0$X}p`QL1Bb6paB#K~aoE<7&v3fMZGY%hn1J62?sh|IC zNr|i`n>I)Nrblx4Ti6tSEs~BW=|m$PFVc-4g^q(c3zUxTv#519q}B6~+7l`1W)x7_ z7xGs+k&d2@)X!b@1>eHmAHXuwpj0EnZbk}k8%d8O>B~VaR)UWd>2OA_+LIts)uZ^M zGLALu;_7K)z7^>NUWa|IJ4;lk}mk+ zcS7G^xJ%!V;$Min9(x5^H$)VjUG}q(R)76tNYwYg^C0r87UAelpTb!KABSX87t26H zwgDwSSWd|hq;<`2akNx977~3Q<@lGZonjP^q{oo-cq2VVHobTS&YR^{E^K$z&X5n9 zj?`8NG&5qhb?&NvYWY1MO_vkns@+wCpTHMysb;q~k?4?dm=GS3*+No{psMGHolOCmEd>9HdH`d!dBge}f=R9OS9P&tNq)hvsQqhvp%t1f4LB+~2v=2=E7g#|j_ zyQD|nHea(w92QBBBWb&l9w*Y_H=>5hMX?@RW#GNmQ`Ew<>SmUt#hcjo&8zJYHP~0x z3emMYDpIwjoD|VvBt4#_^R4e6FVdB)&F1vdu_d)qQ(cy7b@kBSXbz?CLf8`?-x9_6 z?~vwwA2DkrJ%OZ?%%&%hwEphfpqTM!Wa&8v`5N0m_qE8E)n|Ae6J|idwT!HrQNj3y zA4@{>DTSleDU?h=s{UhZHL`@PsX6!&)=m*gN755XI@w51luh++d0uXWFP~ zGUbEf(a=&*KWAPOu0+1ho?cilRIBtos>y38L4&CCZ-ODdkEHD+J;_MhMf%D;(D6KN zr?V?ZQY$@qbsF*-xiV2NP2~} z(@7#-&M``VGe;~ocWp*JHLgF}->WBuc|*44MKzR>_bfb*)Y#eLNXsrSJxcS@6my|S zI+>(X%%+n?dgwCf=;SQlY)U#sdL0~13wtfqb9Tg8BbFewcNNv{R6j@GjGoNygxaQO zR6g(fn4v||lSq29k)9;d?S6~e)_)nPwAx=OKOB+`yO6fJ>(KKIjbmfp3P-c+9z~gK zBvNTmpS1CUjM}ZLqn1+MGtGJw=8chb3Q12f(kXWL=})^f=iqf#$!M#S>c5SCn|D@U zhOzaxA(7PlslWTW6VzYe&Ak+6vyt>EP_uq$nc|6kk{;rJd>!Yh}+)>Y)f6X3q>_~bFNv9g=DY9wp4(OQaR)gy5Ma_`g zE~VXEJ+yB&7Lv+UNV6k&)c5pON_@-ht)1pyhQZ7~lAcP^pRJ>q|5TA)&b!~2b5PmT zMpND|y}hEnb9UGIL<)U>&7Pz2%B+lfx*ww&NhQhmsbD=Kl1?S*X=c-@A|1Z~H8)LX z{U{y25X?L^X{os&+0*?#XluraCH{>Y60+c}X;aQJVsQq$ZC#P6}G?Ix0*PSP`s^mN(um6gzX2ECEpyJ?V=h9GU_C|^0664s!%E_xap;d27NR!2z)U<}StF$=^ z_7<%;xAFSQ@)d(!8Tks|qnh1OF)Gd9|HtZEBt4U)XBp|4B0Z1yz2oYr$)b1m{T@-U z-RU}P?ovVdq4SZ}kL0<#M-4qy=IPJOjsxORlc4Y&l%PDm;%=d5Z^RJMS4J5$RCtQCO*rq-T>f zGt#p~I_Npn{OU5KV$s^a`h))VgIc1FYDCiRskt1Z?C(LkctqnuRhAVO?~pWDD$-B- zeSj=n@!HP;&Pm9oCuB1cvY83lxe3{?COMUVM2CILUwIJcHLSstgoW| z#U7Wj$DLz6E@O|Yzm2(TcIor6$90^Ay!v;Ie(EERxh3|IE*%|%v!>TkvYS4+eooZT zgC~e3dmCRpj`OlYk85R_e6J;XMI=3kq>pZ(SnC}5h9?*iG-mR{X zN99FXkKQiSYEa=Bq2j@f+*wU7FFi{0_XN>bBk6RKPB)uQCu!x=KMOjttDcRT-eL5W zF>3ibXHwa;cy#qlkgx+IXFr>SPV=?UWCUM{P%X3nUA#p`1~7VXv}g0L|_!Z(r7;wiH$o z6c@m+MbeohooS>qWz#FWq3=RQ2eL?6cYFZk6LA6OFu57yZL#XX4T2`c0t*Ey`u3ZgXQ<1mpP$afDB;#t7 zABxmJ(<+}#Ij>b`^|sqCtij5r7y}~dERxPL(pe&X=Td03eHOHu-Cx=wQ|#jBcCtk? z&gwIZL=~n!UXeuBlunBk6fYdLBvZ&%6`r$)4eTwCiWoqTOH%7lERO zJw!))PKRVA7_)VrLOy)yIi%%rNUh9C$oqYdg`F^BY(|-Ef{|jpjHI(kI@?HR%cd)y z!5RI#kgA><{iD{ySFxS?ogWs=uv;?(YAI-WYaFTP|XpuA(5qa z6!V^a%Xrl8KF7eY(xASNI4qLRCFxuvolDZJ#=f-U?NO87RFWs}V(%_ISLI#S9lx9{ zCu0vRx!FtUFlzI3gQI@4vb;gQiwV(TB)yQN7aHk>vgzHtgS9Mb^8K`2rMw)ET0Qhz z3&?2e8k@Q@YL&7Y??i}K!kw^lB@t=98ibfNlFlRPH|=ZY^F+GIjnJVl!kVUosFjgZ zX*~0O1xoi+6p9cuQ{99mMWGhj>?G`;1yYsFNfAj$(u+ts&un@TN$Wp&8~P4k5w+@x ziAKi-jQ6_Fh)36`oem9>>@$oN*XOm?b;nu1_Pd6i9Ut3Kv+@EdE%EX055)J8w1cD< z8EJ>w>EB<5zMtJ6wd(uz`tr~7ByFN6S3SDdl><@!B>K~PN$S_ODvZPIJptK{zO6vY z9$P=gdK6|Ik@RAcb{Of!y8B}nqt5chk<@&<+L6Ze(ebE_0y{#oMtw;>e?Tl_jD7?q zSAkSlkl%gGg(B%CB%NX32e?F}6^@A7*)L7nqZr1yz|u04^?OpbN_nyaIm_-ik7Zm> z*X|nI`zoSVmQh|Q+k2M34}ck3B)ycRb$hmQsYrKw7&_4|GLB3}qQvY^C;z=v-g!zFK zDOQvs>D44%V5C=*w9@q()brG9NTq3`#mHx;Azic-=|}Pmw8AKkW_64Um2Ka^(Rc4b z+Q#zI&^jHG@>xhFu{8uSDy1bVr&~M4I#(oJNYX2fbfIjjzecXV?qyolqnc5VJ%ijO z)@lBnHXS~fWf%h#JlU=+-`AZ*ZPH&z^EVf;`u4@rRe=rbY1feSY9qZyq?@qsTU3J5 zC7Valg0@#`3s)!0Xcg+G>idkXH6j!!tan3aK`sq>s+b>Zf|2xEk}fpTYehPZk+i;0 zX!=xh33T<*Wc2<<^=|}uX9rSydhW~cT$_dDL}}iP4zkeS=r?)jG;NKcDATq6T|^+50WF7PExA*03MqlYJkc7Or^h z=K$9yWQ!8A8xpd`3E7Pa*^-3pri83BA-g#tyCosJH6dG?klmJ$-JX!$k&tyIWOpWH z%M!A?60*A!vU?J;dlRzz60+q9+5HLG0}0uK3E7H-?4gA0;e_mwwPf&HXn(QC)!5^% zG2c*AkK1bjdP>jPvA<~jM7^V966K0W)Z>)WH`LC-QQP@IiS;SPUEYfoJVz;x^`fNP8F&*qfm`+efR4X1qUAos379Ud#Fwj}3J!ja;5uwa6#uHiZX? zq&JYXW~4WeH0yW?HT2`mKo;panRSjp+Bt{$!F8q)SM8gOM%~=~Fe-Y47-xG^`^BiF%REURo$oovNSqn#%~r z*0{Y*Ri?N8u3A(kZ>JcUBI!*eU2LQ`iFEump!hH&i*)S4Jgv}k0`r<%>8N;VQ=9YX z$|$kBuQE#gS<3q~pSxnbjHI0;z0pWJMY=$J#z+0zla4mB=)SR)sSPrg&PKAlRtH6) zbwP{S0s;Q@l3JvVQ9P2~OwuJrdb3FT@D65^S)23?h%{nSZUPs$Zl(e~xzx&>r zI;&BV%hjV0TSU@ZNP3fz-XhZaEOH$h>HJ@>wlA$TyQ8XsX&Xm2TRGOa6m@_1waTCtzc(4ZzcK4T-e)?Gs$KgQqB6cmHQF@SBT~d+ zk#s3ZZ#L4UB2_G1b#9xEb~I zVN|3muN(=9zOLA%D`@mmwDPFSSn?F4g*}RcAZco+TwL^dMa%MN{!|^2bR@llq)UzT z4w267;2B3dt64xr(f)Os&as`rCZ*1yCBcLS;x`WIQuP)Mc%BYu|N@+dLy+JY${)vKUu@9 zBa+@p(%X&nPLXOKeZ9@qBdxN_aLOC+og@=@v{mOi4LUbr*;2e3U3b1C9CM*ax{RcE z80j*R&RmQdTF;2}_~*U$T_W!*RX^`__fbxVhOI@`a7#KB&|$9NgHv!1=Z6FbkwPHeVX5W z%&{Zsy(C>`r1y&S39bRx7%`hghEXfqQAK{hM|7g#h}8c|l&mPav3?cm3$BzJ{2eb) zvy6E2F$y#PNO~Vh?=sT+M5?dtXqU2)$`7d*$@etIN%XLz88g^ET;J=I--f(qL6+WMcB9bmA>D@-UT%@aMm#)*Irk*PEyqmqQTGC@Kn8lLfQtK9%#Q;%fusm#S)FtHA zTJpP(Rgy@0KS}Q~()&f)!T8jkIZ4xCYE?VsDzDy9F04Ybp4og(S(n|tO{K@%&gVUE z?oY9H6GAgn!fJmDbfJ_Q|dJ6s4W)I-pX$yI+yCIc^8qf9b zYnl%cwNhSd`EZ+^V4W+Ht{~}sX44h2>EcUJgT1vY9U8BdKY;ab9x22k-X2B;HWGWg zlfp_mu7X7J{O)7*Es{P&(&a|_kVrS04+=gj35r7LlK;|JeF_=92T~dK8GGigzU2Kw z!M9RpV~>)ayhmY8Fp@q@()*3{VUhN~0xV6g?-#x_Jd&jJNp>BgAgOj?WxUsgF{(E% z(J9UQn7kBLDkJG5Bz?e09}(%$MI_bOEgkeg>gl$&LiS`r_EbXlbV9Z=A$ukvdp03^E+Kn9 zA$uVqdodwcPRQO#$bOWN zy_=A|x0Vdg0nq+pkE^rCJ!n0yt{&IUai~6#y+-||+2yOuH;$z2LHf#}%^JPu%KJTh zqI5P&B+uhl^omIOC`nfs>7yd8Ed$Ha4o4@?#hPne3$zH;bh9MKiaAS=U(+}fZ)O=! z=e@DllYfB|eKnFkM$(6j^f8f^wG!ZG*&4%C&mpYS`&-pRD{F_d?XW1bq^IztCJ!{Z zmGhGFx9}j5^l_3tY^0Bibo_Owq07w(OG8+v?xsk+zvY;qI7WXRqIw+5Z_iZq>s;?| z0^22rq{Htr6$odJ^jl0M)2QP~vU zHj+L`(z=m8Dbn_%=1Lx7&FK*w3@TB=j8e3&=r1|PPMy5#mG)W&b z(x*kbx&yXQA2*NUd{SAfnLa91`(kUYPNy9;*DbU}%5_ajd+S|!tcCG1lCC7_<3_qt zr2R;0JCUf>??|x~$->+~EuXc)2Jd!>`(kG1c8Ii7G)ZcU_ zYL-p4J5gWYwB5^t;!%~+mo4ls35@1Z?;m&_g}=8fNh5D=Q^XdL^jVTVX{67Jw9gFG zV|Q7ay!YIl6uy<|KC%_7A7(1!NgIiJyZiYVg@`ATK1b50jPyB@){lG}EF0WSBG#}x zW1eC;B~ylko!61(HlH;gU@e zNk`I`Ncyaiz9dq$O4}%`C4}8dTof(dSjhQfsG}p+(YHN&143zADmn z??OFovsoL@uI$e|{lDI-wB10`tx7n?EbzDw`?seJnxBGI`98d1EAf zjifIc>1!hWa4yd9U;psWs_UAmcn>RHT5YuE3-sZ|?~;;2B`s}~1Tw6$sz+fq8%bX$ z=}SiXx=3$X0UdhFDx4Ye)ng%1%~j3^OG7D9owCkgNWOYA(!PpPcXMUbW_<+a;xpBv zHM+1yC{oO^Bk3C??KaXkMB2gevOdYx(-QNx&Zj#rMzulqkUq0fvZgC*j%OuSs1tX; z1bgIbftdM6(jSuaWh4EeNROjMTJ>B?R&%|$qSZ4eF^dcUSH`H%cH-*_q(NMsPS>iV zh16_{^@vEiilna?=_+fd^H68cIHX45dO|)Tx}$2dwCU(slq(Wxc4c_fw28}87xTLN zSS5+1Z<6#?BYjh(LoY=Q)hVtX`BPfKb}!4O-cnrmT{#nH+51@DrgjgUPTwcJp4^{e z?Ix1GMbg)d^evIT!)K%RR8rSZ4cZvR^KA& zk4XAMBmI#`M?49w3%HUZ3VjKx&bWOe-QO{;X7ysuNKU;Q@*4e|-e$7v;8erf!Z{2U+i%`>~U{dkLyv78^9hnAw%Dh57Il;*$_xt+bP!^QN2kiJ#ef1 z*U2p7`xnQv!kWB!i_*un*h+BOycl{#B>nOKvGy)-ehv5k|Djr`OD#>?v{gRcqDxcV zL_`pLL_`p=a*-h7lZ%LmSV=?>oUDiy!HOUVKH?VYvLXmVKkjiUOSMg1+C^w+u+$~3 z+kalK*ZY_`+1c-}|HnffkIxwIGv__e^PZXayl2j3N&1SBzAn<~oWpVvOfYZS-bi~d zmVmCFPlcKA=0&+hZ049(i&QD7>IK3C94eCTeWVH zFKutNkTLXJdAVi=co0weCP`m2(l13c;5ByBa)w?(?uB9d}fKoqvhu7$j${hmI^8>4DqthMq&$jf7S zlvcJfnp}^#VavT48;p(Yt5g9guRykI*4Wpm``_An z-L}cr1enD=={qES(@5VD=?spjQj=%No~wnV$fri^IeIbf$dVi(`W~+Bu}H2mYU>=k z*PrzwN;1!n*us;(OVU+F`mRXVvac174K#IQp7o^iUhTah22ouM5i$>g#rqC-#m9!dXcr0Rr4+&(suytxj^ZrpVghUD#a!m z_2JdD=L(O;ND;Go()UTa+DP9QX`=P#s3I&S9f1$Gd#t&!fh$l?Oi5}nQ`k@2lZKLf zUN%J}?MXi%={rXH0ZGeC-g1oTdyjk4`uWJ~*}jh!Bd>3(={nNUkmx&6tNx69uRD>Z zie+@I>gn{wdg@l+YBo!#OfQ^OnP{;T;(JfpM$&hUv`sd(_W;M^JkzAzAnH@Bn!AUi zcI3F$J))$FwGy8O|k0mq#u&>UqOhh(#1i>65Ayg^%XB zp-ojj^jjfys3)7Fux|9EACvTbBmG#U`*1eZJ9gGjC!yxz2&9!6q~P9<9i>HdpRg-^ ze(7kI*^MbF(mu#%tCqy&bI)(8r^~Y07mTo)^`xJW^aCUPM5G^c$Et}vPAp+eY`d1b zdJ5y^4D;AL$SWFA><@NS))W!h?MY(gt@WkT#y-~Ap7c|awi)TCBArCLv`r6KwD&^~ zP*6O;+0iIeTQ$npF=Di*$#)7g^k9CkK+;j`XU|z<uZ>K)4P|c=_ zPidD_^JUMVPK^!vhq^N4CAEj*8eNC%TN|7e_F|RMY?9rt!hVD&T}#rBjC8F?yUc+; zTaieIVh83^_SVSSG{IRbH4ZhWg`-<~{+Bcx``9J%r2ir5zm4=iB5h_1=I#OoW7eKv z2>l8f75Ue)CBk^tdPuIkBZxk!fNTBc&KmY^Jn4T)`mvGzSEMg5!Wp@K8uU1eP=ax7 z_y5_NeHY-|0_V=$J-~1*nPtgkdB>EoXKyTGN6C|ZPSQ_|^mCD(!dZJPEh~$ZO4Q1J zq%ZB}p5|98SEJ0btB|JZ1L4)EKWs@oqHE7CNsWzt>~ne2FG%{Sk$xf4X=Uis{c(}n zs+g^8Yt!yQooZQ1O6NgtUy&laG-Od?yR$?crr9$U*nRV)Uy}4QBmL6)=|$8xA<(LL zQ)6>9?aXfmx%1A5!ufovY$s}TSjERh{(2z$hKZbhWh~Me}2Rzo2=*l z@4q(Ul1eFG;`JR8M)Znzb>-`C*$&cyu7s(DzqU63)4yp9n`> z7HeTtc+&Mq`ni#=C(<7+h1N|}Cw16!iPFdUDffIM>reaOtiN23w4!&}gE>08OOK=B zm04bz{JhYeOve$GT9l|uUTKn?tC7H#w zc7+G=q~9Uwmqz*>k&c*;dRk={QrLGunYU-xL%*&%nd&W3`?_Q;d37Bfb9pPPWVUvN zU-P6Jkn}4f-9V)JYjF0JIGwGvie}qGSbuduAzP58E`_`(n`Slwi|iXpI?89H@V1`x zyCnVENWUvmiJT1Q&#`x>-bMRR`GvI(ha@ul;SPu0g2_o#kreU{9Kz!=F}REU|$lWs`T z^^9~wk#^Dws}yJrd{SCRdDwQUjqPi1=j_cg>Mc6jzI=qyk-2|Hiuux$b|UHeM%qcF z?>>ckX5YZtsIPS#^VLXK(=%94RBik7C|mr}hmdchhf9y5TxAq@>5566dj?WvbYJ4X6_k=D?r_7!94*n@SdhQZ9YAIp?fDMIVZGM$-9gKV0!Y`ddbN%d32 z7M^q?l5Sw68;NvnBXs262hiAObZyTD)dcmZ297%WhRs1d8n(Wy8Lnq?)Q$=NkY@L* z5b=1@jY+!I<{D8Oi?l`UtC6F#d$DHfwx>d?DbZ0&A+g;89aT$&Wjdk@%Vhl&ahNCF zgrwg!n{Fb~m6xH;!jynTq||5o1mW6FzLIIGzGaN~9|| z_LF0SdV2VLQ%5o6f;!S$InWtD8_0xL96`a_a#Vx&JLX}Wo(=&r45 zAyVlm2KWD0&}z1qA>F&PBzFi-UxIw`9HiO(_XK&}?=*In4`%`CVH>zuO*X~4(UW#2 z>83{7SvDR0Ff{e&9)yt|P2FtqE~2QTL^TwcC(BRnMt<=uN(KaFGz*0NA+)db$jZHq z6suWJ`XiG5z({{2(nj7@Zxx+%kWth&M}=)COR?svvq5J&g&~*pbd-kuB#Wf6#`dH? zCh2BI`eTvSH=(wYc66j$ktX%ovlg1i!^?w=}$;n zWu!k5=@<8*p2u!rZ9ID!EtN33Q}k+HH6Ya;p1JJZ=}4Zd{;M)P*J4{ra$ge-uOPes zkNpTw+J&T>8)+Aj7A`2#br-~D50u5nX=Xev(o5?lyv3KK1 ze@4EzR<6YzQ}$J; zf{iHbb9vG&N%|ur-BP6XzN+??q}6P}db%@hUk^(b$Ma}dz9TNlV@K8c*nRV)zaZ(4 zjr12HZEiwsxt)ofSUDY^`dOv$4;du-I}CbjC5;} z>g$90>)GZ-w1QJVJ+Xs2IeymC^V{9?0!xZZjAD@_SVvebl4C@DoA&_xir-BHKP9+aV(RO+?l;BKvJbwqr#0yNIkdBI_2Bb&tq) zipY9IWIIP>JtMMRBC=i)*{%`UZV}n;5n1nuY>$X+&xmZVb!4~?fd1!4T!AC*r#9jW z8gZ)_xmE@D0qhx2`m)Lxj-$|v$@en)YHP&N@@ST+WvX$cXr@mf=_qE*p0mcN@T9*a z>CcSxm*#IZOZ5%3Rx?i`+h2{;gEB>VV=>YL=f=ILm3A<Q=-4kYwr(mJtJG^ z)+#FBzMp1tjVR2Qp0tLfzckVsk+yN4#GX~t*}+J+d#vr-j->XtQ0aMdf4?l`%80({ zGuhQRGW-)MW^qrtJxQyLbbFCDUJk3-w~3`ydwa?&Hf`^LIA&_-H|(jLaO}5l{r1-? z{n_dTv4tnyfuv8_w?TF=o2svk2Cw^vG^{g-5bdbh3+0k1y^fw~?$qT5hd<*NOR=cw|4wA9-47vLmTI`{^^%_0=Ute$j7l5S_DJBqZx+FB7 zNEg~P8~cc)J?ZaA`fDTook$x~)KgS+Cw;-ZpAI2KXfM@M4Y_@5qYul3BT9P0G*5>% z%Z{q`5#M{#T9VcnX{|{6((~)v`#Rgc0i~M9lOps|s*^|C&cadq+eMtUtbVn7*!mrk z+K9rc!;^L+>Gnq2O{5zvL~XSvkx18R^S(PXv3;wsm&v{)?Mu&)s-M;d8pM^O3y!Lm ztc+}mwU8(6PSPEWw7W=$H$q2Qwv!Ic`_gm>YY6S7GL+aCnsjAh4^f#Uqzm(jtI@2V z&HGrPdD5Lo`WqwNNu(>-`h|&srr=(6MI$O~eNoV+z4TP5?x%;bf!aO1zK+IQHb-II z=t+B!w5yT!AZg2+pMml0mp$pi%aBjGb5gh$`P%tBs=1!luONP^%zYd34WD9}X)MF* zsOQ{e-;v{WhhO2A|0{83aS^UsAFEkUx-&_CYot5NrY)RJTNSyC{Ov?mJA ziq59kkMN|uNLp*8y-1qA^#tnae=Tcc4J#X%rw3R;KV)}TgZj(tEgRgAlJ%z{Ega`H zB>k9I&(T?d=QA6q4-~DRVwc2|?n=^bM!Kunl-@fDpNFxL&e{eu4f~*K*67kGl1)Ra zSsUzr zEx(HA_Vya=&7W|-s1A+>dfYd>M2a0HPr5rvcQVr5MLM2+Ev3(}b_wDUdt;Fnw4UP0%hAN6KJ0UO(%vNPVWhoDTG{G-)bRJ`d_8NgMqYOXPijWKlX{5g z`a)8~l~q>0hWw-VAq}6WD)4#7`cojczZf%udGYc((nBFB%`lr{_sx^;LDHR#bPw6I zg?>Ja&%?VUt+MrYK|SUyT9?ddg52I*Q=Pl9B*)L+=%rr05)zB3SjJjK5w;`; zd;LbrDA>Jw@a^6QD7q_N_ddYh5m}#zY@dj%Z$!3lMAk1N+b<&PACc`JksT0`9T<@f zh{z6#$OcAa2S;Re5!oRT*`SDQa6~pFA{!c!9U74hi^zsYWQRp$heu>bL}Vi(vLhq1 zkrCNZ>&S2)0R7L8xFSbfFB@@1`G(=G7z>>r@FSvb2J`d{b1z3ed^fMc`HbHWNq_YM zj-J7ptRRn~Q7P}*Q#zRrRX%a$ErQ`Xy>zts28;?%x;II8HPXFBs=MxmASz5W`ZW&> zVGW_brCj$k7tF=cbTrH4<~d5_nZ=%))p%6$EPlmU^`w1Bx|@;q5otOV=Y@ZJE&Lmd z_TA9-o}LsIU+u`6!!kK8M}U7FrHTvSK|JX`B;DOe_YrB*fO@o6F?}_VC~r?rh1OAC zGv>)GS!5cL%I+P}<*!4e@N1s5FG+hFXj_m2uYh(-(e)G`f10Nb5KU_ zVB38Q9o>@JLZaMtB(Q{zW@}e?TTi+#N%t_)eMQ=r@k-?H1F+xOU3aywD3lh+G9RhU zUKVkYg7Z`MULz&#BVg&t;sVS8p0poH_cYReBE9e~)VBD1q-ybGB=fAfZaVXvTkWV? zzZ&xCeD-POEMMNrXw-96VUpZ_>|B z{f@0!nZ~1<|3en#!xj&Ff@;Z9^;683p0qzni$>aCq?JjiE%$dzgSaU33F39S@DHgh zJB)J1U3TY3M?*#<3N+-YMT%M6lkQK_y^VB#kq+njq%~ZhFqXFc;1X+S-^*BA$_Tv3 zxH|U)ut=*rq{Fp}H``-DY~e`{AZZ^XJwT){H9=qY9WqxsNwmTfi=ybTWo08$6dK5) z*4KE~(GGfxwTG2qUD-2ihNDmb0()p;ZRXt8RimaccHugEQ=IY^SS<5E~ z%|GSr?lst1vY_-Uue6KJrijBl=>U@UHPQhh)oxJcLtSYXsrq^%_W^=F*mf#P+Lww# z(vVAZVHzII{3)VCPkInZr`h{e2Z{9hi%?tc8#Db$N>5|HGS{+BBmTLxr2!@F&89Fm zsG)}TYo3r-`K+HJX7!{4NxHAubf8FepC|XX?HJ{VB~d?B&0#$p`^z|@3fynW`T4M9 z`+Ur%h@?H~!6fZxqz8*sU)oBvMwM219p>#RgaU1(qpF9qR#OT&SKRhZal1bCkdP=G zW1&2=DdKxiT1V3TjI>Uq3oaqWgn&h}JoRbS9hPq8khH&%9wO583e=##OD>Dpv%Iugne&4EJ)N)ya+Njq4<%zbqU0;W*;G~zH7K7w zYl*dxCmlr6{f%^xNZY2couCG5Lz|kH!V1lk4kqaV zMmkue%NkKz?psS?I}RjEXfO3R_T0MDaWs2Fm?eYjus-{LQ)gZZ>qbvHgro-==@5~w z=1y?#>t%|ZXoZT#en=|oaO_*8)q{*3c(M+8bp;tIRpi@O>-%dXNfWs=OMSowR>VI&=Bq{BqoMWjcwHfaj(PFWvpZ_}3;Lwr^=N>z6kQ zTl|0Tvzbk?OX5inBWazH9wyQe^r!asNRnjccax;S{myc~S?+hX`^|R0bKI}d{mym2 zIqr9!`^|N~^WE-0xoZTjqZEx!?Wn_kjB?cfSYS?;-d5gZow7?_u|Q#Qh$1 zzsKC~arb+|{hoBc74G+x`#tS`&$!>S?)OLcd(QoycfS_*d%^u)biY5j-%IZIXZQPy z`~B7ZR=VHc-0x-gd&T`;b-&l#@9*yS5BFS{XTWS&)jdV`~AoL{_B39 zyWbb?_oe%N<$hngU-CWmRLwfd+H(9Qx8{9{elr{b3I2#NXmSnM0xu$!qH!&m6T@waP&*h|CHM3$Bv>WJ%Xfz zjPwYRwx(byj1EYvl}DNmX1=|3BvAyj56iS)!-Qvr)Uu`|+33eUrzagj(!oYLLZrRs zqaHm2Wga^4{pP>gw?1oYo`Z8s|4S?#da;bro$J=9T1R8|)sr4c(ji8Aq)6=z$uL4y zJF>;?jf&S2)2>s8GxDrR)*>0#jn9Om<)_2E} z0rU+e`FM`n+)mUGj;7Gx%3D!V;p)|P4YINBblM(f4bPP)NIJ?V@(majo^%vRhna5} zCDP)V)S;bfX$^OF4&c#{RAuO)>gD?s!FDubwI|JcH<4njdeYG(9d4wfMcR8ISei~D z5w)iB^xYvTY4>z5f7HAZy=yP7C(9}m`Yc&+mv(0vbppF*S0GY&5KlUWq=y;l7?G~# zE=yfVDm$`f`{GL2vZ_I(Z2ibP;wx0B8k{)5CM~k#-4(l1uR5j3EB8}__ zs0`WLM5j5XrsHry`*#? z%jZT^puu=UNs!NCEzC@w^ca#JX{5)9G*J&76r5e{^Y(;rdwa3xrt)p-Eg@;%YPhmc z66Q0TV!rgG<4HQwNXLuxj2ppa&m8gk%|^_(Oe1w~&#qpfw?7_Z++)w^$XD^K+?^Il z+P8}2*=`_aaZh?INsltpV?{dpHc;5#PvF_%H+RzsWDLEOMh-_*>vcG4f3GX-Gu1pR zXFEznXDKCHTKtOG!jn!QX~{?@h_vPicuW1EWUYdCtu7%vZs%l_QsH4yC_Xv)b z7cd>~HRvuz?#^Nle>Cd}khs6$r?HQS$CDmM(osfwoJi|Aesj-L2G+4R(sI^u8f`?$ z=bJy}6tpLUia!k05t^wfb!^%Vu_8_U|l*+$mk z45oMX(<51ilAKM$mI$vSq|WXFB4+iZlSn$&NGFMO+G5nRm~VwxJ)+}^zm`{EzACJN zW31&;oZC8@q~X}FrG$}#>7-Z7t|NhErLEffDI#f4dICw0HqsMB`d~A(mN|-ab~>E( zaHeXWfqZ%hCDJXM(#k8YfxJcS!7H=+MXLUzv)bEKJtQMVeD6u?NjlC*>qV+NdBxEI zOIWA&Pl8CmdRaBf7Zfe@;koTuP&fXqn})q2YkjObJn4xfJ;q2+6zT9AQO|IW4byrs zBzCt%&o71TsL{oUZYo4z7meLkSCo?((y(*S)^^U%P`To z(%C&=YPF|-f#HpL3flTIP&u|_&Yqzf8QgYD=@YmKkd zqUz8hs)r-Qz9OwQ2+PQyhD06ZGg7P@J?T`EPB7A`Bz^4U!rq%Dt1sBtrTFL4dscw- z)%h-M9lXk=>B&z*l5iAlzZCg37rV4DZ9{if@vB!LX>Dd1YS`fS$X7Vtk`nU6oBYv) z{;Y=mZPs!d`&i9-(vwJfoROYH(zF-3HsY))QhS4~0Nr&BNNq=u6nZjU^U^yH;pi8n zu^u;Hj@8bnttNuEP{^~>PT*!;^ z03ua8a&K#odvWxOt9b4{UW2~Dk}A&DSv`ZJlCbZ)-lf?TD}PUVGD(j&(v#IsYaW4) zj{}<~6REWa(glso2c$L&aHjl#E#4pfBuT<}i=H6~cd}|(MvMWe+eZ{B_9Hy$bdpXo z(&-{yz}YGHzH%S0)n-byR9FxDT4g#*Y90-_!ttZC+DkHRBE>F=Cq0FvpW9o&r--x{ z+qXQ%(8T=3 zXw%ZMK|R6#YBHSi>foqq?hJ|f{N6kok}4n4g-7%3vMF|yJn3m9tvAxsM5T4Gq6)ijnnZQ6JN%9ytu;58)uDYv__i7S&u&p}>#GJlFaK~H)H zNv9g=86xd{3$(6TfK=CC8I8Q|Rg_Oe-rlj~b*PN>2a?)eUmvf*y^REI7U?A4Xtr}r z56filgJ7r9lb%V^lZ^CCk^W{m&e(t}RB7tP{-ApmP1++nnp#zZY|#S}{VhqG7Y^`c zT2+3Wm*l>=5bD|6`O|OnK0xZOc-{K|Gb6Hwi0rJ0Y*s{ec0@KiB0DD{YmCUwjmYLi zWamX>b0f0zBeDx3vI`@!rikpKh-_X&c5y^DKO(y%BD*vqyDTDG5RqLTkzEmyT^W%r zjL5Ev$gYmau31M0zlHwiM_kGgH_b*|$`P0Ty3LJ?;?Gw3(NSXTRNDZ_Kbw&j6p3=A z=*?Wt&gm75)7D&uGHvxg8^$uq z>fOY%$zsnXC6LJX+uc_lwe^=~HSSrvcnL&Zy#{;3xubc@^dvYdn;9@xJ!u0;ryFU5 zNL#N)4R!RK@?u81CFFKLHjJZG551V4wKadMNKi)y;@sR{L=0zMm612h_5$HSJn2~^ zJ;g}RQtS787+RmuUZ{U-f*Dd{7 zN_jtPefTv`I*X*I8tE+A^q-9DdoJdAsz;IbU`T4Y8Y+(PN9}I_v9I;#-HsBYpYTb2 zy8}KfI4c+5B(S(_S~OC4TTgm6Nl!DSUHbEI2ESG{wlYILJsb2YAxiB%NWTvt`p;mObFn)7C)Vh3&4V?m|+%5uN*zgXnl2Su{h<*;j2bGkMZ;NP4=Fo+Hu;H{gr~ zvK=+q*FLx(Veg3Ti!xdNavCk7ZKd_qi!FW>OOfTnF&2`ljHPB%%$J_Dk)&rBX`@3B$%UWT-Ml0Rx*ir!#Hw#4}Jc(l%!DR3>MHL%@d&5bCQ?1Z#< zl#yZ<_oU~N^h_f?S2i6`=6Q3OlGNT;pnq&uEFJDhvW#LUjW_e^VKlCl+Kygl*5ZyP z-!|EO0K^uabPh>VBb_7C&a~-n4|=V`8<1}y<1+S&QfO0NL9#o_)UfCDx(NAH>l|K( zzP4dsmEp3&p?`cqfw)nZP$s>g1*<0;~GE>p%2x}CTg{c^4V;PnAMYBK+;)8dI3qBp8nKn zO+SB!x_Nf*8AHqr}8TIu_lJEQ#L)znJT<(zq{*mE0}L;m0E{m~Np16PXa_Afv_ z|OQeS?eRd_oPiEoo%E|Buz)tF2fk7XhiAnFw}AE zZ&^nDjhy{;R1uxpdNuouz7-zc?Jk~3>XSXY_Eb%STE7NIE2E4Qs}4_k5lPqIR8Q1g zq<*@35zfes{ZXu8AEfpUMsG@F5vBCxtz6|MbvSD8V(BQ$r|c(2C(jgWP(FKp6>A|+ zI*+6qRf%+-Y`Wj0sOKGyE7O{iYdF$Zn~)a69T-KL+*hew%aW%vJ%}mmFOEjuo*dB# z3`r&7wYuxmZV*;zp7dgpo@1?lF-e;jqo0<>zUS*%uo(GMN%1CQtgUYLM-|~$A&N=o zJPCR2l{_l@lH%5dki0F=*A4k}B+KwRl0MAS{}yH$Db|gibUsNNjdZ?R|JloMUijs8 zi#2%7=CO7P>QQatl`WNiQYo z93#Dyq?G}$;*9S+>oql9f_w|-`a{`*O=K~PaK@K^+=IQlOdl4m3yQO$p?Df~iYv6Z z`Yhvz!m&n*mA@ywjHKro>18A>{^CzgUpkKCN-S;XqK1^Dv&zVqI8zyEZ%B$9?<+Y+ ztX=>~_+_cuQz7Z!fYfIE8s6!WyQfbH|5pXS+ZkDDm_`$hg}j+dO1nwnoTbk>57M; zb$Q^WT4|A#yv>a`S}RX3-5M?ZAunFRqmz-^-2k#w#zSJ?T+mq^_0#Nc!(i{mlU_m6 z9(Kp#3X-PX{^GQzzg+>{y8ar@ql$+b856D!`{~{&DSHiSM!udaK6`V3q{SJKmlc6^ zqUP=ugtI*812{@}yUi^nA1Fm9ptI^q7M<*Ne1S7ObZ3My7`c^~gp$KvH`( z(key*xqX%cSe~BL`l-$msai!>(A`L}&*e!MlJo*2T`1CK`t7w^3sF-#i1lzTvNkPJ zqIy&($3q=QnyvJE1ZBiX4Z3>QQ`|LW`2>0C$s%d&zIoECNLp)u6YeUJuE$Y7>~62A z#E7mwg`{dO(o(qIXASbF=|wnNnSeC(r^!)}ESQPZ7{k^N?VGLlu_x$BuO?|XBfVOr zOX&?a2*$p}&9qDLcv7%$<}AVy(#XDHF?48m`bzu8iCQ9;@(QxHk(a_wr6;|Hq}`45 z8j=2F1d9mDxOI&&FD>&aL-+)o!Nv|bo(n%4_wIW@3E9!Zc@sjzeiI6CM z9nbNdo1f%;YEWkNY@~XQB=lM7p^)1%+Pc0fNKC&ph<#5Z#aQ*Ei%8nTY`RFKRh%)W zpYJu5^RniFn(mS*!&Q;z_R~>CQ%aok;J$ z9r`+5<+a)xnRIJ8580C!;oQR=nAM7OHE$dkXgGv0?Ww^}pQJlf8z+8)bIBE6Mk|HZP`YTq^33lcqLZ#$^ctva{C(Q*S)yDz0)$ubtx^!GaL z`lKODyIMcReCbISlXO?J>0*(7N}HCNyw=JXG`jUkEeBpk3#HJc!z0IbGEj;NhB;DOeZxQJXw*IYL+ex2%sJvlHk16V0ZCn#9 zqZhXKi1)-bSsC@vP|{I9?O~*dcs%LvN!r^;e=pKQ7omoUw2sxIRTcYbr5;DaasADz z16(snr&)7H=24%Ow|5CB$=$ICsWZ=yILwpYO42=y^j4A1r8Rq9;Oj{aV!nX1GM4$? z!BN%B5mnEK+Ilg4g}YLQ(wEogO1)UoIc*H5BQ8OR1OSo-AY^*Uq(Dn=3*=%<4&RC+S{B zdb>!sxe@xR7I>}2k<8a3)m^J_|HN8f{gkb*=P~V#OkItE1@#Ow#nd7f{1*9`W@o=H5VI0wgQg`Yl{{TRj>%2jl3TyuO0w z)Dd1oaWe8L*S)#3#8_ZS>T%CJixjI4PkJXw`xxn+B(3Z6kvp&a?wdTDn))w7UVoix ze|p=E*dJA=?h01GlAiT6O7^`IX&Us?HS-~v#Z+;t?QUpXiF7}dsmw4^tc5)35|Zv? zq)XKLH!Z^%U2j2Z*MAc78qrmX>%!JgSdz6(r*E^^U~jL%_FBU^igAMJ7q8O3Mv4`h zC%ucLeU0=kwf?h@p@wmH`+D?Dh4unF%P#B*R*(8=Z5OM15@3Ai+;ssGsOBpgxf zp?ZqM?Q5&`v2OIFOG&z~kuH@@o7l2*X&teYP*Q5vnkftp7b7)?q{U;$fi47k2Bgh zepQb}9JFbhtfpB@7E#(2XK63ao*-v`kOuoQ8^?@E)Z(EA<+IroD}PUVFG>3w>AfP| zj3akIusYHA(=^xXO|axJa9N!iQ9D4=sey8>T{MHLewMc=H6vPAgXCF!iv0*rx{Rdz z8|gBV)~)@-)mCbFmv!>&HKg8P0VKCPgmmO$f3$cA^3CuM>6oXH?{YQLRM84GG+zRV zt<2f_#qe5rm3k7w{mmAQDD0AW()&nyfRWxu(qdf;v@U)WsjOB!8+qMbUdvw5%${gA zt-{gDAeO%gsdoNC3zklVTz%Qj>dx}K4tsWtS5V3BtzhrQlip9#1C8{4k#6~Krz1UL zmDkjlk$`sh>z6~moc=*|R=A&%j)Hvur;r}J1Zm|gq$*QGo8GRo)I;~-QH?HAD^6H; zj@cADN}luqk`6G^2h>l0{4jK!+3f47Fy>FFdj!3ge5)wTKeDzFi*S}!uDaKzGTK8) zv;!bI^={cTlw@~+vCrj6my`4$BV8`i4IV*lzqmUfO_A3VhjZs4-%1M_scf_x%QHer z7<<`XlvqZ$JFCF*I;xbt$n7JkpJMmTlRik&VYW7XP^4Sm2OY1{Gm522o@p@THHuco zw5z8ZB$Y;_x__Em!3<@2rLtg-lt(4s%Sf>&=t&DKFO2kjw|4re4i{SQ2wS390P zu0T81%g<{6T(;PfCHF$Qgud8z(GT?+$`g^-{)Dwetv_m>pQP@dgKUbON>BO+k`A=i z{{ue2xrz$F{pB&U9-hCn2g#M|-C`Oi*h6*EAt-*|xdoGrj2Bt;4 z0sd{?2dKC!UiUu0!x7md5!s^=*<%se;}O{t5!sUw*@}qlsfg_9i0qk&?AeIyj}h5( z5!v$*SxZFrLPYjrME0kM?4^k8&k@;QBC@|mWGf@GzeQv(M`W)=WUoeKuSH~kkI4S9 zjtut!(Et31t8l~}Y$L8B-|(a7F?J5*{GbuhM9-zC)D~Zbqxw3#jTgHs5Zf@F1S_QIZ~FHhq+&g&wO>+gmSFD>Z$w2>Ie%q+M9s#4C9; zuuk0+NH%`}>FQZXTW7EgHKg>wRho-6JBQJ2FP7XDsr%BCW(N2*Px=^12N~&O>Zhyj z!5IxV^K91BN(!x#8qa||_ccM)yc6WTxX#hekiEgitI^JCZih{0QNMbK_G( zPx?4X2OH_*B3(ecEVJ16)u@@U4FO2p_Z3l|8ZQUi1*Ye7W9AlzL$3b4P=$hx| zMpWXC+7p+17%AoePx=H&hZyM-Bu(#Uuk3Rx^`UgKfUT+3Q;#Od%g6bn#TDhZ^aVB5fq;<9AXw>nWXzeBCKXD{S9_ zR-vNMnv=b(7e`SWeUhHR5m&Kqwq?4X= zI?`7wUQ@9Vc|FNcW{hG_qluKMc6WNw+v;zi*mLAOTH=nCecfssYL*294f3k)32u>M z7Wbr2k#v}mK1I^vj%`j;`tIMUkD7WcWS+6%%^Yv7m+L4}+e<&v<QtdMEb@PIPdlQ zc{b~*pN+ht&&p-Ux1Q{eTAX|!BrWX4wp)F$FQc8+TK06?2MS5Wt}D*IV1zi#lRit* z!;SP=lJ>eDvs2}JpZR(YUxIv*EjajbuG2Ax7*eFhz>pJA4z(Ik^YgSmDU$rZRwTt0MfLg0rl&ySr67`Pt?-l zx;rG_KJrGCl-=!nTP)MYR_P>fCkyV3lG1N)-F1P)?c|FTF{>wij-(@u^f|Tuv9#9} zw1PCb@d&N-m^CT&1%1$3lj9+|fF_AR~bfBDOb6+JE;+^qkEE3o>vm}O68S`H@jnj_}-JY zkaVPxwutm0dYXHeQ#W-~osYckl~3e+nb5ae+sV`PMVXftAT8=@273+7^~_K7lJJWY z)+%KG#`9y<;YnX0=}|`d0!h;;&p_Ypoc+bJntrf$GUVgw+pA7zok5S29oy)68`(n= zjx=dVMaofUz9MY>z^0{ae-&#XPx>NBOGf%4NeiF74vME=Bnx#+oripSEYi7*vBDkg zqz~k!64FKV#fz^+zI6;zk(TL&6GkrPg^T{EeeZ;Rt8kKyD6G&t>7PhC%1HmD*6+#j zJC%OZ>S1f@o!%z;#4IXux{O6f+h(wSj_b(#$l-Wbucswci>28&7qD*hq%VD1sP)qX z@=CUj!fMu&{+Xm>jP%d4>B>boV?j9f)#K>z^qx)Rc_Z4Wo~^9C;UsL|ZAe$kRCMa& z%3I2#+1DVk#`dItA?a8n{R>Ic51zys|6(K}tF_L7BpryfiepAkvF2KhmfGPalqrrz znv7sd3cVLptn-rmGZmE663zzl{8;&W(!Y}QXe0frY&x3#bUyu!SW?y58~U_fvit0$ zusU~SZD%5FRlA2a?Z>10Fx6RM8rnB|q6YgBo^&Ni#~JBLkv{(%^eJ)^X+dpD-rnpL zRrFY9Q|?#losdoF8CKI*B*8q^MlV$wLsE^Unvhy~r0zbmY>HhHPx?2KPO&!^{wC5j ztgU9D*Q7mQ^*h@I9OjSOcwo)FIF<_JN_qul1~Jc3XV=$}O?NO-?A>_Mmq~hz+4Nm@8rIjP_~*V!cHWysmtT&N)>8b+rRCx$km#=S)F$M&Zg%PT%6G7z zar3K?JfK;wH}VHVQk;z_EzwL-bqVuTNb6FheAl&nV5^a0pUacJO44JE^i`6kA69VQ zZg(Md|6HnPJ#@cWZ&)UruXNN}e{YnZ!5CIY-R|=@8f=dWD;U#hb1L;aZviX@=C z$lh1Qo}efFJ4uf-(!Y!J?b|^#ow1*3Jrol4KD`-I)Lfu?)Z?~8naa5=$=;fKmSr5| z_P63xUf#1kX*Qy;Q|U?nLDGpv`VW!Tb3`p*q$g5)!k44Fa2#3oVH(y`O%_E?#52~$%}qW)iLVsME|`F*ZP_b z%yV?-SQ~-#j-^POu0~o3e6rTpwU4`)k#2G-j=JaOTxz6@ zVDv16B(~a;{xHo}FYq9q^i7hUV5Dz~bUs(7`a8iR==RsvfqTz2`cB<@XKF z;!&GbLoVg5Z5$cyg2<-uYo2r!N$ZVtl}In3P3JB0^^{LUzBCqTg{@x<=lo7ASwPxM zn`&p(_AkWJhh^A{%%*B<9SzfLj|JY=lfFgL6OHsOlBO3u0O_S3UCXu9=tc%Is)0<+|dmpJER1q;HdSvXQtpUL7Cpn=UO~CDh*1rr|mFbdeYS-oob}3 zMXD!|n=kU3^v=BA;MUy$d+Q=!1FSX;XW4#xH?P6|%6!=3NpLjOlYJcmv$!XHhomPN z={q9r&v>xzLa)hvRmjz!?21%7P`S~fdT1|wPsgIao?e5#eVp_QBSe655zTr-g#-^hzeK#DX-ObveXB5 z3N!@Q>h5x>pCaP%r2iu6$wvAwlGbh71|8SDuA=$JJQ<8NVV&)qn37s-2O^9S7G74w%wEHLp>tuD9u*ch*>@9`y@TpNZ%Lf zL7bzu2qTnntbwbosu{>@9czq=HRL^KW`BiUD#@Fot#%HLdK%s#+hBv?u+5 zq^B9_2O`zivN{E=ud%NdEKMQHfk=&1^>8Is&^n8wE4LzK&#}Ah*6x9ZuqR||SH$<8 zw2h=QjI_;KpLhQj2CZK{hFXUptz(>&gyTVDnI2#PXR!K{Se{-@SEKuf;hk37MbK3$ zmEX$deXKe>>4zj;&qzNM>CpR8&yBaRHtAr^oHeXNB%=|?0z-AF$YX_2J2+~Mn~Fg{fz-J*Vav_EQJAK4!gJ@-+| zE6c?r(l9)1;fdR_$A9gw!(v)gH8w zsvUV98(f03nmOun--90wdG7i;82j!$JheVnv!3)5lBP!b2}$dB`o7!GtN-{*Pr7F_ z@@2B0{uJ^(AJkE#dcu0mJeMy{ejSqOOOe)dW|RLvfW3a{y^trgY=OPru2r_?i0yf; zkz$SQNk1j&Oe6hNHXV5r^vx<$D@teIf7=<7CdQr-&rg3^W`DGI?|KIs`Z8}Z3-jTK zVlB3^+R;d{^7o{lk+i``KNIQtcR|yk*HRyKxchS8WnZh~h)P2*rLn<&y7FR_l$Q$c zSLyzLGQjK1d8yE!W+Mvw5uS7{NzXFUwInUv^`X;O+V)Mawc&c?_4fL^4UXL=TnD)P2FGHez50$A7*)hKDCp~u?UNU?Y0N&idI zS!UD!inNV8AjR{%CTnZ@74t*vvspb(W1_bYnrHDWMkq-)ufcYLL(jx3Fb&rFET2Wv z*irJNpOf@#BmJDDmD69s8P7lN>#0%PF%^<=9BC!Z@2pKvB`_ zU2o*uw-&+(kbT_V!pXk0g?%nh`UOd68|fFaX-aSO(iNUGQ7pxI+@6VIPq5J{i*Q^o zW9w@jW6!0@c4`CJT9UBEP2$M#y)F4u?7n%@FG+fik$x%CduW$0uJojp67$taYdQAa z?h&-A29a(DiQc-lClPlG%Iv{>uFnKVL(=RXAoc`3=~pCeG}5m`df#hKM|$hiUegSC z^+a#h?s*;ZE7>26RQ+)v)+r+UenhrWM7D86wn;>`X+-veh-|Zn ztSTbgJR;j7BKu)P);S{kQAGCRi0mg3S(k|HrxDrDBC?-HWLrjLzlg}TipaKJM~3?V z=zo61C7Z72{%?+rxMb7y-Tx)uzl-C7v4BR0zM+?JFEE*jqq+S6jUC3XHS{7Dsq9NV z@=%O^k|P62IG@Q6N|MD|7!{s$J(8Yhr0a=vJ2I|i%pua!Xx6~^QY#rfDUuuIj7#K= zEA#|OG2qfwhB2$nu#N`*kcu>Wh7DuYldezFxkkFaNZT$!4dt_unhr&CoWn|ED5r0< zqd`5zDLkq*c&*o2s()06E5!h?9y?~wF-BmIs@FTDjirj@-W+Y8(Yk`_h> z;k#8f=WdCk&8H)^w}aK@#qmkY^A8GD67WPxc)%qJ;McG|_fE4KwIIA)dsacS-v*p$9ifaej90qUeNxw_d z3yt)AZsB{#)jn=CL=%mJSCdn9c#((kGD`(FqhEkWFu>?5s6D~BPq9!GoST3`LN zhUG=1GSyy#*|GhIk|c|@Ff)154M}>Dk#4BgKlx8iYx-sozm9J}Jr%Au^cVk7;&`ss@=xH{8U z9z)H#=4JF)dIMzfLde?`#Y%TKNQxXk&#EU*hoqu?IhJWV5t8P~NToBkub~k|&*yx% zY>L>zlWs)P`9`{tY`TI`VfSE_T^z@n+4|*EkPqLUasP+<={;Ac$lG2@56X2lTn$u4 z2NIp7qe^Av?7KjScs%LGB)!B)HzsLm=o`>C?Io{u2K$}%&E98E+_K3ZO(!5P4{#B8 z=cef@xx=OFD4&Tk_RV-%kS$^Mr8VuHqH$(Z#9^Lv6OvwPq?^d5A1s5`B8jA_q&ka` zYjtSrna~#9adfT5673$YaCBEa7khK2FjDDJn!O8z=+KjHO47@WbW@Qo=8A9u`=c}! zM}tDEQ_WH7AV_lc&_?>op52uUyp;B~v>%*1OLVfb(%sFbh*>@94@f%O-UIxBNE_#q zt07>~yiZMKQrlWT9KTg4UnMUr|EsmLSkx;u3z@`mpmx|vAd zWna61<4V`BJCwztU@0kbIU0E#wVhzD??A0v&pvQrBGMdR049{b%85Wn@r~`T!$6`%9vV znYiwj23a%LyThI%n=0MOY>KszC*6XiKQPiQMB10D_Fmjcv)0**Txy*$%=ZgORRb-n zdqnm$a4@2>yKL>w3K^Bp=6$TtJn0WfTJLxsOy(p%6zNB7!IsOt)^s%Tnzb$7vzW!{ za{pM8*Rhyumt+zp0jce5mMAy6FrQEl(`vIR){UODGfA&Bn|2mypNFAi8T){2+H@); zilTI%$9A%UIu%{@XM0qJqr75LY0&$v_B@EZQRoLGVSjKwS0f6mSx@>Sl2*BeAZ+?0 zlBTzDEFE??YEwP+isVN@qQ9gQ&gu5-I_J){*P+b9i;#v9N{KOaiL-JTB}%`opve2p z{VJ@nJ?W20y3lO;W7$;SuB$x{wV5W)_?p>U6}OYij>@w1I<~J~$8!sThTWJC`$I<~ zDtr0^D}PV=6OvwKq(32P@wHXZI%lP?r+78;#WRo|ekW3WCB{hU;WZ;{y9`Hlw?7GD zDSiEJrFya2I_&A{37lWkQ>^u|AK^*6ko0OJ?IN4r%GwriT#3c@(rK6W?@bynZCcPc zWIxHRwB@lvy7o4eZ^>dQ?2>rWpOW+%BmJpJ6Ee;S=l#L3ly)OZ^~h^18>8y1fxL!R ztBhuuB2(07Utr1KJMu?Ok9YXRh`5_B>AOFa zm)cUK4|B|{C=;<0>~Vs?`c8uW#}9+m3xir-BHKP9+aV(RO+?l;BKvJbwqr#0yNIkdBI_2Bb&tq)ipY9IWIIP>JtMMR zBC=i)*{%`UZV}n;5n1nuY>$X+&xmZVb!4~?fd1!4T!AC*1{-k&jksSwf^l(S;Kl0b zW92jT1a7qIf(cT^A#5ZtzF-T#D`oZ^G-V3*s2_4O3CRIGtxHvI;zhMYLUU z)WziTw-~FQw3?(h8ELghw^)iZdMu(=lunBE$ZHPM-+wZ%#G_$7CGO4YdD~=Ipnp8E;iC%iL{n0kkVYQ$+);8wbek;9}Q#t(qzc($$-G4 z+TOq(!CAV>_GuPr!>@VLZAf~vk!~Z>UN=IY?yy+fF)CDaq$lVj&slGWvuYcWYCUdy z=3?msc|N|Pq&;c2B80c~q}!7879-u3r0Kcrr%Rvln)G}^nUUScS3{oLvu6J)j)weW zuFeL`N4`A9Yp6O4`DXS3YlHUvv>Ij7Z07=VfG6FKq`x=P?PSxd+=7XN1LikZoi{+gt>8tJb^ zI`>bgVf^F1o(kJk@69aWU6R@ce^k$>d=P;sm;)5chR#Y{@%rNY&rJQgF1 zLbhj(`O=ftkn}bqts!Y;>lUXkec)kVPd!Nsw97=cejDRNvj}U@^U0kT;jF^BNQ>&- zs4r>eeo_m4h&$pW=G%DG`U6K`xny1nv$!YSo}{-M>Graz`+k_yw3I}~!e~{`TgeG2-tQkIQY0nS!A!A6Vyrn#v?OP$X@T5DC^bRB4L8Koo!WsG^tdS0& zj_ycX>Hm{MC{Yb+P4+wO5!x+HTNA|6lr8F|r7wf=0fNYj4Iv&UNxWj<>)r_r9aYaP#$yZiDgWA}wZJF2av zKTNaTb;PWmbVrgdG147Ln$D}Bo{a;4YVUP$9&h28DTV%Y2b5Re{Ngg?>$wUGp8&R< zfWvUq#(sFM>glwp8;5FrMADx0cO<>bNPj1rUb-Cms&123SK7IIB8SW*ynKf+v?28+S?>%WPNtYUFtw>)X=@#6-aN1oB^;1~G z{z#kYEA<5c9kpFc#xI>o+I%w0tItq_p0u@|BQDvIM@G+FLPt$DHCQbV?uhtpGeDC0>%BcQHl+&N(?wm3<=x7hXNR8S^u@>^A-AQ_nk#-m9 znafbyfEzta8)q2ZRWC3aEQalfd>+oK(+nnF*01tKU8RTu&t!8H^|*aJ*%T`@ zPr4IHH|nh2pq)h8^)A#la*-!(CeUdI?-)QD6pVkE$XlsjYMH;q# zn9tr?!n)Cu_8{rKX44)bef4J4U@Hu2)lQzixuEZ6hCAnGksdg!%UG`MR7h^W32EbbJStmk ziF}DIJB;m7KMRtodX^#40>-EEUb?c-;@OvXs3*HujWxC>?Mc!{9T4tV^ps7z-+(jb zaunN@4`rRzOs6u{9Y0c-O=}@T}XPL z*>o3@rU(7m=}Rwp%4@CXtkrrVB$x6!T4*(^fsESuD{+S{nT(S5ygKVI==$Wn)XF<~ z{dTQYkhob+q}Y$}q`gRbzmfKmO=}k6484OOmf{iA+6`%eyh$A;q_8iiaHi7JbheI? zXHpsUQ>Bu0WYcWLhg}j+x+_T^Fw$K``Vg(Qm|j(+ttD~|L|UX>vb&E?7ycn-Z*_m+ z+vRn)Kj%;P=edU?wesP34@Xo+ioF|8x*JKC8|iK$9l#YvO%O>JI9l{}omL*npmufA zd)7BVZf{bCbJQU$A9`W7wNZ!m&7S?ij*=(coum&M>F(;M#TT5`bXkSEX)lf0$~Z{$ zo#$ry0jo!C%6V)yJzViBlnhrVCB`h;A+}z*v)6C^hrI4dJoQuTb9vI+gjHUQ_XC<~iP*PeDGv-sjP3re`26@tVS?QYvhf;xLxs)!Sc$P~Lh1k7nPn!S0(U z-GiimFw#9pT6N1$-TPJj@7ok#O`_G(n;wCV35#4>KA_d5l};^?$U1wLkzX*!r7ahJ z4ZXoVW>f45deS{fS~1c+Wz)lNhmIAj zpQMTQ&h%t#-3%PH{U6p7#+&wJka}_8Pwky>t;g&v$AN!H)lX&FY&OMCr6=8sqz@bE zULtK`UmL=8hBQ@<0-b%e=_KUM4~2Dd-q#n5EV|o~XR(a=iqLO`=PEDWZ~J|KqPyaC z?*r@|k@bnl_KC>)Mr8X&Wc?zt{UWmd5!wC`*#QyRff3n&i0q(#p%K}zh-`R7c34DqctmzYL^dKKJ2E008Ic{ejtut!(Et31D{{m= zVk54o5jTQyU)$w=yjWboNXfiUu-dcn&4@%_wA2$Xx!6H-m?Eyu)LiiTqrL&7!jtYz z(npPSZ<3~SAAydRC0>&~6MPILRr8Q)7sD9keR@Hj(#L8ZNNi1=IJw@^PsgK7?yS%& zBs|*3{4K_+C+$Ph$BeX(NPqtX&N%*VuT|f#cW*{H`EYqR?Ov%K#x8opR=#igOrCq7 z*HAu|dCq_4pF^99QCB?5NZ~;|={_WV+(`FP>p%3o)0*z}u&+mPNrmxX?PZXc=yk2t z6p8kQyqR%YE#|ZAt1G;k`st9goQ~9N8j`9%@QU4xthfMv&6D;e=@UlUS2lh173e$d zk6vr1Cgk-LYtQSE?=ssTEwT^lDZu;gf_zKG+rxbsy-|>hV5968dFQ3VNX4wfIyI{;B4h0olnkE*(Vle;S6ezO z+WkbvXp0poHR~TtOwft96?_$KD58jg)0H7mLW&SsY_l zrkdr|qg6hPS;KrMYkka2o^(HwK4ql)sr6TJM9sd>vuMAiG8U4TxQ?w=KUJL^3EEv> z&R(qN0z;c7^c!XNbnD%WBXZZuapm@n)K4*AdeZ(RecDL-i*)-(KvWF8RIA#Wwdt*d z^aOt$+T&5Q`YNxZC~p*u{d5e+14KIFR%ogUqe4dXy4z!Sal<)Ey{wiLbCDL0W4=FATCF&g`CYvv zx7%ixP29O|bjhZOcs%KWB>kh29!Sz+x7VD$^sc~5-O72XW)|vsXfe{Y^q6K-M%22K z-iH>q*+Ee+Dbhxq)l6?^XH`RDdCjsrKvF!>ND+s5(g7rW&PWHyrW-E9884Gan(8M* zqWv4aos@EPSv_RYc-Ky_?rVnYtl|(-$g=YDT_7@duG_GNE&D!->lu_oKo_hyDb@l*7Uyht)8i`~<*01)^zJl42S7v!Js=sIN zRw9!2qz9Aq1tUF}r0IQ~-Kw?n`FForyC$ER zuXbs1qn98Vej!r#&!t@-LH-Wv(cQwb+KESP1RjPmXJ>0y#P^=Gj-)RdX`O6(+?_b% zfJI1EkKQ)2J?pa}Pvs55xn&o~YZ`dg!AwK{usbBy2S}IgR3_ilqPpDvjK)4z9iH?M zlK#m^4-x4zcR_1oK&m@pHljG{OXE>Sx@B4Uu!NC|J#Vvkvp(raTe(;f-FB z`KvfYW_^jh^r6Fp1Qg{_}X z_eT{6E8bjHhP)GbTQ%xPq1M-(1Y^umQyXpScDgm9u*UYJhmv%qksd12H80}4Yai#? ztVb=L^nqm6#YpSV@kjN9sCL)y|2^cJuuM|t%V>u<*^d&nbx(iPVgPy%7h8%HD}PTq zjHG`v(qU@-Ay+}i@N)xACFWT}%M|8!4vz9_6iIjDykK8WVQ(=DhB36tca&z4H1;Dr z>2Q+1Y^1|Q`oc0$)G(q_J$l2ZG92<14M;0uS8eKFv{AVUM+*~>>aA62&>bw>snc0G zc9y3lzVTAnCGn((k@OWKJ&dG$h2;07=WK*814H@uY{7^i?B0TsCdK2WPCm$ZIN1Wu8%7 z3+JfTWBgI`{9Pfb;drY%nMVVb3fKE~FH!w8XVb);Yu+w<9{@W_p7aQkPTxd#){YSA zYR=b{2G)ksN%)sQEGA~}SIb&TijtytgNnt+SXPyKkQKNRs~DNRJfh zCl8~Bv)La-s<)^W{jB9$s9qjGwW$WuX-!k&3NhT*)~-gP>uBHlk}&;dZHhfXPdbvM z|1i>#BE169T~bZYDAJ~rAW4QH)z^OP?K6>f=FwWDeL42ZlaWt3#-u@`%jUW&me*O~ zwTd@;`U5+ap7bb^wi@YCBu$^EO>bL5eLTB~HOp_OjFwt7W>k;Ty-~jF)kyX9NBESI z{t}1wg>2+hQ@_p)Z0hbGe!K4jl-w1sdmms_L^e7i8xxU@jmVCU$i_uv$3$e~BeG*7 zvI!B{aS_?Xi0t@?Y*IvaLPS;{k)0TkO^(Q>L}XJVvXdgRX%X4U5!v*J?39S?)QIe~ zh-^kgc6vm1MnrbzIx^e`K>zb2uEY`dx{bJ!d_#qiww?&l$WBIJbm;Dx{S}*j?Z(SC zluTnu%?$Fu98>aWxu;)}K!e7e(k#-(sPLqtNcx76juPpXW$2iz$WHb2r&i8VDQBr- zT~LokHfK+*9TTny?Rj-+IDqBp>Fnyor8MvjE=JHChOz2NN0anTBONVL?Tr_;`yfrb z1zbaz4#0OnrWK1cD6f)|gn3DnW>FzLh$kIG(p5$}Mx-CnrmxQPboNAw zY8y}af&QpPFl_x=`Qg4iN)K!n)b;HdoYj725NY;ZAow*;I+mop?QQ0dNfJjGMgSP z(jPRV&fK?_6a#XEESQO-;qw$`Q`)GL_Epr2Lz^n5*$L-n{WQ!clv9%3b;lgwNym}& zZ6h5=(#m@;;f&7VI%^Jfa9pq8+9oBh)yYU(V{AC1iNZA~Z+8M|L4CQsWM@%Z*o!$< zlWNMd`&F2kJn1nc{il&0Bb)B2*kvKlV?D(Q$ZK`l#-5m4WwVUF!BNXtGChjthBjq{ zXwMC(y!uT0eD*do=1WgHo}_*33C8gv9m?26_sC?mHbpSq$U6gRu|yWt!_~2#@9)Gl zt?pgPS4o5IrH4MGOQ6Ac6Q|kTOH@C_Ebd89Hbx=q~7Z=z6b7Plr_4`wESa z=b}Q@!(QAr7f0Qy4t4hP8ua#6*dIFDVRL_ZPNaw}Jn00IzGI{lM7rIRsNvpweLYR` zJ?sP8#V9Fe7Ned5DWbeQTi8JRhcU4%qQ$fnt|>sXO;{2FftY$swNhJNZk)EV}y5wbdUS*pWuW31ZLKSDHH*SW!MR6!8(mF^qr|TK*=F=h3 z4v@ICzFOQMolJFo)L`>#HRLYF(7cZ|wkMrN(vOXFnrzzjuQ+4%Q`ARIi@8$KldFAh zgj{b~nRN<~C=Oh56Y^~hNcHT3%IN!RwHle!nfp7k>Iv*Wt>cXpD}PUVGD$x%(vxM= z4J)Xp(u~wtI6EqeTTA;E=*jIUXF&`CGn)Ekn}SnJw-NM^Dxev%y?S$q*EYK#GyCA>=|)+8rGn>b1AQB zEN9%}VXU8RU6F4)&`a!#cRZSl`udwqv3KK1PbKMEBRy3%{hB`i<6FGe0!dY~#UMxc zqc$FPfn@pxNLO>Dr}9i>(auXQmXc*fYAJQ@ZKT*y@}#Gc^gl*=8cAE<`L{cx^xB&| zk2>`C%$6;JWWsGoUuNDcJ`@r+5?s3PpO7wM57ARqDpTOT>oQ$EcU$ZmF4S*tI_!#b z7tb_O>~ne286^F$k;A zD=Od79F@HffZaDwdOArzH`3EdTKeOMj{%Y94^&SNDD`LfONYvGvUWFUj2_Vl5h1-@L7iok~x7CP}|E(lbd~ zncN0_e|tk(k-mK$(*E=@pU_^5=!e9pIFx$=X}=0ewz7QarP}BXo>hl?B% zZMwn5&ZghycY#uO#p~V&m>H2ZL}X`0WV0f&vm>(E5!pErSz|MP&0LvWp|K`4QPA5!s~?*<}&gf{5($i0q1p?8=C2VMKOSM0RyV zcFj66+y_Aa^CK?hi2KS$Tq@siJ$-*w;2Z2oAo>RT@@g&?aT@LYoXS}kakfvf5AqsQ zn$N=fo94OX6{=WL9ynVQU{rY0nI!$%NN0+4ucbI|)(yTMdjgoVdJ|d7C4bbs7-PCR z&bIb$o>r=4u_qbA>+2k7NP>K}Ccs$rqzxoZw$NSo29lNkVcZgm7FTgexJ0ElCKsgd`l5gyc%d?;{~5T)!K?<{&hF z%|%0F{P?cd>-FB&I^E^_`268M9&5FFueIOnx!2G4T6^t%<^&c@`5bDZjo-%6y?k__ zTX}M>)E-N#ES_FIP2nhnO9y*Ng$1M1ly#ZCca0ImlU_*DRgCmPmFbt98P=KRwWdQD z)-FEn{m?p5{b~(f=9rwGg7o2xY`1>xaLX6kaSfe9V61A3y{ywL7CQ{ zO445N?RVH%M#iYJ*aors9%AlNrr(J^@=Nk$*WRVs*f}3-dYIDL4w`K-+IrH9NV=Ml zUL?{h?tzX0)4e9`{iJN0t(1Fp0G!SZ(_@@&$m;*fN zSdy-8q+>-|TmZ(uvR_#~DI{946xmKI&jmV-_Jpu6_vF))kUr@}pZUu|%fZUY&a1Eo zN`K}f);%XwnPO)0q!*KP4I{mnq`9xYc2^Xy`IK6j&yLd&ZaWYD&JV)x&yh?vhfY}M z*h0QpjMxU&N1mlGJA6rz8hFRXr9P<^N-JHbWyVY}Qp}g0bR0?7G}3V@)4^QTExQ=H zrPX#ySx31h%GoL{Pu`9Cvb`me?~taB618Zh|2aQV!BJINRT5=P0 zQ(sB(tM!yZd)AvzgS_HvG&xAp!SE;Fz^m9E?Yu3yin>>(u{+y}DH&_Mt2-sxx9ec> zc+$&Ay0(#CM$&XwkS6oFf>r(M`@UuNlZGjXZPT*{<-@%|on{|54YBoS!B2ycOslZ6 ztr8F$`QD0VknESYVTXCr@g!ZxNXM&8*Z$aPO6QcRk1T4ldYk$^&ayLt)l0%zHV>|J z`4hNm(IoipO(_sjL*qn-o4mw5L-{Gz<}0lfPq7{a>(G;4PSSOa^m3BsAAQ~FNIzfX zHI2Lq;XHfp=C>ofWQ>nhKC(WBvW>T>EeB&#+Dr{>#kTqntO9$IKvH+AOQRHQR!@2b zN!K&dD^#X!Y-`=P-cX6y^Inea+QD?Ao-dJvVfH9J&rp90p90w|5RReY49ap>UXEI% zu%tcdl_Xu?NUs!Wx0%Sf@oLYKKb+w_e0#RChmW-!SR(BgLT)=SJ$)MO7usAPMzu;Y zR{50f`K(A`-+R&)k{)HxRa-=Q=>lB$S}^aoa}3uL$`a>v*&xQKGG$+`xf$1%S=Zq+ zpZpP&9}nNI((D_O>JGBAmRNOo(g`Hpz{+$2NvkKW=iaVp*m4#Bj>Yy5A%~jz@S9(O zKRy^4bk={|cqh+)`zB)bi-VuCb!$wzo%h{PLacoi{aA)YI*4J8!sp#$Ws0?sC!I*r z4UKf7%JhzBaor)0c}*=N5l(4c7FrOlN`0)2=X*o4xJdcg@WW^5#nF)1u7Jueu(WJ% zK&70$4}cY#C%uZK)kb<1Nz)5iUgPI6Pu_Do=k(HGNa`+tU*gzm^{DpP8*+V5%Co49ZJ<>>YCA|$j*@Ax%WJ&d z5Gy;y_NTbdWw9)A_r%<#F^T8`#-CZ1EhX>_NX5eX;N^D^?_ucl5L8s#s%t(rZZiD9 z?WyhyNviVd=VPsXb%msj_hBP^K&l;Ad*UXpj&qbGnSF{~5>I*^NjEXl>qL6ay~uN& z8JNjy7MElZxUvPVi<_o=n8)mw=xOj5TqpdN+28&5ig zq`xuJDI)#wcCdUWOH&j_L86tgo{{NEishp;tbIL0(To(XqY{qA6=f=3T^st@*&pmE zdD81iT4SWwi?o$v{=_+;6HD8f2y1rK_kqnaRt{RJu)n{>Hj}@U={drhhT)LpHMXgi ztG#~fU6N6$d zNjEdnn^gNJzlc1KdJ?`^R*XYfPyV~HCF+~Rij{4Y=NOtRB4ssOrB2`|O}pwn^*Z%# ziD_VORI703jDFeY07ZAlD?bOgIU<`Dkxh@tW<+GSL}W7~vRfmvSrOT75!vk#*&Pwt z?1=2nh-^+oc2`8!8j;-{kU4n8joa4--eW}v?$FwAcdaWx1T1R^h29bV=qTBHztb|ebtjrBk2}KI!$Hz zKKCVu(>l;7qqS&4TWb+ZP48ja7^F3F4*8F~4!%xZg?k1$S{BJbGO7ea3x?O)+?M?Y zBSsKUI-R6BBb_eN=Q)RkXDv%ZnFH5wg)UiLcG4E3ttY*Oq_swRi%3T>w^5v{q^WcOS-Qeko^~=pIml-X zwsXhIR(=hF=a!J$Mfbp$Cfgh71Bre?%1#NZEL1w|-QP_{no<*dSzpp%=SoAXx7O>=dS-$g zvymURg(tn8q<=Ef+f}Al&7+Q6ye5s?C60+JxFXCKeC$tqBQBo;V-vL&-kC@fj%qDx zIl8}G2Mw%!_Z&xM3X8{+-a*njBfUeUtGxgn?*_Hsco`&G3l6;r;pP$Wje@nNGgCQ^ z#bw5ZD}d6mNN;CfRR^6`)}Z;-Jx>rR>@ZI{o1}j>(%B+CnYj(T(Q8T%VVL!6PuRne zUuDz-Y4j$5ov7W_YvB4|l{MWf^3JX1-0IG);oO?et>s*mb89=dj&tiex1MwBJGX&z z8#-6*+(yoA?A))M>*U<8o!i8@-#Ay}+;5%R)Vbd|x0!RlcW!g%ws0=z+#j5)b?%SO zb#`t`=ejueC+F&%`?GUho%@S(-JJWYb6Yw0H|Oe|+uFJA&TZpd59hXZZae3;cdo&? z9h}?Ixt*Nr>Dj&p9PbH_V(f^#Q2H_W+{oIAz2?|=O9$7c8Msm={|?lk8{ICr{pXE=AJ zb0eKQ%ek|iJIA?E&YkPrdCr~hTO|X;=39m*)mrWs&rUWGF|XqINHpgGO8T_jCkd;+`|efU9FvBE$m6>lJsvzI#;Aar!gP4IJVf&KN&y}W9W^V&wh3-l3A!)sl-b2#-b1x&eJ)UBoyn4Q@ zDL#+Tdv|TD<#5hVX%}?mny<)qZBJULp)eHM8n_B`trmCF#p}0c87yUIGpg@n-@ud3 zBk8gBCg41hmd;%Q9m^JbO(P~CoDPG(yvQ&|04s6zjX{uK)(U?l?@X48(&$$uN+%=M zW_VfGybrr$j$7_5o=CBq;Ysf$>DE@J_mVU{wp9C7zC)Iv;Hd5^Tc+&exx{Z+j!rCQmWa;ENwpyObfqj1l+ez+xra#(iD6${Q#mavH-LCE3=>?CBL{T8}ic3ffo);pnM%3bOCoP@8JJ z1Mg3}*4VrAqz{sGJ0pEiq&-;gn+3LXas+j617E+r6L}8A@|w&sA!YhB9OoNwtQ# zAhj`{y)L^d`AL5!VUF1^S7M*jlRiw+1|xl#r0Eh`D8~gBO2TnSCwG&H(3d-jT2%__ z2|GfvdqZU8~1zkcAD;A z?M|onY>w;~=vIkvc5K(kpcNs?$07TurdRMr{|c5t=- zOTG_Ma(BG)bD+l~vIP;@6A{_Mi0sLT?5T+C>4(Ly%CYU8Iipek-Z&}y%UlBb0ry` z1EKx-9#>+I>uEi%q#k$Iqv#zc1gmU&Bav21!)1ug4TWz#u8!gD;rHWcY~S1I@p@NtrsF5{YDOU@5s(W#FTXM-P#(AqlM>()Dh z8k2QmV+iMm(0#STbQGa0^~YGo(N5+~8KxZ<(YqY_jNDJ)X@ z>HbEF(bkhbNzz@7^huF!d<*ndoV9IY4zyA1%e#$1p304Oc==q)2h!gxpn_ryqjAM>RrT}0AeM!HC(o816?LofGQ z%@(PJ#QM@sKGt|?Yw0&tY$r`?E0S9Is_#)!F%E?CY~KpAxF>yvq`MpGGa|k1F;HAF z*RwRTOiPDAQa>JkQ6r=BREdy%K1aB+`di*>$kAFWXbjU;!F^=ZNdME*71$P@^jVVj zHqvKB`p$Fiiu8=feLiW5a0`2jzH4C5Nt7pR&Cb?OjV;~2A+El})sEGN z^ib}0l~nt%cs%LfNxFxT{#~SFX}Qk3j(Jjttj~n)&dw+WZ7|%uYPkegskKzBvU`zz zfY%vmr@Dje9UItTo^&xu`xxnBlI9P62l{S!-fLZ={JFCJZYJa{996AEc410d1@#Xh z+(G-vN76lw^f{GjiKF*O(isa!Ald$T zwY9KEDIbmiE$rR-1CghFiJzpl&I(8SglQBT`q}S9!)EoQ&y%#Tkv=cd=4+v&nLS6O zCFRVS-RusPqvgOn8CyJoVa@xTU+rFbA4$h@lm^|a!rA^RENM^r0!jBW(icdYUhyn) zJN{AT$*c1hAgmd5*+hgJ*+Yy%rNdGlJ`J&|Yn^OSD=sxb-gYW{YuB99OoLjec#pK& zhkfr!+eo^%k+!K!pKXP{Z`szQ$)4d1gk0w-(}S5O@5A~=JtU2^UkYlWy?h$?O=U20 zoU5RdhOkv+XKJwO@T4!2bRQ#qQKU!Ag;t$LG*XU+I=fRnl6i)`n4^^Totv*jY&wem z?o3G*?IM&4USca=k*YMso4sR$wU8%$iKP9E^d*swy$|}j-0roe%?vld&yRs$3};j2 z!?rn(v#G77_wX9*jOY%5QQ;p(psIQ`4f@ec4kzjM?q4yIf|OqHp4RI9sgwYVcqCSUm@wfR;I6rbk#ec z>AM@LkD4@(Y6rEIeM$S*8L89go;o9a{b=}wfrLQbDo{4M2H>})q2q)19VCSW(1a+<*D3QUixLAv_P)?y@t{e z4BHHnIBGp%si0Q*X1kVH`FqmWN!n5YY?`EYCt$5S!N&%UyV{RmIGgrxf$=@OCZ+c2Z9_oU_15Kh@27P0S_IJO#v z<{#Qd^&C&_q#*m4(xgq$5I$?mO4HG}Kjx*n$xi=Zm&B9)gQNqD^dBN!b1tr{3P*nC zqcISP9>p7afp9$=(zh_ut4 z$gS-<`0fu}vW!{#$ytzB^nH~@E#&%IWGb%R0u6g39G+dstmnkZD`tW0*$Q@)Jn5Sx z9cZL)igefvXq|mEeD{YO4riF-P}^{XWj8C<=5f}(W_+`%_X;#<7U0}rS5b2o_9>G( zD^u)qdD6E?dZ3ZMMbi22tn1#ZZ2KbdZ&x11xnS#iq3_5x_`|q@vHM`}(#hn@-a_mg zjvEE7#8~2kIgcF3QAP8v#$3D0zPKvs2mh^`j1;?Xp7d>!9%Q6%t4!BpX%1!2v3u5d zQ%ilaHMU_mEEmo>8qe~o{mwy}9t_t95{<&9A&@6ViakM3`VL7CHqv)Q`sUlXZmk#n z)$L@@a|dL~ZII`Jm8+~ytw+1DH@0#`P#Wenw9495Pa|W+31Hr(&e)VsFjDMPdeVQA zbdZt$lcc55ueco2*-!d>CbckpHvD7Riqp|P*0n4r*LmC9xprB?dCbnWveeo+Yqg!H ztLU>`Tb-$V*-lct4fIPs2PnHcUimq|yAj!Y5!w3@+0uyYgNW?Ii0q??Y*|G1uZZm9 zi0qSy?9+(svxw~Ti0t1HS$jnGMMU;xMD|rgwmc&HPek^0MD|TYwjv_?Z$$QOME1Xk z?7N8U`-tp^i0sFeWOxpM_UC(CnLX|h>v3g`4P$5zJ{;JudG&IR?uC^7OLGN#ll2<* zpyI`dHA`hr_AI68jc{a+4mD^l%w`7k3QzhjNe?yBcSU;igV5TGqm?L1oMAPGwvZ)9 z8^5Awa|G7!2b9hr7e{)f(HLht7eoGrv~l6(?@A;tnk|t$B2<`lQ-vwtB&Q=}DK7^e7`;CenXC0j|gAk&c?? zk7oD;_?=te+lfo%(+v{6o6>p{!ucWaEAEDp;&GJgDvl%-_sVwaMhWe&VixzL{~~FV zk^W1h)m*(Sp6a!hX%A|o(f5qfu$?OBZIQla46kDP@Esd{o!3sWDt*|aLP^$6VOx08 zk4bv8k$x=F&)5?CP4lG5DGcumUtj(xpjF}zel^3aef{FGc74L9mD(9f2LxAjB$c-9 ztW06?c+yWuI>bmnA!)kP-=S}v`Ce<^u?WlF?>hzI>SiBniIk1^6uMLK#h^7)O{MAT8u9P*s&^^CV(c`66ZMeM)& zy=y%uOf*(8P3d^(EI08EbXCV5MLnhL{3@(NPx={2k2TWIRQo-rL7#mshg$6|bdDk= zwuFkcYnbynxYka%RnF#4u2XQf3e-5SYePSKwgQ{glYUOp1MEe3UblYNviA z@>hRo<*3Th(?vR6uIVCH`x>*^56kT1;dx9wk+0Yd;(eP2jZ)H+Jy(S#?MeSl(xFEB zZ;_sSJ95@@3u)5$sC`MbIIW1Ye8{^Mc{xWFPGWdF`n((4UFUdaSE(QBUPC|ojtT60 zPufn>-4!aCeN%stU5gD7bJbeC3_^fH2Feh`o~sWH$JdX?1TYz+gpj+A+WMwKI{)k z3&QoMQ^L`}YGoiLv<$6G!yXlmSlKr=u@>^AUy}3$E7LDUx+=$~?rZ~=Pc!n#GdJy} zgezz(kv)-SJ(B8+d}S+lmtUf1ZLVLtu#t8O!n$MeW@U;MnkW5=q*tz{GW|-VpZ*Iv z`o8To^`?bV8V`wj+I)?e%t50;BkyL~<4E)T4ET+wQ3LazbqT`l*HKapKis*{7pL?a z*KOz9$d7fSCtXg`79(A*cG~9|X!<8hR`;)S^x6>|L3=3Ge5taK-N7+w*3Gz9UzALm z5H=0N5Z1eolGsx&m7{v2+C%n@O{``;>3>K%!ASoj(ifhB)(hwPd_n06%}EPh(%Vkwvci3&#QR(s!!^StwXzd(y8-I?+hKR_*uaZ2H;* zKA-A~5YBOw9C;1GW!ANo4r^0Sr20%}EYsN2SaQ{$1-WJ_yDFSbMXFYDxRGMz?@7NQ z=~YJhjmmT#T76gD2i?+|GN0nnkSu3;Wgj~y^9(v+3u`#f;mdhI13s#`ze2ypL?f}Ve;Bl zDo2)hcxu5}V5)uWl6cbpl5~+%h4J*iBK_t&r#1cVGwPw ziX3`Tx3M%aPd=|oFJSmk`n(StPwOB_S>pLY4EG7rFkJCIfaax8gCsqS6gx_u^nWD1 z#z_As(mfwT4&kZKBG*nu^6Cq0npw>%Qay5{SvnclYSkS+pHOdX4O@5D;6B8wzMq}@ z!#qLvaxv-ztpm#ECCnexg zomKeTTA5<^&69pl(#b~py-0g-BzLJldBRykXDF+uj{#v9-Ige@vRT}MR zhu>ccdy(l;-DFRIu_x$Be<0~~M*4$DPvb~B^j1%*Q7U2EtZSjX$;X-v#5rm_WA(Or zLQ6mtDaWk}t5!1-Xxv|*E&IkMb}BvTk0hO9q(720UBI5Z={>>KwEA?mxSb=WS)j^? zBcslE>eQ$0pdI2h*jjI}muLj2C{2~=0j~Cc$>#vc1|6RRtP+u}8j-CQk*yw)tr3x} z8Ii3OkyS-xYe!`3L}cqmWa~v_>qlf8L}VLAWYrPbMiJS@5!tUIvQ81%uOqTeBC_8^ zWHk}lZzHlzBeLH`WSd1~zmLc^kI1%INrvYDXn(%PB^#{b{&&6gxMYJ>-Tz7_aK@al z!1s>EOA*d=g2NV zukfU+kaVh%u0qoGSzo*B(!YG@SvI&0;UY(<9XWEm70ku?!w{>JEl0HB+FN*+Pkwam|yiPSTr< zbaj!oaE~QC5uS`h{>ec2#mnH!BC!&oMUdz^`vW%v}mMjh;+;Qk;B|sKA$2jXO-r%(U50vraE2jk16x;hjGPFK8k62Q%+LZ z5k=YCVplIx*nFnXPBCE)@T6;!^kySnQ>0JK#}!lA9(B+9{$q)A`?zt46^oUKW=Yxw zD=tB7j-)DOOT%k50+>W47?Mg)cGeOzlP6t^q|=OaEs^e^G7T)47L6_kkdY%++Jvy> zsoc6k(o9R+*5F*tS{ho2>EXduA*mQ8$=(LReCbK6NIKm}t3+Be1NwSsOcVu6Bw@SL z_ui7dgFKan`Ba}qc>{g6T#?G^w&!a~FFJ+Qek93u*D;HG(zQuC!${W_=`pmja^zJ$ zI9fwjoiqUTt4uUsA4PPgtXB$cEK^tcgD za}+EdPr5EiZ?Q66SENJc;EL8@FR;`^mR;euk)q<+gX)fDs;{0ExN~6dgRul{M(RsF zlxPmNdljilHrro?9kyXI)3Lz{SdXN)8tHl@EpE~7^p($g&ueX-gs^7K!rcgOI?c!C zha#-Kj9S)5*SV0``%UE1+j#bLl|k6(37rD(pg5jzRL7N*86-~ zBGQyo8L7TTfWlfLDM}h8w}ZTity}BDu+;S2&EB_D35FvB_1G#XXQZ%MJ?RD{z0F8B z5NXpFF3-}sA0TIu>bZ5U36i5);kO3;ZIotT-a)bmv2&-vFS7?qL#YK4JE_o#v1h_p ztj!%{ZysZ$u%tcdh9te+NH-Me%`DS)uC=8pe*(4Arf|PK=yI@qa_F*e1k36hd@W*| zIaa0pc$Lx&V7O->*&zrk4gGvJp2EKOq}3#S!``i|CTZ#U*PM>@e3p(#TQ%>~eq3=K za;Tc<^C_Q!a65b2j%>v}I6fqeK258}*{!`qHDqO4O*#91%>`DbSao>PjYxWjmFY$* z)7#i9CUK`lnhM8L6KA31QiR(_Q=(Eh0^t%%ZN*IpFB`+y?R}b(T0&hQImm}A?CE2S z6l)<*x-m&-8|lU*&2RX=(~+LB#A{l@GSa+1b{gc}Zt$^1&hlCjyv1I>j4d~(n&92o z{;KwB)T0J_4YuN@m6)Dtq*$SO(qEDEP9yylN!uRz%IQe|{E64Jf?VUqLh|Q(;cFG5 z60fIyTt6IF?eaKcmrj9i-!LU<-8e|9=&J-PYyj=uakd^h+DNf(^rW3gI>$&mk+jhE zgVWl0#&YNu%jP#T%o5q+K7^m;jH_6kB5l6F$jcNlH4)yMOskH z<$WZa-;zFvZO*>7gVn4j{WVGNaSK80ul|~(>5;*t032#cB0UC z%ku*v*ArmHn&nRoDQEm@_C2ja@5)iZJQ@CfSf*;Z;j?PlHTG^8=_;PHh_^E|INMUB*d_6#za{BhBmJ#vzYlHxgVc+p zgCnNKlGanHFKA_Xjkc`K!ZgJ8O_`<_e7hUAjf(f|d-zzTv3WmxYYBTdo^(@^-eaVj ziu5)7GEn`B;Ou(-A!wa^vGda-I4|tW8CN+p-iFxT6P;gL#<6%h)6{TgRhr?v`|%Ty zQYUTlNRL0~+ldxFM;bQS$`m_Fp7eJlJ=pEJqVNAsq!ZZdADA0xI+5Xe_<9peZ%`>8 z+wI|cr8BKs?Vf~d5qloEJN3{et9YALeM~b#_RE#n=klbRk#wGw>1HC`fNgEWE!4_; z)=rM`xI{T}1Zh zh^%Ww_LqpPTSWHPh-|Bf>~9fSeMGi(MAkhb+a@CG5s_^hk!=@|Z6A>}L}WWeWIIM= zJ4IwYBeI<%vRxvwU00G}2LSEQ_qZH;+j6Ra1O;w^DlMkM% z>BOg<7r%tPsR_QFtwVnHZdG3Pt0c8dqp*C9V%b?s^a@Y<2a-Nuq<GdSvs z)ZS2}row3C5T2gUDG-ff+ue%Tdd$o2i_G*%VdEfYFX^nc+6O@>M^*Cz!6W5L!n~cYb;n=Z#^D zm=E(TUXQSBtxG;Ycrxo_;2liE{HtdnJV+9@ftGPTR_8)=`en(rR;CzjJ?WMteZ)w& zRGBu?-tQXZQ()a`rpeJRkX>zMu{HDT1%I=N@a=2Y!F+0VpGu$Xdb^;aG}%sF|5WW` z4)CO1NcyOeb|GnL=1a)!Z)~m7)IeK6^}88o{v@1j3rL?F48Qs=`j^8GcZ2NRfc=<~ zq(xmNYB92P<+2qaW+qSiCz3v9q<>PGc7E3BOZO^yty*E}Nu72D+EX7Z3sI*NTWF!_ zH|@=8Axo;3TkEe%2l}v;Y>twFR;HLQJ!u_DOGa8p(n8%g?ux=rpLtDvX_s(sB3X@X z<7C;c-?A2-rJ zlQjM6V|PXVwRgSN-cu3Q7ne%x8?7^aZ1tIprGF(Y$}+j^*#`1UW?h6dC5{_bg2TNA z+3@ODZQ0HRYzt4?m81)dw5w{rhHI#6f>FwP$R5F!TyYc{jFmoLSnics%J}Ncx14{zaq*bC0EXzt>cK4#PXZZ@B_~^{GC#g{7nC zJYUR%eCia&?&Z^@8a?(5B>jEZO1TpxZY`wRhaKigyODIEk#-|#{@2Ug73nLlculQZ z{SSnsWg7e(d6k2{%#t?Ys`@s>_F)UL)fw_j?3a%YM67;;&7Nv7R`2f0esE`8MGEWC zlm3;YPa5f8Ri?`xgT4diQY$ru&r0ggg***g8P|5|`&HK=w&e__3CdKb7VOlO=xV)w z+qX&}al7Fnh0W?ow<76NM!FSAOFN@9(=8TxP1P4L+y}nisUF1st}@m8jLAWWJ^gO@ zIrbmz?J14s4)qyH^rS{%oASHcAADO^n}zj^`#D6X*0gf zIh5!rruLrNIacM=D!1}i*)Lj$E5e!}R(h%^skJhNeeX%@NxH~L>qR>9dtA|_-D_%Q zyVHK@uS$?FVA<(Ds$mc41a9g0*ATvqEoU5ODy7+sV?th%TBK>!cuLE`EI_uF#Wxr! zRvn&nYmz==q+5%$J7>fnZiYVPQ#^rTmXY;z_AbTRDHF!d8i$l_j}+H-^%@ejS&r>C z&TkXMs!Z8V-Pu94Q>=wNX?K!7Yoy)PPB&fdbQF6m^P18k!yK80u{6)S&Brdh8sYSO z=cl_qk8nYCaJ)~G(5lT=){wW13S!Bq(Y83sNU=imq}!16??$=}Nz;BWI34MV1zwZw zQqh9wGzoIeohnn+U6D5Iq-luFvt|n_S>%`0H&a_+OKGKGwIYi(hcr%)$`tEHPuhc| zi;c7gNy|&WbXVk>KB8{sGw&LNwFmtlmTA@PKDICdVg7=BTK6o%JvqNspY7A=tx9{w zNuv7EKGvRLa9(J>#7ME4^`zU9^f@ElR_*lJN1-D;Ygtx1WxH!*tu+VZsm1~A6I)AQ zJ4yEOEcpQpYaHU;+lZlX6=UhU9YmEW*4UnOJCc6o>Hxcz+o_!%`LVmMaR0l!nwl0} zg0Qn3o&V`H_}2vet&A3`_tDZvN(fJ7%dNW*VbyPrb3vIJBnjJw`k3At&1WM&R{oxJ zdy+nHWxBmcPkhnkkPhUEL|R+UVxG0|TS#GJJMSZ*ZLdA4E_WhLX$<_(l1{}~PdzHT zy&0AU`I}LK-!;X0ANvuWw1K2A7-@rQf7;Wy;+T0}lbzY2ra_}2&mZSwtH`ApscH`7 zRTCIX>q_^k+0^EDadr0^Y&Pu#$xo|j?2>rW9Z1?{q&tYT8*R)|VD)KEcYID$yR6~C zJ|8<<#gbi}Hne`VLe`Z?ZAD$@ud4W3px8BQWhcV1cjHNSBIjFfEa8(-2;rz9<^mHj2kW-eUp$L7b8FY{N*|18v^dnAAv}N#fEgjh=Y5X5U!E zj*=(ciKH(X=}sh_vFS!`{oJ)a?p48_}fLrci9h5 zcnIki1-O)sv9k<|Wp$o+TP7Td1C{I=fLl3cGKf zbZ3&jVx&8hwDEG3>B!+hnI6kB(sye%T8unDdy1sY;X{^P{ZvQ}`vCqG55u1=%b)k! zlh5N;jOJBr?~^(587XH!x6k9Qnw;%SU{BDK?n2U6jdT~1mKMH(E51f8rWvi=d-ei2z?M7DoKHXtH9AR-$WksTP39Tbrr9FYx*$PS6f4vokTi^v8?WQRv& zM?_>tt|Wt9fcEEmT%JAdb?b3?^|(_Pq2;d`>|7Lvv3GEsEM9?d?gC2K%kArY>|gq_ z_&AMF{e2p<+BH3OPoDxxJH{l4wCd>UPX$M!m_o*mG`lxXEW-_zGQ&D>PdT%^dCmri=-_R z*KjjK>xcjInht73nD5}Fk6?65m+L;r-o`n9(8Wlz%bW0PX&dTynKVN6oCx`Rj&9mf zuGss?Ay!Wb9-U!jiV?(FK1nv*F0%&lD=uAy+!(Wlv;8NXIPQuM^OjcT^r}K zcG=#l$6XjZ2>v8muB8(ZwiC-tV^6B~gIqcjwiydcPZjlKXM!=>deS{e`j(OIA<`e% z))p57t@|@fYp%rJW$lhRq-4}PfQwt0+bK*R&QfM|2RgS3!U3t%&Thj%u%GCwqb$PA*pr+^ktZ0f$4jC4Ytoko64?Y zPq(n{rkd${TbW|M^rU@B`cEV6OVYyYOWhUeBmeOE%woSz`av?D_I{6ReQd%pDLENe z?eRF|lR1)wUjry0HqjGJ(djuy1!*19l(J_ln8iKmUL-9W>0T<+ubJEW^KhMMQoCc{ z&ui^`f{&H;r+Q<(xpbauSol_yoxt?P4=W& zb+S}TS^V@(Kh%FrD(+s+jVU;yUqxy?{ti2h?c3O3* zwNqHqo^(HwerTlok#y<*`Zx>ajs6$7bohh+0kj@{kMjrZxr&RO+-r5`yWhKp{Pzo- zpMLV9^T!PTwUg&={0#CjFTm#xP-(xH5&n$rN|wm|t&FAq0&Seqcqb|RxXegl-+R(V zl73{QjjH_xY@t^Kv#C9;WgS(IU=9O)KDHahxpNV6i~T0c9zlBDeaCj1FirN(8de>i zbbpdAGt&J@nm_ARcSTyi!0T=sjj+mM$OMG-L`o&T=yFI(gW=!FzCVt;SK+=@`FO-u zyob+rEe+Zc)BNgA9BSUjTF8?QAnCu1bO1@ywO@i(`%W@ayFrQhupOyA=0{S(*fK{c zS<+MPgM1#_Y4{}roy5;9J*264#;RO2@@G#gu|o5t2axn*BRxQ*FFy}WzkL9{?s+mt zCL48HAh#VTk+SEM=}(`B*l}0Gx32^+O*>nn?fqbvHkffg& z=|GYWO3*9vlW{T_f6iad{F^ZXrDr?`fBi+yx7dZO>uT5o`HMe+e9nXLr%m^1cI4b) zUo`FndC%*7tew+85RwtuZV*4kGEljdYMm`>+je!nUS-^xki>KUhkv{pJzmmF_x(HShOkY0kQU zvHg9T`~eJWmep0^2wTHg&8gWs3cDnp^bnG^8|fh=EpEQlU6(&*39qKs9P2Sx8B2$kE4B<4_ab1+D4)sRNZ}eDnl()Hj7(RsGVZ(#*-dO(l3nkP?hPy zt=6B(OT1bv^rm-_Cp(WDQ$65=iqNJ;lVn@l7 z9!Ap7oN_!_J4~eg?#2}(IC@J*sRb&tUkQvE^ugtvJkUD6$9I)1;21Y89IyeKC6v5PO22^azqJH_{_i`+Zq1 zRcr%RYRtz@$B|cKt70{S%i3;`{e3#}tguj2z73vTPp7gnbxdwL;Z@l$!(gYcG z?RIzhSgjZN?q&Xdu2EY!LTFx=2HT_4Y(OqM5l#KtZ`X=pMvIZ6uX@rZlCCh)CY9-w zIiQ$U^elQ~$@cFxmImcz_Q!5W->TK2tioXDB3o5ar{;m~Ucc_fb_KRKQj8#;^k|a) z*GP{hX@1aqPDg1dOGi3%Dztnebob#M)LiBBX*mtyd=va*7rN-$-cje znaPtLN7C<%^f;0(+IUsBB5aw05deSAUuPP^jp$41$P&UcG={Ns)J{w1I(dF7+suHO zNTUdCFu`FI#gvkmLt%jt9czs z?R*5Sw&qhI&(1YDUH0v8t?3)5AlBX;vKmJk+x5sH*8Ra}tF*8r)r_sPc8XctlO9jf zAC2^Qk?PA2dV(fR;o2i7dw-W8PnMC&rQs6D^Noz%I!IH)uv%!yrEut18!2oHPkI7L zlhxJtPY~&t7HG{k2l>m(Bue?dWv)5>)>QNyFHXw3Cs-;_;*>l5`a# zJyE0|a~HI5v(G2r#4!7K{RIqbG_V{f*$e)6GZ^N`t1rb_{r07tvx7-ER#enJ?}PR$ zS|;o;PdbdGs~YJrkq*2LTC34R@CUzvVQSK@Pem)MW^65dooO!@C<(`*&Xg#nbgDfl z9QxT8j9?vl(vwKKnvtF)(m&n{t@>htNQ-I->{0r{shvkvZK`ilb%e{)s6IIksjU(9p#|!+m61*yR(_YfFK{u;M+p-)>Qb` z>v{xfG&|J>l5Rm*yt?mf&l;ArCq0FvYZ&P%B28(zS$mX@J-t>Nu|f*<4VIU_U1t^z z@66gy$GQ$T8Eb4izT^&`Eb{%n)79DgpbW}XQ+femX;PmzIYn^@LYnPUxs_uVc2r1 z!&Uk0D<)VsdeRXjUB^gAs7y<=K$ncib<$x^z*!1u$I@Y0YhR<9Z9^?oPmPR1t#T*o zR3BGA3`>(?w*#Vfiq)(qJ)NW*S8FysU8GMffW97FJ1HOArDC6{x|q4ChfueD(}Hu< zlG_nmxD0;96Moja%^JKa=}$cho6oDVuS8>w?Mcrd>AF^?XNWY8orB3uVnUxNC zE8d<_8L?z-Pm{BNt*=C(a<|f?&M+MEX1nWH`FqkcNxGhqo+(oIWgbV@em;Do3rA@^ z6JY+0u5{>+xbE{P{Si=-PE=~*I8$0DEl;ml2U zTkFHNg0h^QF89Y+N_4U=Q5{sUcnwy{KhvY!N<}>idpDl+Y?3ZmTRrM*k!~^*TB|1p zx>ZKhoerg3^SJJ#o)X@Tjly|K!ZO{OlFsyXRW1liB0saGu%qNj&mrkM*7wg5>4-Vd zpi)E@2E;*d()moLm`WWxkbau1^6q`MaMh}SL)Y{EKk)kd$;|TmS)P3MSWk?@_(-HXBG-}-#qELB&{~mb49v> zqg3@MPgk+~tTDVUh*h5C&8u~*X2bqo(PnYSwsH>Ht;DUJVo%VMo=4J+jPyK`7W;qX zDAG@!^DHB#Bdiv>{BDHHm-^UurXid^2L3aP;a_kse0z#Xme$iLITgOugzSfaRMvKN z_G>%Xsr01hlXQ~(g3wyCx#LHX@rGkzE&&O^L{^kI1G*WH&@) zH%4SPtt7*K0NS7LaVdM;#x^#j>T!F|Kz}J;&R)YFVe`ED3+;l69evt^`eI#q0~ZQ}?6WpDbR5^z`?6h2^a@XU0ZD&lq!)zuVt z8ra)jnje^hou+5W9!gT#Ko!r`8_2a|KqrY9<*UTAbrwbtPkJFqJ6V}tDALkx&{ts> z$QIZK^86{xZBP1P4zy@>QZc6)pf*UO65KzK$nKGbP*3&^8;on7bPP#hE(X9?Ni8I@&8^&N;4l-Kx&rQ^gM3w$kABR9F@v@77lP7;Qc2MI_zCNG~F3 zdgZH5U&XiW^zDkIC-SMkmbslppE>9hQ$owJ_7TXdM#E2!_i0K)86M;%I=y8jAyUqH zrR<3X<^WGRmZZNi(y=PjzO$jPo~2`&f*lom48l+X_0wRuF~O zOsFTbUone&(o0CXsgYhH(j0qK_`a!)s^iqWNf0?r4_-J6vzOsz>d^S!0gI zVq2ZL{OqiInKrJT3RawN6e(-2IMn(+EFMpK8A&%Y(#uq)L%AE2oC98whR;@P?=;*Y zkS)*h(pMl7^}x`6RZ9qKJPeCeepdUi!#wGDlK$RE$BVS}1~3+a9u?Zv`Ga`}9Vu9w zZEWMV``WQBheRDoCCOIVuns-x-G z!%?b!Jg?H4x@Vx_|6aaXnZlCxq*szOXQWq(^vtJ_!_519KDJZ34J0c#4plrAJsEPX z=f>WNaCs=NrJbOAO%I}^AAQ|lXje(XGA(6qh{L}3q%9=u&adq{s zWKsX^&2X5f+81-SvhKk&)%2x-ZA0Uek%qBKW4?`2SPOa5i6s4_kxmq8JxBib%X~iC z*H=D8)^){KCzU7L#^9@Yl}0Iz_R3%E;*}(9x#2jFl_^$ep7bh`b~e(hMEZ(Gno~Wg zJ*{L8W&?y}sy@yVpLHRwvRSL5)B)}yd)^rVwWx}}j$5^2I&sPSyC zTc;CkTse^Pa6DCsuvIpyCbTXINwwRi_9LP&HstMWwU5=TC%u}aU5xZ;kUPIVuWhb>{_bP@R*nqckJUN~Yiv(?4N3oGq}Paa?Gp5zJ=<$_ z)-80@!HpQCHJImHl z*d_6#*O9cVkzOa#!{_3P$?R9snmY;-y^*SS7Scv)RSOL$3bbxoRHj^48&?C$&+4B(r!k2y+}K;oep9>ip5TIkfm@MaF&imIghQNbz^VO zgk`E(E*$y86@m1qOf&lw`&^!MDoOupq*FzzuP2u^7fDCZ;>-pJXKjU9YNg?%)-&`l zjTpNyRyxBnHHjm0e^&e0eejsb7MZ$ zmoUu!yMk7Ic=A}YY>9VsL=h=%Z*Xs~!M^pdyO)Ifns&#!CwyV^mwXOTba%Y+bAX#8 zvS|_7^oVRmM0QI=HZvl-H6oi8k=+)N-5!zM5s}S~$nK2D=0s$7MP#iJ+1(M@+=%R+ zh-_X&c5g&>Uqp6)L^eMndmtivFd};>B6~O@dn6)zG$MO!B^jOrp#AwCS7eV{wUeG@ z7uDm|<2+jk#s*t8vquzX~?2*NUHmj{tDklG4xeW zI*p`T8|gHWu09F*OdiABLb?PJcgD>56+6zd3+f>+pTSt&M>rI_S;H2RXZqUUD%L?|nKE{7t9^{N zp7a)y_At_0L^|+(Trn=NUz6jhgXLHliEw@ZB_u5t7~T$kzZvi+%cj`Jr?EMVD{-Ui z8N}+2Rm$0SfiMSn(wQXP)<|cPH2vGN(D66ghNkr#YNb6|#nV5@i9Vk~6T&*NcG7(a zx3*By=+oHfp_U`A&}Ni`mV(=PQte}A@}#$tbUP!xRb{HL0Thn)`Pg}VwnY1iru7h~ zE3-Uk1LkE*(t@biQBirR?}_W@eUW0m^rW*$y1kLk66prhz*x`m#>#XLQNu5*&9bg7 zR{3-E)YFdi5T+09YW1VRaZct z`wpt}?LLFq#-0Mz1+mo(vjnvhY%AL^&Ht_5kz=+K42#E;-a*nGtW56^X^y4YH}x#G zV&R?JdCBd4tlbS;ZX0{OeXS~7Nrm;U5==U1$l9{nDeN#$I-8_B8tH72F1a2$MqcPO z+4_%~Qtk7F_1K9i+3s?eB5eD

1G2(Ce(|Z^oXm7On5YI`pJ>l5{5{y;G!v#z9|> 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

Q|p=#FM%a}>lMUxuC#Wf&lBH_c%4YuLsQx< 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

2W1Q9f@!NF+T4PAOHil9fy^&< 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 C<*<+d literal 0 HcmV?d00001 From bdcfe4871bd9acd5d428b7be1db484a70deff819 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 05:02:17 -0300 Subject: [PATCH 055/265] Create constants file --- br_denatran_frota/code/constants.py | 34 +++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 br_denatran_frota/code/constants.py diff --git a/br_denatran_frota/code/constants.py b/br_denatran_frota/code/constants.py new file mode 100644 index 000000000..bd50c4bab --- /dev/null +++ b/br_denatran_frota/code/constants.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +DICT_UFS = { + "AC": "Acre", + "AL": "Alagoas", + "AP": "Amapá", + "AM": "Amazonas", + "BA": "Bahia", + "CE": "Ceará", + "DF": "Distrito Federal", + "ES": "Espírito Santo", + "GO": "Goiás", + "MA": "Maranhão", + "MT": "Mato Grosso", + "MS": "Mato Grosso do Sul", + "MG": "Minas Gerais", + "PA": "Pará", + "PB": "Paraíba", + "PR": "Paraná", + "PE": "Pernambuco", + "PI": "Piauí", + "RJ": "Rio de Janeiro", + "RN": "Rio Grande do Norte", + "RS": "Rio Grande do Sul", + "RO": "Rondônia", + "RR": "Roraima", + "SC": "Santa Catarina", + "SP": "São Paulo", + "SE": "Sergipe", + "TO": "Tocantins", +} + +REGRAS = { + ("RN", "ASSU"): "açu", +} From 44e39b4005ffbd3a4a3fefd6ce90a311d66aa898 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 05:05:04 -0300 Subject: [PATCH 056/265] Add more utility functions --- br_denatran_frota/code/utils.py | 68 ++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/br_denatran_frota/code/utils.py b/br_denatran_frota/code/utils.py index 40b73d2d9..e51cf3586 100644 --- a/br_denatran_frota/code/utils.py +++ b/br_denatran_frota/code/utils.py @@ -1,37 +1,9 @@ # -*- coding: utf-8 -*- import pandas as pd import polars as pl +import difflib import re - -DICT_UFS = { - "AC": "Acre", - "AL": "Alagoas", - "AP": "Amapá", - "AM": "Amazonas", - "BA": "Bahia", - "CE": "Ceará", - "DF": "Distrito Federal", - "ES": "Espírito Santo", - "GO": "Goiás", - "MA": "Maranhão", - "MT": "Mato Grosso", - "MS": "Mato Grosso do Sul", - "MG": "Minas Gerais", - "PA": "Pará", - "PB": "Paraíba", - "PR": "Paraná", - "PE": "Pernambuco", - "PI": "Piauí", - "RJ": "Rio de Janeiro", - "RN": "Rio Grande do Norte", - "RS": "Rio Grande do Sul", - "RO": "Rondônia", - "RR": "Roraima", - "SC": "Santa Catarina", - "SP": "São Paulo", - "SE": "Sergipe", - "TO": "Tocantins", -} +from constants import DICT_UFS, REGRAS def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int: @@ -62,7 +34,7 @@ def get_year_month_from_filename(filename: str) -> tuple[int, int]: raise ValueError("No match found") -def verify_total(df: pl.DataFrame): +def verify_total(df: pl.DataFrame) -> None: columns_for_total = df.select(pl.exclude("TOTAL")).select(pl.exclude([pl.Utf8])) calculated_total = columns_for_total.select( pl.fold( @@ -75,3 +47,37 @@ def verify_total(df: pl.DataFrame): raise ValueError( "A coluna de TOTAL da base original tem inconsistências e não soma tudo das demais colunas." ) + + +def fix_suggested_nome_ibge(row) -> str: + key = (row[0], row[1]) + if key in REGRAS: + return REGRAS[key] + else: + return row[-1] + + +def match_ibge(denatran_uf: pl.DataFrame, ibge_uf: pl.DataFrame) -> None: + joined_df = denatran_uf.join( + ibge_uf, + left_on=["suggested_nome_ibge", "sigla_uf"], + right_on=["nome", "sigla_uf"], + how="left", + ) + mismatched_rows = joined_df.filter(pl.col("id_municipio").is_null()) + + if len(mismatched_rows) > 0: + error_message = "Os seguintes municípios falharam: \n" + for row in mismatched_rows.rows(named=True): + error_message += f"{row['nome_denatran']} ({row['sigla_uf']})\n" + raise ValueError(error_message) + + +def get_city_name_ibge(denatran_name: str, ibge_uf: pl.DataFrame) -> str: + matches = difflib.get_close_matches( + denatran_name.lower(), ibge_uf["nome"].str.to_lowercase(), n=1 + ) + if matches: + return matches[0] + else: + return "" # I don't want this to error out directly, because then I can get all municipalities. From 031d4de0c7086f0f5802235bab934601bfca77e2 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 05:11:43 -0300 Subject: [PATCH 057/265] Migrate code to proper folder --- .../datasets/br_denatran_frota/constants.py | 34 +++++++- pipelines/datasets/br_denatran_frota/utils.py | 86 +++++++++++++++++++ 2 files changed, 119 insertions(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index a323827db..977dd7eec 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -39,4 +39,36 @@ class constants(Enum): # pylint: disable=c0103 Constant values for the br_denatran_frota project """ - FOO = "bar" + DICT_UFS = { + "AC": "Acre", + "AL": "Alagoas", + "AP": "Amapá", + "AM": "Amazonas", + "BA": "Bahia", + "CE": "Ceará", + "DF": "Distrito Federal", + "ES": "Espírito Santo", + "GO": "Goiás", + "MA": "Maranhão", + "MT": "Mato Grosso", + "MS": "Mato Grosso do Sul", + "MG": "Minas Gerais", + "PA": "Pará", + "PB": "Paraíba", + "PR": "Paraná", + "PE": "Pernambuco", + "PI": "Piauí", + "RJ": "Rio de Janeiro", + "RN": "Rio Grande do Norte", + "RS": "Rio Grande do Sul", + "RO": "Rondônia", + "RR": "Roraima", + "SC": "Santa Catarina", + "SP": "São Paulo", + "SE": "Sergipe", + "TO": "Tocantins", + } + + REGRAS = { + ("RN", "ASSU"): "açu", + } diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 45810ab91..b00798d26 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -29,3 +29,89 @@ # ``` # ############################################################################### +# -*- coding: utf-8 -*- +import pandas as pd +import polars as pl +import difflib +import re +from pipelines.datasets.br_denatran_frota.constants import constants + +DICT_UFS = constants.DICT_UFS.value +REGRAS = constants.REGRAS.value + + +def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int: + header_guess = 0 + while header_guess < max_header_guess: + # Iffy logic, but essentially: if all rows of the column are strings, then this is a good candidate for a header. + if all(df.iloc[header_guess].apply(lambda x: isinstance(x, str))): + return header_guess + + header_guess += 1 + return 0 # If nothing is ever found until the max, let's just assume it's the first row as per usual. + + +def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame: + new_header = df.iloc[header_row] + new_df = df[(header_row + 1) :].reset_index(drop=True) + new_df.rename(columns=new_header, inplace=True) + return new_df + + +def get_year_month_from_filename(filename: str) -> tuple[int, int]: + match = re.search(r"(\w+)_(\d{1,2})-(\d{4})\.(xls|xlsx)$", filename) + if match: + month = match.group(2) + year = match.group(3) + return month, year + else: + raise ValueError("No match found") + + +def verify_total(df: pl.DataFrame) -> None: + columns_for_total = df.select(pl.exclude("TOTAL")).select(pl.exclude([pl.Utf8])) + calculated_total = columns_for_total.select( + pl.fold( + acc=pl.lit(0), function=lambda acc, x: acc + x, exprs=pl.col("*") + ).alias("calculated_total") + )["calculated_total"] + + mask = df["TOTAL"] == calculated_total + if pl.sum(~mask) != 0: + raise ValueError( + "A coluna de TOTAL da base original tem inconsistências e não soma tudo das demais colunas." + ) + + +def fix_suggested_nome_ibge(row) -> str: + key = (row[0], row[1]) + if key in REGRAS: + return REGRAS[key] + else: + return row[-1] + + +def match_ibge(denatran_uf: pl.DataFrame, ibge_uf: pl.DataFrame) -> None: + joined_df = denatran_uf.join( + ibge_uf, + left_on=["suggested_nome_ibge", "sigla_uf"], + right_on=["nome", "sigla_uf"], + how="left", + ) + mismatched_rows = joined_df.filter(pl.col("id_municipio").is_null()) + + if len(mismatched_rows) > 0: + error_message = "Os seguintes municípios falharam: \n" + for row in mismatched_rows.rows(named=True): + error_message += f"{row['nome_denatran']} ({row['sigla_uf']})\n" + raise ValueError(error_message) + + +def get_city_name_ibge(denatran_name: str, ibge_uf: pl.DataFrame) -> str: + matches = difflib.get_close_matches( + denatran_name.lower(), ibge_uf["nome"].str.to_lowercase(), n=1 + ) + if matches: + return matches[0] + else: + return "" # I don't want this to error out directly, because then I can get all municipalities. From 635c61f6d37eddc882e0c3e6f1684f4e80f10cac Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 05:26:55 -0300 Subject: [PATCH 058/265] More constants --- .../datasets/br_denatran_frota/constants.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index 977dd7eec..74eda5115 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -72,3 +72,20 @@ class constants(Enum): # pylint: disable=c0103 REGRAS = { ("RN", "ASSU"): "açu", } + + MONTHS = { + "janeiro": 1, + "fevereiro": 2, + "marco": 3, + "abril": 4, + "maio": 5, + "junho": 6, + "julho": 7, + "agosto": 8, + "setembro": 9, + "outubro": 10, + "novembro": 11, + "dezembro": 12, + } + + DATASET = "br_denatran_frota" From 8e089a729768bbaa7463fdc91a26738a1f7b2645 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 06:20:25 -0300 Subject: [PATCH 059/265] Rename substituions ruleset --- pipelines/datasets/br_denatran_frota/constants.py | 2 +- pipelines/datasets/br_denatran_frota/utils.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index 74eda5115..06a19a0ae 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -69,7 +69,7 @@ class constants(Enum): # pylint: disable=c0103 "TO": "Tocantins", } - REGRAS = { + SUBSTITUTIONS = { ("RN", "ASSU"): "açu", } diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index b00798d26..f2ae280eb 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -37,7 +37,7 @@ from pipelines.datasets.br_denatran_frota.constants import constants DICT_UFS = constants.DICT_UFS.value -REGRAS = constants.REGRAS.value +SUBSTITUTIONS = constants.SUBSTITUTIONS.value def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int: @@ -85,8 +85,8 @@ def verify_total(df: pl.DataFrame) -> None: def fix_suggested_nome_ibge(row) -> str: key = (row[0], row[1]) - if key in REGRAS: - return REGRAS[key] + if key in SUBSTITUTIONS: + return SUBSTITUTIONS[key] else: return row[-1] From 2fe17fe3a7a30c7576b9d9f8dc920921f9ef85cf Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 06:25:47 -0300 Subject: [PATCH 060/265] Cleanup --- br_denatran_frota/code/frota_uf_tipo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/br_denatran_frota/code/frota_uf_tipo.py b/br_denatran_frota/code/frota_uf_tipo.py index 213f52cc9..aad75545e 100644 --- a/br_denatran_frota/code/frota_uf_tipo.py +++ b/br_denatran_frota/code/frota_uf_tipo.py @@ -2,7 +2,7 @@ import polars as pl import pandas as pd import os -from utils import ( +from br_denatran_frota.code.butils import ( guess_header, change_df_header, get_year_month_from_filename, From a25ce639cbe4f737fb54ce93037dfbab632bbdc1 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 06:26:06 -0300 Subject: [PATCH 061/265] Cleanup crew --- .../code/{utils.py => butils.py} | 0 br_denatran_frota/code/download_frota.py | 3 +- br_denatran_frota/code/test_drive.ipynb | 443 +++++++++++++----- 3 files changed, 335 insertions(+), 111 deletions(-) rename br_denatran_frota/code/{utils.py => butils.py} (100%) diff --git a/br_denatran_frota/code/utils.py b/br_denatran_frota/code/butils.py similarity index 100% rename from br_denatran_frota/code/utils.py rename to br_denatran_frota/code/butils.py diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index 52ce439e6..097a78d96 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- import os import re import glob @@ -75,8 +76,6 @@ def make_filename(i: dict, ext: bool = True) -> str: filename += f".{filetype}" return filename - print(2) - def call_downloader(i): filename = make_filename(i) diff --git a/br_denatran_frota/code/test_drive.ipynb b/br_denatran_frota/code/test_drive.ipynb index 7bb9411db..fed5fa695 100644 --- a/br_denatran_frota/code/test_drive.ipynb +++ b/br_denatran_frota/code/test_drive.ipynb @@ -2,9 +2,21 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "ImportError", + "evalue": "cannot import name 'get_city_name_ibge' from 'utils' (/home/tamir/basedosdados/pipelines/br_denatran_frota/code/utils.py)", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mImportError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[2], line 11\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mbs4\u001b[39;00m \u001b[39mimport\u001b[39;00m BeautifulSoup\n\u001b[1;32m 10\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mdifflib\u001b[39;00m\n\u001b[0;32m---> 11\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mutils\u001b[39;00m \u001b[39mimport\u001b[39;00m guess_header, change_df_header, get_year_month_from_filename, verify_total, get_city_name_ibge, match_ibge\n\u001b[1;32m 12\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mconstants\u001b[39;00m \u001b[39mimport\u001b[39;00m DICT_UFS, REGRAS\n", + "\u001b[0;31mImportError\u001b[0m: cannot import name 'get_city_name_ibge' from 'utils' (/home/tamir/basedosdados/pipelines/br_denatran_frota/code/utils.py)" + ] + } + ], "source": [ "import polars as pl\n", "import pandas as pd \n", @@ -16,41 +28,13 @@ "from rarfile import RarFile\n", "from bs4 import BeautifulSoup\n", "import difflib\n", - "from utils import guess_header, change_df_header, get_year_month_from_filename, treat_uf_tipo\n", - "DICT_UFS = {\n", - " \"AC\": \"Acre\",\n", - " \"AL\": \"Alagoas\",\n", - " \"AP\": \"Amapá\",\n", - " \"AM\": \"Amazonas\",\n", - " \"BA\": \"Bahia\",\n", - " \"CE\": \"Ceará\",\n", - " \"DF\": \"Distrito Federal\",\n", - " \"ES\": \"Espírito Santo\",\n", - " \"GO\": \"Goiás\",\n", - " \"MA\": \"Maranhão\",\n", - " \"MT\": \"Mato Grosso\",\n", - " \"MS\": \"Mato Grosso do Sul\",\n", - " \"MG\": \"Minas Gerais\",\n", - " \"PA\": \"Pará\",\n", - " \"PB\": \"Paraíba\",\n", - " \"PR\": \"Paraná\",\n", - " \"PE\": \"Pernambuco\",\n", - " \"PI\": \"Piauí\",\n", - " \"RJ\": \"Rio de Janeiro\",\n", - " \"RN\": \"Rio Grande do Norte\",\n", - " \"RS\": \"Rio Grande do Sul\",\n", - " \"RO\": \"Rondônia\",\n", - " \"RR\": \"Roraima\",\n", - " \"SC\": \"Santa Catarina\",\n", - " \"SP\": \"São Paulo\",\n", - " \"SE\": \"Sergipe\",\n", - " \"TO\": \"Tocantins\",\n", - "}" + "from br_denatran_frota.utils import guess_header, change_df_header, get_year_month_from_filename, verify_total, get_city_name_ibge, match_ibge\n", + "from constants import DICT_UFS, REGRAS" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -60,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -69,7 +53,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -87,16 +71,14 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/home/tamir/.cache/pypoetry/virtualenvs/pipelines-Fyk5jlG0-py3.10/lib/python3.10/site-packages/requests/__init__.py:102: RequestsDependencyWarning: urllib3 (1.26.7) or chardet (5.1.0)/charset_normalizer (2.0.8) doesn't match a supported version!\n", - " warnings.warn(\"urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported \"\n", - "Downloading: 100%|██████████| 5570/5570 [00:00<00:00, 10744.58rows/s]\n" + "Downloading: 100%|██████████| 5570/5570 [00:00<00:00, 12793.96rows/s]\n" ] } ], @@ -110,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -125,7 +107,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -134,7 +116,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -146,19 +128,44 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [ { - "ename": "NameError", - "evalue": "name 'denatran_uf' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m denatran_uf\n", - "\u001b[0;31mNameError\u001b[0m: name 'denatran_uf' is not defined" - ] + "data": { + "text/html": [ + "

\n", + "shape: (167, 24)
sigla_ufnome_denatranTOTALAUTOMOVELBONDECAMINHAOCAMINHAO TRATORCAMINHONETECAMIONETACHASSI PLATAFCICLOMOTORMICRO-ONIBUSMOTOCICLETAMOTONETAONIBUSQUADRICICLOREBOQUESEMI-REBOQUESIDE-CAROUTROSTRATOR ESTEITRATOR RODASTRICICLOUTILITARIO
strstri64i64i64i64i64i64i64i64i64i64i64i64i64i64i64i64i64i64i64i64i64i64
"RN""ACARI"40351394012272799107313168428616031801500412
"RN""AFONSO BEZERRA…186773003711533002108076517061040004
"RN""AGUA NOVA"10572600160429028613942031020005
"RN""ALEXANDRIA"612222240146195506202502686216180483402500141
"RN""ALMINO AFONSO"16214650241951504984313530104060007
"RN""ALTO DO RODRIG…541118980266740873115222196367340451302803134
"RN""ANGICOS"41891400013954247201821184715320040901400126
"RN""ANTONIO MARTIN…20165500460122200213111512150600500011
"RN""APODI"177714506051259105112303615480722683630714608400185
"RN""AREIA BRANCA"9801321202024154412802414731911827770629205200778
"RN""ARES"3098124309131854405913111781490138430400028
"RN""ASSU"266678400096057166832201416751062524061270219970970012186
"RN""TIBAU"18296930537150190601260812940017502101014
"RN""TIBAU DO SUL"4676191107104921970124541375198280501109000156
"RN""TIMBAUBA DOS B…69721201206013069324357062030008
"RN""TOUROS"83152463018658861230134393945303630381707013102
"RN""TRIUNFO POTIGU…89823702208611047497243050010001
"RN""UMARIZAL"3879107308116275270727193533480292401700125
"RN""UPANEMA"4127114901151228527059132011378160171102200012
"RN""VARZEA"123047002106226053582338095040002
"RN""VENHA-VER"8502700170789007443127020000005
"RN""VERA CRUZ"39891238021143714905111967592601360100127
"RN""VICOSA"515162081276001285162011040001
"RN""VILA FLOR"847298010237150182433192012010007
" + ], + "text/plain": [ + "shape: (167, 24)\n", + "┌──────────┬────────────┬───────┬───────────┬───┬────────────┬────────────┬──────────┬────────────┐\n", + "│ sigla_uf ┆ nome_denat ┆ TOTAL ┆ AUTOMOVEL ┆ … ┆ TRATOR ┆ TRATOR ┆ TRICICLO ┆ UTILITARIO │\n", + "│ --- ┆ ran ┆ --- ┆ --- ┆ ┆ ESTEI ┆ RODAS ┆ --- ┆ --- │\n", + "│ str ┆ --- ┆ i64 ┆ i64 ┆ ┆ --- ┆ --- ┆ i64 ┆ i64 │\n", + "│ ┆ str ┆ ┆ ┆ ┆ i64 ┆ i64 ┆ ┆ │\n", + "╞══════════╪════════════╪═══════╪═══════════╪═══╪════════════╪════════════╪══════════╪════════════╡\n", + "│ RN ┆ ACARI ┆ 4035 ┆ 1394 ┆ … ┆ 0 ┆ 0 ┆ 4 ┆ 12 │\n", + "│ RN ┆ AFONSO ┆ 1867 ┆ 730 ┆ … ┆ 0 ┆ 0 ┆ 0 ┆ 4 │\n", + "│ ┆ BEZERRA ┆ ┆ ┆ ┆ ┆ ┆ ┆ │\n", + "│ RN ┆ AGUA NOVA ┆ 1057 ┆ 260 ┆ … ┆ 0 ┆ 0 ┆ 0 ┆ 5 │\n", + "│ RN ┆ ALEXANDRIA ┆ 6122 ┆ 2224 ┆ … ┆ 0 ┆ 0 ┆ 1 ┆ 41 │\n", + "│ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … │\n", + "│ RN ┆ VENHA-VER ┆ 850 ┆ 270 ┆ … ┆ 0 ┆ 0 ┆ 0 ┆ 5 │\n", + "│ RN ┆ VERA CRUZ ┆ 3989 ┆ 1238 ┆ … ┆ 0 ┆ 0 ┆ 1 ┆ 27 │\n", + "│ RN ┆ VICOSA ┆ 515 ┆ 162 ┆ … ┆ 0 ┆ 0 ┆ 0 ┆ 1 │\n", + "│ RN ┆ VILA FLOR ┆ 847 ┆ 298 ┆ … ┆ 0 ┆ 0 ┆ 0 ┆ 7 │\n", + "└──────────┴────────────┴───────┴───────────┴───┴────────────┴────────────┴──────────┴────────────┘" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -167,40 +174,25 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "def get_city_name_ibge(denatran_name: str):\n", - " matches = difflib.get_close_matches(denatran_name.lower(), ibge_uf['nome'].str.to_lowercase(), n = 1)\n", - " if matches:\n", - " return matches[0]\n", - " else:\n", - " return '' # I don't want this to error out directly, because then I can get all municipalities.\n", + "\n", "x = denatran_uf['nome_denatran'].apply(get_city_name_ibge)\n", "denatran_uf = denatran_uf.with_columns(x.alias('suggested_nome_ibge'))" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "def match_ibge(denatran_uf: pl.DataFrame, ibge_uf: pl.DataFrame):\n", - " joined_df = denatran_uf.join(ibge_uf, left_on=['suggested_nome_ibge', 'sigla_uf'], right_on=['nome', 'sigla_uf'], how='left')\n", - " mismatched_rows = joined_df.filter(pl.col('id_municipio').is_null())\n", - "\n", - " if len(mismatched_rows) > 0:\n", - " error_message = \"Os seguintes municípios falharam: \\n\"\n", - " for row in mismatched_rows.rows(named = True):\n", - " error_message += f\"{row['nome_denatran']} ({row['sigla_uf']})\\n\"\n", - " raise ValueError(error_message)\n" - ] + "source": [] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -210,8 +202,8 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[9], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m match_ibge(denatran_uf, ibge_uf)\n", - "Cell \u001b[0;32mIn[8], line 9\u001b[0m, in \u001b[0;36mmatch_ibge\u001b[0;34m(denatran_uf, ibge_uf)\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[39mfor\u001b[39;00m row \u001b[39min\u001b[39;00m mismatched_rows\u001b[39m.\u001b[39mrows(named \u001b[39m=\u001b[39m \u001b[39mTrue\u001b[39;00m):\n\u001b[1;32m 8\u001b[0m error_message \u001b[39m+\u001b[39m\u001b[39m=\u001b[39m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m{\u001b[39;00mrow[\u001b[39m'\u001b[39m\u001b[39mnome_denatran\u001b[39m\u001b[39m'\u001b[39m]\u001b[39m}\u001b[39;00m\u001b[39m (\u001b[39m\u001b[39m{\u001b[39;00mrow[\u001b[39m'\u001b[39m\u001b[39msigla_uf\u001b[39m\u001b[39m'\u001b[39m]\u001b[39m}\u001b[39;00m\u001b[39m)\u001b[39m\u001b[39m\\n\u001b[39;00m\u001b[39m\"\u001b[39m\n\u001b[0;32m----> 9\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(error_message)\n", + "Cell \u001b[0;32mIn[26], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m match_ibge(denatran_uf, ibge_uf)\n", + "Cell \u001b[0;32mIn[25], line 9\u001b[0m, in \u001b[0;36mmatch_ibge\u001b[0;34m(denatran_uf, ibge_uf)\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[39mfor\u001b[39;00m row \u001b[39min\u001b[39;00m mismatched_rows\u001b[39m.\u001b[39mrows(named \u001b[39m=\u001b[39m \u001b[39mTrue\u001b[39;00m):\n\u001b[1;32m 8\u001b[0m error_message \u001b[39m+\u001b[39m\u001b[39m=\u001b[39m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m{\u001b[39;00mrow[\u001b[39m'\u001b[39m\u001b[39mnome_denatran\u001b[39m\u001b[39m'\u001b[39m]\u001b[39m}\u001b[39;00m\u001b[39m (\u001b[39m\u001b[39m{\u001b[39;00mrow[\u001b[39m'\u001b[39m\u001b[39msigla_uf\u001b[39m\u001b[39m'\u001b[39m]\u001b[39m}\u001b[39;00m\u001b[39m)\u001b[39m\u001b[39m\\n\u001b[39;00m\u001b[39m\"\u001b[39m\n\u001b[0;32m----> 9\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(error_message)\n", "\u001b[0;31mValueError\u001b[0m: Os seguintes municípios falharam: \nASSU (RN)\n" ] } @@ -222,7 +214,23 @@ }, { "cell_type": "code", - "execution_count": 232, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nomes = ibge_uf['nome'].to_list()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -233,59 +241,276 @@ }, { "cell_type": "code", - "execution_count": 146, + "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " sigla_uf nome_denatran TOTAL AUTOMOVEL BONDE CAMINHAO \\\n", + "0 RN ACARI 4035 1394 0 122 \n", + "1 RN AFONSO BEZERRA 1867 730 0 37 \n", + "2 RN AGUA NOVA 1057 260 0 16 \n", + "3 RN ALEXANDRIA 6122 2224 0 146 \n", + "4 RN ALMINO AFONSO 1621 465 0 24 \n", + ".. ... ... ... ... ... ... \n", + "162 RN VARZEA 1230 470 0 21 \n", + "163 RN VENHA-VER 850 270 0 17 \n", + "164 RN VERA CRUZ 3989 1238 0 211 \n", + "165 RN VICOSA 515 162 0 8 \n", + "166 RN VILA FLOR 847 298 0 10 \n", + "\n", + " CAMINHAO TRATOR CAMINHONETE CAMIONETA CHASSI PLATAF ... QUADRICICLO \\\n", + "0 7 279 91 0 ... 0 \n", + "1 1 153 30 0 ... 0 \n", + "2 0 42 9 0 ... 0 \n", + "3 19 550 62 0 ... 0 \n", + "4 1 95 15 0 ... 0 \n", + ".. ... ... ... ... ... ... \n", + "162 0 62 26 0 ... 0 \n", + "163 0 78 9 0 ... 0 \n", + "164 4 371 49 0 ... 0 \n", + "165 1 27 6 0 ... 0 \n", + "166 2 37 15 0 ... 0 \n", + "\n", + " REBOQUE SEMI-REBOQUE SIDE-CAR OUTROS TRATOR ESTEI TRATOR RODAS \\\n", + "0 31 8 0 15 0 0 \n", + "1 6 1 0 4 0 0 \n", + "2 3 1 0 2 0 0 \n", + "3 48 34 0 25 0 0 \n", + "4 10 4 0 6 0 0 \n", + ".. ... ... ... ... ... ... \n", + "162 9 5 0 4 0 0 \n", + "163 2 0 0 0 0 0 \n", + "164 13 6 0 1 0 0 \n", + "165 1 1 0 4 0 0 \n", + "166 1 2 0 1 0 0 \n", + "\n", + " TRICICLO UTILITARIO suggested_nome_ibge \n", + "0 4 12 acari \n", + "1 0 4 afonso bezerra \n", + "2 0 5 água nova \n", + "3 1 41 alexandria \n", + "4 0 7 almino afonso \n", + ".. ... ... ... \n", + "162 0 2 várzea \n", + "163 0 5 venha-ver \n", + "164 1 27 vera cruz \n", + "165 0 1 viçosa \n", + "166 0 7 vila flor \n", + "\n", + "[167 rows x 25 columns]\n" + ] + } + ], "source": [ - "def verify_total(df: pl.DataFrame):\n", - " columns_for_total = df.select( pl.exclude(\"TOTAL\")).select(pl.exclude([pl.Utf8]))\n", - " calculated_total = columns_for_total.select( pl.fold( acc=pl.lit(0), function=lambda acc, x: acc + x, exprs=pl.col(\"*\")\n", - " ).alias(\"calculated_total\"))['calculated_total']\n", + "import pandas as pd\n", + "zdf = denatran_uf.to_pandas()\n", "\n", - " mask = df['TOTAL'] == calculated_total\n", - " if pl.sum(~mask) != 0:\n", - " raise ValueError('A coluna de TOTAL da base original tem inconsistências e não soma tudo das demais colunas.')\n", - " # Verifies that we can do drop total and do LONG. \n", - "verify_total(new_df)" + "REGRAS = {('RN', 'ASSU'): 'açu'}\n", + "\n", + "# Define a function to apply the ruleset\n", + "def get_name_c(row):\n", + " key = (row['sigla_uf'], row['nome_denatran'])\n", + " if key in REGRAS:\n", + " return REGRAS[key]\n", + " else:\n", + " return row['suggested_nome_ibge']\n", + "\n", + "# Apply the function to the DataFrame\n", + "zdf['suggested_nome_ibge'] = zdf.apply(get_name_c, axis=1)\n", + "\n", + "# Print the modified DataFrame\n", + "print(zdf)\n" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [ { - "ename": "TypeError", - "evalue": "DataFrame.apply() got an unexpected keyword argument 'predicate'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[12], line 12\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[39m# set id_municipio to 1 when nome_denatran is 'B' and sigla_uf is 'MG'\u001b[39;00m\n\u001b[1;32m 11\u001b[0m mask1 \u001b[39m=\u001b[39m (df[\u001b[39m'\u001b[39m\u001b[39mnome_denatran\u001b[39m\u001b[39m'\u001b[39m] \u001b[39m==\u001b[39m \u001b[39m'\u001b[39m\u001b[39mB\u001b[39m\u001b[39m'\u001b[39m) \u001b[39m&\u001b[39m (df[\u001b[39m'\u001b[39m\u001b[39msigla_uf\u001b[39m\u001b[39m'\u001b[39m] \u001b[39m==\u001b[39m \u001b[39m'\u001b[39m\u001b[39mMG\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[0;32m---> 12\u001b[0m df[\u001b[39m'\u001b[39m\u001b[39mid_municipio\u001b[39m\u001b[39m'\u001b[39m] \u001b[39m=\u001b[39m df\u001b[39m.\u001b[39;49mapply(\u001b[39mlambda\u001b[39;49;00m x: \u001b[39m1\u001b[39;49m \u001b[39mif\u001b[39;49;00m mask1[x] \u001b[39melse\u001b[39;49;00m x[\u001b[39m'\u001b[39;49m\u001b[39mid_municipio\u001b[39;49m\u001b[39m'\u001b[39;49m], predicate\u001b[39m=\u001b[39;49mmask1)\n\u001b[1;32m 14\u001b[0m \u001b[39m# set id_municipio to 23 when nome_denatran is 'C' and sigla_uf is 'RJ'\u001b[39;00m\n\u001b[1;32m 15\u001b[0m mask2 \u001b[39m=\u001b[39m (df[\u001b[39m'\u001b[39m\u001b[39mnome_denatran\u001b[39m\u001b[39m'\u001b[39m] \u001b[39m==\u001b[39m \u001b[39m'\u001b[39m\u001b[39mC\u001b[39m\u001b[39m'\u001b[39m) \u001b[39m&\u001b[39m (df[\u001b[39m'\u001b[39m\u001b[39msigla_uf\u001b[39m\u001b[39m'\u001b[39m] \u001b[39m==\u001b[39m \u001b[39m'\u001b[39m\u001b[39mRJ\u001b[39m\u001b[39m'\u001b[39m)\n", - "\u001b[0;31mTypeError\u001b[0m: DataFrame.apply() got an unexpected keyword argument 'predicate'" - ] + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
sigla_ufnome_denatranTOTALAUTOMOVELBONDECAMINHAOCAMINHAO TRATORCAMINHONETECAMIONETACHASSI PLATAF...QUADRICICLOREBOQUESEMI-REBOQUESIDE-CAROUTROSTRATOR ESTEITRATOR RODASTRICICLOUTILITARIOsuggested_nome_ibge
11RNASSU26667840009605716683220...0219970970012186açu
\n", + "

1 rows × 25 columns

\n", + "
" + ], + "text/plain": [ + " sigla_uf nome_denatran TOTAL AUTOMOVEL BONDE CAMINHAO CAMINHAO TRATOR \\\n", + "11 RN ASSU 26667 8400 0 960 57 \n", + "\n", + " CAMINHONETE CAMIONETA CHASSI PLATAF ... QUADRICICLO REBOQUE \\\n", + "11 1668 322 0 ... 0 219 \n", + "\n", + " SEMI-REBOQUE SIDE-CAR OUTROS TRATOR ESTEI TRATOR RODAS TRICICLO \\\n", + "11 97 0 97 0 0 12 \n", + "\n", + " UTILITARIO suggested_nome_ibge \n", + "11 186 açu \n", + "\n", + "[1 rows x 25 columns]" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" } ], + "source": [ + "zdf.loc[zdf['nome_denatran'] == 'ASSU']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import polars as pl\n", "\n", - "# create a sample polars data frame\n", - "df = pl.DataFrame({\n", - " 'nome_denatran': ['A', 'B', 'C', 'D'],\n", - " 'sigla_uf': ['SP', 'MG', 'RJ', 'ES'],\n", - " 'id_municipio': [0, 0, 0, 0]\n", + "# Create example polars DataFrame\n", + "zdf = pl.DataFrame({\n", + " 'sigla_uf': ['RN', 'MG', 'RS'],\n", + " 'nome_denatran': ['ASSU', 'BELO HORIZONTE', 'PORTO ALEGRE'],\n", + " 'suggested_nome_ibge': ['Unknown', 'Unknown', 'Unknown'],\n", + " 'id': [1, 2, 3]\n", "})\n", "\n", - "# set id_municipio to 1 when nome_denatran is 'B' and sigla_uf is 'MG'\n", - "mask1 = (df['nome_denatran'] == 'B') & (df['sigla_uf'] == 'MG')\n", - "df['id_municipio'] = df.apply(lambda x: 1 if mask1[x] else x['id_municipio'], predicate=mask1)\n", + "# Define your ruleset as a dictionary\n", + "\n", + "# Define a function to apply the ruleset\n", "\n", - "# set id_municipio to 23 when nome_denatran is 'C' and sigla_uf is 'RJ'\n", - "mask2 = (df['nome_denatran'] == 'C') & (df['sigla_uf'] == 'RJ')\n", - "df['id_municipio'] = df.apply(lambda x: 23 if mask2[x] else x['id_municipio'], predicate=mask2)\n", "\n", - "# print the updated data frame\n", - "print(df)\n" + "# Apply the function to the polars DataFrame\n", + "denatran_uf = denatran_uf.with_columns(denatran_uf.apply(fix_suggested_nome_ibge)['apply'].alias('suggested_nome_ibge'))\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "shape: (167,)
apply
str
"acari"
"afonso bezerra…
"água nova"
"alexandria"
"almino afonso"
"alto do rodrig…
"angicos"
"antônio martin…
"apodi"
"areia branca"
"arês"
"açu"
"tibau"
"tibau do sul"
"timbaúba dos b…
"touros"
"triunfo potigu…
"umarizal"
"upanema"
"várzea"
"venha-ver"
"vera cruz"
"viçosa"
"vila flor"
" + ], + "text/plain": [ + "shape: (167,)\n", + "Series: 'apply' [str]\n", + "[\n", + "\t\"acari\"\n", + "\t\"afonso bezerra…\n", + "\t\"água nova\"\n", + "\t\"alexandria\"\n", + "\t\"almino afonso\"\n", + "\t\"alto do rodrig…\n", + "\t\"angicos\"\n", + "\t\"antônio martin…\n", + "\t\"apodi\"\n", + "\t\"areia branca\"\n", + "\t\"arês\"\n", + "\t\"açu\"\n", + "\t…\n", + "\t\"tenente lauren…\n", + "\t\"tibau\"\n", + "\t\"tibau do sul\"\n", + "\t\"timbaúba dos b…\n", + "\t\"touros\"\n", + "\t\"triunfo potigu…\n", + "\t\"umarizal\"\n", + "\t\"upanema\"\n", + "\t\"várzea\"\n", + "\t\"venha-ver\"\n", + "\t\"vera cruz\"\n", + "\t\"viçosa\"\n", + "\t\"vila flor\"\n", + "]" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "denatran_uf.apply(get_suggested_nome_ibge)['apply']\n" ] } ], From 2516646943499a19327a16181cba5bf33646efcf Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 06:33:00 -0300 Subject: [PATCH 062/265] More migration of code --- .../datasets/br_denatran_frota/constants.py | 3 + pipelines/datasets/br_denatran_frota/utils.py | 62 +++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index 06a19a0ae..0e14e5a3e 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -89,3 +89,6 @@ class constants(Enum): # pylint: disable=c0103 } DATASET = "br_denatran_frota" + HEADERS = { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36" + } diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index f2ae280eb..a620f9eb9 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -34,10 +34,14 @@ import polars as pl import difflib import re +import os +from zipfile import ZipFile +import requests from pipelines.datasets.br_denatran_frota.constants import constants DICT_UFS = constants.DICT_UFS.value SUBSTITUTIONS = constants.SUBSTITUTIONS.value +HEADERS = constants.HEADERS.value def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int: @@ -115,3 +119,61 @@ def get_city_name_ibge(denatran_name: str, ibge_uf: pl.DataFrame) -> str: return matches[0] else: return "" # I don't want this to error out directly, because then I can get all municipalities. + + +def download_file(url, filename): + # Send a GET request to the URL + + new_url = url.replace("arquivos-denatran", "arquivos-senatran") + response = requests.get(new_url, headers=HEADERS) + # Save the contents of the response to a file + with open(filename, "wb") as f: + f.write(response.content) + + print(f"Download of {filename} complete") + + +def extract_zip(dest_path_file): + with ZipFile(dest_path_file, "r") as z: + z.extractall() + + +def handle_xl(i: dict) -> None: + """Actually downloads and deals with Excel files. + + Args: + i (dict): Dictionary with all the desired downloadable file's info. + """ + dest_path_file = make_filename(i) + download_file(i["href"], dest_path_file) + + +def make_filename(i: dict, ext: bool = True) -> str: + """Creates the filename using the sent dictionary. + + Args: + i (dict): Dictionary with all the file's info. + ext (bool, optional): Specifies if the generated file name needs the filetype at the end. Defaults to True. + + Returns: + str: The full filename. + """ + txt = i["txt"] + mes = i["mes"] + ano = i["ano"] + filetype = i["filetype"] + filename = re.sub("\\s+", "_", txt, flags=re.UNICODE).lower() + filename = f"{filename}_{mes}-{ano}" + if ext: + filename += f".{filetype}" + return filename + + +def make_dir_when_not_exists(dir_name: str): + """Auxiliary function to create a subdirectory when it is not present. + + Args: + dir_name (str): Name of the subdirectory to be created. + """ + if not os.path.exists(dir_name): + os.mkdir(dir_name) From 60bdf9b43f30d7ea4e9246ba3e345ce9b48f3f1b Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 06:48:26 -0300 Subject: [PATCH 063/265] Small refactoring --- br_denatran_frota/code/constants.py | 2 +- br_denatran_frota/code/download_frota.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/br_denatran_frota/code/constants.py b/br_denatran_frota/code/constants.py index bd50c4bab..88ce21463 100644 --- a/br_denatran_frota/code/constants.py +++ b/br_denatran_frota/code/constants.py @@ -29,6 +29,6 @@ "TO": "Tocantins", } -REGRAS = { +SUBSTITUTIONS = { ("RN", "ASSU"): "açu", } diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index 097a78d96..6060769fc 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -24,7 +24,7 @@ } DATASET = "br_denatran_frota" -headers = { +HEADERS = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36" } @@ -33,7 +33,7 @@ def download_file(url, filename): # Send a GET request to the URL new_url = url.replace("arquivos-denatran", "arquivos-senatran") - response = requests.get(new_url, headers=headers) + response = requests.get(new_url, headers=HEADERS) # Save the contents of the response to a file with open(filename, "wb") as f: f.write(response.content) From 0a07c40e3512741fd6f5d2f59e392f7ac050f765 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 07:33:07 -0300 Subject: [PATCH 064/265] More reorganizing --- br_denatran_frota/code/frota_uf_tipo.py | 2 +- br_denatran_frota/code/test_drive.ipynb | 259 ++---------------- .../code/{butils.py => utils.py} | 2 +- 3 files changed, 18 insertions(+), 245 deletions(-) rename br_denatran_frota/code/{butils.py => utils.py} (97%) diff --git a/br_denatran_frota/code/frota_uf_tipo.py b/br_denatran_frota/code/frota_uf_tipo.py index aad75545e..05d3aacf2 100644 --- a/br_denatran_frota/code/frota_uf_tipo.py +++ b/br_denatran_frota/code/frota_uf_tipo.py @@ -2,7 +2,7 @@ import polars as pl import pandas as pd import os -from br_denatran_frota.code.butils import ( +from br_denatran_frota.code.utils import ( guess_header, change_df_header, get_year_month_from_filename, diff --git a/br_denatran_frota/code/test_drive.ipynb b/br_denatran_frota/code/test_drive.ipynb index fed5fa695..6a367de1b 100644 --- a/br_denatran_frota/code/test_drive.ipynb +++ b/br_denatran_frota/code/test_drive.ipynb @@ -2,21 +2,9 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 9, "metadata": {}, - "outputs": [ - { - "ename": "ImportError", - "evalue": "cannot import name 'get_city_name_ibge' from 'utils' (/home/tamir/basedosdados/pipelines/br_denatran_frota/code/utils.py)", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mImportError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[2], line 11\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mbs4\u001b[39;00m \u001b[39mimport\u001b[39;00m BeautifulSoup\n\u001b[1;32m 10\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mdifflib\u001b[39;00m\n\u001b[0;32m---> 11\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mutils\u001b[39;00m \u001b[39mimport\u001b[39;00m guess_header, change_df_header, get_year_month_from_filename, verify_total, get_city_name_ibge, match_ibge\n\u001b[1;32m 12\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mconstants\u001b[39;00m \u001b[39mimport\u001b[39;00m DICT_UFS, REGRAS\n", - "\u001b[0;31mImportError\u001b[0m: cannot import name 'get_city_name_ibge' from 'utils' (/home/tamir/basedosdados/pipelines/br_denatran_frota/code/utils.py)" - ] - } - ], + "outputs": [], "source": [ "import polars as pl\n", "import pandas as pd \n", @@ -28,8 +16,8 @@ "from rarfile import RarFile\n", "from bs4 import BeautifulSoup\n", "import difflib\n", - "from br_denatran_frota.utils import guess_header, change_df_header, get_year_month_from_filename, verify_total, get_city_name_ibge, match_ibge\n", - "from constants import DICT_UFS, REGRAS" + "from br_denatran_frota.code.utils import *\n", + "from br_denatran_frota.code.constants import DICT_UFS, SUBSTITUTIONS" ] }, { @@ -71,14 +59,16 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "Downloading: 100%|██████████| 5570/5570 [00:00<00:00, 12793.96rows/s]\n" + "/home/tamir/.cache/pypoetry/virtualenvs/pipelines-Fyk5jlG0-py3.10/lib/python3.10/site-packages/requests/__init__.py:102: RequestsDependencyWarning: urllib3 (1.26.7) or chardet (5.1.0)/charset_normalizer (2.0.8) doesn't match a supported version!\n", + " warnings.warn(\"urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported \"\n", + "Downloading: 100%|██████████| 5570/5570 [00:00<00:00, 8581.01rows/s]\n" ] } ], @@ -92,7 +82,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -111,7 +101,7 @@ "metadata": {}, "outputs": [], "source": [ - "uf = 'RN'" + "new_df = new_df.with_columns(new_df.apply(fix_suggested_nome_ibge)['apply'].alias('suggested_nome_ibge'))" ] }, { @@ -126,52 +116,6 @@ "ibge_uf = ibge_uf.with_columns(pl.col('nome').str.to_lowercase())" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "shape: (167, 24)
sigla_ufnome_denatranTOTALAUTOMOVELBONDECAMINHAOCAMINHAO TRATORCAMINHONETECAMIONETACHASSI PLATAFCICLOMOTORMICRO-ONIBUSMOTOCICLETAMOTONETAONIBUSQUADRICICLOREBOQUESEMI-REBOQUESIDE-CAROUTROSTRATOR ESTEITRATOR RODASTRICICLOUTILITARIO
strstri64i64i64i64i64i64i64i64i64i64i64i64i64i64i64i64i64i64i64i64i64i64
"RN""ACARI"40351394012272799107313168428616031801500412
"RN""AFONSO BEZERRA…186773003711533002108076517061040004
"RN""AGUA NOVA"10572600160429028613942031020005
"RN""ALEXANDRIA"612222240146195506202502686216180483402500141
"RN""ALMINO AFONSO"16214650241951504984313530104060007
"RN""ALTO DO RODRIG…541118980266740873115222196367340451302803134
"RN""ANGICOS"41891400013954247201821184715320040901400126
"RN""ANTONIO MARTIN…20165500460122200213111512150600500011
"RN""APODI"177714506051259105112303615480722683630714608400185
"RN""AREIA BRANCA"9801321202024154412802414731911827770629205200778
"RN""ARES"3098124309131854405913111781490138430400028
"RN""ASSU"266678400096057166832201416751062524061270219970970012186
"RN""TIBAU"18296930537150190601260812940017502101014
"RN""TIBAU DO SUL"4676191107104921970124541375198280501109000156
"RN""TIMBAUBA DOS B…69721201206013069324357062030008
"RN""TOUROS"83152463018658861230134393945303630381707013102
"RN""TRIUNFO POTIGU…89823702208611047497243050010001
"RN""UMARIZAL"3879107308116275270727193533480292401700125
"RN""UPANEMA"4127114901151228527059132011378160171102200012
"RN""VARZEA"123047002106226053582338095040002
"RN""VENHA-VER"8502700170789007443127020000005
"RN""VERA CRUZ"39891238021143714905111967592601360100127
"RN""VICOSA"515162081276001285162011040001
"RN""VILA FLOR"847298010237150182433192012010007
" - ], - "text/plain": [ - "shape: (167, 24)\n", - "┌──────────┬────────────┬───────┬───────────┬───┬────────────┬────────────┬──────────┬────────────┐\n", - "│ sigla_uf ┆ nome_denat ┆ TOTAL ┆ AUTOMOVEL ┆ … ┆ TRATOR ┆ TRATOR ┆ TRICICLO ┆ UTILITARIO │\n", - "│ --- ┆ ran ┆ --- ┆ --- ┆ ┆ ESTEI ┆ RODAS ┆ --- ┆ --- │\n", - "│ str ┆ --- ┆ i64 ┆ i64 ┆ ┆ --- ┆ --- ┆ i64 ┆ i64 │\n", - "│ ┆ str ┆ ┆ ┆ ┆ i64 ┆ i64 ┆ ┆ │\n", - "╞══════════╪════════════╪═══════╪═══════════╪═══╪════════════╪════════════╪══════════╪════════════╡\n", - "│ RN ┆ ACARI ┆ 4035 ┆ 1394 ┆ … ┆ 0 ┆ 0 ┆ 4 ┆ 12 │\n", - "│ RN ┆ AFONSO ┆ 1867 ┆ 730 ┆ … ┆ 0 ┆ 0 ┆ 0 ┆ 4 │\n", - "│ ┆ BEZERRA ┆ ┆ ┆ ┆ ┆ ┆ ┆ │\n", - "│ RN ┆ AGUA NOVA ┆ 1057 ┆ 260 ┆ … ┆ 0 ┆ 0 ┆ 0 ┆ 5 │\n", - "│ RN ┆ ALEXANDRIA ┆ 6122 ┆ 2224 ┆ … ┆ 0 ┆ 0 ┆ 1 ┆ 41 │\n", - "│ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … │\n", - "│ RN ┆ VENHA-VER ┆ 850 ┆ 270 ┆ … ┆ 0 ┆ 0 ┆ 0 ┆ 5 │\n", - "│ RN ┆ VERA CRUZ ┆ 3989 ┆ 1238 ┆ … ┆ 0 ┆ 0 ┆ 1 ┆ 27 │\n", - "│ RN ┆ VICOSA ┆ 515 ┆ 162 ┆ … ┆ 0 ┆ 0 ┆ 0 ┆ 1 │\n", - "│ RN ┆ VILA FLOR ┆ 847 ┆ 298 ┆ … ┆ 0 ┆ 0 ┆ 0 ┆ 7 │\n", - "└──────────┴────────────┴───────┴───────────┴───┴────────────┴────────────┴──────────┴────────────┘" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "denatran_uf" - ] - }, { "cell_type": "code", "execution_count": null, @@ -192,19 +136,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [ { - "ename": "ValueError", - "evalue": "Os seguintes municípios falharam: \nASSU (RN)\n", + "ename": "NameError", + "evalue": "name 'denatran_uf' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[26], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m match_ibge(denatran_uf, ibge_uf)\n", - "Cell \u001b[0;32mIn[25], line 9\u001b[0m, in \u001b[0;36mmatch_ibge\u001b[0;34m(denatran_uf, ibge_uf)\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[39mfor\u001b[39;00m row \u001b[39min\u001b[39;00m mismatched_rows\u001b[39m.\u001b[39mrows(named \u001b[39m=\u001b[39m \u001b[39mTrue\u001b[39;00m):\n\u001b[1;32m 8\u001b[0m error_message \u001b[39m+\u001b[39m\u001b[39m=\u001b[39m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m{\u001b[39;00mrow[\u001b[39m'\u001b[39m\u001b[39mnome_denatran\u001b[39m\u001b[39m'\u001b[39m]\u001b[39m}\u001b[39;00m\u001b[39m (\u001b[39m\u001b[39m{\u001b[39;00mrow[\u001b[39m'\u001b[39m\u001b[39msigla_uf\u001b[39m\u001b[39m'\u001b[39m]\u001b[39m}\u001b[39;00m\u001b[39m)\u001b[39m\u001b[39m\\n\u001b[39;00m\u001b[39m\"\u001b[39m\n\u001b[0;32m----> 9\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(error_message)\n", - "\u001b[0;31mValueError\u001b[0m: Os seguintes municípios falharam: \nASSU (RN)\n" + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[4], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m match_ibge(denatran_uf, ibge_uf)\n", + "\u001b[0;31mNameError\u001b[0m: name 'denatran_uf' is not defined" ] } ], @@ -239,92 +182,6 @@ "mismatched = joined_df.filter(pl.col('id_municipio').is_null())" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " sigla_uf nome_denatran TOTAL AUTOMOVEL BONDE CAMINHAO \\\n", - "0 RN ACARI 4035 1394 0 122 \n", - "1 RN AFONSO BEZERRA 1867 730 0 37 \n", - "2 RN AGUA NOVA 1057 260 0 16 \n", - "3 RN ALEXANDRIA 6122 2224 0 146 \n", - "4 RN ALMINO AFONSO 1621 465 0 24 \n", - ".. ... ... ... ... ... ... \n", - "162 RN VARZEA 1230 470 0 21 \n", - "163 RN VENHA-VER 850 270 0 17 \n", - "164 RN VERA CRUZ 3989 1238 0 211 \n", - "165 RN VICOSA 515 162 0 8 \n", - "166 RN VILA FLOR 847 298 0 10 \n", - "\n", - " CAMINHAO TRATOR CAMINHONETE CAMIONETA CHASSI PLATAF ... QUADRICICLO \\\n", - "0 7 279 91 0 ... 0 \n", - "1 1 153 30 0 ... 0 \n", - "2 0 42 9 0 ... 0 \n", - "3 19 550 62 0 ... 0 \n", - "4 1 95 15 0 ... 0 \n", - ".. ... ... ... ... ... ... \n", - "162 0 62 26 0 ... 0 \n", - "163 0 78 9 0 ... 0 \n", - "164 4 371 49 0 ... 0 \n", - "165 1 27 6 0 ... 0 \n", - "166 2 37 15 0 ... 0 \n", - "\n", - " REBOQUE SEMI-REBOQUE SIDE-CAR OUTROS TRATOR ESTEI TRATOR RODAS \\\n", - "0 31 8 0 15 0 0 \n", - "1 6 1 0 4 0 0 \n", - "2 3 1 0 2 0 0 \n", - "3 48 34 0 25 0 0 \n", - "4 10 4 0 6 0 0 \n", - ".. ... ... ... ... ... ... \n", - "162 9 5 0 4 0 0 \n", - "163 2 0 0 0 0 0 \n", - "164 13 6 0 1 0 0 \n", - "165 1 1 0 4 0 0 \n", - "166 1 2 0 1 0 0 \n", - "\n", - " TRICICLO UTILITARIO suggested_nome_ibge \n", - "0 4 12 acari \n", - "1 0 4 afonso bezerra \n", - "2 0 5 água nova \n", - "3 1 41 alexandria \n", - "4 0 7 almino afonso \n", - ".. ... ... ... \n", - "162 0 2 várzea \n", - "163 0 5 venha-ver \n", - "164 1 27 vera cruz \n", - "165 0 1 viçosa \n", - "166 0 7 vila flor \n", - "\n", - "[167 rows x 25 columns]\n" - ] - } - ], - "source": [ - "import pandas as pd\n", - "zdf = denatran_uf.to_pandas()\n", - "\n", - "REGRAS = {('RN', 'ASSU'): 'açu'}\n", - "\n", - "# Define a function to apply the ruleset\n", - "def get_name_c(row):\n", - " key = (row['sigla_uf'], row['nome_denatran'])\n", - " if key in REGRAS:\n", - " return REGRAS[key]\n", - " else:\n", - " return row['suggested_nome_ibge']\n", - "\n", - "# Apply the function to the DataFrame\n", - "zdf['suggested_nome_ibge'] = zdf.apply(get_name_c, axis=1)\n", - "\n", - "# Print the modified DataFrame\n", - "print(zdf)\n" - ] - }, { "cell_type": "code", "execution_count": null, @@ -428,90 +285,6 @@ "source": [ "zdf.loc[zdf['nome_denatran'] == 'ASSU']" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import polars as pl\n", - "\n", - "# Create example polars DataFrame\n", - "zdf = pl.DataFrame({\n", - " 'sigla_uf': ['RN', 'MG', 'RS'],\n", - " 'nome_denatran': ['ASSU', 'BELO HORIZONTE', 'PORTO ALEGRE'],\n", - " 'suggested_nome_ibge': ['Unknown', 'Unknown', 'Unknown'],\n", - " 'id': [1, 2, 3]\n", - "})\n", - "\n", - "# Define your ruleset as a dictionary\n", - "\n", - "# Define a function to apply the ruleset\n", - "\n", - "\n", - "# Apply the function to the polars DataFrame\n", - "denatran_uf = denatran_uf.with_columns(denatran_uf.apply(fix_suggested_nome_ibge)['apply'].alias('suggested_nome_ibge'))\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "shape: (167,)
apply
str
"acari"
"afonso bezerra…
"água nova"
"alexandria"
"almino afonso"
"alto do rodrig…
"angicos"
"antônio martin…
"apodi"
"areia branca"
"arês"
"açu"
"tibau"
"tibau do sul"
"timbaúba dos b…
"touros"
"triunfo potigu…
"umarizal"
"upanema"
"várzea"
"venha-ver"
"vera cruz"
"viçosa"
"vila flor"
" - ], - "text/plain": [ - "shape: (167,)\n", - "Series: 'apply' [str]\n", - "[\n", - "\t\"acari\"\n", - "\t\"afonso bezerra…\n", - "\t\"água nova\"\n", - "\t\"alexandria\"\n", - "\t\"almino afonso\"\n", - "\t\"alto do rodrig…\n", - "\t\"angicos\"\n", - "\t\"antônio martin…\n", - "\t\"apodi\"\n", - "\t\"areia branca\"\n", - "\t\"arês\"\n", - "\t\"açu\"\n", - "\t…\n", - "\t\"tenente lauren…\n", - "\t\"tibau\"\n", - "\t\"tibau do sul\"\n", - "\t\"timbaúba dos b…\n", - "\t\"touros\"\n", - "\t\"triunfo potigu…\n", - "\t\"umarizal\"\n", - "\t\"upanema\"\n", - "\t\"várzea\"\n", - "\t\"venha-ver\"\n", - "\t\"vera cruz\"\n", - "\t\"viçosa\"\n", - "\t\"vila flor\"\n", - "]" - ] - }, - "execution_count": 62, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "denatran_uf.apply(get_suggested_nome_ibge)['apply']\n" - ] } ], "metadata": { diff --git a/br_denatran_frota/code/butils.py b/br_denatran_frota/code/utils.py similarity index 97% rename from br_denatran_frota/code/butils.py rename to br_denatran_frota/code/utils.py index e51cf3586..c66a3fe33 100644 --- a/br_denatran_frota/code/butils.py +++ b/br_denatran_frota/code/utils.py @@ -3,7 +3,7 @@ import polars as pl import difflib import re -from constants import DICT_UFS, REGRAS +from br_denatran_frota.code.constants import DICT_UFS, REGRAS def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int: From 2ae6fa5c8057774c1d812d6164e07a44e595d691 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 12:32:10 -0300 Subject: [PATCH 065/265] Docstrings for all utils --- br_denatran_frota/code/utils.py | 93 ++++++++++++++++++++++++++++++--- 1 file changed, 86 insertions(+), 7 deletions(-) diff --git a/br_denatran_frota/code/utils.py b/br_denatran_frota/code/utils.py index c66a3fe33..d2b561844 100644 --- a/br_denatran_frota/code/utils.py +++ b/br_denatran_frota/code/utils.py @@ -3,10 +3,22 @@ import polars as pl import difflib import re -from br_denatran_frota.code.constants import DICT_UFS, REGRAS +from br_denatran_frota.code.constants import DICT_UFS, SUBSTITUTIONS def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int: + """Function to deal with problematic dataframes coming from Excel/CSV files. + Tries to guess which row is the header by examining the first few rows (max given by max_header_guess). + Assumes that the header is the first row where all of the columns are strings. + This will NOT work for a strings only dataframe. + + Args: + df (pd.DataFrame): Dataframe whose header we don't know. + max_header_guess (int, optional): Number of initial rows we want to check . Defaults to 4. + + Returns: + int: Index of the row where the header is contained. + """ header_guess = 0 while header_guess < max_header_guess: # Iffy logic, but essentially: if all rows of the column are strings, then this is a good candidate for a header. @@ -18,6 +30,15 @@ def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int: def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame: + """Changes the dataframe's header to a row inside of it and returns the corrected df. + Ideally, to be used in conjunction with guess_header(). + Args: + df (pd.DataFrame): Dataframe whose header we want changed. + header_row (int): Index of the row where the header is located. + + Returns: + pd.DataFrame: Returns the same dataframe but with the corrected header + """ new_header = df.iloc[header_row] new_df = df[(header_row + 1) :].reset_index(drop=True) new_df.rename(columns=new_header, inplace=True) @@ -25,6 +46,17 @@ def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame: def get_year_month_from_filename(filename: str) -> tuple[int, int]: + """Helper to extract month and year information from files named indicator_month-year.xls + + Args: + filename (str): Name of the file. + + Raises: + ValueError: Errors out if nothing is found, which likely means the filename is not the correct format. + + Returns: + tuple[int, int]: Month, year. + """ match = re.search(r"(\w+)_(\d{1,2})-(\d{4})\.(xls|xlsx)$", filename) if match: month = match.group(2) @@ -35,29 +67,66 @@ def get_year_month_from_filename(filename: str) -> tuple[int, int]: def verify_total(df: pl.DataFrame) -> None: + """Helper function that is meant to act as a guard to guarantee that we can pivot from wide to long. + Essentially, gets a Wide dataframe, excludes all string columns and the TOTAL column and sums it all row wise. + Then verifies if the calculated total column is the same as the TOTAL column. + If not, raises an error. + + Args: + df (pl.DataFrame): Wide format dataframe to verify. + + Raises: + ValueError: Errors out if the sum of the columns is actually different than the total. + """ columns_for_total = df.select(pl.exclude("TOTAL")).select(pl.exclude([pl.Utf8])) calculated_total = columns_for_total.select( pl.fold( acc=pl.lit(0), function=lambda acc, x: acc + x, exprs=pl.col("*") ).alias("calculated_total") )["calculated_total"] - mask = df["TOTAL"] == calculated_total if pl.sum(~mask) != 0: raise ValueError( - "A coluna de TOTAL da base original tem inconsistências e não soma tudo das demais colunas." + "A coluna de TOTAL da base original tem inconsistências e não é igual à soma das demais colunas." ) -def fix_suggested_nome_ibge(row) -> str: +def fix_suggested_nome_ibge(row: tuple[str, ...]) -> str: + """Gets a row from a dataframe and applies the SUBSTITUTIONS constant ruleset where applicable. + This fixes the dataframe to have the names of municipalities according to IBGE. + The fixes are necessary because match_ibge() will fail where the DENATRAN data has typos in city names. + + Args: + row (tuple[str, ...]): Row from the dataframe we want to apply the IBGE substitutions. + + Raises: + ValueError: Errors out if the desired parts of the row do not conform to the expected format. + + Returns: + str: Returns the suggested IBGE name, either the pre existing or the one in the ruleset for substitutions. + """ key = (row[0], row[1]) - if key in REGRAS: - return REGRAS[key] + if (not isinstance(row[0], str)) or (not isinstance(row[1], str)): + raise ValueError("This is not a valid key to be checked.") + if key in SUBSTITUTIONS: + return SUBSTITUTIONS[key] else: return row[-1] def match_ibge(denatran_uf: pl.DataFrame, ibge_uf: pl.DataFrame) -> None: + """Takes a dataframe of the Denatran data and an IBGE dataframe of municipalities. + Joins them using the IBGE name of both. The IBGE name of denatran_uf is ideally filled via get_city_name(). + This verifies if there are any municipalities in denatran_uf that have no corresponding municipality in the IBGE database. + These must be manually fixed via the constants file and the fix_suggested_nome function. + Will error out if there are municipalities that have no correspondence whatsover. + Args: + denatran_uf (pl.DataFrame): Dataframe with the DENATRAN data, filtered by state (UF). + ibge_uf (pl.DataFrame): Dataframe with the IBGE municipalities data, filtered by state (UF). + + Raises: + ValueError: Errors if there are municipalities that have not match and outputs them all with the state to enable manual fix. + """ joined_df = denatran_uf.join( ibge_uf, left_on=["suggested_nome_ibge", "sigla_uf"], @@ -65,7 +134,6 @@ def match_ibge(denatran_uf: pl.DataFrame, ibge_uf: pl.DataFrame) -> None: how="left", ) mismatched_rows = joined_df.filter(pl.col("id_municipio").is_null()) - if len(mismatched_rows) > 0: error_message = "Os seguintes municípios falharam: \n" for row in mismatched_rows.rows(named=True): @@ -74,6 +142,17 @@ def match_ibge(denatran_uf: pl.DataFrame, ibge_uf: pl.DataFrame) -> None: def get_city_name_ibge(denatran_name: str, ibge_uf: pl.DataFrame) -> str: + """Gets the closest match to the denatran name of the municipality in the IBGE dataframe of the same state. + This ibge_uf dataframe is pulled directly from Base dos Dados to ensure correctness. + Returns either the match or an empty string in case no match is found. + + + Args: + denatran_name (str): The name of the municipality according to DENATRAN data. + ibge_uf (pl.DataFrame): Dataframe with the information from municipalities for a certain state (UF). + Returns: + str: Closest match to the denatran name or an empty string if no such match is found. + """ matches = difflib.get_close_matches( denatran_name.lower(), ibge_uf["nome"].str.to_lowercase(), n=1 ) From 15cec37d4c34734b8f47f223bb0962f46dd73424 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 14:06:18 -0300 Subject: [PATCH 066/265] Fix documentation in utils --- br_denatran_frota/code/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/br_denatran_frota/code/utils.py b/br_denatran_frota/code/utils.py index d2b561844..160b39d48 100644 --- a/br_denatran_frota/code/utils.py +++ b/br_denatran_frota/code/utils.py @@ -97,7 +97,7 @@ def fix_suggested_nome_ibge(row: tuple[str, ...]) -> str: The fixes are necessary because match_ibge() will fail where the DENATRAN data has typos in city names. Args: - row (tuple[str, ...]): Row from the dataframe we want to apply the IBGE substitutions. + row (tuple[str, ...]): Row from the full DENATRAN dataframe we want to apply the IBGE substitutions to. Raises: ValueError: Errors out if the desired parts of the row do not conform to the expected format. From 0ff97de77a3b54af8f334bbac382445fcaaa17c5 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 16:24:12 -0300 Subject: [PATCH 067/265] Apply better fuzzy matching for strings --- br_denatran_frota/code/utils.py | 22 +++++++++++++++------- poetry.lock | 17 ++++++++++++++++- pyproject.toml | 1 + 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/br_denatran_frota/code/utils.py b/br_denatran_frota/code/utils.py index 160b39d48..dcbf1e9db 100644 --- a/br_denatran_frota/code/utils.py +++ b/br_denatran_frota/code/utils.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- import pandas as pd import polars as pl -import difflib +from string_utils import asciify +from thefuzz import process import re from br_denatran_frota.code.constants import DICT_UFS, SUBSTITUTIONS @@ -106,8 +107,12 @@ def fix_suggested_nome_ibge(row: tuple[str, ...]) -> str: str: Returns the suggested IBGE name, either the pre existing or the one in the ruleset for substitutions. """ key = (row[0], row[1]) - if (not isinstance(row[0], str)) or (not isinstance(row[1], str)): - raise ValueError("This is not a valid key to be checked.") + if ( + (not isinstance(row[0], str)) + or (not isinstance(row[1], str)) + or (not isinstance(row[-1], str)) + ): + raise ValueError("This row is not in the expected format.") if key in SUBSTITUTIONS: return SUBSTITUTIONS[key] else: @@ -153,10 +158,13 @@ def get_city_name_ibge(denatran_name: str, ibge_uf: pl.DataFrame) -> str: Returns: str: Closest match to the denatran name or an empty string if no such match is found. """ - matches = difflib.get_close_matches( - denatran_name.lower(), ibge_uf["nome"].str.to_lowercase(), n=1 + matches = process.extract( + denatran_name.lower(), + ibge_uf["nome"].apply(asciify).str.to_lowercase(), + limit=1, ) - if matches: - return matches[0] + matched_name = matches[0] + if matched_name[1] >= 60: # Apply threshold + return matched_name[0] else: return "" # I don't want this to error out directly, because then I can get all municipalities. diff --git a/poetry.lock b/poetry.lock index ea7af3f74..10f586d8f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3479,6 +3479,21 @@ files = [ {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, ] +[[package]] +name = "thefuzz" +version = "0.19.0" +description = "Fuzzy string matching in python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "thefuzz-0.19.0-py2.py3-none-any.whl", hash = "sha256:4fcdde8e40f5ca5e8106bc7665181f9598a9c8b18b0a4d38c41a095ba6788972"}, + {file = "thefuzz-0.19.0.tar.gz", hash = "sha256:6f7126db2f2c8a54212b05e3a740e45f4291c497d75d20751728f635bb74aa3d"}, +] + +[package.extras] +speedup = ["python-levenshtein (>=0.12)"] + [[package]] name = "toml" version = "0.10.2" @@ -3843,4 +3858,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "a3e71799a5863e871ed54be65449b470cc7a73f6aafea6cb4a192ed70ccc580f" +content-hash = "511d0ceb54caeb7334883993247870c8d628c3862b75154af1587e3b511a839a" diff --git a/pyproject.toml b/pyproject.toml index 65a8f5a47..d03e8ae9d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -105,6 +105,7 @@ xlrd = "^2.0.1" typer = "^0.7.0" cookiecutter = "^2.1.1" python-string-utils = "^1.0.0" +thefuzz = "^0.19.0" [tool.poetry.dev-dependencies] pytest_cov = "^3.0.0" From 30f19d2c2a829932eb60ff935aa3dde904708778 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 16:25:51 -0300 Subject: [PATCH 068/265] Add package to speed up string comparisons --- poetry.lock | 237 ++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + 2 files changed, 237 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 10f586d8f..3fab28aa0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1659,6 +1659,121 @@ files = [ {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, ] +[[package]] +name = "levenshtein" +version = "0.21.0" +description = "Python extension for computing string edit distances and similarities." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "Levenshtein-0.21.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1f19fe25ea0dd845d0f48505e8947f6080728e10b7642ba0dad34e9b48c81130"}, + {file = "Levenshtein-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d23c647b03acbb5783f9bdfd51cfa5365d51f7df9f4029717a35eff5cc32bbcc"}, + {file = "Levenshtein-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:668ea30b311944c643f866ce5e45edf346f05e920075c0056f2ba7f74dde6071"}, + {file = "Levenshtein-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f42b8dba2cce257cd34efd1ce9678d06f3248cb0bb2a92a5db8402e1e4a6f30"}, + {file = "Levenshtein-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c27a5178ce322b56527a451185b4224217aa81955d9b0dad6f5a8de81ffe80f"}, + {file = "Levenshtein-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:92bf2370b01d7a4862abf411f8f60f39f064cebebce176e3e9ee14e744db8288"}, + {file = "Levenshtein-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32dfda2e64d0c50553e47d0ab2956413970f940253351c196827ad46f17916d5"}, + {file = "Levenshtein-0.21.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f55623094b665d79a3b82ba77386ac34fa85049163edfe65387063e5127d4184"}, + {file = "Levenshtein-0.21.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:25576ad9c337ecb342306fe87166b54b2f49e713d4ff592c752cc98e0046296e"}, + {file = "Levenshtein-0.21.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fae24c875c4ecc8c5f34a9715eb2a459743b4ca21d35c51819b640ee2f71cb51"}, + {file = "Levenshtein-0.21.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:4b2156f32e46d16b74a055ccb4f64ee3c64399372a6aaf1ee98f6dccfadecee1"}, + {file = "Levenshtein-0.21.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:04046878a57129da4e2352c032df7c1fceaa54870916d12772cad505ef998290"}, + {file = "Levenshtein-0.21.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:608beb1683508c3cdbfff669c1c872ea02b47965e1bbb8a630de548e2490f96a"}, + {file = "Levenshtein-0.21.0-cp310-cp310-win32.whl", hash = "sha256:cc36ba40027b4f8821155c9e3e0afadffccdccbe955556039d1d1169dfc659c9"}, + {file = "Levenshtein-0.21.0-cp310-cp310-win_amd64.whl", hash = "sha256:80e67bd73a05592ecd52aede4afa8ea49575de70f9d5bfbe2c52ebd3541b20be"}, + {file = "Levenshtein-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3305262cb85ff78ace9e2d8d2dfc029b34dc5f93aa2d24fd20b6ed723e2ad501"}, + {file = "Levenshtein-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:023ca95c833ca548280e444e9a4c34fdecb3be3851e96af95bad290ae0c708b9"}, + {file = "Levenshtein-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8476862a5c3150b8d63a7475563a4bff6dc50bbc0447894eb6b6a116ced0809d"}, + {file = "Levenshtein-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0236c8ff4648c50ebd81ac3692430d2241b134936ac9d86d7ca32ba6ab4a4e63"}, + {file = "Levenshtein-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cfbc4ed7ee2965e305bf81388fea377b795dabc82ee07f04f31d1fb8677a885"}, + {file = "Levenshtein-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6338a47b6f8c7f1ee8b5636cc8b245ad2d1d0ee47f7bb6f33f38a522ef0219cc"}, + {file = "Levenshtein-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dc79033140f82acaca40712a6d26ed190cc2dd403e104020a87c24f2771aa72"}, + {file = "Levenshtein-0.21.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88ccdc8dc20c16e8059ace00fb58d353346a04fd24c0733b009678b2554801d2"}, + {file = "Levenshtein-0.21.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c031cbe3685b0343f5cc2dcf2172fd21b82f8ccc5c487179a895009bf0e4ea8"}, + {file = "Levenshtein-0.21.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eab6c253983a6659e749f4c44fcc2215194c2e00bf7b1c5e90fe683ea3b7b00f"}, + {file = "Levenshtein-0.21.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:8bdbcd1570340b07549f71e8a5ba3f0a6d84408bf86c4051dc7b70a29ae342bb"}, + {file = "Levenshtein-0.21.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4357bf8146cbadb10016ad3a950bba16e042f79015362a575f966181d95b4bc7"}, + {file = "Levenshtein-0.21.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be038321695267a8faa5ae1b1a83deb3748827f0b6f72471e0beed36afcbd72a"}, + {file = "Levenshtein-0.21.0-cp311-cp311-win32.whl", hash = "sha256:be87998ffcbb5fb0c37a76d100f63b4811f48527192677da0ec3624b49ab8a64"}, + {file = "Levenshtein-0.21.0-cp311-cp311-win_amd64.whl", hash = "sha256:f873af54014cac12082c7f5ccec6bbbeb5b57f63466e7f9c61a34588621313fb"}, + {file = "Levenshtein-0.21.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4ec2ef9836a34a3bb009a81e5efe4d9d43515455fb5f182c5d2cf8ae61c79496"}, + {file = "Levenshtein-0.21.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e748c2349719cb1bc90f802d9d7f07310633dcf166d468a5bd821f78ed17698"}, + {file = "Levenshtein-0.21.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:37a99d858fa1d88b1a917b4059a186becd728534e5e889d583086482356b7ca1"}, + {file = "Levenshtein-0.21.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:742b785c93d16c63289902607219c200bd2b6077dafc788073c74337cae382fb"}, + {file = "Levenshtein-0.21.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cefd5a668f6d7af1279aca10104b43882fdd83f9bdc68933ba5429257a628abe"}, + {file = "Levenshtein-0.21.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e1723d515ab287b9b2c2e4a111894dc6b474f5d28826fff379647486cae98d2"}, + {file = "Levenshtein-0.21.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3e22d31375d5fea5797c9b7aa0f8cc36579c31dcf5754e9931ca86c27d9011f8"}, + {file = "Levenshtein-0.21.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:31cb59d86a5f99147cd4a67ebced8d6df574b5d763dcb63c033a642e29568746"}, + {file = "Levenshtein-0.21.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:76d5d34a8e21de8073c66ae801f053520f946d499fa533fbba654712775f8132"}, + {file = "Levenshtein-0.21.0-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:46dab8c6e8fae563ca77acfaeb3824c4dd4b599996328b8a081b06f16befa6a0"}, + {file = "Levenshtein-0.21.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:ee62ec5882a857b252faffeb7867679f7e418052ca6bf7d6b56099f6498a2b0e"}, + {file = "Levenshtein-0.21.0-cp36-cp36m-win32.whl", hash = "sha256:7e40a4bac848c9a8883225f926cfa7b2bc9f651e989a8b7006cdb596edc7ac9b"}, + {file = "Levenshtein-0.21.0-cp36-cp36m-win_amd64.whl", hash = "sha256:709a727f58d31a5ee1e5e83b247972fe55ef0014f6222256c9692c5efa471785"}, + {file = "Levenshtein-0.21.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01dd427cf72b4978b09558e3d36e3f92c8eef467e3eb4653c3fdccd8d70aaa08"}, + {file = "Levenshtein-0.21.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ff1255c499fcb41ba37a578ad8c1b8dab5c44f78941b8e1c1d7fab5b5e831bc"}, + {file = "Levenshtein-0.21.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8aa92b05156dfa2e248c3743670d5deb41a45b5789416d5fa31be009f4f043ab"}, + {file = "Levenshtein-0.21.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d932cb21e40beb93cfc8973de7f25fbf25ba4a07d1dccac3b9ba977164cf9887"}, + {file = "Levenshtein-0.21.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d4ba0df46bb41d660d77e7cc6b4d38c8d5b6f977d51c48ed1217db6a8474cde"}, + {file = "Levenshtein-0.21.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c8eaaa6f0df2838437d1d8739629486b145f7a3405d3ef0874301a9f5bc7dcd"}, + {file = "Levenshtein-0.21.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ede583155f24c8b2456a7720fbbfa5d9c1154ae04b4da3cf63368e2406ea099"}, + {file = "Levenshtein-0.21.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a18c8e4d1aae3f9950797d049020c64a8a63cc8b4e43afcca91ec400bf6304c5"}, + {file = "Levenshtein-0.21.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:8cf87a5e2962431d7260dd81dc1ca0697f61aad81036145d3666f4c0d514ce3a"}, + {file = "Levenshtein-0.21.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bd0bfa71b1441be359e99e77709885b79c22857bf9bb7f4e84c09e501f6c5fad"}, + {file = "Levenshtein-0.21.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e9a6251818b9eb6d519bffd7a0b745f3a99b3e99563a4c9d3cad26e34f6ac880"}, + {file = "Levenshtein-0.21.0-cp37-cp37m-win32.whl", hash = "sha256:8dd8ef4239b24fb1c9f0b536e48e55194d5966d351d349af23e67c9eb3875c68"}, + {file = "Levenshtein-0.21.0-cp37-cp37m-win_amd64.whl", hash = "sha256:26c6fb012538a245d78adea786d2cfe3c1506b835762c1c523a4ed6b9e08dc0b"}, + {file = "Levenshtein-0.21.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b0ba9723c7d67a61e160b3457259552f7d679d74aaa144b892eb68b7e2a5ebb6"}, + {file = "Levenshtein-0.21.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:426883be613d912495cf6ee2a776d2ab84aa6b3de5a8d82c43a994267ea6e0e3"}, + {file = "Levenshtein-0.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5369827ace536c6df04e0e670d782999bc17bf9eb111e77435fdcdaecb10c2a3"}, + {file = "Levenshtein-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ebabcf982ae161534f8729d13fe05eebc977b497ac34936551f97cf8b07dd9e"}, + {file = "Levenshtein-0.21.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13e8a5b1b58de49befea555bb913dc394614f2d3553bc5b86bc672c69ef1a85a"}, + {file = "Levenshtein-0.21.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d647f1e0c30c7a73f70f4de7376ed7dafc2b856b67fe480d32a81af133edbaeb"}, + {file = "Levenshtein-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5378a8139ba61d7271c0f9350201259c11eb90bfed0ac45539c4aeaed3907230"}, + {file = "Levenshtein-0.21.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df9b0f8f511270ad259c7bfba22ab6d5a0c33d81cd594461668e67cd80dd9052"}, + {file = "Levenshtein-0.21.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9485f2a5c88113410153256657072bc93b81bf5c8690d47e4cc3df58135dbadb"}, + {file = "Levenshtein-0.21.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:aa39bb773915e4df330d311bb6c100a8613e265cc50d5b25b015c8db824e1c47"}, + {file = "Levenshtein-0.21.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:de2dfd6498454c7d89036d56a53c0a01fd9bcf1c2970253e469b5e8bb938b69f"}, + {file = "Levenshtein-0.21.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4515f9511cb91c66d254ee30154206aad76b57d8b25f64ba1402aad43efdb251"}, + {file = "Levenshtein-0.21.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f622f542bd065ffec7d26b26d44d0c9a25c9c1295fd8ba6e4d77778e2293a12c"}, + {file = "Levenshtein-0.21.0-cp38-cp38-win32.whl", hash = "sha256:ee757fd36bad66ad8b961958840894021ecaad22194f65219a666432739393ff"}, + {file = "Levenshtein-0.21.0-cp38-cp38-win_amd64.whl", hash = "sha256:457442911df185e28a32fd8b788b14ca22ab3a552256b556e7687173d5f18bc4"}, + {file = "Levenshtein-0.21.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b646ace5085a60d4f89b28c81301c9d9e8cd6a9bdda908181b2fa3dfac7fc10d"}, + {file = "Levenshtein-0.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0cc3679978cd0250bf002963cf2e08855b93f70fa0fc9f74956115c343983fbb"}, + {file = "Levenshtein-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:84b55b732e311629a8308ad2778a0f9824e29e3c35987eb35610fc52eb6d4634"}, + {file = "Levenshtein-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7adaabe07c5ceb6228332b9184f06eb9cda89c227d198a1b8a6f78c05b3c672"}, + {file = "Levenshtein-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac8b6266799645827980ab1af4e0bfae209c1f747a10bdf6e5da96a6ebe511a2"}, + {file = "Levenshtein-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c2d67220867d640e36931b3d63b8349369b485d52cf6f4a2635bec8da92d678"}, + {file = "Levenshtein-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb26e69fc6c12534fbaa1657efed3b6482f1a166ba8e31227fa6f6f062a59070"}, + {file = "Levenshtein-0.21.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a68b05614d25cc2a5fbcc4d2fd124be7668d075fd5ac3d82f292eec573157361"}, + {file = "Levenshtein-0.21.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b167b32b3e336c5ec5e0212f025587f9248344ae6e73ed668270eba5c6a506e5"}, + {file = "Levenshtein-0.21.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:04850a0719e503014acb3fee6d4ec7d7f170a2c7375ffbc5833c7256b7cd10ee"}, + {file = "Levenshtein-0.21.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ce7e76c6341abb498368d42b8081f2f45c245ac2a221af6a0394349d41302c08"}, + {file = "Levenshtein-0.21.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:ec64b7b3fb95bc9c20c72548277794b81281a6ba9da85eda2c87324c218441ff"}, + {file = "Levenshtein-0.21.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24843f28cbbdcbcfc18b08e7d3409dbaad7896fb7113442592fa978590a7bbf0"}, + {file = "Levenshtein-0.21.0-cp39-cp39-win32.whl", hash = "sha256:c290a7211f1b4f87c300df4424cc46b7379cead3b6f37fa8d3e7e6c6212ccd39"}, + {file = "Levenshtein-0.21.0-cp39-cp39-win_amd64.whl", hash = "sha256:1fde464f937878e6f5c30c234b95ce2cb969331a175b3089367e077113428062"}, + {file = "Levenshtein-0.21.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:66d303cd485710fe6d62108209219b7a695bdd10a722f4e86abdaf26f4bf2202"}, + {file = "Levenshtein-0.21.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bc550d0986ace95bde003b8a60e622449baf2bdf24d8412f7a50f401a289ec3"}, + {file = "Levenshtein-0.21.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c6858cfd84568bc1df3ad545553b5c27af6ed3346973e8f4b57d23c318cf8f4"}, + {file = "Levenshtein-0.21.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ce3f14a8e006fb7e3fc7bab965ab7da5817f48fc48d25cf735fcec8f1d2e39a"}, + {file = "Levenshtein-0.21.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:024302c82d49fc1f1d044794997ef7aa9d01b509a9040e222480b64a01cd4b80"}, + {file = "Levenshtein-0.21.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e043b79e39f165026bc941c95582bfc4bfdd297a1de6f13ace0d0a7abf486288"}, + {file = "Levenshtein-0.21.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8446f8da38857482ec0cfd616fe5e7dcd3695fd323cc65f37366a9ff6a31c9cb"}, + {file = "Levenshtein-0.21.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:587ad51770de41eb491bea1bfb676abc7ff9a94dbec0e2bc51fc6a25abef99c4"}, + {file = "Levenshtein-0.21.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac4ed77d3263eac7f9b6ed89d451644332aecd55cda921201e348803a1e5c57"}, + {file = "Levenshtein-0.21.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cf2dee0f8c71598f8be51e3feceb9142ac01576277b9e691e25740987761c86e"}, + {file = "Levenshtein-0.21.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4bbceef2caba4b2ae613b0e853a7aaab990c1a13bddb9054ba1328a84bccdbf7"}, + {file = "Levenshtein-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2290732763e3b75979888364b26acce79d72b8677441b5762a4e97b3630cc3d9"}, + {file = "Levenshtein-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db7567997ffbc2feb999e30002a92461a76f17a596a142bdb463b5f7037f160c"}, + {file = "Levenshtein-0.21.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c270487d60b33102efea73be6dcd5835f3ddc3dc06e77499f0963df6cba2ec71"}, + {file = "Levenshtein-0.21.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e2686c37d22faf27d02a19e83b55812d248b32b7ba3aa638e768d0ea032e1f3c"}, + {file = "Levenshtein-0.21.0.tar.gz", hash = "sha256:545635d9e857711d049dcdb0b8609fb707b34b032517376c531ca159fcd46265"}, +] + +[package.dependencies] +rapidfuzz = ">=2.3.0,<4.0.0" + [[package]] name = "locket" version = "0.2.1" @@ -2932,6 +3047,21 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "python-levenshtein" +version = "0.21.0" +description = "Python extension for computing string edit distances and similarities." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "python-Levenshtein-0.21.0.tar.gz", hash = "sha256:c97f60e694dcfc4eae7fabc19490e0892b212d975d70d1b14fc109e58c33b0bf"}, + {file = "python_Levenshtein-0.21.0-py3-none-any.whl", hash = "sha256:2e05a10989cae751669dc08c5d4934e2da489c9afb1545ecc1d8c8edb822b5ae"}, +] + +[package.dependencies] +Levenshtein = "0.21.0" + [[package]] name = "python-slugify" version = "5.0.2" @@ -3148,6 +3278,111 @@ files = [ [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} +[[package]] +name = "rapidfuzz" +version = "3.0.0" +description = "rapid fuzzy string matching" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "rapidfuzz-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ab635a544243e1924508bfc3f294c28bdced6d74388ac25041d3dabcaefab75"}, + {file = "rapidfuzz-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cf8b1b29028dc1bc6a5654f22425ee6d3967bbd44bc3a117be0f43b03300f928"}, + {file = "rapidfuzz-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2bbf9aad86b70283362dc2db3cacb7dcde0ffe6027f54feb0ccb23cf87b6aa11"}, + {file = "rapidfuzz-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a9b7d22e46ada4e6a1f1404c267f3f023b44594929913d855f14bc5fb11b53d"}, + {file = "rapidfuzz-3.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c81891e570e50d0afe43f722f426b0bd602d3c5315f0f290514511d9520b1e6"}, + {file = "rapidfuzz-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:abc2f05c1f30b9533cb9b85d73c28d93aa99c7ae2992df04c1704fcaf248b59c"}, + {file = "rapidfuzz-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:339b94c536ab9c1b1bac245fb6814df3ba104603d2c1a97f8fb41922357bd772"}, + {file = "rapidfuzz-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8883267df996b42494f40d533ef3a3fea247531d137773a649fb851747ae12c8"}, + {file = "rapidfuzz-3.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:59c6c9d3ca7d84c5878a74d142816350a3bdfb51e4d10ac104afd396168481f6"}, + {file = "rapidfuzz-3.0.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5759bb0fd13ee030626e8bbb5b644092a043817fb192335ff4c481402b1edd0e"}, + {file = "rapidfuzz-3.0.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:1fe6ea9300f347fd3352c755aa04d71a2786afa008d1af1a35830e6a44e7fd5f"}, + {file = "rapidfuzz-3.0.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:481c0389c3b26cd2aa498b6924ca6e9a1d1dd5b15ad5f009d273292949e47e24"}, + {file = "rapidfuzz-3.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:658be4cabcc229f52a902f5e87205e1b9c29c66e463a267c8d8f237acde56002"}, + {file = "rapidfuzz-3.0.0-cp310-cp310-win32.whl", hash = "sha256:7f8d89b16b4752deeb66dd321548c4cfa59819982d43d2ae7ab5d6e0f15bee94"}, + {file = "rapidfuzz-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:2132d7724c03dd322035cf1b0c23ca9e7e449ec2b7225040a2ca2fa3f1a3bbfa"}, + {file = "rapidfuzz-3.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:0bf1953a4c32ce6e2f3ed1897d0a8dbbbf19456ef0a8e37bae26e007d9fb5096"}, + {file = "rapidfuzz-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:526df35d07083480e751f9679fd1f3e8a0819e8a13586e3860db5b65549a408a"}, + {file = "rapidfuzz-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88c9e93508128168708aae3ef98eeb422a88204d81ac4492fcea1e1162a6af74"}, + {file = "rapidfuzz-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:562caa39652c72156574fcf60ce7adf29964a031a57ae977c180947e00425b4a"}, + {file = "rapidfuzz-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a149c944f3c349f6279a8cc4cbfa3e80cc2baaec9d983359698aa792faa44653"}, + {file = "rapidfuzz-3.0.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c40a626050e37c2f74e2ba00538578d3c4a6baa171d08ed5091b6a03512ac4a"}, + {file = "rapidfuzz-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ee35eddeddb5f5750d2a9cc55894926969fa0bac80bbe57211ae6fd0d34b39f"}, + {file = "rapidfuzz-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c94fe53da481d8580e6410f3e7e4ba4e9c5786cad1f289fbb6c9c9585c6d78e1"}, + {file = "rapidfuzz-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4032713943c32fff97d863e6618162923e3b3c31917d437126d9fcf7e33c83d2"}, + {file = "rapidfuzz-3.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dc1a39d1cc8e679c7240b2d1ed8366cf740ab8429cc9b582ebd94a5c6ededbe5"}, + {file = "rapidfuzz-3.0.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f213bb5d4cd0b1fddf209bafe2d2896320a737fbded3a567d454e54875e4d9cc"}, + {file = "rapidfuzz-3.0.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c9ca5f4ae767605cefa5156f5fa8561bee61849f9b2ccfb165d7087b4f9af90c"}, + {file = "rapidfuzz-3.0.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:938cc766d0ce9eca95549593b6ca7ff86a2917b9e68c1989ad95485aed0f49dd"}, + {file = "rapidfuzz-3.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:87eb7e9fb49265c33bda0417cc74c474a891cae60735fbbd75d79a106483888e"}, + {file = "rapidfuzz-3.0.0-cp311-cp311-win32.whl", hash = "sha256:3f51d35521f86e767d3e640d0ab42908d01c3e05cf54ac1f0b547f3f602800f1"}, + {file = "rapidfuzz-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:4ef3a6aa07b996c789c8d5ab99ed0563d551d32fa9330fd0f52ba28d20fcb662"}, + {file = "rapidfuzz-3.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:7eea0ca53da78040a6b7bb041af8051c52efa7facc6f18dce33e679f2decaf62"}, + {file = "rapidfuzz-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6dfd138dcc0920b71c1d1bc017413b032286a1f33488613dce9e254c454abaf2"}, + {file = "rapidfuzz-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b81d15da16e97c288c645eb642d8a08d0ab98b827efb2682cab282a45893efe"}, + {file = "rapidfuzz-3.0.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ff8835a3ba17f3baf3838f2612e3758d7b1ca09eb16c9a382df3bec5bb9bda3"}, + {file = "rapidfuzz-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:82a4ea0742b9e375d4856714ef59241007765edbce34fd2f7d76c552ed93a7d2"}, + {file = "rapidfuzz-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5767b0e8220b6f8afcc1fe77529e5678470f9e94a1cfc9e29f5b0721dc1496c"}, + {file = "rapidfuzz-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8c372dc278d1d5ced7cdc99ad8cc1d3de0b245e769a6b327c462b98873e5d4"}, + {file = "rapidfuzz-3.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5d8664d6f844ea9018b4866e8a8dbf49c87f703668b1b3265de83aa3c9941272"}, + {file = "rapidfuzz-3.0.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fa098429af4e17fb5bacb0c39f1f8349891356ba7ca540521515b5708fec4a76"}, + {file = "rapidfuzz-3.0.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:738ae2d59ab254c4f173b40b00a9c1f092697949284c59e0879e6e3beb337a69"}, + {file = "rapidfuzz-3.0.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1a5eb2d1844f375f34e3c83b1a03094293d894472fdd1a095cf35e4dfa2ecf01"}, + {file = "rapidfuzz-3.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:24d77723bb20030a91b096326d14b673d2ff1f0c7bbc64ed519992ed8eb5b869"}, + {file = "rapidfuzz-3.0.0-cp37-cp37m-win32.whl", hash = "sha256:b85dfb6f0c353c4b37499529f9831620a7bdc61c375e07f8c38b595f93e906e5"}, + {file = "rapidfuzz-3.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:54fb70b667b882f9939bc6f581957fcb47fec2e7ad652259835c80e9e30230c9"}, + {file = "rapidfuzz-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4e1da3dce34d742567da0722b9c8dc2b51554ab5a22fdaf763b60209445a7b37"}, + {file = "rapidfuzz-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c50825de43442c4625a2ca1d948c911d116cf9007ad7f29cd27561c99b16947c"}, + {file = "rapidfuzz-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:69270e0cd850984f562b2239d07cde2213e5c3642cd8d550d5ac9a0fcd0882df"}, + {file = "rapidfuzz-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5ddf48f63895f949355a1c4d643e0a531c9317d52901f80d5a6299d967b766"}, + {file = "rapidfuzz-3.0.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd2ad4160d8ad9a2abdad1c765fd29e4d9b6b8ce6a707ee48eb2869e7dff0f89"}, + {file = "rapidfuzz-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc39af05cdf89be426d96fce579c812948a324b022fb11dfea1e99e180d4f68b"}, + {file = "rapidfuzz-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d25555297466ab5ded3875913fc0bfa78b89b0a32d79bd65ffbd32ae71f07c2d"}, + {file = "rapidfuzz-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76da6c8972acd58c31efdd09c4c85263ba3b4394d2c2929be4c171a22293bab3"}, + {file = "rapidfuzz-3.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2b50f2d429d81a65910f5ee9b14e172e300a09b8b2ecb91d3e4efc5d2583915c"}, + {file = "rapidfuzz-3.0.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f00a8b3d0b21884ea972d5430797b1a25b9d2c715b3eaf03366903aac5d8398c"}, + {file = "rapidfuzz-3.0.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:e058ecfd8edb04b221d1b2d005f17be932075a16f75b100b275de1d3d220da5f"}, + {file = "rapidfuzz-3.0.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:35e21f0718fd1c1853f8f433f2f84f618f6d4a6d9d96bb7c42e39797be600b58"}, + {file = "rapidfuzz-3.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d128f615da9a198cd9b33be658a0c26fabe06a6d28fa4652953853e8d174c2c6"}, + {file = "rapidfuzz-3.0.0-cp38-cp38-win32.whl", hash = "sha256:bc593306faa6c73e50cb31b81efbb580957272b14c5cf6bcf0233adf8a7e118d"}, + {file = "rapidfuzz-3.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:0f7041c550b69d35675e04dc3f0690d0c26499039e942a0b1604c6547951e6fc"}, + {file = "rapidfuzz-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:351df02889ac3da9f3f7b10e6812740927cfab9def453079da94f83697b03f2f"}, + {file = "rapidfuzz-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:35506d04429440333224c3711dfdb4195d34eff733cb48648d0c89a9b99faf14"}, + {file = "rapidfuzz-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d24054843f4cfbb86df608ec1209e6a29b0d2635230577a94e38a9cfa3880d18"}, + {file = "rapidfuzz-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a94fe0a42da816e4a6279ac4c23e4ba6de86a529b61b08d5e8e2633b29c781b"}, + {file = "rapidfuzz-3.0.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41e98b3cebfa3e720186eeab37e6c0565895edf848fd958c34ab94c39e743311"}, + {file = "rapidfuzz-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea5e25378591a698ae5076c582a0135db2cb43270fb2866737ab4cb6fcc34474"}, + {file = "rapidfuzz-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6bf090b9b4ec4df5f0899bbc4055b8b173b33169186d4de1dd3d9c609bd330a2"}, + {file = "rapidfuzz-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f241ca0bcbfcbf90bb48bb1c8dbc1fddc205bee5520f898b994adda3d3f150a"}, + {file = "rapidfuzz-3.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f80986d3c8d55b848d679084231a35273320f658e64f0d86d725bb360e6cd2c4"}, + {file = "rapidfuzz-3.0.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:62c760748b1253e08ab5138855e8f8d2c25a7cb5a0bfad74bb66db63c27d8a50"}, + {file = "rapidfuzz-3.0.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8b5d78052e840191b9c7556eb3bd4fe52435e58bd979c75298b65262368dd1fa"}, + {file = "rapidfuzz-3.0.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:fc764665ba19b923696eae6912a2f0fc52bdd7db6c53be178d1dd70eb72f2f68"}, + {file = "rapidfuzz-3.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:62aac81ef17bab9f664828b9087d0afe5a94ed48396b0456a2503b68e3d567f2"}, + {file = "rapidfuzz-3.0.0-cp39-cp39-win32.whl", hash = "sha256:aeb855b62bc351884a672b8f87875c552492d9199c78f33cc8650c283fd7504d"}, + {file = "rapidfuzz-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:a0e0d8798b7048c9db4e139bafb21792013fb043df07bfaf0d3dc9e1df2be5e6"}, + {file = "rapidfuzz-3.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:ebf96d236a52058c010f354256e8de4274621a7f8b5a15dffa54d9b6a1c7e6e8"}, + {file = "rapidfuzz-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fbe4b8305cb427b49d70c182a01c91fd85112e0573193a1f9e4fbcec35ea3eff"}, + {file = "rapidfuzz-3.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db57085c9dbd0b1005d6ad905c610920c49d0752f522d2f34477b13cba24e1d1"}, + {file = "rapidfuzz-3.0.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e334225a97824d9f75f5cf8e949e129bc183f0762f4c9b7a127d1809461bdc55"}, + {file = "rapidfuzz-3.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0c22a36b611a2d53fada2cb03b276135d08c2703039078ce985d7cc42734fd7"}, + {file = "rapidfuzz-3.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:05130d9d33c4770116037de9f131e488825165105588cc7143f77733c5b25a6f"}, + {file = "rapidfuzz-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9c263840bda0f532714ecd66f1f82ed3d3460f45e79e8a907f4df8eaafd93d31"}, + {file = "rapidfuzz-3.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dbaa605c0f81208efbf166afb23f73b0f3847a1a966bec828f4167f61d0ca4b"}, + {file = "rapidfuzz-3.0.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ba129c3c8202e8bef0d9964b8798913905ad1dc6293e94d7a02d87cdbef2544"}, + {file = "rapidfuzz-3.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e85b4f4aeb994c841478e98a9e05bcb7ed8ead084d93bd2ca0683dc5e93b1c36"}, + {file = "rapidfuzz-3.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:284f216f0500cd977830f107da5c3f96e91356dc7993512efc414dbd55679d51"}, + {file = "rapidfuzz-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:494b613a3e730e08df1c7c14e45c303a0f5c8a701162bfc8ac9079585837de43"}, + {file = "rapidfuzz-3.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a5670d5475777450fbc70ed8de8d4e3f7c69230a8b539f45bda358a6f9699f2"}, + {file = "rapidfuzz-3.0.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14e9924108a26f2f58aa8cb90f1a106398fa43e359fa5a96b0f328c7bb7f76da"}, + {file = "rapidfuzz-3.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:832d953b5f1462eba5a0830ea7df11b784f090ba5409fc92bccb856d2539b618"}, + {file = "rapidfuzz-3.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5fdcc1ce830bf46fbc098c8b6eb3201a8299476153bae7a5d5e86576f7228d0a"}, + {file = "rapidfuzz-3.0.0.tar.gz", hash = "sha256:4c1d895d16f62e9ac88d303eb918d90a390bd712055c849e01c558b7ae0fa908"}, +] + +[package.extras] +full = ["numpy"] + [[package]] name = "rarfile" version = "4.0" @@ -3858,4 +4093,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "511d0ceb54caeb7334883993247870c8d628c3862b75154af1587e3b511a839a" +content-hash = "cd2101701e46504bc70378439939d22661d681b1a83933c0dfb5b4824b1e8fd1" diff --git a/pyproject.toml b/pyproject.toml index d03e8ae9d..094792f1f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -106,6 +106,7 @@ typer = "^0.7.0" cookiecutter = "^2.1.1" python-string-utils = "^1.0.0" thefuzz = "^0.19.0" +python-levenshtein = "^0.21.0" [tool.poetry.dev-dependencies] pytest_cov = "^3.0.0" From 0bc7fd6bd37661d98aef0a4129825cfab8b877eb Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 16:53:46 -0300 Subject: [PATCH 069/265] Maybe difflib was better --- br_denatran_frota/code/utils.py | 22 +++++++--------------- poetry.lock | 15 --------------- pyproject.toml | 2 -- 3 files changed, 7 insertions(+), 32 deletions(-) diff --git a/br_denatran_frota/code/utils.py b/br_denatran_frota/code/utils.py index dcbf1e9db..160b39d48 100644 --- a/br_denatran_frota/code/utils.py +++ b/br_denatran_frota/code/utils.py @@ -1,8 +1,7 @@ # -*- coding: utf-8 -*- import pandas as pd import polars as pl -from string_utils import asciify -from thefuzz import process +import difflib import re from br_denatran_frota.code.constants import DICT_UFS, SUBSTITUTIONS @@ -107,12 +106,8 @@ def fix_suggested_nome_ibge(row: tuple[str, ...]) -> str: str: Returns the suggested IBGE name, either the pre existing or the one in the ruleset for substitutions. """ key = (row[0], row[1]) - if ( - (not isinstance(row[0], str)) - or (not isinstance(row[1], str)) - or (not isinstance(row[-1], str)) - ): - raise ValueError("This row is not in the expected format.") + if (not isinstance(row[0], str)) or (not isinstance(row[1], str)): + raise ValueError("This is not a valid key to be checked.") if key in SUBSTITUTIONS: return SUBSTITUTIONS[key] else: @@ -158,13 +153,10 @@ def get_city_name_ibge(denatran_name: str, ibge_uf: pl.DataFrame) -> str: Returns: str: Closest match to the denatran name or an empty string if no such match is found. """ - matches = process.extract( - denatran_name.lower(), - ibge_uf["nome"].apply(asciify).str.to_lowercase(), - limit=1, + matches = difflib.get_close_matches( + denatran_name.lower(), ibge_uf["nome"].str.to_lowercase(), n=1 ) - matched_name = matches[0] - if matched_name[1] >= 60: # Apply threshold - return matched_name[0] + if matches: + return matches[0] else: return "" # I don't want this to error out directly, because then I can get all municipalities. diff --git a/poetry.lock b/poetry.lock index 3fab28aa0..2b0aab238 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3714,21 +3714,6 @@ files = [ {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, ] -[[package]] -name = "thefuzz" -version = "0.19.0" -description = "Fuzzy string matching in python" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "thefuzz-0.19.0-py2.py3-none-any.whl", hash = "sha256:4fcdde8e40f5ca5e8106bc7665181f9598a9c8b18b0a4d38c41a095ba6788972"}, - {file = "thefuzz-0.19.0.tar.gz", hash = "sha256:6f7126db2f2c8a54212b05e3a740e45f4291c497d75d20751728f635bb74aa3d"}, -] - -[package.extras] -speedup = ["python-levenshtein (>=0.12)"] - [[package]] name = "toml" version = "0.10.2" diff --git a/pyproject.toml b/pyproject.toml index 094792f1f..65a8f5a47 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -105,8 +105,6 @@ xlrd = "^2.0.1" typer = "^0.7.0" cookiecutter = "^2.1.1" python-string-utils = "^1.0.0" -thefuzz = "^0.19.0" -python-levenshtein = "^0.21.0" [tool.poetry.dev-dependencies] pytest_cov = "^3.0.0" From 882e8beb90d33cedb90ad82b0251b0125c538b6c Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 17:48:09 -0300 Subject: [PATCH 070/265] All rules done afaik --- br_denatran_frota/code/constants.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/br_denatran_frota/code/constants.py b/br_denatran_frota/code/constants.py index 88ce21463..7e5cc7425 100644 --- a/br_denatran_frota/code/constants.py +++ b/br_denatran_frota/code/constants.py @@ -30,5 +30,9 @@ } SUBSTITUTIONS = { - ("RN", "ASSU"): "açu", + ("RN", "assu"): "acu", + ("PB", "sao domingos de pombal"): "sao domingos", + ("PB", "santarem"): "joca claudino", + ("SP", "embu"): "embu das artes", + ("TO", "sao valerio da natividade"): "sao valerio", } From a55714eebb657ea13dcb6654213692b109e7c94c Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 17:48:51 -0300 Subject: [PATCH 071/265] Actual decent file to be tested --- .../code/frota_municipio_tipo.py | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 br_denatran_frota/code/frota_municipio_tipo.py diff --git a/br_denatran_frota/code/frota_municipio_tipo.py b/br_denatran_frota/code/frota_municipio_tipo.py new file mode 100644 index 000000000..94f37eaf1 --- /dev/null +++ b/br_denatran_frota/code/frota_municipio_tipo.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +import polars as pl +import pandas as pd +from string_utils import asciify +import os +from urllib.request import urlopen, urlretrieve +from zipfile import ZipFile +from rarfile import RarFile +from bs4 import BeautifulSoup +import difflib +from br_denatran_frota.code.utils import ( + change_df_header, + fix_suggested_nome_ibge, + guess_header, + get_city_name_ibge, + match_ibge, +) +from br_denatran_frota.code.constants import DICT_UFS, SUBSTITUTIONS + +import basedosdados as bd + +municipios_query = """SELECT nome, id_municipio, sigla_uf FROM `basedosdados.br_bd_diretorios_brasil.municipio` +""" +bd_municipios = bd.read_sql(municipios_query, "tamir-pipelines") +bd_municipios = pl.from_pandas(bd_municipios) + +file = "br_denatran_frota/files/2022/frota_por_município_e_tipo_2-2022.xls" +filename = os.path.split(file)[1] +df = pd.read_excel(file) +new_df = change_df_header(df, guess_header(df)) +new_df.rename( + columns={new_df.columns[0]: "sigla_uf", new_df.columns[1]: "nome_denatran"}, + inplace=True, +) # Rename for ease of use. +new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace. +new_df = pl.from_pandas(new_df) +new_df = new_df.with_columns(pl.col("nome_denatran").apply(asciify).str.to_lowercase()) +new_df = new_df.filter(pl.col("nome_denatran") != "municipio nao informado") + + +def verify_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str): + denatran_uf = denatran_df.filter(pl.col("sigla_uf") == uf) + ibge_uf = ibge_df.filter(pl.col("sigla_uf") == uf) + ibge_uf = ibge_uf.with_columns(pl.col("nome").apply(asciify).str.to_lowercase()) + municipios_na_bd = ibge_uf["nome"].to_list() + x = denatran_uf["nome_denatran"].apply(lambda x: get_city_name_ibge(x, ibge_uf)) + denatran_uf = denatran_uf.with_columns(x.alias("suggested_nome_ibge")) + denatran_uf = denatran_uf.with_columns( + denatran_uf.apply(fix_suggested_nome_ibge)["apply"].alias("suggested_nome_ibge") + ) + municipios_no_denatran = denatran_uf["suggested_nome_ibge"].to_list() + d = set(municipios_na_bd) - set(municipios_no_denatran) + z = denatran_uf.groupby("suggested_nome_ibge").count().filter(pl.col("count") > 1) + if not z.is_empty(): + print(z["suggested_nome_ibge"].to_list(), uf) + if d: + print(d, uf) + match_ibge(denatran_uf, ibge_uf) + + +for uf in DICT_UFS: + verify_uf(new_df, bd_municipios, uf) From 35d3ebc35b1162c036b2df7317009f8fa8f3e488 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 17:49:37 -0300 Subject: [PATCH 072/265] Imports cleanup --- br_denatran_frota/code/frota_municipio_tipo.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/br_denatran_frota/code/frota_municipio_tipo.py b/br_denatran_frota/code/frota_municipio_tipo.py index 94f37eaf1..33b13f8e0 100644 --- a/br_denatran_frota/code/frota_municipio_tipo.py +++ b/br_denatran_frota/code/frota_municipio_tipo.py @@ -3,11 +3,6 @@ import pandas as pd from string_utils import asciify import os -from urllib.request import urlopen, urlretrieve -from zipfile import ZipFile -from rarfile import RarFile -from bs4 import BeautifulSoup -import difflib from br_denatran_frota.code.utils import ( change_df_header, fix_suggested_nome_ibge, From ba51ac5ca31fd7a041c43013a6b025da6cf202fb Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 23 Apr 2023 17:54:06 -0300 Subject: [PATCH 073/265] Added guard --- br_denatran_frota/code/frota_municipio_tipo.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/br_denatran_frota/code/frota_municipio_tipo.py b/br_denatran_frota/code/frota_municipio_tipo.py index 33b13f8e0..48b0eaf0a 100644 --- a/br_denatran_frota/code/frota_municipio_tipo.py +++ b/br_denatran_frota/code/frota_municipio_tipo.py @@ -31,6 +31,8 @@ new_df = pl.from_pandas(new_df) new_df = new_df.with_columns(pl.col("nome_denatran").apply(asciify).str.to_lowercase()) new_df = new_df.filter(pl.col("nome_denatran") != "municipio nao informado") +if new_df.shape[0] != bd_municipios.shape[0]: + raise ValueError("Uh oh") def verify_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str): From da00c6d309e99fd6b6dba970bc37a1c484dd805e Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 25 Apr 2023 00:33:34 -0300 Subject: [PATCH 074/265] Clean up --- .../code/frota_municipio_tipo.py | 2 ++ .../test/download_frota_integration_test.py | 3 ++- .../code/test/download_frota_unit_test.py | 3 ++- ...ta_por_munic\303\255pio_e_tipo_2-2022.xls" | Bin 1183744 -> 0 bytes ...or_uf_e_tipo_de_ve\303\255culo_2-2022.xls" | Bin 33792 -> 0 bytes 5 files changed, 6 insertions(+), 2 deletions(-) delete mode 100644 "br_denatran_frota/files/2022/frota_por_munic\303\255pio_e_tipo_2-2022.xls" delete mode 100644 "br_denatran_frota/files/2022/frota_por_uf_e_tipo_de_ve\303\255culo_2-2022.xls" diff --git a/br_denatran_frota/code/frota_municipio_tipo.py b/br_denatran_frota/code/frota_municipio_tipo.py index 48b0eaf0a..2db886fcf 100644 --- a/br_denatran_frota/code/frota_municipio_tipo.py +++ b/br_denatran_frota/code/frota_municipio_tipo.py @@ -12,6 +12,8 @@ ) from br_denatran_frota.code.constants import DICT_UFS, SUBSTITUTIONS +## TODO: Extract everything then run this? Create prefect? where to go now + import basedosdados as bd municipios_query = """SELECT nome, id_municipio, sigla_uf FROM `basedosdados.br_bd_diretorios_brasil.municipio` diff --git a/br_denatran_frota/code/test/download_frota_integration_test.py b/br_denatran_frota/code/test/download_frota_integration_test.py index 331b35be8..654a5b6e0 100644 --- a/br_denatran_frota/code/test/download_frota_integration_test.py +++ b/br_denatran_frota/code/test/download_frota_integration_test.py @@ -1,10 +1,11 @@ +# -*- coding: utf-8 -*- import os import shutil import tempfile import unittest import glob from parameterized import parameterized -from download_frota import ( +from br_denatran_frota.code.download_frota import ( DATASET, MONTHS, download_frota, diff --git a/br_denatran_frota/code/test/download_frota_unit_test.py b/br_denatran_frota/code/test/download_frota_unit_test.py index a128bf894..5442587ef 100644 --- a/br_denatran_frota/code/test/download_frota_unit_test.py +++ b/br_denatran_frota/code/test/download_frota_unit_test.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- import os import shutil import tempfile @@ -5,7 +6,7 @@ import glob from parameterized import parameterized -from download_frota import ( +from br_denatran_frota.code.download_frota import ( DATASET, MONTHS, make_filename, diff --git "a/br_denatran_frota/files/2022/frota_por_munic\303\255pio_e_tipo_2-2022.xls" "b/br_denatran_frota/files/2022/frota_por_munic\303\255pio_e_tipo_2-2022.xls" deleted file mode 100644 index fd37025cd0a73890779470bcf62c330fdf17bd2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1183744 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

1G2(Ce(|Z^oXm7On5YI`pJ>l5{5{y;G!v#z9|> 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

Q|p=#FM%a}>lMUxuC#Wf&lBH_c%4YuLsQx< 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

2W1Q9f@!NF+T4PAOHil9fy^&< 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 C<*<+d From baceabcd177543e48a7d3ebeabd4e0d496c88e2e Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 25 Apr 2023 02:34:39 -0300 Subject: [PATCH 075/265] Reorganizing --- br_denatran_frota/code/constants.py | 22 +++ br_denatran_frota/code/download_frota.py | 127 +----------------- .../code/test/download_frota_unit_test.py | 8 +- br_denatran_frota/code/utils.py | 114 +++++++++++++++- 4 files changed, 140 insertions(+), 131 deletions(-) diff --git a/br_denatran_frota/code/constants.py b/br_denatran_frota/code/constants.py index 7e5cc7425..ce21f239e 100644 --- a/br_denatran_frota/code/constants.py +++ b/br_denatran_frota/code/constants.py @@ -1,4 +1,26 @@ # -*- coding: utf-8 -*- + +MONTHS = { + "janeiro": 1, + "fevereiro": 2, + "marco": 3, + "abril": 4, + "maio": 5, + "junho": 6, + "julho": 7, + "agosto": 8, + "setembro": 9, + "outubro": 10, + "novembro": 11, + "dezembro": 12, +} + +DATASET = "br_denatran_frota" + +HEADERS = { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36" +} + DICT_UFS = { "AC": "Acre", "AL": "Alagoas", diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index 6060769fc..7306d08c6 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -1,133 +1,10 @@ # -*- coding: utf-8 -*- import os -import re import glob from urllib.request import urlopen, urlretrieve from zipfile import ZipFile -from rarfile import RarFile -from bs4 import BeautifulSoup -import requests - -MONTHS = { - "janeiro": 1, - "fevereiro": 2, - "marco": 3, - "abril": 4, - "maio": 5, - "junho": 6, - "julho": 7, - "agosto": 8, - "setembro": 9, - "outubro": 10, - "novembro": 11, - "dezembro": 12, -} - -DATASET = "br_denatran_frota" -HEADERS = { - "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36" -} - - -def download_file(url, filename): - # Send a GET request to the URL - - new_url = url.replace("arquivos-denatran", "arquivos-senatran") - response = requests.get(new_url, headers=HEADERS) - # Save the contents of the response to a file - with open(filename, "wb") as f: - f.write(response.content) - - print(f"Download of {filename} complete") - - -def extract_zip(dest_path_file): - with ZipFile(dest_path_file, "r") as z: - z.extractall() - - -def handle_xl(i: dict) -> None: - """Actually downloads and deals with Excel files. - - Args: - i (dict): Dictionary with all the desired downloadable file's info. - """ - dest_path_file = make_filename(i) - download_file(i["href"], dest_path_file) - - -def make_filename(i: dict, ext: bool = True) -> str: - """Creates the filename using the sent dictionary. - - Args: - i (dict): Dictionary with all the file's info. - ext (bool, optional): Specifies if the generated file name needs the filetype at the end. Defaults to True. - - Returns: - str: The full filename. - """ - txt = i["txt"] - mes = i["mes"] - ano = i["ano"] - filetype = i["filetype"] - filename = re.sub("\\s+", "_", txt, flags=re.UNICODE).lower() - filename = f"{filename}_{mes}-{ano}" - if ext: - filename += f".{filetype}" - return filename - - -def call_downloader(i): - filename = make_filename(i) - if i["filetype"] in ["xlsx", "xls"]: - download_file(i["href"], filename) - elif i["filetype"] == "zip": - download_file(i["href"], filename) - extract_zip(filename) - - -def download_post_2012(month: int, year: int): - """_summary_ - - Args: - year (int): _description_ - month (int): _description_ - """ - url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-Senatran/frota-de-veiculos-{year}" - soup = BeautifulSoup(urlopen(url), "html.parser") - # Só queremos os dados de frota nacional. - nodes = soup.select("p:contains('rota por ') > a") - for node in nodes: - txt = node.text - href = node.get("href") - # Pega a parte relevante do arquivo em questão. - match = re.search( - r"(?i)\/([\w-]+)\/(\d{4})\/(\w+)\/([\w-]+)\.(?:xls|xlsx|rar|zip)$", href - ) - if match: - matched_month = match.group(3) - matched_year = match.group(2) - if MONTHS.get(matched_month) == month and matched_year == str(year): - filetype = match.group(0).split(".")[-1].lower() - info = { - "txt": txt, - "href": href, - "mes_name": matched_month, - "mes": month, - "ano": year, - "filetype": filetype, - } - call_downloader(info) - - -def make_dir_when_not_exists(dir_name: str): - """Auxiliary function to create a subdirectory when it is not present. - - Args: - dir_name (str): Name of the subdirectory to be created. - """ - if not os.path.exists(dir_name): - os.mkdir(dir_name) +from br_denatran_frota.code.constants import MONTHS, DATASET +from br_denatran_frota.code.utils import make_dir_when_not_exists, download_post_2012 def download_frota(month: int, year: int, temp_dir: str = ""): diff --git a/br_denatran_frota/code/test/download_frota_unit_test.py b/br_denatran_frota/code/test/download_frota_unit_test.py index 5442587ef..65007d9d5 100644 --- a/br_denatran_frota/code/test/download_frota_unit_test.py +++ b/br_denatran_frota/code/test/download_frota_unit_test.py @@ -6,14 +6,12 @@ import glob from parameterized import parameterized -from br_denatran_frota.code.download_frota import ( - DATASET, - MONTHS, +from br_denatran_frota.code.utils import ( make_filename, make_dir_when_not_exists, - download_frota, ) - +from br_denatran_frota.code.constants import DATASET +from br_denatran_frota.code.download_frota import download_frota dir_list = glob.glob(f"**/{DATASET}", recursive=True) if dir_list: diff --git a/br_denatran_frota/code/utils.py b/br_denatran_frota/code/utils.py index 160b39d48..8aa9bebec 100644 --- a/br_denatran_frota/code/utils.py +++ b/br_denatran_frota/code/utils.py @@ -3,7 +3,18 @@ import polars as pl import difflib import re -from br_denatran_frota.code.constants import DICT_UFS, SUBSTITUTIONS +import os +from zipfile import ZipFile +from br_denatran_frota.code.constants import ( + DICT_UFS, + SUBSTITUTIONS, + HEADERS, + DATASET, + MONTHS, +) +import requests +from urllib.request import urlopen, urlretrieve +from bs4 import BeautifulSoup def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int: @@ -160,3 +171,104 @@ def get_city_name_ibge(denatran_name: str, ibge_uf: pl.DataFrame) -> str: return matches[0] else: return "" # I don't want this to error out directly, because then I can get all municipalities. + + +def download_file(url, filename): + # Send a GET request to the URL + + new_url = url.replace("arquivos-denatran", "arquivos-senatran") + response = requests.get(new_url, headers=HEADERS) + # Save the contents of the response to a file + with open(filename, "wb") as f: + f.write(response.content) + + print(f"Download of {filename} complete") + + +def extract_zip(dest_path_file): + with ZipFile(dest_path_file, "r") as z: + z.extractall() + + +def handle_xl(i: dict) -> None: + """Actually downloads and deals with Excel files. + + Args: + i (dict): Dictionary with all the desired downloadable file's info. + """ + dest_path_file = make_filename(i) + download_file(i["href"], dest_path_file) + + +def make_filename(i: dict, ext: bool = True) -> str: + """Creates the filename using the sent dictionary. + + Args: + i (dict): Dictionary with all the file's info. + ext (bool, optional): Specifies if the generated file name needs the filetype at the end. Defaults to True. + + Returns: + str: The full filename. + """ + txt = i["txt"] + mes = i["mes"] + ano = i["ano"] + filetype = i["filetype"] + filename = re.sub("\\s+", "_", txt, flags=re.UNICODE).lower() + filename = f"{filename}_{mes}-{ano}" + if ext: + filename += f".{filetype}" + return filename + + +def call_downloader(i): + filename = make_filename(i) + if i["filetype"] in ["xlsx", "xls"]: + download_file(i["href"], filename) + elif i["filetype"] == "zip": + download_file(i["href"], filename) + extract_zip(filename) + + +def download_post_2012(month: int, year: int): + """_summary_ + + Args: + year (int): _description_ + month (int): _description_ + """ + url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-Senatran/frota-de-veiculos-{year}" + soup = BeautifulSoup(urlopen(url), "html.parser") + # Só queremos os dados de frota nacional. + nodes = soup.select("p:contains('rota por ') > a") + for node in nodes: + txt = node.text + href = node.get("href") + # Pega a parte relevante do arquivo em questão. + match = re.search( + r"(?i)\/([\w-]+)\/(\d{4})\/(\w+)\/([\w-]+)\.(?:xls|xlsx|rar|zip)$", href + ) + if match: + matched_month = match.group(3) + matched_year = match.group(2) + if MONTHS.get(matched_month) == month and matched_year == str(year): + filetype = match.group(0).split(".")[-1].lower() + info = { + "txt": txt, + "href": href, + "mes_name": matched_month, + "mes": month, + "ano": year, + "filetype": filetype, + } + call_downloader(info) + + +def make_dir_when_not_exists(dir_name: str): + """Auxiliary function to create a subdirectory when it is not present. + + Args: + dir_name (str): Name of the subdirectory to be created. + """ + if not os.path.exists(dir_name): + os.mkdir(dir_name) From 293364bf4dc61ab8e8eb7a9404fa97db2eb1c048 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 26 Apr 2023 01:50:35 -0300 Subject: [PATCH 076/265] Testing more stuff --- br_denatran_frota/code/download_frota.py | 6 --- .../test/download_frota_integration_test.py | 1 + .../code/test/download_frota_unit_test.py | 47 +++++++++++++++++++ br_denatran_frota/code/utils.py | 1 + 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index 7306d08c6..4c6bb56da 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -50,9 +50,3 @@ def download_frota(month: int, year: int, temp_dir: str = ""): with ZipFile(generic_zip_filename) as zip_file: zip_file.extractall() os.chdir(initial_dir) - - -year = 2022 -if __name__ == "__main__": - for month in range(1, 6): - download_frota(month, year) diff --git a/br_denatran_frota/code/test/download_frota_integration_test.py b/br_denatran_frota/code/test/download_frota_integration_test.py index 654a5b6e0..d110cef91 100644 --- a/br_denatran_frota/code/test/download_frota_integration_test.py +++ b/br_denatran_frota/code/test/download_frota_integration_test.py @@ -29,6 +29,7 @@ def tearDown(self): print("Deleting temporary directory") shutil.rmtree(self.temp_dir.name) + @unittest.skip("take it easy") @parameterized.expand( [(month, year) for year in range(2021, 2023) for month in range(1, 12)], name_func=custom_name_func, diff --git a/br_denatran_frota/code/test/download_frota_unit_test.py b/br_denatran_frota/code/test/download_frota_unit_test.py index 65007d9d5..0ddfba6c2 100644 --- a/br_denatran_frota/code/test/download_frota_unit_test.py +++ b/br_denatran_frota/code/test/download_frota_unit_test.py @@ -4,6 +4,7 @@ import tempfile import unittest import glob +import pandas as pd from parameterized import parameterized from br_denatran_frota.code.utils import ( @@ -12,6 +13,7 @@ ) from br_denatran_frota.code.constants import DATASET from br_denatran_frota.code.download_frota import download_frota +from br_denatran_frota.code.utils import guess_header dir_list = glob.glob(f"**/{DATASET}", recursive=True) if dir_list: @@ -71,5 +73,50 @@ def test_download_frota_with_invalid_month(self): download_frota(13, 2013) +class TestGuessHeader(unittest.TestCase): + def test_correct_header_guess(self): + # Test case 1: Correct header guess + df = pd.DataFrame( + { + "A": ["Name", "Alice", "Bob"], + "B": ["Age", 30, 40], + "C": ["Country", "USA", "Canada"], + } + ) + self.assertEqual(guess_header(df), 0) # Header is in the first row + + def test_no_header_found(self): + # Test case 2: No header found + df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]}) + self.assertEqual( + guess_header(df), 0 + ) # Header is assumed to be in the first row + + def test_header_found_beyond_max_header_guess(self): + # Test case 3: Header found beyond max_header_guess + df = pd.DataFrame( + {"A": [1, 2, 3], "B": [4, 5, 6], "C": ["Name", "Alice", "Bob"]} + ) + self.assertEqual( + guess_header(df, max_header_guess=2), 0 + ) # Header is assumed to be in the first row + + def test_empty_dataframe(self): + # Test case 4: Empty dataframe + df = pd.DataFrame() + self.assertEqual( + guess_header(df), 0 + ) # Header is assumed to be in the first row + + def test_all_columns_are_strings_not_in_header_row(self): + # Test case 5: All columns are strings but not in header row + df = pd.DataFrame( + {"A": ["1", "2", "3"], "B": ["4", "5", "6"], "C": ["7", "8", "9"]} + ) + self.assertEqual( + guess_header(df), 0 + ) # Header is assumed to be in the first row + + if __name__ == "__main__": unittest.main() diff --git a/br_denatran_frota/code/utils.py b/br_denatran_frota/code/utils.py index 8aa9bebec..b6fcf2cf7 100644 --- a/br_denatran_frota/code/utils.py +++ b/br_denatran_frota/code/utils.py @@ -50,6 +50,7 @@ def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame: Returns: pd.DataFrame: Returns the same dataframe but with the corrected header """ + print(2) new_header = df.iloc[header_row] new_df = df[(header_row + 1) :].reset_index(drop=True) new_df.rename(columns=new_header, inplace=True) From dda7427c8872715698c6b9c25a9ec8b72ef5a2cc Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 26 Apr 2023 03:13:01 -0300 Subject: [PATCH 077/265] Coverage back --- poetry.lock | 259 +++---------------------------------------------- pyproject.toml | 4 +- 2 files changed, 13 insertions(+), 250 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2b0aab238..5409f7a5b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -61,7 +61,7 @@ files = [ name = "attrs" version = "22.2.0" description = "Classes Without Boilerplate" -category = "dev" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -470,7 +470,7 @@ requests = ">=2.23.0" name = "coverage" version = "7.2.3" description = "Code coverage measurement for Python" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -763,7 +763,7 @@ files = [ name = "exceptiongroup" version = "1.1.1" description = "Backport of PEP 654 (exception groups)" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1383,7 +1383,7 @@ testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-chec name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1659,121 +1659,6 @@ files = [ {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, ] -[[package]] -name = "levenshtein" -version = "0.21.0" -description = "Python extension for computing string edit distances and similarities." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "Levenshtein-0.21.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1f19fe25ea0dd845d0f48505e8947f6080728e10b7642ba0dad34e9b48c81130"}, - {file = "Levenshtein-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d23c647b03acbb5783f9bdfd51cfa5365d51f7df9f4029717a35eff5cc32bbcc"}, - {file = "Levenshtein-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:668ea30b311944c643f866ce5e45edf346f05e920075c0056f2ba7f74dde6071"}, - {file = "Levenshtein-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f42b8dba2cce257cd34efd1ce9678d06f3248cb0bb2a92a5db8402e1e4a6f30"}, - {file = "Levenshtein-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c27a5178ce322b56527a451185b4224217aa81955d9b0dad6f5a8de81ffe80f"}, - {file = "Levenshtein-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:92bf2370b01d7a4862abf411f8f60f39f064cebebce176e3e9ee14e744db8288"}, - {file = "Levenshtein-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32dfda2e64d0c50553e47d0ab2956413970f940253351c196827ad46f17916d5"}, - {file = "Levenshtein-0.21.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f55623094b665d79a3b82ba77386ac34fa85049163edfe65387063e5127d4184"}, - {file = "Levenshtein-0.21.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:25576ad9c337ecb342306fe87166b54b2f49e713d4ff592c752cc98e0046296e"}, - {file = "Levenshtein-0.21.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fae24c875c4ecc8c5f34a9715eb2a459743b4ca21d35c51819b640ee2f71cb51"}, - {file = "Levenshtein-0.21.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:4b2156f32e46d16b74a055ccb4f64ee3c64399372a6aaf1ee98f6dccfadecee1"}, - {file = "Levenshtein-0.21.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:04046878a57129da4e2352c032df7c1fceaa54870916d12772cad505ef998290"}, - {file = "Levenshtein-0.21.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:608beb1683508c3cdbfff669c1c872ea02b47965e1bbb8a630de548e2490f96a"}, - {file = "Levenshtein-0.21.0-cp310-cp310-win32.whl", hash = "sha256:cc36ba40027b4f8821155c9e3e0afadffccdccbe955556039d1d1169dfc659c9"}, - {file = "Levenshtein-0.21.0-cp310-cp310-win_amd64.whl", hash = "sha256:80e67bd73a05592ecd52aede4afa8ea49575de70f9d5bfbe2c52ebd3541b20be"}, - {file = "Levenshtein-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3305262cb85ff78ace9e2d8d2dfc029b34dc5f93aa2d24fd20b6ed723e2ad501"}, - {file = "Levenshtein-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:023ca95c833ca548280e444e9a4c34fdecb3be3851e96af95bad290ae0c708b9"}, - {file = "Levenshtein-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8476862a5c3150b8d63a7475563a4bff6dc50bbc0447894eb6b6a116ced0809d"}, - {file = "Levenshtein-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0236c8ff4648c50ebd81ac3692430d2241b134936ac9d86d7ca32ba6ab4a4e63"}, - {file = "Levenshtein-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cfbc4ed7ee2965e305bf81388fea377b795dabc82ee07f04f31d1fb8677a885"}, - {file = "Levenshtein-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6338a47b6f8c7f1ee8b5636cc8b245ad2d1d0ee47f7bb6f33f38a522ef0219cc"}, - {file = "Levenshtein-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dc79033140f82acaca40712a6d26ed190cc2dd403e104020a87c24f2771aa72"}, - {file = "Levenshtein-0.21.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88ccdc8dc20c16e8059ace00fb58d353346a04fd24c0733b009678b2554801d2"}, - {file = "Levenshtein-0.21.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c031cbe3685b0343f5cc2dcf2172fd21b82f8ccc5c487179a895009bf0e4ea8"}, - {file = "Levenshtein-0.21.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eab6c253983a6659e749f4c44fcc2215194c2e00bf7b1c5e90fe683ea3b7b00f"}, - {file = "Levenshtein-0.21.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:8bdbcd1570340b07549f71e8a5ba3f0a6d84408bf86c4051dc7b70a29ae342bb"}, - {file = "Levenshtein-0.21.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4357bf8146cbadb10016ad3a950bba16e042f79015362a575f966181d95b4bc7"}, - {file = "Levenshtein-0.21.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be038321695267a8faa5ae1b1a83deb3748827f0b6f72471e0beed36afcbd72a"}, - {file = "Levenshtein-0.21.0-cp311-cp311-win32.whl", hash = "sha256:be87998ffcbb5fb0c37a76d100f63b4811f48527192677da0ec3624b49ab8a64"}, - {file = "Levenshtein-0.21.0-cp311-cp311-win_amd64.whl", hash = "sha256:f873af54014cac12082c7f5ccec6bbbeb5b57f63466e7f9c61a34588621313fb"}, - {file = "Levenshtein-0.21.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4ec2ef9836a34a3bb009a81e5efe4d9d43515455fb5f182c5d2cf8ae61c79496"}, - {file = "Levenshtein-0.21.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e748c2349719cb1bc90f802d9d7f07310633dcf166d468a5bd821f78ed17698"}, - {file = "Levenshtein-0.21.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:37a99d858fa1d88b1a917b4059a186becd728534e5e889d583086482356b7ca1"}, - {file = "Levenshtein-0.21.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:742b785c93d16c63289902607219c200bd2b6077dafc788073c74337cae382fb"}, - {file = "Levenshtein-0.21.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cefd5a668f6d7af1279aca10104b43882fdd83f9bdc68933ba5429257a628abe"}, - {file = "Levenshtein-0.21.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e1723d515ab287b9b2c2e4a111894dc6b474f5d28826fff379647486cae98d2"}, - {file = "Levenshtein-0.21.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3e22d31375d5fea5797c9b7aa0f8cc36579c31dcf5754e9931ca86c27d9011f8"}, - {file = "Levenshtein-0.21.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:31cb59d86a5f99147cd4a67ebced8d6df574b5d763dcb63c033a642e29568746"}, - {file = "Levenshtein-0.21.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:76d5d34a8e21de8073c66ae801f053520f946d499fa533fbba654712775f8132"}, - {file = "Levenshtein-0.21.0-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:46dab8c6e8fae563ca77acfaeb3824c4dd4b599996328b8a081b06f16befa6a0"}, - {file = "Levenshtein-0.21.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:ee62ec5882a857b252faffeb7867679f7e418052ca6bf7d6b56099f6498a2b0e"}, - {file = "Levenshtein-0.21.0-cp36-cp36m-win32.whl", hash = "sha256:7e40a4bac848c9a8883225f926cfa7b2bc9f651e989a8b7006cdb596edc7ac9b"}, - {file = "Levenshtein-0.21.0-cp36-cp36m-win_amd64.whl", hash = "sha256:709a727f58d31a5ee1e5e83b247972fe55ef0014f6222256c9692c5efa471785"}, - {file = "Levenshtein-0.21.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01dd427cf72b4978b09558e3d36e3f92c8eef467e3eb4653c3fdccd8d70aaa08"}, - {file = "Levenshtein-0.21.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ff1255c499fcb41ba37a578ad8c1b8dab5c44f78941b8e1c1d7fab5b5e831bc"}, - {file = "Levenshtein-0.21.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8aa92b05156dfa2e248c3743670d5deb41a45b5789416d5fa31be009f4f043ab"}, - {file = "Levenshtein-0.21.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d932cb21e40beb93cfc8973de7f25fbf25ba4a07d1dccac3b9ba977164cf9887"}, - {file = "Levenshtein-0.21.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d4ba0df46bb41d660d77e7cc6b4d38c8d5b6f977d51c48ed1217db6a8474cde"}, - {file = "Levenshtein-0.21.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c8eaaa6f0df2838437d1d8739629486b145f7a3405d3ef0874301a9f5bc7dcd"}, - {file = "Levenshtein-0.21.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ede583155f24c8b2456a7720fbbfa5d9c1154ae04b4da3cf63368e2406ea099"}, - {file = "Levenshtein-0.21.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a18c8e4d1aae3f9950797d049020c64a8a63cc8b4e43afcca91ec400bf6304c5"}, - {file = "Levenshtein-0.21.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:8cf87a5e2962431d7260dd81dc1ca0697f61aad81036145d3666f4c0d514ce3a"}, - {file = "Levenshtein-0.21.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bd0bfa71b1441be359e99e77709885b79c22857bf9bb7f4e84c09e501f6c5fad"}, - {file = "Levenshtein-0.21.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e9a6251818b9eb6d519bffd7a0b745f3a99b3e99563a4c9d3cad26e34f6ac880"}, - {file = "Levenshtein-0.21.0-cp37-cp37m-win32.whl", hash = "sha256:8dd8ef4239b24fb1c9f0b536e48e55194d5966d351d349af23e67c9eb3875c68"}, - {file = "Levenshtein-0.21.0-cp37-cp37m-win_amd64.whl", hash = "sha256:26c6fb012538a245d78adea786d2cfe3c1506b835762c1c523a4ed6b9e08dc0b"}, - {file = "Levenshtein-0.21.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b0ba9723c7d67a61e160b3457259552f7d679d74aaa144b892eb68b7e2a5ebb6"}, - {file = "Levenshtein-0.21.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:426883be613d912495cf6ee2a776d2ab84aa6b3de5a8d82c43a994267ea6e0e3"}, - {file = "Levenshtein-0.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5369827ace536c6df04e0e670d782999bc17bf9eb111e77435fdcdaecb10c2a3"}, - {file = "Levenshtein-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ebabcf982ae161534f8729d13fe05eebc977b497ac34936551f97cf8b07dd9e"}, - {file = "Levenshtein-0.21.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13e8a5b1b58de49befea555bb913dc394614f2d3553bc5b86bc672c69ef1a85a"}, - {file = "Levenshtein-0.21.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d647f1e0c30c7a73f70f4de7376ed7dafc2b856b67fe480d32a81af133edbaeb"}, - {file = "Levenshtein-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5378a8139ba61d7271c0f9350201259c11eb90bfed0ac45539c4aeaed3907230"}, - {file = "Levenshtein-0.21.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df9b0f8f511270ad259c7bfba22ab6d5a0c33d81cd594461668e67cd80dd9052"}, - {file = "Levenshtein-0.21.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9485f2a5c88113410153256657072bc93b81bf5c8690d47e4cc3df58135dbadb"}, - {file = "Levenshtein-0.21.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:aa39bb773915e4df330d311bb6c100a8613e265cc50d5b25b015c8db824e1c47"}, - {file = "Levenshtein-0.21.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:de2dfd6498454c7d89036d56a53c0a01fd9bcf1c2970253e469b5e8bb938b69f"}, - {file = "Levenshtein-0.21.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4515f9511cb91c66d254ee30154206aad76b57d8b25f64ba1402aad43efdb251"}, - {file = "Levenshtein-0.21.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f622f542bd065ffec7d26b26d44d0c9a25c9c1295fd8ba6e4d77778e2293a12c"}, - {file = "Levenshtein-0.21.0-cp38-cp38-win32.whl", hash = "sha256:ee757fd36bad66ad8b961958840894021ecaad22194f65219a666432739393ff"}, - {file = "Levenshtein-0.21.0-cp38-cp38-win_amd64.whl", hash = "sha256:457442911df185e28a32fd8b788b14ca22ab3a552256b556e7687173d5f18bc4"}, - {file = "Levenshtein-0.21.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b646ace5085a60d4f89b28c81301c9d9e8cd6a9bdda908181b2fa3dfac7fc10d"}, - {file = "Levenshtein-0.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0cc3679978cd0250bf002963cf2e08855b93f70fa0fc9f74956115c343983fbb"}, - {file = "Levenshtein-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:84b55b732e311629a8308ad2778a0f9824e29e3c35987eb35610fc52eb6d4634"}, - {file = "Levenshtein-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7adaabe07c5ceb6228332b9184f06eb9cda89c227d198a1b8a6f78c05b3c672"}, - {file = "Levenshtein-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac8b6266799645827980ab1af4e0bfae209c1f747a10bdf6e5da96a6ebe511a2"}, - {file = "Levenshtein-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c2d67220867d640e36931b3d63b8349369b485d52cf6f4a2635bec8da92d678"}, - {file = "Levenshtein-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb26e69fc6c12534fbaa1657efed3b6482f1a166ba8e31227fa6f6f062a59070"}, - {file = "Levenshtein-0.21.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a68b05614d25cc2a5fbcc4d2fd124be7668d075fd5ac3d82f292eec573157361"}, - {file = "Levenshtein-0.21.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b167b32b3e336c5ec5e0212f025587f9248344ae6e73ed668270eba5c6a506e5"}, - {file = "Levenshtein-0.21.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:04850a0719e503014acb3fee6d4ec7d7f170a2c7375ffbc5833c7256b7cd10ee"}, - {file = "Levenshtein-0.21.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ce7e76c6341abb498368d42b8081f2f45c245ac2a221af6a0394349d41302c08"}, - {file = "Levenshtein-0.21.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:ec64b7b3fb95bc9c20c72548277794b81281a6ba9da85eda2c87324c218441ff"}, - {file = "Levenshtein-0.21.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24843f28cbbdcbcfc18b08e7d3409dbaad7896fb7113442592fa978590a7bbf0"}, - {file = "Levenshtein-0.21.0-cp39-cp39-win32.whl", hash = "sha256:c290a7211f1b4f87c300df4424cc46b7379cead3b6f37fa8d3e7e6c6212ccd39"}, - {file = "Levenshtein-0.21.0-cp39-cp39-win_amd64.whl", hash = "sha256:1fde464f937878e6f5c30c234b95ce2cb969331a175b3089367e077113428062"}, - {file = "Levenshtein-0.21.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:66d303cd485710fe6d62108209219b7a695bdd10a722f4e86abdaf26f4bf2202"}, - {file = "Levenshtein-0.21.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bc550d0986ace95bde003b8a60e622449baf2bdf24d8412f7a50f401a289ec3"}, - {file = "Levenshtein-0.21.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c6858cfd84568bc1df3ad545553b5c27af6ed3346973e8f4b57d23c318cf8f4"}, - {file = "Levenshtein-0.21.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ce3f14a8e006fb7e3fc7bab965ab7da5817f48fc48d25cf735fcec8f1d2e39a"}, - {file = "Levenshtein-0.21.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:024302c82d49fc1f1d044794997ef7aa9d01b509a9040e222480b64a01cd4b80"}, - {file = "Levenshtein-0.21.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e043b79e39f165026bc941c95582bfc4bfdd297a1de6f13ace0d0a7abf486288"}, - {file = "Levenshtein-0.21.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8446f8da38857482ec0cfd616fe5e7dcd3695fd323cc65f37366a9ff6a31c9cb"}, - {file = "Levenshtein-0.21.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:587ad51770de41eb491bea1bfb676abc7ff9a94dbec0e2bc51fc6a25abef99c4"}, - {file = "Levenshtein-0.21.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac4ed77d3263eac7f9b6ed89d451644332aecd55cda921201e348803a1e5c57"}, - {file = "Levenshtein-0.21.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cf2dee0f8c71598f8be51e3feceb9142ac01576277b9e691e25740987761c86e"}, - {file = "Levenshtein-0.21.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4bbceef2caba4b2ae613b0e853a7aaab990c1a13bddb9054ba1328a84bccdbf7"}, - {file = "Levenshtein-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2290732763e3b75979888364b26acce79d72b8677441b5762a4e97b3630cc3d9"}, - {file = "Levenshtein-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db7567997ffbc2feb999e30002a92461a76f17a596a142bdb463b5f7037f160c"}, - {file = "Levenshtein-0.21.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c270487d60b33102efea73be6dcd5835f3ddc3dc06e77499f0963df6cba2ec71"}, - {file = "Levenshtein-0.21.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e2686c37d22faf27d02a19e83b55812d248b32b7ba3aa638e768d0ea032e1f3c"}, - {file = "Levenshtein-0.21.0.tar.gz", hash = "sha256:545635d9e857711d049dcdb0b8609fb707b34b032517376c531ca159fcd46265"}, -] - -[package.dependencies] -rapidfuzz = ">=2.3.0,<4.0.0" - [[package]] name = "locket" version = "0.2.1" @@ -2482,7 +2367,7 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.2.2)", "pytest- name = "pluggy" version = "1.0.0" description = "plugin and hook calling mechanisms for python" -category = "dev" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2973,7 +2858,7 @@ diagrams = ["jinja2", "railroad-diagrams"] name = "pytest" version = "7.2.2" description = "pytest: simple powerful testing with Python" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2995,14 +2880,14 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2. [[package]] name = "pytest-cov" -version = "3.0.0" +version = "4.0.0" description = "Pytest plugin for measuring coverage." -category = "dev" +category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, - {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, + {file = "pytest-cov-4.0.0.tar.gz", hash = "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470"}, + {file = "pytest_cov-4.0.0-py3-none-any.whl", hash = "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b"}, ] [package.dependencies] @@ -3047,21 +2932,6 @@ files = [ [package.dependencies] six = ">=1.5" -[[package]] -name = "python-levenshtein" -version = "0.21.0" -description = "Python extension for computing string edit distances and similarities." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "python-Levenshtein-0.21.0.tar.gz", hash = "sha256:c97f60e694dcfc4eae7fabc19490e0892b212d975d70d1b14fc109e58c33b0bf"}, - {file = "python_Levenshtein-0.21.0-py3-none-any.whl", hash = "sha256:2e05a10989cae751669dc08c5d4934e2da489c9afb1545ecc1d8c8edb822b5ae"}, -] - -[package.dependencies] -Levenshtein = "0.21.0" - [[package]] name = "python-slugify" version = "5.0.2" @@ -3278,111 +3148,6 @@ files = [ [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} -[[package]] -name = "rapidfuzz" -version = "3.0.0" -description = "rapid fuzzy string matching" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "rapidfuzz-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ab635a544243e1924508bfc3f294c28bdced6d74388ac25041d3dabcaefab75"}, - {file = "rapidfuzz-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cf8b1b29028dc1bc6a5654f22425ee6d3967bbd44bc3a117be0f43b03300f928"}, - {file = "rapidfuzz-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2bbf9aad86b70283362dc2db3cacb7dcde0ffe6027f54feb0ccb23cf87b6aa11"}, - {file = "rapidfuzz-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a9b7d22e46ada4e6a1f1404c267f3f023b44594929913d855f14bc5fb11b53d"}, - {file = "rapidfuzz-3.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c81891e570e50d0afe43f722f426b0bd602d3c5315f0f290514511d9520b1e6"}, - {file = "rapidfuzz-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:abc2f05c1f30b9533cb9b85d73c28d93aa99c7ae2992df04c1704fcaf248b59c"}, - {file = "rapidfuzz-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:339b94c536ab9c1b1bac245fb6814df3ba104603d2c1a97f8fb41922357bd772"}, - {file = "rapidfuzz-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8883267df996b42494f40d533ef3a3fea247531d137773a649fb851747ae12c8"}, - {file = "rapidfuzz-3.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:59c6c9d3ca7d84c5878a74d142816350a3bdfb51e4d10ac104afd396168481f6"}, - {file = "rapidfuzz-3.0.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5759bb0fd13ee030626e8bbb5b644092a043817fb192335ff4c481402b1edd0e"}, - {file = "rapidfuzz-3.0.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:1fe6ea9300f347fd3352c755aa04d71a2786afa008d1af1a35830e6a44e7fd5f"}, - {file = "rapidfuzz-3.0.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:481c0389c3b26cd2aa498b6924ca6e9a1d1dd5b15ad5f009d273292949e47e24"}, - {file = "rapidfuzz-3.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:658be4cabcc229f52a902f5e87205e1b9c29c66e463a267c8d8f237acde56002"}, - {file = "rapidfuzz-3.0.0-cp310-cp310-win32.whl", hash = "sha256:7f8d89b16b4752deeb66dd321548c4cfa59819982d43d2ae7ab5d6e0f15bee94"}, - {file = "rapidfuzz-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:2132d7724c03dd322035cf1b0c23ca9e7e449ec2b7225040a2ca2fa3f1a3bbfa"}, - {file = "rapidfuzz-3.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:0bf1953a4c32ce6e2f3ed1897d0a8dbbbf19456ef0a8e37bae26e007d9fb5096"}, - {file = "rapidfuzz-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:526df35d07083480e751f9679fd1f3e8a0819e8a13586e3860db5b65549a408a"}, - {file = "rapidfuzz-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88c9e93508128168708aae3ef98eeb422a88204d81ac4492fcea1e1162a6af74"}, - {file = "rapidfuzz-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:562caa39652c72156574fcf60ce7adf29964a031a57ae977c180947e00425b4a"}, - {file = "rapidfuzz-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a149c944f3c349f6279a8cc4cbfa3e80cc2baaec9d983359698aa792faa44653"}, - {file = "rapidfuzz-3.0.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c40a626050e37c2f74e2ba00538578d3c4a6baa171d08ed5091b6a03512ac4a"}, - {file = "rapidfuzz-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ee35eddeddb5f5750d2a9cc55894926969fa0bac80bbe57211ae6fd0d34b39f"}, - {file = "rapidfuzz-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c94fe53da481d8580e6410f3e7e4ba4e9c5786cad1f289fbb6c9c9585c6d78e1"}, - {file = "rapidfuzz-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4032713943c32fff97d863e6618162923e3b3c31917d437126d9fcf7e33c83d2"}, - {file = "rapidfuzz-3.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dc1a39d1cc8e679c7240b2d1ed8366cf740ab8429cc9b582ebd94a5c6ededbe5"}, - {file = "rapidfuzz-3.0.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f213bb5d4cd0b1fddf209bafe2d2896320a737fbded3a567d454e54875e4d9cc"}, - {file = "rapidfuzz-3.0.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c9ca5f4ae767605cefa5156f5fa8561bee61849f9b2ccfb165d7087b4f9af90c"}, - {file = "rapidfuzz-3.0.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:938cc766d0ce9eca95549593b6ca7ff86a2917b9e68c1989ad95485aed0f49dd"}, - {file = "rapidfuzz-3.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:87eb7e9fb49265c33bda0417cc74c474a891cae60735fbbd75d79a106483888e"}, - {file = "rapidfuzz-3.0.0-cp311-cp311-win32.whl", hash = "sha256:3f51d35521f86e767d3e640d0ab42908d01c3e05cf54ac1f0b547f3f602800f1"}, - {file = "rapidfuzz-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:4ef3a6aa07b996c789c8d5ab99ed0563d551d32fa9330fd0f52ba28d20fcb662"}, - {file = "rapidfuzz-3.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:7eea0ca53da78040a6b7bb041af8051c52efa7facc6f18dce33e679f2decaf62"}, - {file = "rapidfuzz-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6dfd138dcc0920b71c1d1bc017413b032286a1f33488613dce9e254c454abaf2"}, - {file = "rapidfuzz-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b81d15da16e97c288c645eb642d8a08d0ab98b827efb2682cab282a45893efe"}, - {file = "rapidfuzz-3.0.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ff8835a3ba17f3baf3838f2612e3758d7b1ca09eb16c9a382df3bec5bb9bda3"}, - {file = "rapidfuzz-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:82a4ea0742b9e375d4856714ef59241007765edbce34fd2f7d76c552ed93a7d2"}, - {file = "rapidfuzz-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5767b0e8220b6f8afcc1fe77529e5678470f9e94a1cfc9e29f5b0721dc1496c"}, - {file = "rapidfuzz-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8c372dc278d1d5ced7cdc99ad8cc1d3de0b245e769a6b327c462b98873e5d4"}, - {file = "rapidfuzz-3.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5d8664d6f844ea9018b4866e8a8dbf49c87f703668b1b3265de83aa3c9941272"}, - {file = "rapidfuzz-3.0.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fa098429af4e17fb5bacb0c39f1f8349891356ba7ca540521515b5708fec4a76"}, - {file = "rapidfuzz-3.0.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:738ae2d59ab254c4f173b40b00a9c1f092697949284c59e0879e6e3beb337a69"}, - {file = "rapidfuzz-3.0.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1a5eb2d1844f375f34e3c83b1a03094293d894472fdd1a095cf35e4dfa2ecf01"}, - {file = "rapidfuzz-3.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:24d77723bb20030a91b096326d14b673d2ff1f0c7bbc64ed519992ed8eb5b869"}, - {file = "rapidfuzz-3.0.0-cp37-cp37m-win32.whl", hash = "sha256:b85dfb6f0c353c4b37499529f9831620a7bdc61c375e07f8c38b595f93e906e5"}, - {file = "rapidfuzz-3.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:54fb70b667b882f9939bc6f581957fcb47fec2e7ad652259835c80e9e30230c9"}, - {file = "rapidfuzz-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4e1da3dce34d742567da0722b9c8dc2b51554ab5a22fdaf763b60209445a7b37"}, - {file = "rapidfuzz-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c50825de43442c4625a2ca1d948c911d116cf9007ad7f29cd27561c99b16947c"}, - {file = "rapidfuzz-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:69270e0cd850984f562b2239d07cde2213e5c3642cd8d550d5ac9a0fcd0882df"}, - {file = "rapidfuzz-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5ddf48f63895f949355a1c4d643e0a531c9317d52901f80d5a6299d967b766"}, - {file = "rapidfuzz-3.0.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd2ad4160d8ad9a2abdad1c765fd29e4d9b6b8ce6a707ee48eb2869e7dff0f89"}, - {file = "rapidfuzz-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc39af05cdf89be426d96fce579c812948a324b022fb11dfea1e99e180d4f68b"}, - {file = "rapidfuzz-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d25555297466ab5ded3875913fc0bfa78b89b0a32d79bd65ffbd32ae71f07c2d"}, - {file = "rapidfuzz-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76da6c8972acd58c31efdd09c4c85263ba3b4394d2c2929be4c171a22293bab3"}, - {file = "rapidfuzz-3.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2b50f2d429d81a65910f5ee9b14e172e300a09b8b2ecb91d3e4efc5d2583915c"}, - {file = "rapidfuzz-3.0.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f00a8b3d0b21884ea972d5430797b1a25b9d2c715b3eaf03366903aac5d8398c"}, - {file = "rapidfuzz-3.0.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:e058ecfd8edb04b221d1b2d005f17be932075a16f75b100b275de1d3d220da5f"}, - {file = "rapidfuzz-3.0.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:35e21f0718fd1c1853f8f433f2f84f618f6d4a6d9d96bb7c42e39797be600b58"}, - {file = "rapidfuzz-3.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d128f615da9a198cd9b33be658a0c26fabe06a6d28fa4652953853e8d174c2c6"}, - {file = "rapidfuzz-3.0.0-cp38-cp38-win32.whl", hash = "sha256:bc593306faa6c73e50cb31b81efbb580957272b14c5cf6bcf0233adf8a7e118d"}, - {file = "rapidfuzz-3.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:0f7041c550b69d35675e04dc3f0690d0c26499039e942a0b1604c6547951e6fc"}, - {file = "rapidfuzz-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:351df02889ac3da9f3f7b10e6812740927cfab9def453079da94f83697b03f2f"}, - {file = "rapidfuzz-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:35506d04429440333224c3711dfdb4195d34eff733cb48648d0c89a9b99faf14"}, - {file = "rapidfuzz-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d24054843f4cfbb86df608ec1209e6a29b0d2635230577a94e38a9cfa3880d18"}, - {file = "rapidfuzz-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a94fe0a42da816e4a6279ac4c23e4ba6de86a529b61b08d5e8e2633b29c781b"}, - {file = "rapidfuzz-3.0.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41e98b3cebfa3e720186eeab37e6c0565895edf848fd958c34ab94c39e743311"}, - {file = "rapidfuzz-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea5e25378591a698ae5076c582a0135db2cb43270fb2866737ab4cb6fcc34474"}, - {file = "rapidfuzz-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6bf090b9b4ec4df5f0899bbc4055b8b173b33169186d4de1dd3d9c609bd330a2"}, - {file = "rapidfuzz-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f241ca0bcbfcbf90bb48bb1c8dbc1fddc205bee5520f898b994adda3d3f150a"}, - {file = "rapidfuzz-3.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f80986d3c8d55b848d679084231a35273320f658e64f0d86d725bb360e6cd2c4"}, - {file = "rapidfuzz-3.0.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:62c760748b1253e08ab5138855e8f8d2c25a7cb5a0bfad74bb66db63c27d8a50"}, - {file = "rapidfuzz-3.0.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8b5d78052e840191b9c7556eb3bd4fe52435e58bd979c75298b65262368dd1fa"}, - {file = "rapidfuzz-3.0.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:fc764665ba19b923696eae6912a2f0fc52bdd7db6c53be178d1dd70eb72f2f68"}, - {file = "rapidfuzz-3.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:62aac81ef17bab9f664828b9087d0afe5a94ed48396b0456a2503b68e3d567f2"}, - {file = "rapidfuzz-3.0.0-cp39-cp39-win32.whl", hash = "sha256:aeb855b62bc351884a672b8f87875c552492d9199c78f33cc8650c283fd7504d"}, - {file = "rapidfuzz-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:a0e0d8798b7048c9db4e139bafb21792013fb043df07bfaf0d3dc9e1df2be5e6"}, - {file = "rapidfuzz-3.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:ebf96d236a52058c010f354256e8de4274621a7f8b5a15dffa54d9b6a1c7e6e8"}, - {file = "rapidfuzz-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fbe4b8305cb427b49d70c182a01c91fd85112e0573193a1f9e4fbcec35ea3eff"}, - {file = "rapidfuzz-3.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db57085c9dbd0b1005d6ad905c610920c49d0752f522d2f34477b13cba24e1d1"}, - {file = "rapidfuzz-3.0.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e334225a97824d9f75f5cf8e949e129bc183f0762f4c9b7a127d1809461bdc55"}, - {file = "rapidfuzz-3.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0c22a36b611a2d53fada2cb03b276135d08c2703039078ce985d7cc42734fd7"}, - {file = "rapidfuzz-3.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:05130d9d33c4770116037de9f131e488825165105588cc7143f77733c5b25a6f"}, - {file = "rapidfuzz-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9c263840bda0f532714ecd66f1f82ed3d3460f45e79e8a907f4df8eaafd93d31"}, - {file = "rapidfuzz-3.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dbaa605c0f81208efbf166afb23f73b0f3847a1a966bec828f4167f61d0ca4b"}, - {file = "rapidfuzz-3.0.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ba129c3c8202e8bef0d9964b8798913905ad1dc6293e94d7a02d87cdbef2544"}, - {file = "rapidfuzz-3.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e85b4f4aeb994c841478e98a9e05bcb7ed8ead084d93bd2ca0683dc5e93b1c36"}, - {file = "rapidfuzz-3.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:284f216f0500cd977830f107da5c3f96e91356dc7993512efc414dbd55679d51"}, - {file = "rapidfuzz-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:494b613a3e730e08df1c7c14e45c303a0f5c8a701162bfc8ac9079585837de43"}, - {file = "rapidfuzz-3.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a5670d5475777450fbc70ed8de8d4e3f7c69230a8b539f45bda358a6f9699f2"}, - {file = "rapidfuzz-3.0.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14e9924108a26f2f58aa8cb90f1a106398fa43e359fa5a96b0f328c7bb7f76da"}, - {file = "rapidfuzz-3.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:832d953b5f1462eba5a0830ea7df11b784f090ba5409fc92bccb856d2539b618"}, - {file = "rapidfuzz-3.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5fdcc1ce830bf46fbc098c8b6eb3201a8299476153bae7a5d5e86576f7228d0a"}, - {file = "rapidfuzz-3.0.0.tar.gz", hash = "sha256:4c1d895d16f62e9ac88d303eb918d90a390bd712055c849e01c558b7ae0fa908"}, -] - -[package.extras] -full = ["numpy"] - [[package]] name = "rarfile" version = "4.0" @@ -3730,7 +3495,7 @@ files = [ name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4078,4 +3843,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "cd2101701e46504bc70378439939d22661d681b1a83933c0dfb5b4824b1e8fd1" +content-hash = "baef9a144e1f37fe2ae40a08acec12f0878a99571d6eaa60684118dbf0e9c03e" diff --git a/pyproject.toml b/pyproject.toml index 65a8f5a47..f5b129919 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -105,9 +105,7 @@ xlrd = "^2.0.1" typer = "^0.7.0" cookiecutter = "^2.1.1" python-string-utils = "^1.0.0" - -[tool.poetry.dev-dependencies] -pytest_cov = "^3.0.0" +pytest-cov = "^4.0.0" [tool.poetry.group.dev.dependencies] pytest = "^7.2.2" From 19d276fd5076ef73f5f61b1cbfcf6193f50167ae Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 26 Apr 2023 03:13:15 -0300 Subject: [PATCH 078/265] Increasing coverage and cleanup of guess header --- br_denatran_frota/code/utils.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/br_denatran_frota/code/utils.py b/br_denatran_frota/code/utils.py index b6fcf2cf7..9c961c375 100644 --- a/br_denatran_frota/code/utils.py +++ b/br_denatran_frota/code/utils.py @@ -21,17 +21,19 @@ def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int: """Function to deal with problematic dataframes coming from Excel/CSV files. Tries to guess which row is the header by examining the first few rows (max given by max_header_guess). Assumes that the header is the first row where all of the columns are strings. - This will NOT work for a strings only dataframe. + This will NOT properly work for a strings only dataframe and will always guess the first row for it. Args: df (pd.DataFrame): Dataframe whose header we don't know. - max_header_guess (int, optional): Number of initial rows we want to check . Defaults to 4. + max_header_guess (int, optional): Number of initial rows we want to check. Defaults to 4. Returns: int: Index of the row where the header is contained. """ header_guess = 0 while header_guess < max_header_guess: + if len(df) - 1 < header_guess: + break # Iffy logic, but essentially: if all rows of the column are strings, then this is a good candidate for a header. if all(df.iloc[header_guess].apply(lambda x: isinstance(x, str))): return header_guess @@ -50,7 +52,6 @@ def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame: Returns: pd.DataFrame: Returns the same dataframe but with the corrected header """ - print(2) new_header = df.iloc[header_row] new_df = df[(header_row + 1) :].reset_index(drop=True) new_df.rename(columns=new_header, inplace=True) From 9faed06c05a7e8448fc80e8aba26b09acd34aa65 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 26 Apr 2023 03:13:26 -0300 Subject: [PATCH 079/265] Reduce exposure --- br_denatran_frota/code/test/download_frota_integration_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/br_denatran_frota/code/test/download_frota_integration_test.py b/br_denatran_frota/code/test/download_frota_integration_test.py index d110cef91..68fc426cf 100644 --- a/br_denatran_frota/code/test/download_frota_integration_test.py +++ b/br_denatran_frota/code/test/download_frota_integration_test.py @@ -31,7 +31,7 @@ def tearDown(self): @unittest.skip("take it easy") @parameterized.expand( - [(month, year) for year in range(2021, 2023) for month in range(1, 12)], + [(month, year) for year in range(2021, 2022) for month in range(1, 3)], name_func=custom_name_func, ) def test_download_post_2012(self, month, year): From 514f156f669f3d3c2d40c6b30223ef6c711d7f78 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 26 Apr 2023 03:37:40 -0300 Subject: [PATCH 080/265] More testing --- .../code/test/download_frota_unit_test.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/br_denatran_frota/code/test/download_frota_unit_test.py b/br_denatran_frota/code/test/download_frota_unit_test.py index 0ddfba6c2..a43275729 100644 --- a/br_denatran_frota/code/test/download_frota_unit_test.py +++ b/br_denatran_frota/code/test/download_frota_unit_test.py @@ -13,7 +13,7 @@ ) from br_denatran_frota.code.constants import DATASET from br_denatran_frota.code.download_frota import download_frota -from br_denatran_frota.code.utils import guess_header +from br_denatran_frota.code.utils import guess_header, get_year_month_from_filename dir_list = glob.glob(f"**/{DATASET}", recursive=True) if dir_list: @@ -118,5 +118,21 @@ def test_all_columns_are_strings_not_in_header_row(self): ) # Header is assumed to be in the first row +class TestFilenameExtraction(unittest.TestCase): + def test_correct_file(self): + filename = "indicator_2-2022.xlsx" + self.assertEqual(get_year_month_from_filename(filename), ("2", "2022")) + + def test_not_excel_file(self): + filename = "indicator_2-2022" + with self.assertRaises(ValueError): + get_year_month_from_filename(filename) + + def test_excel_but_incorrect_format(self): + filename = "random_2_20.xlsx" + with self.assertRaises(ValueError): + get_year_month_from_filename(filename) + + if __name__ == "__main__": unittest.main() From 02cd15a08c54552178dcb7f5cd76e0943890bca8 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 26 Apr 2023 03:37:52 -0300 Subject: [PATCH 081/265] Erroring when appropriate for municipio_tipo --- .../code/frota_municipio_tipo.py | 56 +++++++++++-------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/br_denatran_frota/code/frota_municipio_tipo.py b/br_denatran_frota/code/frota_municipio_tipo.py index 2db886fcf..a400a88af 100644 --- a/br_denatran_frota/code/frota_municipio_tipo.py +++ b/br_denatran_frota/code/frota_municipio_tipo.py @@ -9,6 +9,7 @@ guess_header, get_city_name_ibge, match_ibge, + verify_total, ) from br_denatran_frota.code.constants import DICT_UFS, SUBSTITUTIONS @@ -16,12 +17,39 @@ import basedosdados as bd + +def verify_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str): + denatran_uf = denatran_df.filter(pl.col("sigla_uf") == uf) + ibge_uf = ibge_df.filter(pl.col("sigla_uf") == uf) + ibge_uf = ibge_uf.with_columns(pl.col("nome").apply(asciify).str.to_lowercase()) + municipios_na_bd = ibge_uf["nome"].to_list() + x = denatran_uf["nome_denatran"].apply(lambda x: get_city_name_ibge(x, ibge_uf)) + denatran_uf = denatran_uf.with_columns(x.alias("suggested_nome_ibge")) + denatran_uf = denatran_uf.with_columns( + denatran_uf.apply(fix_suggested_nome_ibge)["apply"].alias("suggested_nome_ibge") + ) + municipios_no_denatran = denatran_uf["suggested_nome_ibge"].to_list() + d = set(municipios_no_denatran) - set(municipios_na_bd) + municipios_duplicados = ( + denatran_uf.groupby("suggested_nome_ibge").count().filter(pl.col("count") > 1) + ) + if not municipios_duplicados.is_empty(): + raise ValueError( + f"Existem municípios com mesmo nome do IBGE em {uf}! São eles {municipios_duplicados['suggested_nome_ibge'].to_list()}" + ) + if d: + # This here is probably impossible and shouldn't happen due to the matching coming from the BD data. + # The set difference might occur the other way around, but still, better safe. + raise ValueError(f"Existem municípios em {uf} que não estão na BD.") + match_ibge(denatran_uf, ibge_uf) + + municipios_query = """SELECT nome, id_municipio, sigla_uf FROM `basedosdados.br_bd_diretorios_brasil.municipio` """ bd_municipios = bd.read_sql(municipios_query, "tamir-pipelines") bd_municipios = pl.from_pandas(bd_municipios) -file = "br_denatran_frota/files/2022/frota_por_município_e_tipo_2-2022.xls" +file = "br_denatran_frota/files/2022/frota_por_município_e_tipo_2-2022.xls" # Hardcode problem filename = os.path.split(file)[1] df = pd.read_excel(file) new_df = change_df_header(df, guess_header(df)) @@ -33,29 +61,11 @@ new_df = pl.from_pandas(new_df) new_df = new_df.with_columns(pl.col("nome_denatran").apply(asciify).str.to_lowercase()) new_df = new_df.filter(pl.col("nome_denatran") != "municipio nao informado") -if new_df.shape[0] != bd_municipios.shape[0]: - raise ValueError("Uh oh") - - -def verify_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str): - denatran_uf = denatran_df.filter(pl.col("sigla_uf") == uf) - ibge_uf = ibge_df.filter(pl.col("sigla_uf") == uf) - ibge_uf = ibge_uf.with_columns(pl.col("nome").apply(asciify).str.to_lowercase()) - municipios_na_bd = ibge_uf["nome"].to_list() - x = denatran_uf["nome_denatran"].apply(lambda x: get_city_name_ibge(x, ibge_uf)) - denatran_uf = denatran_uf.with_columns(x.alias("suggested_nome_ibge")) - denatran_uf = denatran_uf.with_columns( - denatran_uf.apply(fix_suggested_nome_ibge)["apply"].alias("suggested_nome_ibge") +if new_df.shape[0] > bd_municipios.shape[0]: + raise ValueError( + f"Atenção: a base do Denatran tem {new_df.shape[0]} linhas e isso é mais municípios do que a BD com {bd_municipios.shape[0]}" ) - municipios_no_denatran = denatran_uf["suggested_nome_ibge"].to_list() - d = set(municipios_na_bd) - set(municipios_no_denatran) - z = denatran_uf.groupby("suggested_nome_ibge").count().filter(pl.col("count") > 1) - if not z.is_empty(): - print(z["suggested_nome_ibge"].to_list(), uf) - if d: - print(d, uf) - match_ibge(denatran_uf, ibge_uf) - +verify_total(new_df) for uf in DICT_UFS: verify_uf(new_df, bd_municipios, uf) From 5fb737fe0e94e4ea98886db0b9ee9a9ee80c6f40 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 26 Apr 2023 03:39:27 -0300 Subject: [PATCH 082/265] This is useless --- br_denatran_frota/code/test/download_frota_integration_test.py | 1 - 1 file changed, 1 deletion(-) diff --git a/br_denatran_frota/code/test/download_frota_integration_test.py b/br_denatran_frota/code/test/download_frota_integration_test.py index 68fc426cf..649035b43 100644 --- a/br_denatran_frota/code/test/download_frota_integration_test.py +++ b/br_denatran_frota/code/test/download_frota_integration_test.py @@ -29,7 +29,6 @@ def tearDown(self): print("Deleting temporary directory") shutil.rmtree(self.temp_dir.name) - @unittest.skip("take it easy") @parameterized.expand( [(month, year) for year in range(2021, 2022) for month in range(1, 3)], name_func=custom_name_func, From 4d2f644662a65dc9ff6a6a4aa103aef715f1c257 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 26 Apr 2023 04:30:05 -0300 Subject: [PATCH 083/265] Directories are again working!!!! --- br_denatran_frota/code/download_frota.py | 8 ++++---- .../code/test/download_frota_integration_test.py | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py index 4c6bb56da..ff4b771f3 100644 --- a/br_denatran_frota/code/download_frota.py +++ b/br_denatran_frota/code/download_frota.py @@ -23,14 +23,14 @@ def download_frota(month: int, year: int, temp_dir: str = ""): dir_list = glob.glob(f"**/{DATASET}", recursive=True) # Get the directory where this Python file is located initial_dir = os.path.dirname(os.path.abspath(__file__)) - + if temp_dir: + os.chdir(temp_dir) # Construct the path to the "files" directory relative to this directory - files_dir = os.path.join(initial_dir, "..", "files") + files_dir = os.path.join(os.getcwd(), "files") if dir_list: # I always want to be in the actual folder for this dataset, because I might start in the pipelines full repo: os.chdir(dir_list[0]) - if temp_dir: - os.chdir(temp_dir) + # I always need a files directory inside my dataset folder. make_dir_when_not_exists(files_dir) # I should always switch to the files dir now and save stuff inside it. diff --git a/br_denatran_frota/code/test/download_frota_integration_test.py b/br_denatran_frota/code/test/download_frota_integration_test.py index 649035b43..844cd2cc0 100644 --- a/br_denatran_frota/code/test/download_frota_integration_test.py +++ b/br_denatran_frota/code/test/download_frota_integration_test.py @@ -4,6 +4,7 @@ import tempfile import unittest import glob +import contextlib from parameterized import parameterized from br_denatran_frota.code.download_frota import ( DATASET, @@ -23,7 +24,8 @@ class TestAllPossibleYears(unittest.TestCase): def setUp(self): file_dir = os.path.dirname(os.path.abspath(__file__)) os.chdir(file_dir) - self.temp_dir = tempfile.TemporaryDirectory(dir=file_dir) + dataset_dir = os.path.join(file_dir, "..", "..") + self.temp_dir = tempfile.TemporaryDirectory(dir=dataset_dir) def tearDown(self): print("Deleting temporary directory") @@ -39,9 +41,7 @@ def test_download_post_2012(self, month, year): f"frota_por_uf_e_tipo_de_veículo_{month}-{year}", f"frota_por_município_e_tipo_{month}-{year}", } - list_of_files = os.listdir( - os.path.join(DATASET, self.temp_dir.name, "files", f"{year}") - ) + list_of_files = os.listdir(os.path.join(self.temp_dir.name, "files", f"{year}")) files = set(os.path.splitext(file)[0] for file in list_of_files) self.assertEqual(files, expected_files) From 5896ac96d04137f60db232997a50c21e60c84563 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sat, 29 Apr 2023 02:37:08 -0300 Subject: [PATCH 084/265] All constants --- .../datasets/br_denatran_frota/constants.py | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index 0e14e5a3e..5491b46cb 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -39,6 +39,29 @@ class constants(Enum): # pylint: disable=c0103 Constant values for the br_denatran_frota project """ + # -*- coding: utf-8 -*- + + MONTHS = { + "janeiro": 1, + "fevereiro": 2, + "marco": 3, + "abril": 4, + "maio": 5, + "junho": 6, + "julho": 7, + "agosto": 8, + "setembro": 9, + "outubro": 10, + "novembro": 11, + "dezembro": 12, + } + + DATASET = "br_denatran_frota" + + HEADERS = { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36" + } + DICT_UFS = { "AC": "Acre", "AL": "Alagoas", @@ -70,25 +93,9 @@ class constants(Enum): # pylint: disable=c0103 } SUBSTITUTIONS = { - ("RN", "ASSU"): "açu", - } - - MONTHS = { - "janeiro": 1, - "fevereiro": 2, - "marco": 3, - "abril": 4, - "maio": 5, - "junho": 6, - "julho": 7, - "agosto": 8, - "setembro": 9, - "outubro": 10, - "novembro": 11, - "dezembro": 12, - } - - DATASET = "br_denatran_frota" - HEADERS = { - "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36" + ("RN", "assu"): "acu", + ("PB", "sao domingos de pombal"): "sao domingos", + ("PB", "santarem"): "joca claudino", + ("SP", "embu"): "embu das artes", + ("TO", "sao valerio da natividade"): "sao valerio", } From a42845c78f4a8494827acaa4390fb20d68468edb Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 29 Apr 2023 05:51:16 +0000 Subject: [PATCH 085/265] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- br_denatran_frota/README.md | 2 +- br_denatran_frota/code/download_frota.R | 14 +-- br_denatran_frota/code/download_frota_old.R | 38 +++--- br_denatran_frota/code/frota_municipio_tipo.R | 10 +- br_denatran_frota/code/frota_uf_tipo.R | 6 +- br_denatran_frota/code/setup.py | 11 +- br_denatran_frota/code/utils.R | 54 ++++----- br_denatran_frota/dataset_config.yaml | 6 +- br_denatran_frota/municipio_tipo/publish.sql | 2 +- .../municipio_tipo/table_config.yaml | 108 +++++++++--------- br_denatran_frota/uf_tipo/publish.sql | 2 +- br_denatran_frota/uf_tipo/table_config.yaml | 108 +++++++++--------- pipelines/datasets/__init__.py | 1 - pipelines/datasets/delete_flows/tasks.py | 2 +- 14 files changed, 182 insertions(+), 182 deletions(-) diff --git a/br_denatran_frota/README.md b/br_denatran_frota/README.md index feaeb233b..d8415e1fd 100644 --- a/br_denatran_frota/README.md +++ b/br_denatran_frota/README.md @@ -14,7 +14,7 @@ Dependências: - [unrar](https://www.rarlab.com/rar_add.htm) para extrair os arquivos `.rar` via cli. -Ubuntu e Debian: +Ubuntu e Debian: ```sh sudo apt-get install unrar ``` \ No newline at end of file diff --git a/br_denatran_frota/code/download_frota.R b/br_denatran_frota/code/download_frota.R index b9ce2930c..e797298ae 100644 --- a/br_denatran_frota/code/download_frota.R +++ b/br_denatran_frota/code/download_frota.R @@ -8,7 +8,7 @@ library(dplyr) library(purrr) download_frota <- function(key = NULL, prefix = NULL, month, year, tempdir = tempdir(), dir = getwd()) { - + months <- c( "janeiro" = 1, "fevereiro" = 2, @@ -40,8 +40,8 @@ download_frota <- function(key = NULL, prefix = NULL, month, year, tempdir = tem } make_filename <- function(i, ext = TRUE) { - stringi::stri_trans_general(i$txt, id = "Latin-ASCII; lower") %>% - stringr::str_replace_all("\\s+", "_") %>% + stringi::stri_trans_general(i$txt, id = "Latin-ASCII; lower") %>% + stringr::str_replace_all("\\s+", "_") %>% paste0(., "_", i$mes, "-", i$ano, ifelse(ext, paste0(".", i$filetype), as.character(""))) } @@ -54,7 +54,7 @@ download_frota <- function(key = NULL, prefix = NULL, month, year, tempdir = tem ) } } - + handle_compact <- function(i) { path_file_zip <- paste0(tempdir, "/", make_filename(i)) dir_file <- paste0(tempdir, "/", make_filename(i, ext = F)) @@ -70,7 +70,7 @@ download_frota <- function(key = NULL, prefix = NULL, month, year, tempdir = tem } else { archive::archive_extract(path_file_zip, dir = dir_file) } - + # Remove rar, zip files. Keep only xls or xlsx list.files(dir_file, full.names = T, pattern = "rar|zip") %>% purrr::walk(~file.remove(.x)) @@ -115,8 +115,8 @@ download_frota <- function(key = NULL, prefix = NULL, month, year, tempdir = tem dplyr::filter( stringr::str_detect(txt, regex(key, ignore_case = TRUE)), mes %in% month - ) %>% - purrr::transpose() %>% + ) %>% + purrr::transpose() %>% purrr::walk(~download_file(.x)) } diff --git a/br_denatran_frota/code/download_frota_old.R b/br_denatran_frota/code/download_frota_old.R index 61d645616..fa3b4b45f 100644 --- a/br_denatran_frota/code/download_frota_old.R +++ b/br_denatran_frota/code/download_frota_old.R @@ -3,17 +3,17 @@ library(stringr) library(stringi) download_frota_old <- function(key = NULL, prefix = NULL, year, tempdir = tempdir(), dir = getwd()) { - + if (year > 2012) { stop("Utilize download_frota()") } mi_url <- paste0( - "https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-denatran/estatisticas/renavam/", - year, + "https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-denatran/estatisticas/renavam/", + year, "/frota", - ifelse(year > 2008, "_", ""), - year, + ifelse(year > 2008, "_", ""), + year, ".zip" ) @@ -37,13 +37,13 @@ download_frota_old <- function(key = NULL, prefix = NULL, year, tempdir = tempdi ) utils::unzip( - path_file, + path_file, exdir = paste0(tempdir, "/", "frota__", year) ) } - + months <- c( - "jan" = 1, + "jan" = 1, "fev" = 2, "mar" = 3, "abr" = 4, @@ -53,18 +53,18 @@ download_frota_old <- function(key = NULL, prefix = NULL, year, tempdir = tempdi "ago" = 8, "set" = 9, "out" = 10, - "nov" = 11, + "nov" = 11, "dez" = 12 ) - list.files(path = dir_temp, full.names = T, recursive = T) %>% + list.files(path = dir_temp, full.names = T, recursive = T) %>% purrr::walk(function(i) { if (stringr::str_ends(i, ".zip")) { utils::unzip(i, exdir = paste0(dirname(i), "/")) } }) - list.files(path = dir_temp, full.names = T, recursive = T) %>% + list.files(path = dir_temp, full.names = T, recursive = T) %>% purrr::walk(function(i) { get_by <- list( @@ -72,22 +72,22 @@ download_frota_old <- function(key = NULL, prefix = NULL, year, tempdir = tempdi municipio = "(frota munic)|(frota mun)" ) - new_name <- basename(i) %>% - stringi::stri_trans_general(id = "Latin-ASCII; lower") %>% - stringr::str_replace("regi�es", "regiao") %>% - stringr::str_replace_all("\\s+", "_") %>% - stringr::str_replace_all("_|-", " ") %>% - stringr::str_replace("^(\\d\\_|\\d)+", "") %>% + new_name <- basename(i) %>% + stringi::stri_trans_general(id = "Latin-ASCII; lower") %>% + stringr::str_replace("regi�es", "regiao") %>% + stringr::str_replace_all("\\s+", "_") %>% + stringr::str_replace_all("_|-", " ") %>% + stringr::str_replace("^(\\d\\_|\\d)+", "") %>% stringr::str_replace_all("internet|^\\s", "") # Match jan|fev|... or number of month (two digits) get_month <- stringr::str_match( - new_name, + new_name, regex(paste0(stringr::str_c(names(months), collapse = "|"), "|\\d{2}(?=\\d{4})"), ignore_case = T) ) month_i <- ifelse( - stringr::str_count(get_month) == 2, + stringr::str_count(get_month) == 2, as.numeric(get_month), months[get_month] ) diff --git a/br_denatran_frota/code/frota_municipio_tipo.R b/br_denatran_frota/code/frota_municipio_tipo.R index 4f935e17b..837c9a22e 100644 --- a/br_denatran_frota/code/frota_municipio_tipo.R +++ b/br_denatran_frota/code/frota_municipio_tipo.R @@ -31,7 +31,7 @@ PREFIX_FROTA_MUN <- "frota_mun_tipo" 2014:2020 %>% purrr::walk( ~download_frota( - key = "Frota por Munic", + key = "Frota por Munic", prefix = PREFIX_FROTA_MUN, month = 1:12, year = .x, @@ -42,7 +42,7 @@ PREFIX_FROTA_MUN <- "frota_mun_tipo" 2021 %>% purrr::walk( ~download_frota( - key = "Frota por Munic", + key = "Frota por Munic", prefix = PREFIX_FROTA_MUN, month = 1:3, year = .x, @@ -125,13 +125,13 @@ df_municipios %>% ) -> frota_municipios_dist -frota_municipios_dist %>% +frota_municipios_dist %>% filter(is.na(id_municipio)) %>% group_by(municipio_original, sigla_uf) %>% summarise() -frota_municipios_dist %>% +frota_municipios_dist %>% dplyr::filter(!is.na(id_municipio)) %>% - dplyr::select(!municipio_original) %>% + dplyr::select(!municipio_original) %>% readr::write_rds(file = "output/municipio_tipo.rds") %T>% readr::write_csv(file = "output/municipio_tipo.csv") \ No newline at end of file diff --git a/br_denatran_frota/code/frota_uf_tipo.R b/br_denatran_frota/code/frota_uf_tipo.R index b92aede98..d46624c48 100644 --- a/br_denatran_frota/code/frota_uf_tipo.R +++ b/br_denatran_frota/code/frota_uf_tipo.R @@ -32,7 +32,7 @@ PREFIX_FROTA_REG <- "frota_regiao_tipo" # Download da frota por regiao e tipo em 2013 ## Demais meses de agosto a key é "Frota por Tipo" -2013 %>% +2013 %>% purrr::walk(~download_frota( key = "Frota por tipo", prefix = PREFIX_FROTA_REG, @@ -91,7 +91,7 @@ list.files(PATH_DOWNLOAD_REG, full.names = T) %>% # Cada tibble deve ter 25 colunas e 27 linhas frota_regiao %>% purrr::map_lgl(~ncol(.x) == 25 & nrow(.x) == 27) %>% all(T) -frota_regiao %>% - purrr::map_dfr(~tidyr::unnest(.)) %>% +frota_regiao %>% + purrr::map_dfr(~tidyr::unnest(.)) %>% readr::write_csv(file = "output/uf_tipo.csv") %T>% readr::write_rds(file = "output/uf_tipo.rds") \ No newline at end of file diff --git a/br_denatran_frota/code/setup.py b/br_denatran_frota/code/setup.py index 4a1e6d3ad..6cd60597a 100644 --- a/br_denatran_frota/code/setup.py +++ b/br_denatran_frota/code/setup.py @@ -1,11 +1,12 @@ +# -*- coding: utf-8 -*- from setuptools import setup setup( - name='download_frota', - version='1.0', - py_modules=['download_frota'], + name="download_frota", + version="1.0", + py_modules=["download_frota"], install_requires=[ - 'beautifulsoup4', - 'rarfile', + "beautifulsoup4", + "rarfile", ], ) diff --git a/br_denatran_frota/code/utils.R b/br_denatran_frota/code/utils.R index 93e136d0d..e26c381ec 100644 --- a/br_denatran_frota/code/utils.R +++ b/br_denatran_frota/code/utils.R @@ -6,7 +6,7 @@ find_sheet <- function(x, date) { } ) - sheet_names <- read_sheet %>% + sheet_names <- read_sheet %>% stringr::str_subset(., "^(?!.*Glossário).*$") if (length(sheet_names) == 1) { @@ -15,8 +15,8 @@ find_sheet <- function(x, date) { month_name <- lubridate::month(date, label = T) query_sheet <- stringr::str_subset( - sheet_names, - regex(paste0("\\d{2}(?=\\d{4}$)", "|", month_name), ignore_case = T) + sheet_names, + regex(paste0("\\d{2}(?=\\d{4}$)", "|", month_name), ignore_case = T) ) if (length(query_sheet) == 0) { @@ -44,7 +44,7 @@ row_of_header <- function(x, key_of_header) { if (length(result) == 0) { return(0) } - + if (length(result) > 1) { result[2] } else { @@ -68,8 +68,8 @@ read_old_xls <- function(x, date) { while (start_row <= 5) { result <- try( xlsx::read.xlsx2( - x, - sheetName = sheet_name, + x, + sheetName = sheet_name, startRow = start_row, endRow = 10 ), @@ -81,15 +81,15 @@ read_old_xls <- function(x, date) { } start_row <- start_row + 1 } - xlsx::read.xlsx2(x, sheetName = sheet_name, startRow = start_row) %>% + xlsx::read.xlsx2(x, sheetName = sheet_name, startRow = start_row) %>% tibble::as_tibble() } read_xl <- function(x, type) { - date <- stringr::str_match(x, "\\d{1,2}-\\d{4}") %>% - paste0("01-", .) %>% + date <- stringr::str_match(x, "\\d{1,2}-\\d{4}") %>% + paste0("01-", .) %>% lubridate::dmy() - + read <- function(pl) { tryCatch( readxl::read_excel(pl, sheet = find_sheet(pl, date)), @@ -97,11 +97,11 @@ read_xl <- function(x, type) { ) } - read(x) %>% - set_header(., key_of_header = type) %>% - janitor::clean_names() %>% - dplyr::rename_with(.fn = function(x) stringr::str_replace(x, pattern = "_|\\.|-", replacement = "")) %>% - dplyr::select(!starts_with("na")) %>% + read(x) %>% + set_header(., key_of_header = type) %>% + janitor::clean_names() %>% + dplyr::rename_with(.fn = function(x) stringr::str_replace(x, pattern = "_|\\.|-", replacement = "")) %>% + dplyr::select(!starts_with("na")) %>% dplyr::mutate( ano = lubridate::year(date), mes = lubridate::month(date) @@ -120,30 +120,30 @@ download_utils_files <- function() { download_utils_files() -ibge_ids <- readxl::read_excel("input/ibge_cods/RELATORIO_DTB_BRASIL_DISTRITO.xls") %>% +ibge_ids <- readxl::read_excel("input/ibge_cods/RELATORIO_DTB_BRASIL_DISTRITO.xls") %>% janitor::clean_names() -ufs <- ibge_ids %>% - dplyr::group_by(nome_uf, uf) %>% - dplyr::summarise() %>% - dplyr::ungroup() %>% - dplyr::mutate(uf = as.numeric(uf)) %>% +ufs <- ibge_ids %>% + dplyr::group_by(nome_uf, uf) %>% + dplyr::summarise() %>% + dplyr::ungroup() %>% + dplyr::mutate(uf = as.numeric(uf)) %>% dplyr::rename(id_uf = uf) -municipios <- ibge_ids %>% +municipios <- ibge_ids %>% dplyr::group_by( uf, nome_uf, - codigo_municipio_completo, + codigo_municipio_completo, nome_municipio - ) %>% - dplyr::summarise() %>% + ) %>% + dplyr::summarise() %>% dplyr::mutate( name_upper = stringi::stri_trans_general(nome_municipio, id = "Latin-ASCII; upper"), codigo_municipio_completo = as.numeric(codigo_municipio_completo), uf = as.numeric(uf) - ) %>% - dplyr::ungroup() %>% + ) %>% + dplyr::ungroup() %>% dplyr::rename( id_uf = uf, uf = nome_uf, diff --git a/br_denatran_frota/dataset_config.yaml b/br_denatran_frota/dataset_config.yaml index d8db54254..9a43e3b43 100644 --- a/br_denatran_frota/dataset_config.yaml +++ b/br_denatran_frota/dataset_config.yaml @@ -17,7 +17,7 @@ organization: Departamento Nacional de Trânsito # REQUIRED # Qual departamento/grupo/pessoa mantém os dados originais? author: name: Departamento Nacional de Trânsito - email: + email: # Onde encontrar os dados originais e mais informações? website: @@ -35,7 +35,7 @@ groups: # - sem acentos # - não repita nomes de grupos (ex. educacao, saude, meio ambiente, economia, etc.) tags: - - veiculo + - veiculo - trafego # Em quais línguas a base (ou a fonte original) está disponível? @@ -65,5 +65,5 @@ brazilian_IP: não # Essa base está sob qual licença? # A licença MIT se aplica a bases públicas. # Caso não seja pública, ver opções aqui: https://help.data.world/hc/en-us/articles/115006114287-Common-license-types-for-datasets -license: +license: name: MIT # REQUIRED diff --git a/br_denatran_frota/municipio_tipo/publish.sql b/br_denatran_frota/municipio_tipo/publish.sql index f4e74c045..4b7acaffd 100644 --- a/br_denatran_frota/municipio_tipo/publish.sql +++ b/br_denatran_frota/municipio_tipo/publish.sql @@ -20,7 +20,7 @@ TIPOS: */ CREATE VIEW basedosdados-312117.br_denatran_frota.municipio_tipo AS -SELECT +SELECT SAFE_CAST(sigla_uf AS STRING) sigla_uf, SAFE_CAST(id_municipio AS STRING) id_municipio, SAFE_CAST(ano AS INT64) ano, diff --git a/br_denatran_frota/municipio_tipo/table_config.yaml b/br_denatran_frota/municipio_tipo/table_config.yaml index 2ab4752e2..28af5cb70 100644 --- a/br_denatran_frota/municipio_tipo/table_config.yaml +++ b/br_denatran_frota/municipio_tipo/table_config.yaml @@ -35,12 +35,12 @@ treated_by: email: pdesacastro@gmail.com # Se houve passos de tratamento, limpeza e manipulação de dados, descreva-os aqui. -treatment_description: | +treatment_description: | Padronização das colunas. Nova coluna, id_municipio. Remoção das linhas "MUNICIPIO NAO INFORMADO". # Com qual frequência a base é atualizada? # Opções: hora | dia | semana | mes | 1 ano | 2 anos | 5 anos | 10 anos | unico | recorrente -data_update_frequency: mes # REQUIRED +data_update_frequency: mes # REQUIRED # Nível da observação (qual é a granularidade de cada linha na tabela) # Escolha todas as opções necessárias. @@ -110,158 +110,158 @@ partitions: # REQUIRED # Para esses, defina is_in_staging como False. # Além disso, você deve adicionar as colunas de partição aqui e definir is_partition como True. columns: # REQUIRED - - - + + - name: sigla_uf description: Sigla da Unidade da Federação original da base is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: id_municipio description: ID Município - IBGE 7 Dígitos is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: ano description: Ano is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: mes description: Mês is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: automovel description: Automóvel is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: bonde description: Bonde is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: caminhao description: Caminhão is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: caminhaotrator description: Caminhão Trator is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: caminhonete description: Caminhonete is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: camioneta description: Camioneta is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: chassiplataforma description: Chassi Plataforma is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: ciclomotor description: Ciclo Motor is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: microonibus description: Microônibus is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: motocicleta description: Motocicleta is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: motoneta description: Motoneta is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: onibus description: Ônibus is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: quadriciclo description: Quadriciclo is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: reboque description: Reboque is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: semireboque description: Semi-reboque is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: sidecar description: Side-car is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: outros description: Argumento que não se enquadra em nenhuma definição estabelecida is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: tratoresteira description: Trator esteira is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: tratorrodas description: Trator rodas is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: triciclo description: Triciclo is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: utilitario description: Utilitário is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: total description: Total is_in_staging: True # Bool [True, False], whether the column is in the staging table diff --git a/br_denatran_frota/uf_tipo/publish.sql b/br_denatran_frota/uf_tipo/publish.sql index 016ef11b3..0725b27d8 100644 --- a/br_denatran_frota/uf_tipo/publish.sql +++ b/br_denatran_frota/uf_tipo/publish.sql @@ -20,7 +20,7 @@ TIPOS: */ CREATE VIEW basedosdados-312117.br_denatran_frota.uf_tipo AS -SELECT +SELECT SAFE_CAST(sigla_uf AS STRING) sigla_uf, SAFE_CAST(ano AS INT64) ano, SAFE_CAST(mes AS INT64) mes, diff --git a/br_denatran_frota/uf_tipo/table_config.yaml b/br_denatran_frota/uf_tipo/table_config.yaml index 08424b33c..66cb8f5bc 100644 --- a/br_denatran_frota/uf_tipo/table_config.yaml +++ b/br_denatran_frota/uf_tipo/table_config.yaml @@ -36,12 +36,12 @@ treated_by: email: pdesacastro@gmail.com # Se houve passos de tratamento, limpeza e manipulação de dados, descreva-os aqui. -treatment_description: | +treatment_description: | Padronização dos nomes das colunas. Remoção das linhas do total dos estados. # Com qual frequência a base é atualizada? # Opções: hora | dia | semana | mes | 1 ano | 2 anos | 5 anos | 10 anos | unico | recorrente -data_update_frequency: mes # REQUIRED +data_update_frequency: mes # REQUIRED # Nível da observação (qual é a granularidade de cada linha na tabela) # Escolha todas as opções necessárias. @@ -111,152 +111,152 @@ partitions: # REQUIRED # Para esses, defina is_in_staging como False. # Além disso, você deve adicionar as colunas de partição aqui e definir is_partition como True. columns: # REQUIRED - - - + + - name: sigla_uf description: Sigla da Unidade da Federação is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: ano - description: Ano + description: Ano is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: mes - description: Mês + description: Mês is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: automovel description: Automóvel is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: bonde description: Bonde is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: caminhao description: Caminhão is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: caminhaotrator description: Caminhão Trator is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: caminhonete description: Caminhonete is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: camioneta description: Camioneta is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: chassiplataforma description: Chassi Plataforma is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: ciclomotor description: Ciclo Motor is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: microonibus description: Microônibus is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: motocicleta description: Motocicleta is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: motoneta description: Motoneta is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: onibus description: Ônibus is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: quadriciclo description: Quadriciclo is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: reboque description: Reboque is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: semireboque description: Semi-reboque is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: sidecar description: Side-car is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: outros description: Argumento que não se enquadra em nenhuma definição estabelecida is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: tratoresteira description: Trator esteira is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: tratorrodas description: Trator rodas is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: triciclo description: Triciclo is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: utilitario description: Utilitário is_in_staging: True # Bool [True, False], whether the column is in the staging table is_partition: False # Bool [True, False], whether the column is a partition. - - - + + - name: total description: Total is_in_staging: True # Bool [True, False], whether the column is in the staging table diff --git a/pipelines/datasets/__init__.py b/pipelines/datasets/__init__.py index 6f0a8d204..5f2fbe94b 100644 --- a/pipelines/datasets/__init__.py +++ b/pipelines/datasets/__init__.py @@ -29,4 +29,3 @@ from pipelines.datasets.cross_update.flows import * from pipelines.datasets.br_denatran_frota.flows import * from pipelines.datasets.br_anatel_banda_larga_fixa.flows import * - diff --git a/pipelines/datasets/delete_flows/tasks.py b/pipelines/datasets/delete_flows/tasks.py index bc2f818b5..8aa52ba75 100644 --- a/pipelines/datasets/delete_flows/tasks.py +++ b/pipelines/datasets/delete_flows/tasks.py @@ -85,4 +85,4 @@ def delete_flow_run(flow_run_dict: Dict[str, str], client: Client = None) -> Non log(type(response["data"]["delete_flow_run"])) log(response["data"]) if not success: - pass \ No newline at end of file + pass From 70d7d64c502b8f8b8d6a0b8b4941fd9b47a89c26 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sat, 29 Apr 2023 03:34:44 -0300 Subject: [PATCH 086/265] Add utils function to correct folder --- pipelines/datasets/br_denatran_frota/utils.py | 135 +++++++++++++++++- 1 file changed, 131 insertions(+), 4 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index a620f9eb9..272984bbb 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -38,15 +38,32 @@ from zipfile import ZipFile import requests from pipelines.datasets.br_denatran_frota.constants import constants +from bs4 import BeautifulSoup +from urllib.request import urlopen DICT_UFS = constants.DICT_UFS.value SUBSTITUTIONS = constants.SUBSTITUTIONS.value HEADERS = constants.HEADERS.value +MONTHS = constants.MONTHS.value def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int: + """Function to deal with problematic dataframes coming from Excel/CSV files. + Tries to guess which row is the header by examining the first few rows (max given by max_header_guess). + Assumes that the header is the first row where all of the columns are strings. + This will NOT properly work for a strings only dataframe and will always guess the first row for it. + + Args: + df (pd.DataFrame): Dataframe whose header we don't know. + max_header_guess (int, optional): Number of initial rows we want to check. Defaults to 4. + + Returns: + int: Index of the row where the header is contained. + """ header_guess = 0 while header_guess < max_header_guess: + if len(df) - 1 < header_guess: + break # Iffy logic, but essentially: if all rows of the column are strings, then this is a good candidate for a header. if all(df.iloc[header_guess].apply(lambda x: isinstance(x, str))): return header_guess @@ -56,6 +73,15 @@ def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int: def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame: + """Changes the dataframe's header to a row inside of it and returns the corrected df. + Ideally, to be used in conjunction with guess_header(). + Args: + df (pd.DataFrame): Dataframe whose header we want changed. + header_row (int): Index of the row where the header is located. + + Returns: + pd.DataFrame: Returns the same dataframe but with the corrected header + """ new_header = df.iloc[header_row] new_df = df[(header_row + 1) :].reset_index(drop=True) new_df.rename(columns=new_header, inplace=True) @@ -63,6 +89,17 @@ def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame: def get_year_month_from_filename(filename: str) -> tuple[int, int]: + """Helper to extract month and year information from files named indicator_month-year.xls + + Args: + filename (str): Name of the file. + + Raises: + ValueError: Errors out if nothing is found, which likely means the filename is not the correct format. + + Returns: + tuple[int, int]: Month, year. + """ match = re.search(r"(\w+)_(\d{1,2})-(\d{4})\.(xls|xlsx)$", filename) if match: month = match.group(2) @@ -73,22 +110,47 @@ def get_year_month_from_filename(filename: str) -> tuple[int, int]: def verify_total(df: pl.DataFrame) -> None: + """Helper function that is meant to act as a guard to guarantee that we can pivot from wide to long. + Essentially, gets a Wide dataframe, excludes all string columns and the TOTAL column and sums it all row wise. + Then verifies if the calculated total column is the same as the TOTAL column. + If not, raises an error. + + Args: + df (pl.DataFrame): Wide format dataframe to verify. + + Raises: + ValueError: Errors out if the sum of the columns is actually different than the total. + """ columns_for_total = df.select(pl.exclude("TOTAL")).select(pl.exclude([pl.Utf8])) calculated_total = columns_for_total.select( pl.fold( acc=pl.lit(0), function=lambda acc, x: acc + x, exprs=pl.col("*") ).alias("calculated_total") )["calculated_total"] - mask = df["TOTAL"] == calculated_total if pl.sum(~mask) != 0: raise ValueError( - "A coluna de TOTAL da base original tem inconsistências e não soma tudo das demais colunas." + "A coluna de TOTAL da base original tem inconsistências e não é igual à soma das demais colunas." ) -def fix_suggested_nome_ibge(row) -> str: +def fix_suggested_nome_ibge(row: tuple[str, ...]) -> str: + """Gets a row from a dataframe and applies the SUBSTITUTIONS constant ruleset where applicable. + This fixes the dataframe to have the names of municipalities according to IBGE. + The fixes are necessary because match_ibge() will fail where the DENATRAN data has typos in city names. + + Args: + row (tuple[str, ...]): Row from the full DENATRAN dataframe we want to apply the IBGE substitutions to. + + Raises: + ValueError: Errors out if the desired parts of the row do not conform to the expected format. + + Returns: + str: Returns the suggested IBGE name, either the pre existing or the one in the ruleset for substitutions. + """ key = (row[0], row[1]) + if (not isinstance(row[0], str)) or (not isinstance(row[1], str)): + raise ValueError("This is not a valid key to be checked.") if key in SUBSTITUTIONS: return SUBSTITUTIONS[key] else: @@ -96,6 +158,18 @@ def fix_suggested_nome_ibge(row) -> str: def match_ibge(denatran_uf: pl.DataFrame, ibge_uf: pl.DataFrame) -> None: + """Takes a dataframe of the Denatran data and an IBGE dataframe of municipalities. + Joins them using the IBGE name of both. The IBGE name of denatran_uf is ideally filled via get_city_name(). + This verifies if there are any municipalities in denatran_uf that have no corresponding municipality in the IBGE database. + These must be manually fixed via the constants file and the fix_suggested_nome function. + Will error out if there are municipalities that have no correspondence whatsover. + Args: + denatran_uf (pl.DataFrame): Dataframe with the DENATRAN data, filtered by state (UF). + ibge_uf (pl.DataFrame): Dataframe with the IBGE municipalities data, filtered by state (UF). + + Raises: + ValueError: Errors if there are municipalities that have not match and outputs them all with the state to enable manual fix. + """ joined_df = denatran_uf.join( ibge_uf, left_on=["suggested_nome_ibge", "sigla_uf"], @@ -103,7 +177,6 @@ def match_ibge(denatran_uf: pl.DataFrame, ibge_uf: pl.DataFrame) -> None: how="left", ) mismatched_rows = joined_df.filter(pl.col("id_municipio").is_null()) - if len(mismatched_rows) > 0: error_message = "Os seguintes municípios falharam: \n" for row in mismatched_rows.rows(named=True): @@ -112,6 +185,17 @@ def match_ibge(denatran_uf: pl.DataFrame, ibge_uf: pl.DataFrame) -> None: def get_city_name_ibge(denatran_name: str, ibge_uf: pl.DataFrame) -> str: + """Gets the closest match to the denatran name of the municipality in the IBGE dataframe of the same state. + This ibge_uf dataframe is pulled directly from Base dos Dados to ensure correctness. + Returns either the match or an empty string in case no match is found. + + + Args: + denatran_name (str): The name of the municipality according to DENATRAN data. + ibge_uf (pl.DataFrame): Dataframe with the information from municipalities for a certain state (UF). + Returns: + str: Closest match to the denatran name or an empty string if no such match is found. + """ matches = difflib.get_close_matches( denatran_name.lower(), ibge_uf["nome"].str.to_lowercase(), n=1 ) @@ -169,6 +253,49 @@ def make_filename(i: dict, ext: bool = True) -> str: return filename +def call_downloader(i): + filename = make_filename(i) + if i["filetype"] in ["xlsx", "xls"]: + download_file(i["href"], filename) + elif i["filetype"] == "zip": + download_file(i["href"], filename) + extract_zip(filename) + + +def download_post_2012(month: int, year: int): + """_summary_ + + Args: + year (int): _description_ + month (int): _description_ + """ + url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-Senatran/frota-de-veiculos-{year}" + soup = BeautifulSoup(urlopen(url), "html.parser") + # Só queremos os dados de frota nacional. + nodes = soup.select("p:contains('rota por ') > a") + for node in nodes: + txt = node.text + href = node.get("href") + # Pega a parte relevante do arquivo em questão. + match = re.search( + r"(?i)\/([\w-]+)\/(\d{4})\/(\w+)\/([\w-]+)\.(?:xls|xlsx|rar|zip)$", href + ) + if match: + matched_month = match.group(3) + matched_year = match.group(2) + if MONTHS.get(matched_month) == month and matched_year == str(year): + filetype = match.group(0).split(".")[-1].lower() + info = { + "txt": txt, + "href": href, + "mes_name": matched_month, + "mes": month, + "ano": year, + "filetype": filetype, + } + call_downloader(info) + + def make_dir_when_not_exists(dir_name: str): """Auxiliary function to create a subdirectory when it is not present. From 5fd8a796ac7f169beb19c29246c0e00ea79a5662 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 2 May 2023 03:00:03 -0300 Subject: [PATCH 087/265] Redo lock file --- poetry.lock | 1642 ++++++--------------------------------------------- 1 file changed, 189 insertions(+), 1453 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3049b8efc..acaf7580c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -57,26 +57,6 @@ files = [ {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, ] -[[package]] -name = "attrs" -version = "22.2.0" -description = "Classes Without Boilerplate" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, - {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, -] - -[package.extras] - -cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] -tests = ["attrs[tests-no-zope]", "zope.interface"] -tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] - [[package]] name = "backcall" version = "0.2.0" @@ -89,7 +69,6 @@ files = [ {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, ] - [[package]] name = "basedosdados" version = "1.6.9" @@ -470,63 +449,63 @@ requests = ">=2.23.0" [[package]] name = "coverage" -version = "7.2.3" +version = "7.2.5" description = "Code coverage measurement for Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "coverage-7.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e58c0d41d336569d63d1b113bd573db8363bc4146f39444125b7f8060e4e04f5"}, - {file = "coverage-7.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:344e714bd0fe921fc72d97404ebbdbf9127bac0ca1ff66d7b79efc143cf7c0c4"}, - {file = "coverage-7.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:974bc90d6f6c1e59ceb1516ab00cf1cdfbb2e555795d49fa9571d611f449bcb2"}, - {file = "coverage-7.2.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0743b0035d4b0e32bc1df5de70fba3059662ace5b9a2a86a9f894cfe66569013"}, - {file = "coverage-7.2.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d0391fb4cfc171ce40437f67eb050a340fdbd0f9f49d6353a387f1b7f9dd4fa"}, - {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a42e1eff0ca9a7cb7dc9ecda41dfc7cbc17cb1d02117214be0561bd1134772b"}, - {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:be19931a8dcbe6ab464f3339966856996b12a00f9fe53f346ab3be872d03e257"}, - {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:72fcae5bcac3333a4cf3b8f34eec99cea1187acd55af723bcbd559adfdcb5535"}, - {file = "coverage-7.2.3-cp310-cp310-win32.whl", hash = "sha256:aeae2aa38395b18106e552833f2a50c27ea0000122bde421c31d11ed7e6f9c91"}, - {file = "coverage-7.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:83957d349838a636e768251c7e9979e899a569794b44c3728eaebd11d848e58e"}, - {file = "coverage-7.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfd393094cd82ceb9b40df4c77976015a314b267d498268a076e940fe7be6b79"}, - {file = "coverage-7.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:182eb9ac3f2b4874a1f41b78b87db20b66da6b9cdc32737fbbf4fea0c35b23fc"}, - {file = "coverage-7.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bb1e77a9a311346294621be905ea8a2c30d3ad371fc15bb72e98bfcfae532df"}, - {file = "coverage-7.2.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca0f34363e2634deffd390a0fef1aa99168ae9ed2af01af4a1f5865e362f8623"}, - {file = "coverage-7.2.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55416d7385774285b6e2a5feca0af9652f7f444a4fa3d29d8ab052fafef9d00d"}, - {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:06ddd9c0249a0546997fdda5a30fbcb40f23926df0a874a60a8a185bc3a87d93"}, - {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fff5aaa6becf2c6a1699ae6a39e2e6fb0672c2d42eca8eb0cafa91cf2e9bd312"}, - {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ea53151d87c52e98133eb8ac78f1206498c015849662ca8dc246255265d9c3c4"}, - {file = "coverage-7.2.3-cp311-cp311-win32.whl", hash = "sha256:8f6c930fd70d91ddee53194e93029e3ef2aabe26725aa3c2753df057e296b925"}, - {file = "coverage-7.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:fa546d66639d69aa967bf08156eb8c9d0cd6f6de84be9e8c9819f52ad499c910"}, - {file = "coverage-7.2.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2317d5ed777bf5a033e83d4f1389fd4ef045763141d8f10eb09a7035cee774c"}, - {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be9824c1c874b73b96288c6d3de793bf7f3a597770205068c6163ea1f326e8b9"}, - {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3b2803e730dc2797a017335827e9da6da0e84c745ce0f552e66400abdfb9a1"}, - {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f69770f5ca1994cb32c38965e95f57504d3aea96b6c024624fdd5bb1aa494a1"}, - {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1127b16220f7bfb3f1049ed4a62d26d81970a723544e8252db0efde853268e21"}, - {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:aa784405f0c640940595fa0f14064d8e84aff0b0f762fa18393e2760a2cf5841"}, - {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3146b8e16fa60427e03884301bf8209221f5761ac754ee6b267642a2fd354c48"}, - {file = "coverage-7.2.3-cp37-cp37m-win32.whl", hash = "sha256:1fd78b911aea9cec3b7e1e2622c8018d51c0d2bbcf8faaf53c2497eb114911c1"}, - {file = "coverage-7.2.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f3736a5d34e091b0a611964c6262fd68ca4363df56185902528f0b75dbb9c1f"}, - {file = "coverage-7.2.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:981b4df72c93e3bc04478153df516d385317628bd9c10be699c93c26ddcca8ab"}, - {file = "coverage-7.2.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0045f8f23a5fb30b2eb3b8a83664d8dc4fb58faddf8155d7109166adb9f2040"}, - {file = "coverage-7.2.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f760073fcf8f3d6933178d67754f4f2d4e924e321f4bb0dcef0424ca0215eba1"}, - {file = "coverage-7.2.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c86bd45d1659b1ae3d0ba1909326b03598affbc9ed71520e0ff8c31a993ad911"}, - {file = "coverage-7.2.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:172db976ae6327ed4728e2507daf8a4de73c7cc89796483e0a9198fd2e47b462"}, - {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d2a3a6146fe9319926e1d477842ca2a63fe99af5ae690b1f5c11e6af074a6b5c"}, - {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f649dd53833b495c3ebd04d6eec58479454a1784987af8afb77540d6c1767abd"}, - {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c4ed4e9f3b123aa403ab424430b426a1992e6f4c8fd3cb56ea520446e04d152"}, - {file = "coverage-7.2.3-cp38-cp38-win32.whl", hash = "sha256:eb0edc3ce9760d2f21637766c3aa04822030e7451981ce569a1b3456b7053f22"}, - {file = "coverage-7.2.3-cp38-cp38-win_amd64.whl", hash = "sha256:63cdeaac4ae85a179a8d6bc09b77b564c096250d759eed343a89d91bce8b6367"}, - {file = "coverage-7.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:20d1a2a76bb4eb00e4d36b9699f9b7aba93271c9c29220ad4c6a9581a0320235"}, - {file = "coverage-7.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ea748802cc0de4de92ef8244dd84ffd793bd2e7be784cd8394d557a3c751e21"}, - {file = "coverage-7.2.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21b154aba06df42e4b96fc915512ab39595105f6c483991287021ed95776d934"}, - {file = "coverage-7.2.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd214917cabdd6f673a29d708574e9fbdb892cb77eb426d0eae3490d95ca7859"}, - {file = "coverage-7.2.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2e58e45fe53fab81f85474e5d4d226eeab0f27b45aa062856c89389da2f0d9"}, - {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:87ecc7c9a1a9f912e306997ffee020297ccb5ea388421fe62a2a02747e4d5539"}, - {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:387065e420aed3c71b61af7e82c7b6bc1c592f7e3c7a66e9f78dd178699da4fe"}, - {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ea3f5bc91d7d457da7d48c7a732beaf79d0c8131df3ab278e6bba6297e23c6c4"}, - {file = "coverage-7.2.3-cp39-cp39-win32.whl", hash = "sha256:ae7863a1d8db6a014b6f2ff9c1582ab1aad55a6d25bac19710a8df68921b6e30"}, - {file = "coverage-7.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:3f04becd4fcda03c0160d0da9c8f0c246bc78f2f7af0feea1ec0930e7c93fa4a"}, - {file = "coverage-7.2.3-pp37.pp38.pp39-none-any.whl", hash = "sha256:965ee3e782c7892befc25575fa171b521d33798132692df428a09efacaffe8d0"}, - {file = "coverage-7.2.3.tar.gz", hash = "sha256:d298c2815fa4891edd9abe5ad6e6cb4207104c7dd9fd13aea3fdebf6f9b91259"}, + {file = "coverage-7.2.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:883123d0bbe1c136f76b56276074b0c79b5817dd4238097ffa64ac67257f4b6c"}, + {file = "coverage-7.2.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d2fbc2a127e857d2f8898aaabcc34c37771bf78a4d5e17d3e1f5c30cd0cbc62a"}, + {file = "coverage-7.2.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f3671662dc4b422b15776cdca89c041a6349b4864a43aa2350b6b0b03bbcc7f"}, + {file = "coverage-7.2.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780551e47d62095e088f251f5db428473c26db7829884323e56d9c0c3118791a"}, + {file = "coverage-7.2.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:066b44897c493e0dcbc9e6a6d9f8bbb6607ef82367cf6810d387c09f0cd4fe9a"}, + {file = "coverage-7.2.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b9a4ee55174b04f6af539218f9f8083140f61a46eabcaa4234f3c2a452c4ed11"}, + {file = "coverage-7.2.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:706ec567267c96717ab9363904d846ec009a48d5f832140b6ad08aad3791b1f5"}, + {file = "coverage-7.2.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ae453f655640157d76209f42c62c64c4d4f2c7f97256d3567e3b439bd5c9b06c"}, + {file = "coverage-7.2.5-cp310-cp310-win32.whl", hash = "sha256:f81c9b4bd8aa747d417407a7f6f0b1469a43b36a85748145e144ac4e8d303cb5"}, + {file = "coverage-7.2.5-cp310-cp310-win_amd64.whl", hash = "sha256:dc945064a8783b86fcce9a0a705abd7db2117d95e340df8a4333f00be5efb64c"}, + {file = "coverage-7.2.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40cc0f91c6cde033da493227797be2826cbf8f388eaa36a0271a97a332bfd7ce"}, + {file = "coverage-7.2.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a66e055254a26c82aead7ff420d9fa8dc2da10c82679ea850d8feebf11074d88"}, + {file = "coverage-7.2.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c10fbc8a64aa0f3ed136b0b086b6b577bc64d67d5581acd7cc129af52654384e"}, + {file = "coverage-7.2.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a22cbb5ede6fade0482111fa7f01115ff04039795d7092ed0db43522431b4f2"}, + {file = "coverage-7.2.5-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:292300f76440651529b8ceec283a9370532f4ecba9ad67d120617021bb5ef139"}, + {file = "coverage-7.2.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7ff8f3fb38233035028dbc93715551d81eadc110199e14bbbfa01c5c4a43f8d8"}, + {file = "coverage-7.2.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a08c7401d0b24e8c2982f4e307124b671c6736d40d1c39e09d7a8687bddf83ed"}, + {file = "coverage-7.2.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef9659d1cda9ce9ac9585c045aaa1e59223b143f2407db0eaee0b61a4f266fb6"}, + {file = "coverage-7.2.5-cp311-cp311-win32.whl", hash = "sha256:30dcaf05adfa69c2a7b9f7dfd9f60bc8e36b282d7ed25c308ef9e114de7fc23b"}, + {file = "coverage-7.2.5-cp311-cp311-win_amd64.whl", hash = "sha256:97072cc90f1009386c8a5b7de9d4fc1a9f91ba5ef2146c55c1f005e7b5c5e068"}, + {file = "coverage-7.2.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bebea5f5ed41f618797ce3ffb4606c64a5de92e9c3f26d26c2e0aae292f015c1"}, + {file = "coverage-7.2.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828189fcdda99aae0d6bf718ea766b2e715eabc1868670a0a07bf8404bf58c33"}, + {file = "coverage-7.2.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e8a95f243d01ba572341c52f89f3acb98a3b6d1d5d830efba86033dd3687ade"}, + {file = "coverage-7.2.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8834e5f17d89e05697c3c043d3e58a8b19682bf365048837383abfe39adaed5"}, + {file = "coverage-7.2.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d1f25ee9de21a39b3a8516f2c5feb8de248f17da7eead089c2e04aa097936b47"}, + {file = "coverage-7.2.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1637253b11a18f453e34013c665d8bf15904c9e3c44fbda34c643fbdc9d452cd"}, + {file = "coverage-7.2.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8e575a59315a91ccd00c7757127f6b2488c2f914096077c745c2f1ba5b8c0969"}, + {file = "coverage-7.2.5-cp37-cp37m-win32.whl", hash = "sha256:509ecd8334c380000d259dc66feb191dd0a93b21f2453faa75f7f9cdcefc0718"}, + {file = "coverage-7.2.5-cp37-cp37m-win_amd64.whl", hash = "sha256:12580845917b1e59f8a1c2ffa6af6d0908cb39220f3019e36c110c943dc875b0"}, + {file = "coverage-7.2.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b5016e331b75310610c2cf955d9f58a9749943ed5f7b8cfc0bb89c6134ab0a84"}, + {file = "coverage-7.2.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:373ea34dca98f2fdb3e5cb33d83b6d801007a8074f992b80311fc589d3e6b790"}, + {file = "coverage-7.2.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a063aad9f7b4c9f9da7b2550eae0a582ffc7623dca1c925e50c3fbde7a579771"}, + {file = "coverage-7.2.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38c0a497a000d50491055805313ed83ddba069353d102ece8aef5d11b5faf045"}, + {file = "coverage-7.2.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b3b05e22a77bb0ae1a3125126a4e08535961c946b62f30985535ed40e26614"}, + {file = "coverage-7.2.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0342a28617e63ad15d96dca0f7ae9479a37b7d8a295f749c14f3436ea59fdcb3"}, + {file = "coverage-7.2.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf97ed82ca986e5c637ea286ba2793c85325b30f869bf64d3009ccc1a31ae3fd"}, + {file = "coverage-7.2.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c2c41c1b1866b670573657d584de413df701f482574bad7e28214a2362cb1fd1"}, + {file = "coverage-7.2.5-cp38-cp38-win32.whl", hash = "sha256:10b15394c13544fce02382360cab54e51a9e0fd1bd61ae9ce012c0d1e103c813"}, + {file = "coverage-7.2.5-cp38-cp38-win_amd64.whl", hash = "sha256:a0b273fe6dc655b110e8dc89b8ec7f1a778d78c9fd9b4bda7c384c8906072212"}, + {file = "coverage-7.2.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c587f52c81211d4530fa6857884d37f514bcf9453bdeee0ff93eaaf906a5c1b"}, + {file = "coverage-7.2.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4436cc9ba5414c2c998eaedee5343f49c02ca93b21769c5fdfa4f9d799e84200"}, + {file = "coverage-7.2.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6599bf92f33ab041e36e06d25890afbdf12078aacfe1f1d08c713906e49a3fe5"}, + {file = "coverage-7.2.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:857abe2fa6a4973f8663e039ead8d22215d31db613ace76e4a98f52ec919068e"}, + {file = "coverage-7.2.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f5cab2d7f0c12f8187a376cc6582c477d2df91d63f75341307fcdcb5d60303"}, + {file = "coverage-7.2.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aa387bd7489f3e1787ff82068b295bcaafbf6f79c3dad3cbc82ef88ce3f48ad3"}, + {file = "coverage-7.2.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:156192e5fd3dbbcb11cd777cc469cf010a294f4c736a2b2c891c77618cb1379a"}, + {file = "coverage-7.2.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bd3b4b8175c1db502adf209d06136c000df4d245105c8839e9d0be71c94aefe1"}, + {file = "coverage-7.2.5-cp39-cp39-win32.whl", hash = "sha256:ddc5a54edb653e9e215f75de377354e2455376f416c4378e1d43b08ec50acc31"}, + {file = "coverage-7.2.5-cp39-cp39-win_amd64.whl", hash = "sha256:338aa9d9883aaaad53695cb14ccdeb36d4060485bb9388446330bef9c361c252"}, + {file = "coverage-7.2.5-pp37.pp38.pp39-none-any.whl", hash = "sha256:8877d9b437b35a85c18e3c6499b23674684bf690f5d96c1006a1ef61f9fdf0f3"}, + {file = "coverage-7.2.5.tar.gz", hash = "sha256:f99ef080288f09ffc687423b8d60978cf3a465d3f404a18d1a05474bd8575a47"}, ] [package.dependencies] @@ -590,10 +569,6 @@ diagnostics = ["bokeh (>=1.0.0,!=2.0.0)", "jinja2"] distributed = ["distributed (==2021.11.2)"] test = ["pre-commit", "pytest", "pytest-rerunfailures", "pytest-xdist"] -[package.dependencies] -pytz = "*" -"zope.interface" = "*" - [[package]] name = "db-dtypes" version = "1.1.1" @@ -830,19 +805,19 @@ zstandard = ["zstandard"] [[package]] name = "filelock" -version = "3.10.7" +version = "3.12.0" description = "A platform independent file lock." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "filelock-3.10.7-py3-none-any.whl", hash = "sha256:bde48477b15fde2c7e5a0713cbe72721cb5a5ad32ee0b8f419907960b9d75536"}, - {file = "filelock-3.10.7.tar.gz", hash = "sha256:892be14aa8efc01673b5ed6589dbccb95f9a8596f0507e232626155495c18105"}, + {file = "filelock-3.12.0-py3-none-any.whl", hash = "sha256:ad98852315c2ab702aeb628412cbf7e95b7ce8c3bf9565670b4eaecf1db370a9"}, + {file = "filelock-3.12.0.tar.gz", hash = "sha256:fc03ae43288c013d2ea83c8597001b1129db351aad9c57fe2409327916b8e718"}, ] [package.extras] -docs = ["furo (>=2022.12.7)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.2)", "diff-cover (>=7.5)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] [[package]] name = "fonttools" @@ -951,14 +926,14 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2)"] [[package]] name = "google-api-python-client" -version = "2.83.0" +version = "2.86.0" description = "Google API Client Library for Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-python-client-2.83.0.tar.gz", hash = "sha256:d07509f1b2d2b2427363b454db996f7a15e1751a48cfcaf28427050560dd51cf"}, - {file = "google_api_python_client-2.83.0-py2.py3-none-any.whl", hash = "sha256:afa7fe2a5d77e8f136cdb8f40a120dd6660c2292f791c1b22734dfe786bd1dac"}, + {file = "google-api-python-client-2.86.0.tar.gz", hash = "sha256:3ca4e93821f4e9ac29b91ab0d9df168b42c8ad0fb8bff65b8c2ccb2d462b0464"}, + {file = "google_api_python_client-2.86.0-py2.py3-none-any.whl", hash = "sha256:0f320190ab9d5bd2fdb0cb894e8e53bb5e17d4888ee8dc4d26ba65ce378409e2"}, ] [package.dependencies] @@ -1321,14 +1296,14 @@ parser = ["pyhcl (>=0.3.10)"] [[package]] name = "identify" -version = "2.5.22" +version = "2.5.23" description = "File identification library for Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "identify-2.5.22-py2.py3-none-any.whl", hash = "sha256:f0faad595a4687053669c112004178149f6c326db71ee999ae4636685753ad2f"}, - {file = "identify-2.5.22.tar.gz", hash = "sha256:f7a93d6cf98e29bd07663c60728e7a4057615068d7a639d132dc883b2d54d31e"}, + {file = "identify-2.5.23-py2.py3-none-any.whl", hash = "sha256:17d9351c028a781456965e781ed2a435755cac655df1ebd930f7186b54399312"}, + {file = "identify-2.5.23.tar.gz", hash = "sha256:50b01b9d5f73c6b53e5fa2caf9f543d3e657a9d0bbdeb203ebb8d45960ba7433"}, ] [package.extras] @@ -1449,14 +1424,14 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio" [[package]] name = "ipython" -version = "8.12.0" +version = "8.12.1" description = "IPython: Productive Interactive Computing" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "ipython-8.12.0-py3-none-any.whl", hash = "sha256:1c183bf61b148b00bcebfa5d9b39312733ae97f6dad90d7e9b4d86c8647f498c"}, - {file = "ipython-8.12.0.tar.gz", hash = "sha256:a950236df04ad75b5bc7f816f9af3d74dc118fd42f2ff7e80e8e60ca1f182e2d"}, + {file = "ipython-8.12.1-py3-none-any.whl", hash = "sha256:e3015a1a4aa09b3984fb81b9cef4f0772af5a549878b81efb094cda8bb121993"}, + {file = "ipython-8.12.1.tar.gz", hash = "sha256:2442915417763b62181009259782975fa50bb5eedb97ae97fb614204bf6ecc21"}, ] [package.dependencies] @@ -1696,6 +1671,99 @@ win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} [package.extras] dev = ["Sphinx (>=4.1.1)", "black (>=19.10b0)", "colorama (>=0.3.4)", "docutils (==0.16)", "flake8 (>=3.7.7)", "isort (>=5.1.1)", "pytest (>=4.6.2)", "pytest-cov (>=2.7.1)", "sphinx-autobuild (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "tox (>=3.9.0)"] +[[package]] +name = "lxml" +version = "4.9.2" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" +files = [ + {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, + {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, + {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, + {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, + {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, + {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, + {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, + {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, + {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, + {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, + {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, + {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, + {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, + {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, + {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, + {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, + {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, + {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, + {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, + {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, + {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, + {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, + {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=0.29.7)"] + [[package]] name = "markupsafe" version = "2.0.1" @@ -2355,19 +2423,19 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa [[package]] name = "platformdirs" -version = "3.2.0" +version = "3.5.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-3.2.0-py3-none-any.whl", hash = "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e"}, - {file = "platformdirs-3.2.0.tar.gz", hash = "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08"}, + {file = "platformdirs-3.5.0-py3-none-any.whl", hash = "sha256:47692bc24c1958e8b0f13dd727307cff1db103fca36399f457da8e05f222fdc4"}, + {file = "platformdirs-3.5.0.tar.gz", hash = "sha256:7954a68d0ba23558d753f73437c55f89027cf8f5108c19844d4b82e5af396335"}, ] [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" @@ -2387,18 +2455,18 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "polars" -version = "0.17.5" +version = "0.17.11" description = "Blazingly fast DataFrame library" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "polars-0.17.5-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:3ec088bb68c2b833f1172b85dc1222ae88732ce0ae7de34590dd387204a84b1b"}, - {file = "polars-0.17.5-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:1f5389d29d5e5e993a9a361801d54dccd0399cedb72632274b341e27957c631c"}, - {file = "polars-0.17.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4518d2a70bf69eaae04437a241f6d81f2d576e4491d8d4b45c95eacb53415616"}, - {file = "polars-0.17.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fbe7dc6be495d1805f8252bc6bcfb0372134595bea0ebf7c46db21bad86bf58"}, - {file = "polars-0.17.5-cp37-abi3-win_amd64.whl", hash = "sha256:7f112d6cefb37a32fc723195f0be1f62ec528b5f83905ad2e614bc78585a0313"}, - {file = "polars-0.17.5.tar.gz", hash = "sha256:7db2da068e983312238799ad8263e80544151304aac0bc2e6511f91cb56af54d"}, + {file = "polars-0.17.11-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:07ecde540830bad035fecadbd07721a0dd3cba5887ba6d49844242de83a9ace8"}, + {file = "polars-0.17.11-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:accf4719953f0e2f27db4c87e3ebac9569ebce8675fe3c6b710af2c313aedb81"}, + {file = "polars-0.17.11-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38db6e92726c36ffd80fc39c511c725c34391b4b33a1fb1d2866cbe14d7c9c07"}, + {file = "polars-0.17.11-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54aca5e4cb157cd3d177fe46c6f5b167cd2dd466d2fa4b8a7ff65c3e627a1037"}, + {file = "polars-0.17.11-cp37-abi3-win_amd64.whl", hash = "sha256:2b8d7055809017f0d1aab122cd5a818d502086f2ed7d57c2e5057f7374aa9831"}, + {file = "polars-0.17.11.tar.gz", hash = "sha256:103579cf6f1784740f88fc1510c4f349ebdf062d093a4155d87d09a80d40b342"}, ] [package.dependencies] @@ -2862,18 +2930,17 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.2.2" +version = "7.3.1" description = "pytest: simple powerful testing with Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"}, - {file = "pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"}, + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, ] [package.dependencies] -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" @@ -2882,10 +2949,7 @@ pluggy = ">=0.12,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] - -checkqa-mypy = ["mypy (==0.780)"] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] - +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] [[package]] name = "pytest-cov" @@ -3378,14 +3442,14 @@ scipy = ">=1.0" [[package]] name = "setuptools" -version = "67.6.1" +version = "67.7.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "setuptools-67.6.1-py3-none-any.whl", hash = "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078"}, - {file = "setuptools-67.6.1.tar.gz", hash = "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a"}, + {file = "setuptools-67.7.2-py3-none-any.whl", hash = "sha256:23aaf86b85ca52ceb801d32703f12d77517b2556af839621c641fca11287952b"}, + {file = "setuptools-67.7.2.tar.gz", hash = "sha256:f104fa03692a2602fa0fec6c6a9e63b6c8a968de13e17c026957dd1f53d80990"}, ] [package.extras] @@ -3419,14 +3483,14 @@ files = [ [[package]] name = "soupsieve" -version = "2.4" +version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "soupsieve-2.4-py3-none-any.whl", hash = "sha256:49e5368c2cda80ee7e84da9dbe3e110b70a4575f196efb74e51b94549d921955"}, - {file = "soupsieve-2.4.tar.gz", hash = "sha256:e28dba9ca6c7c00173e34e4ba57448f0688bb681b7c5e8bf4971daafc093d69a"}, + {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, + {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, ] [[package]] @@ -3716,24 +3780,24 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.21.0" +version = "20.23.0" description = "Virtual Python Environment builder" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.21.0-py3-none-any.whl", hash = "sha256:31712f8f2a17bd06234fa97fdf19609e789dd4e3e4bf108c3da71d710651adbc"}, - {file = "virtualenv-20.21.0.tar.gz", hash = "sha256:f50e3e60f990a0757c9b68333c9fdaa72d7188caa417f96af9e52407831a3b68"}, + {file = "virtualenv-20.23.0-py3-none-any.whl", hash = "sha256:6abec7670e5802a528357fdc75b26b9f57d5d92f29c5462ba0fbe45feacc685e"}, + {file = "virtualenv-20.23.0.tar.gz", hash = "sha256:a85caa554ced0c0afbd0d638e7e2d7b5f92d23478d05d17a76daeac8f279f924"}, ] [package.dependencies] distlib = ">=0.3.6,<1" -filelock = ">=3.4.1,<4" -platformdirs = ">=2.4,<4" +filelock = ">=3.11,<4" +platformdirs = ">=3.2,<4" [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] -test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23)", "pytest (>=7.2.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.7.1)", "time-machine (>=2.9)"] [[package]] name = "wcwidth" @@ -3849,1335 +3913,7 @@ files = [ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] -[[package]] -name = "zope-interface" -version = "6.0" -description = "Interfaces for Python" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -setuptools = "*" - -[package.extras] -docs = ["Sphinx", "repoze.sphinx.autointerface"] -test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] -testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] - [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" - -content-hash = "baef9a144e1f37fe2ae40a08acec12f0878a99571d6eaa60684118dbf0e9c03e" - - -[metadata.files] -async-timeout = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, -] -basedosdados = [ - {file = "basedosdados-1.6.9-py3-none-any.whl", hash = "sha256:9a73ad8a3667cca327d81c5d41ec809ed0675825dfc5d93d1efcf45f9bd1e867"}, - {file = "basedosdados-1.6.9.tar.gz", hash = "sha256:51783ea130944295dbc6b7dcbad8676ca0ff0234cdf2b4d212177bcd12db7921"}, -] -beautifulsoup4 = [ - {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, - {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, -] -cachetools = [ - {file = "cachetools-4.2.4-py3-none-any.whl", hash = "sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1"}, - {file = "cachetools-4.2.4.tar.gz", hash = "sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693"}, -] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -cfgv = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.8.tar.gz", hash = "sha256:735e240d9a8506778cd7a453d97e817e536bb1fc29f4f6961ce297b9c7a917b0"}, - {file = "charset_normalizer-2.0.8-py3-none-any.whl", hash = "sha256:83fcdeb225499d6344c8f7f34684c2981270beacc32ede2e669e94f7fa544405"}, -] -ckanapi = [ - {file = "ckanapi-4.6.tar.gz", hash = "sha256:35361965bfb38c8e146d7229f2d7c3aaf1c0f2ef547de4239b4d38931bf081d2"}, -] -click = [ - {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, - {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, -] -cloudpickle = [ - {file = "cloudpickle-2.0.0-py3-none-any.whl", hash = "sha256:6b2df9741d06f43839a3275c4e6632f7df6487a1f181f5f46a052d3c917c3d11"}, - {file = "cloudpickle-2.0.0.tar.gz", hash = "sha256:5cd02f3b417a783ba84a4ec3e290ff7929009fe51f6405423cfccfadd43ba4a4"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -coverage = [ - {file = "coverage-6.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7b4da9bafad21ea45a714d3ea6f3e1679099e420c8741c74905b92ee9bfa7cc"}, - {file = "coverage-6.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fde17bc42e0716c94bf19d92e4c9f5a00c5feb401f5bc01101fdf2a8b7cacf60"}, - {file = "coverage-6.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdbb0d89923c80dbd435b9cf8bba0ff55585a3cdb28cbec65f376c041472c60d"}, - {file = "coverage-6.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:67f9346aeebea54e845d29b487eb38ec95f2ecf3558a3cffb26ee3f0dcc3e760"}, - {file = "coverage-6.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42c499c14efd858b98c4e03595bf914089b98400d30789511577aa44607a1b74"}, - {file = "coverage-6.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c35cca192ba700979d20ac43024a82b9b32a60da2f983bec6c0f5b84aead635c"}, - {file = "coverage-6.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9cc4f107009bca5a81caef2fca843dbec4215c05e917a59dec0c8db5cff1d2aa"}, - {file = "coverage-6.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f444627b3664b80d078c05fe6a850dd711beeb90d26731f11d492dcbadb6973"}, - {file = "coverage-6.4.4-cp310-cp310-win32.whl", hash = "sha256:66e6df3ac4659a435677d8cd40e8eb1ac7219345d27c41145991ee9bf4b806a0"}, - {file = "coverage-6.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:35ef1f8d8a7a275aa7410d2f2c60fa6443f4a64fae9be671ec0696a68525b875"}, - {file = "coverage-6.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c1328d0c2f194ffda30a45f11058c02410e679456276bfa0bbe0b0ee87225fac"}, - {file = "coverage-6.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61b993f3998ee384935ee423c3d40894e93277f12482f6e777642a0141f55782"}, - {file = "coverage-6.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d5dd4b8e9cd0deb60e6fcc7b0647cbc1da6c33b9e786f9c79721fd303994832f"}, - {file = "coverage-6.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7026f5afe0d1a933685d8f2169d7c2d2e624f6255fb584ca99ccca8c0e966fd7"}, - {file = "coverage-6.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9c7b9b498eb0c0d48b4c2abc0e10c2d78912203f972e0e63e3c9dc21f15abdaa"}, - {file = "coverage-6.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ee2b2fb6eb4ace35805f434e0f6409444e1466a47f620d1d5763a22600f0f892"}, - {file = "coverage-6.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ab066f5ab67059d1f1000b5e1aa8bbd75b6ed1fc0014559aea41a9eb66fc2ce0"}, - {file = "coverage-6.4.4-cp311-cp311-win32.whl", hash = "sha256:9d6e1f3185cbfd3d91ac77ea065d85d5215d3dfa45b191d14ddfcd952fa53796"}, - {file = "coverage-6.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e3d3c4cc38b2882f9a15bafd30aec079582b819bec1b8afdbde8f7797008108a"}, - {file = "coverage-6.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a095aa0a996ea08b10580908e88fbaf81ecf798e923bbe64fb98d1807db3d68a"}, - {file = "coverage-6.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef6f44409ab02e202b31a05dd6666797f9de2aa2b4b3534e9d450e42dea5e817"}, - {file = "coverage-6.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b7101938584d67e6f45f0015b60e24a95bf8dea19836b1709a80342e01b472f"}, - {file = "coverage-6.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14a32ec68d721c3d714d9b105c7acf8e0f8a4f4734c811eda75ff3718570b5e3"}, - {file = "coverage-6.4.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6a864733b22d3081749450466ac80698fe39c91cb6849b2ef8752fd7482011f3"}, - {file = "coverage-6.4.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:08002f9251f51afdcc5e3adf5d5d66bb490ae893d9e21359b085f0e03390a820"}, - {file = "coverage-6.4.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a3b2752de32c455f2521a51bd3ffb53c5b3ae92736afde67ce83477f5c1dd928"}, - {file = "coverage-6.4.4-cp37-cp37m-win32.whl", hash = "sha256:f855b39e4f75abd0dfbcf74a82e84ae3fc260d523fcb3532786bcbbcb158322c"}, - {file = "coverage-6.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ee6ae6bbcac0786807295e9687169fba80cb0617852b2fa118a99667e8e6815d"}, - {file = "coverage-6.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:564cd0f5b5470094df06fab676c6d77547abfdcb09b6c29c8a97c41ad03b103c"}, - {file = "coverage-6.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cbbb0e4cd8ddcd5ef47641cfac97d8473ab6b132dd9a46bacb18872828031685"}, - {file = "coverage-6.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6113e4df2fa73b80f77663445be6d567913fb3b82a86ceb64e44ae0e4b695de1"}, - {file = "coverage-6.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d032bfc562a52318ae05047a6eb801ff31ccee172dc0d2504614e911d8fa83e"}, - {file = "coverage-6.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e431e305a1f3126477abe9a184624a85308da8edf8486a863601d58419d26ffa"}, - {file = "coverage-6.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cf2afe83a53f77aec067033199797832617890e15bed42f4a1a93ea24794ae3e"}, - {file = "coverage-6.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:783bc7c4ee524039ca13b6d9b4186a67f8e63d91342c713e88c1865a38d0892a"}, - {file = "coverage-6.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ff934ced84054b9018665ca3967fc48e1ac99e811f6cc99ea65978e1d384454b"}, - {file = "coverage-6.4.4-cp38-cp38-win32.whl", hash = "sha256:e1fabd473566fce2cf18ea41171d92814e4ef1495e04471786cbc943b89a3781"}, - {file = "coverage-6.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:4179502f210ebed3ccfe2f78bf8e2d59e50b297b598b100d6c6e3341053066a2"}, - {file = "coverage-6.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:98c0b9e9b572893cdb0a00e66cf961a238f8d870d4e1dc8e679eb8bdc2eb1b86"}, - {file = "coverage-6.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc600f6ec19b273da1d85817eda339fb46ce9eef3e89f220055d8696e0a06908"}, - {file = "coverage-6.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a98d6bf6d4ca5c07a600c7b4e0c5350cd483c85c736c522b786be90ea5bac4f"}, - {file = "coverage-6.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01778769097dbd705a24e221f42be885c544bb91251747a8a3efdec6eb4788f2"}, - {file = "coverage-6.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfa0b97eb904255e2ab24166071b27408f1f69c8fbda58e9c0972804851e0558"}, - {file = "coverage-6.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fcbe3d9a53e013f8ab88734d7e517eb2cd06b7e689bedf22c0eb68db5e4a0a19"}, - {file = "coverage-6.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:15e38d853ee224e92ccc9a851457fb1e1f12d7a5df5ae44544ce7863691c7a0d"}, - {file = "coverage-6.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6913dddee2deff8ab2512639c5168c3e80b3ebb0f818fed22048ee46f735351a"}, - {file = "coverage-6.4.4-cp39-cp39-win32.whl", hash = "sha256:354df19fefd03b9a13132fa6643527ef7905712109d9c1c1903f2133d3a4e145"}, - {file = "coverage-6.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:1238b08f3576201ebf41f7c20bf59baa0d05da941b123c6656e42cdb668e9827"}, - {file = "coverage-6.4.4-pp36.pp37.pp38-none-any.whl", hash = "sha256:f67cf9f406cf0d2f08a3515ce2db5b82625a7257f88aad87904674def6ddaec1"}, - {file = "coverage-6.4.4.tar.gz", hash = "sha256:e16c45b726acb780e1e6f88b286d3c10b3914ab03438f32117c4aa52d7f30d58"}, -] -croniter = [ - {file = "croniter-1.0.15-py2.py3-none-any.whl", hash = "sha256:0f97b361fe343301a8f66f852e7d84e4fb7f21379948f71e1bbfe10f5d015fbd"}, - {file = "croniter-1.0.15.tar.gz", hash = "sha256:a70dfc9d52de9fc1a886128b9148c89dd9e76b67d55f46516ca94d2d73d58219"}, -] -cycler = [ - {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, - {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, -] -dask = [ - {file = "dask-2021.11.2-py3-none-any.whl", hash = "sha256:2b0ad7beba8950add4fdc7c5cb94fa9444915ddb00c711d5743e2c4bb0a95ef5"}, - {file = "dask-2021.11.2.tar.gz", hash = "sha256:e12bfe272928d62fa99623d98d0e0b0c045b33a47509ef31a22175aa5fd10917"}, -] -db-dtypes = [ - {file = "db-dtypes-1.0.1.tar.gz", hash = "sha256:3eb5931c9f8c314a1a4aeb698a7eb1d713cddaed4a7a13f0408a8785c4a72330"}, - {file = "db_dtypes-1.0.1-py2.py3-none-any.whl", hash = "sha256:b26b295773d2a4b445f6a7f297ec04dd9eb5d3fb26622032550da013486ba7b7"}, -] -dbt-client = [ - {file = "dbt-client-0.1.3.tar.gz", hash = "sha256:192fff51a51d6d002d4048dd494e601592599e004c0f31f1ea5156aa6d516cf5"}, - {file = "dbt_client-0.1.3-py3-none-any.whl", hash = "sha256:31a0db4844c1559c95c643a6f57d1e39d4e9c3b4d9a8c867f7b3e6ed75cedca0"}, -] -deprecated = [ - {file = "Deprecated-1.2.13-py2.py3-none-any.whl", hash = "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d"}, - {file = "Deprecated-1.2.13.tar.gz", hash = "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d"}, -] -dill = [ - {file = "dill-0.3.5.1-py2.py3-none-any.whl", hash = "sha256:33501d03270bbe410c72639b350e941882a8b0fd55357580fbc873fba0c59302"}, - {file = "dill-0.3.5.1.tar.gz", hash = "sha256:d75e41f3eff1eee599d738e76ba8f4ad98ea229db8b085318aa2b3333a208c86"}, -] -distlib = [ - {file = "distlib-0.3.5-py2.py3-none-any.whl", hash = "sha256:b710088c59f06338ca514800ad795a132da19fda270e3ce4affc74abf955a26c"}, - {file = "distlib-0.3.5.tar.gz", hash = "sha256:a7f75737c70be3b25e2bee06288cec4e4c221de18455b2dd037fe2a795cab2fe"}, -] -distributed = [ - {file = "distributed-2021.11.2-py3-none-any.whl", hash = "sha256:af1f7b98d85d43886fefe2354379c848c7a5aa6ae4d2313a7aca9ab9081a7e56"}, - {file = "distributed-2021.11.2.tar.gz", hash = "sha256:f86a01a2e1e678865d2e42300c47552b5012cd81a2d354e47827a1fd074cc302"}, -] -docker = [ - {file = "docker-5.0.3-py2.py3-none-any.whl", hash = "sha256:7a79bb439e3df59d0a72621775d600bc8bc8b422d285824cb37103eab91d1ce0"}, - {file = "docker-5.0.3.tar.gz", hash = "sha256:d916a26b62970e7c2f554110ed6af04c7ccff8e9f81ad17d0d40c75637e227fb"}, -] -docopt = [ - {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, -] -fastavro = [ - {file = "fastavro-1.4.11-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:44f01008f95d685edacc4b10366c755d25612df00924349f7d34a29f08522ce3"}, - {file = "fastavro-1.4.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f5e736d12e67348f253da8a332d7c3b483ca04f2b6e772befa79d1a46bac9d"}, - {file = "fastavro-1.4.11-cp310-cp310-win_amd64.whl", hash = "sha256:8dca11bc3191cd7de0a3c4b76a70dac493356a219e96ebcde0def1f06faddef7"}, - {file = "fastavro-1.4.11-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7a2a0bf03686f9d860e8f8476be000f5b3e6cc9af6853dbabab2ef9cfa5dc3a0"}, - {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c17e3decfac260e1be4d02d1903d2483eec2f3ce7f92c9b808a0f6a81572c4b"}, - {file = "fastavro-1.4.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19ba25c6529f50722a7618cc4ca24c7d265def57fd9f94e4e554e1df8cce38d2"}, - {file = "fastavro-1.4.11-cp37-cp37m-win_amd64.whl", hash = "sha256:ceaba04da9419f40899a670eb62eb373a127b511bb8e3ae4f6f1f23ec49bd0e4"}, - {file = "fastavro-1.4.11-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:732eab3a1ae5d2c3f4b52e747c55bcc41c4df0eb7e8a395038080741a3c0a934"}, - {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03d3c802b71f44e7b3442abae961bba996258244bd222b242ad1e5cb7754e57"}, - {file = "fastavro-1.4.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cb7475a9b25b9f8aebe7eb756dafedd0369434571062f3883d894281befd7c"}, - {file = "fastavro-1.4.11-cp38-cp38-win_amd64.whl", hash = "sha256:ce0776f54591aef90bcd02bd919964abe4c2ad2a10a4336c3a1b66cef289b41c"}, - {file = "fastavro-1.4.11-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:621e72cc365c9539d7590e7b43e48a62e6bfb4c2de7c16837fed54d113d7312c"}, - {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842b25782f911ee8c626f9d9fedc2ef01aeac272536fe90ee6d45b2ae7cdb024"}, - {file = "fastavro-1.4.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8491bfcba25c9d661289f884688e5a4f56f2ee389a240d0ad02692495a9a087"}, - {file = "fastavro-1.4.11-cp39-cp39-win_amd64.whl", hash = "sha256:c94130a8c8d80073eb0276844915aa5e928ae322024e76dc57943542ccda211c"}, - {file = "fastavro-1.4.11.tar.gz", hash = "sha256:7c64332ad52de0134be9a933ca986514c3ff85c63d54bc5398c31f0498ac1820"}, -] -filelock = [ - {file = "filelock-3.7.1-py3-none-any.whl", hash = "sha256:37def7b658813cda163b56fc564cdc75e86d338246458c4c28ae84cabefa2404"}, - {file = "filelock-3.7.1.tar.gz", hash = "sha256:3a0fd85166ad9dbab54c9aec96737b744106dc5f15c0b09a6744a445299fcf04"}, -] -fonttools = [ - {file = "fonttools-4.33.3-py3-none-any.whl", hash = "sha256:f829c579a8678fa939a1d9e9894d01941db869de44390adb49ce67055a06cc2a"}, - {file = "fonttools-4.33.3.zip", hash = "sha256:c0fdcfa8ceebd7c1b2021240bd46ef77aa8e7408cf10434be55df52384865f8e"}, -] -fsspec = [ - {file = "fsspec-2021.11.1-py3-none-any.whl", hash = "sha256:bcb136caa37e1470dd8314a7d3917cb9b25dd9da44c10d36df556ab4ef038185"}, - {file = "fsspec-2021.11.1.tar.gz", hash = "sha256:03683e606651d5e4bd9180525d57477bd5430e5dc68d2e459835dc14cecc3dd4"}, -] -google-analytics-data = [ - {file = "google-analytics-data-0.12.1.tar.gz", hash = "sha256:8d5436797338683ff80988d6303e1bbeca01a1d7ece73c248fe2315aa2ae70dc"}, - {file = "google_analytics_data-0.12.1-py2.py3-none-any.whl", hash = "sha256:320a16df6624606abbceef85c6b0a67727eff48f27da347630929b3ee28cd5ff"}, -] -google-api-core = [ - {file = "google-api-core-1.31.5.tar.gz", hash = "sha256:85d2074f2c8f9c07e614d7f978767d71ceb7d40647814ef4236d3a0ef671ee75"}, - {file = "google_api_core-1.31.5-py2.py3-none-any.whl", hash = "sha256:6815207a8b422e9da42c200681603f304b25f98c98b675a9db9fdc3717e44280"}, -] -google-api-python-client = [ - {file = "google-api-python-client-2.58.0.tar.gz", hash = "sha256:3af6a181763a8cb18f2b9d973760ba32e4fe2af09e4ce06626ff6a53777c33fa"}, - {file = "google_api_python_client-2.58.0-py2.py3-none-any.whl", hash = "sha256:8f4eeed1b46f3f445307719aa3e9678e429d90c0af4f22ada707a72ba10fe02d"}, -] -google-auth = [ - {file = "google-auth-1.35.0.tar.gz", hash = "sha256:b7033be9028c188ee30200b204ea00ed82ea1162e8ac1df4aa6ded19a191d88e"}, - {file = "google_auth-1.35.0-py2.py3-none-any.whl", hash = "sha256:997516b42ecb5b63e8d80f5632c1a61dddf41d2a4c2748057837e06e00014258"}, -] -google-auth-httplib2 = [ - {file = "google-auth-httplib2-0.1.0.tar.gz", hash = "sha256:a07c39fd632becacd3f07718dfd6021bf396978f03ad3ce4321d060015cc30ac"}, - {file = "google_auth_httplib2-0.1.0-py2.py3-none-any.whl", hash = "sha256:31e49c36c6b5643b57e82617cb3e021e3e1d2df9da63af67252c02fa9c1f4a10"}, -] -google-auth-oauthlib = [ - {file = "google-auth-oauthlib-0.4.6.tar.gz", hash = "sha256:a90a072f6993f2c327067bf65270046384cda5a8ecb20b94ea9a687f1f233a7a"}, - {file = "google_auth_oauthlib-0.4.6-py2.py3-none-any.whl", hash = "sha256:3f2a6e802eebbb6fb736a370fbf3b055edcb6b52878bf2f26330b5e041316c73"}, -] -google-cloud-bigquery = [ - {file = "google-cloud-bigquery-2.30.1.tar.gz", hash = "sha256:4e3b5e3dcc475d5a601d84872ac0b63e059540be2251b1c4165c51106d572855"}, - {file = "google_cloud_bigquery-2.30.1-py2.py3-none-any.whl", hash = "sha256:c62d601aa0f62388e1909d11de40db7597b02fb8602ccb7f21a3ac2a0997495b"}, -] -google-cloud-bigquery-storage = [ - {file = "google-cloud-bigquery-storage-1.1.0.tar.gz", hash = "sha256:c92533cedbb672f1a35555c112d4d5cccb9f8f6d0e98a604fbf98223773adad3"}, - {file = "google_cloud_bigquery_storage-1.1.0-py2.py3-none-any.whl", hash = "sha256:fc543e9d2343d34c043ad48984333ba84de10be31b7af8435548aaf8555507c4"}, -] -google-cloud-core = [ - {file = "google-cloud-core-2.2.1.tar.gz", hash = "sha256:476d1f71ab78089e0638e0aaf34bfdc99bab4fce8f4170ba6321a5243d13c5c7"}, - {file = "google_cloud_core-2.2.1-py2.py3-none-any.whl", hash = "sha256:ab6cee07791afe4e210807ceeab749da6a076ab16d496ac734bf7e6ffea27486"}, -] -google-cloud-storage = [ - {file = "google-cloud-storage-1.42.3.tar.gz", hash = "sha256:7754d4dcaa45975514b404ece0da2bb4292acbc67ca559a69e12a19d54fcdb06"}, - {file = "google_cloud_storage-1.42.3-py2.py3-none-any.whl", hash = "sha256:71ee3a0dcf2c139f034a054181cd7658f1ec8f12837d2769c450a8a00fcd4c6d"}, -] -google-crc32c = [ - {file = "google-crc32c-1.3.0.tar.gz", hash = "sha256:276de6273eb074a35bc598f8efbc00c7869c5cf2e29c90748fccc8c898c244df"}, - {file = "google_crc32c-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cb6994fff247987c66a8a4e550ef374671c2b82e3c0d2115e689d21e511a652d"}, - {file = "google_crc32c-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9da0a39b53d2fab3e5467329ed50e951eb91386e9d0d5b12daf593973c3b168"}, - {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:eb0b14523758e37802f27b7f8cd973f5f3d33be7613952c0df904b68c4842f0e"}, - {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:95c68a4b9b7828ba0428f8f7e3109c5d476ca44996ed9a5f8aac6269296e2d59"}, - {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c3cf890c3c0ecfe1510a452a165431b5831e24160c5fcf2071f0f85ca5a47cd"}, - {file = "google_crc32c-1.3.0-cp310-cp310-win32.whl", hash = "sha256:3bbce1be3687bbfebe29abdb7631b83e6b25da3f4e1856a1611eb21854b689ea"}, - {file = "google_crc32c-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:c124b8c8779bf2d35d9b721e52d4adb41c9bfbde45e6a3f25f0820caa9aba73f"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:42ae4781333e331a1743445931b08ebdad73e188fd554259e772556fc4937c48"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ff71073ebf0e42258a42a0b34f2c09ec384977e7f6808999102eedd5b49920e3"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fe31de3002e7b08eb20823b3735b97c86c5926dd0581c7710a680b418a8709d4"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd7760a88a8d3d705ff562aa93f8445ead54f58fd482e4f9e2bafb7e177375d4"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0b9e622c3b2b8d0ce32f77eba617ab0d6768b82836391e4f8f9e2074582bf02"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-win32.whl", hash = "sha256:779cbf1ce375b96111db98fca913c1f5ec11b1d870e529b1dc7354b2681a8c3a"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:04e7c220798a72fd0f08242bc8d7a05986b2a08a0573396187fd32c1dcdd58b3"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e7a539b9be7b9c00f11ef16b55486141bc2cdb0c54762f84e3c6fc091917436d"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ca60076c388728d3b6ac3846842474f4250c91efbfe5afa872d3ffd69dd4b318"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05340b60bf05b574159e9bd940152a47d38af3fb43803ffe71f11d704b7696a6"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:318f73f5484b5671f0c7f5f63741ab020a599504ed81d209b5c7129ee4667407"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f58099ad7affc0754ae42e6d87443299f15d739b0ce03c76f515153a5cda06c"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-win32.whl", hash = "sha256:f52a4ad2568314ee713715b1e2d79ab55fab11e8b304fd1462ff5cccf4264b3e"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bab4aebd525218bab4ee615786c4581952eadc16b1ff031813a2fd51f0cc7b08"}, - {file = "google_crc32c-1.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dda4d8a3bb0b50f540f6ff4b6033f3a74e8bf0bd5320b70fab2c03e512a62812"}, - {file = "google_crc32c-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fec221a051150eeddfdfcff162e6db92c65ecf46cb0f7bb1bf812a1520ec026b"}, - {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:226f2f9b8e128a6ca6a9af9b9e8384f7b53a801907425c9a292553a3a7218ce0"}, - {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a7f9cbea4245ee36190f85fe1814e2d7b1e5f2186381b082f5d59f99b7f11328"}, - {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a4db36f9721fdf391646685ecffa404eb986cbe007a3289499020daf72e88a2"}, - {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:12674a4c3b56b706153a358eaa1018c4137a5a04635b92b4652440d3d7386206"}, - {file = "google_crc32c-1.3.0-cp38-cp38-win32.whl", hash = "sha256:650e2917660e696041ab3dcd7abac160b4121cd9a484c08406f24c5964099829"}, - {file = "google_crc32c-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:58be56ae0529c664cc04a9c76e68bb92b091e0194d6e3c50bea7e0f266f73713"}, - {file = "google_crc32c-1.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:96a8918a78d5d64e07c8ea4ed2bc44354e3f93f46a4866a40e8db934e4c0d74b"}, - {file = "google_crc32c-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:13af315c3a0eec8bb8b8d80b8b128cb3fcd17d7e4edafc39647846345a3f003a"}, - {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6311853aa2bba4064d0c28ca54e7b50c4d48e3de04f6770f6c60ebda1e975267"}, - {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ed447680ff21c14aaceb6a9f99a5f639f583ccfe4ce1a5e1d48eb41c3d6b3217"}, - {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1c1d6236feab51200272d79b3d3e0f12cf2cbb12b208c835b175a21efdb0a73"}, - {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e0f1ff55dde0ebcfbef027edc21f71c205845585fffe30d4ec4979416613e9b3"}, - {file = "google_crc32c-1.3.0-cp39-cp39-win32.whl", hash = "sha256:fbd60c6aaa07c31d7754edbc2334aef50601b7f1ada67a96eb1eb57c7c72378f"}, - {file = "google_crc32c-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:127f9cc3ac41b6a859bd9dc4321097b1a4f6aa7fdf71b4f9227b9e3ebffb4422"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fc28e0db232c62ca0c3600884933178f0825c99be4474cdd645e378a10588125"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1926fd8de0acb9d15ee757175ce7242e235482a783cd4ec711cc999fc103c24e"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5da2c81575cc3ccf05d9830f9e8d3c70954819ca9a63828210498c0774fda1a3"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:891f712ce54e0d631370e1f4997b3f182f3368179198efc30d477c75d1f44942"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:7f6fe42536d9dcd3e2ffb9d3053f5d05221ae3bbcefbe472bdf2c71c793e3183"}, -] -google-resumable-media = [ - {file = "google-resumable-media-2.1.0.tar.gz", hash = "sha256:725b989e0dd387ef2703d1cc8e86217474217f4549593c477fd94f4024a0f911"}, - {file = "google_resumable_media-2.1.0-py2.py3-none-any.whl", hash = "sha256:cdc75ea0361e39704dc7df7da59fbd419e73c8bc92eac94d8a020d36baa9944b"}, -] -googleapis-common-protos = [ - {file = "googleapis-common-protos-1.53.0.tar.gz", hash = "sha256:a88ee8903aa0a81f6c3cec2d5cf62d3c8aa67c06439b0496b49048fb1854ebf4"}, - {file = "googleapis_common_protos-1.53.0-py2.py3-none-any.whl", hash = "sha256:f6d561ab8fb16b30020b940e2dd01cd80082f4762fa9f3ee670f4419b4b8dbd0"}, -] -grpcio = [ - {file = "grpcio-1.42.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:6e5eec67909795f7b1ff2bd941bd6c2661ca5217ea9c35003d73314100786f60"}, - {file = "grpcio-1.42.0-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:8e8cd9909fdd232ecffb954936fd90c935ebe0b5fce36c88813f8247ce54019c"}, - {file = "grpcio-1.42.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:b4d7115ee08a36f3f50a6233bd78280e40847e078d2a5bb39c0ab0db4490d58f"}, - {file = "grpcio-1.42.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b781f412546830be55644f7c48251d30860f4725981862d4a1ea322f80d9cd34"}, - {file = "grpcio-1.42.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e62140c46d8125927c673c72c960cb387c02b2a1a3c6985a8b0a3914d27c0018"}, - {file = "grpcio-1.42.0-cp310-cp310-win32.whl", hash = "sha256:6b69726d7bbb633133c1b0d780b1357aa9b7a7f714fead6470bab1feb8012806"}, - {file = "grpcio-1.42.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6c0b159b38fcc3bbc3331105197c1f58ac0d294eb83910d136a325a85def88f"}, - {file = "grpcio-1.42.0-cp36-cp36m-linux_armv7l.whl", hash = "sha256:53e10d07e541073eb9a84d49ecffb831c3cbb970bcd8cd8de8431e935bf66c2e"}, - {file = "grpcio-1.42.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:7a3c9b8e13365529f9426d4754085e8a9c2ad718a41a46a97e4e30e87bb45eae"}, - {file = "grpcio-1.42.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:66f910b6324ae69625e63db2eb29d833c307cfa36736fe13d2f841656c5f658f"}, - {file = "grpcio-1.42.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:59163b8d2e0d85f0ecbee52b348f867eec7e0f909177564fb3956363f7e616e5"}, - {file = "grpcio-1.42.0-cp36-cp36m-manylinux_2_17_aarch64.whl", hash = "sha256:d92c1721c7981812d0f42dfc8248b15d3b6a2ea79eb8870776364423de2aa245"}, - {file = "grpcio-1.42.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65720d2bf05e2b78c4bffe372f13c41845bae5658fd3f5dd300c374dd240e5cb"}, - {file = "grpcio-1.42.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f385e40846ff81d1c6dce98dcc192c7988a46540758804c4a2e6da5a0e3e3e05"}, - {file = "grpcio-1.42.0-cp36-cp36m-win32.whl", hash = "sha256:ea3560ffbfe08327024380508190103937fef25e355d2259f8b5c003a0732f55"}, - {file = "grpcio-1.42.0-cp36-cp36m-win_amd64.whl", hash = "sha256:29fc36c99161ff307c8ca438346b2e36f81dac5ecdbabc983d0b255d7913fb19"}, - {file = "grpcio-1.42.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:76b5fa4c6d88f804456e763461cf7a1db38b200669f1ba00c579014ab5aa7965"}, - {file = "grpcio-1.42.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:d1451a8c0c01c5b5fdfeb8f777820cb277fb5d797d972f57a41bb82483c44a79"}, - {file = "grpcio-1.42.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6655df5f31664bac4cd6c9b52f389fd92cd10025504ad83685038f47e11e29d8"}, - {file = "grpcio-1.42.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:5b9f0c4822e3a52a1663a315752c6bbdbed0ec15a660d3e64137335acbb5b7ce"}, - {file = "grpcio-1.42.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:7742606ac2bc03ed10360f4f630e0cc01dce864fe63557254e9adea21bb51416"}, - {file = "grpcio-1.42.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:603d71de14ab1f1fd1254b69ceda73545943461b1f51f82fda9477503330b6ea"}, - {file = "grpcio-1.42.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d08ce780bbd8d1a442d855bd681ed0f7483c65d2c8ed83701a9ea4f13678411f"}, - {file = "grpcio-1.42.0-cp37-cp37m-win32.whl", hash = "sha256:2aba7f93671ec971c5c70db81633b49a2f974aa09a2d811aede344a32bad1896"}, - {file = "grpcio-1.42.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2956da789d74fc35d2c869b3aa45dbf41c5d862c056ca8b5e35a688347ede809"}, - {file = "grpcio-1.42.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:21aa4a111b3381d3dd982a3df62348713b29f651aa9f6dfbc9415adbfe28d2ba"}, - {file = "grpcio-1.42.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a6f9ed5320b93c029615b75f6c8caf2c76aa6545d8845f3813908892cfc5f84e"}, - {file = "grpcio-1.42.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:3a13953e12dc40ee247b5fe6ef22b5fac8f040a76b814a11bf9f423e82402f28"}, - {file = "grpcio-1.42.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:f721b42a20d886c03d9b1f461b228cdaf02ccf6c4550e263f7fd3ce3ff19a8f1"}, - {file = "grpcio-1.42.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:e2d9c6690d4c88cd51ee395d7ba5bd1d26d7c37e94cb59e7fd62ff21ecaf891d"}, - {file = "grpcio-1.42.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7f66eb220898787d7821a7931e35ae2512ed74f79f75adcd7ea2fb3119ca87d"}, - {file = "grpcio-1.42.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2e3f250e5398bf474c6e140df1b67494bf1e31c5277b5bf93841a564cbc22d0"}, - {file = "grpcio-1.42.0-cp38-cp38-win32.whl", hash = "sha256:06d5364e85e0fa50ee68bffd9c93a6aff869a91c68f1fd7ba1b944e063a0ff9f"}, - {file = "grpcio-1.42.0-cp38-cp38-win_amd64.whl", hash = "sha256:d58b3774ee2084c31aad140586a42e18328d9823959ca006a0b85ad7937fe405"}, - {file = "grpcio-1.42.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:b74bbac7e039cf23ed0c8edd820c31e90a52a22e28a03d45274a0956addde8d2"}, - {file = "grpcio-1.42.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2b264cf303a22c46f8d455f42425c546ad6ce22f183debb8d64226ddf1e039f4"}, - {file = "grpcio-1.42.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:64f2b3e6474e2ad865478b64f0850d15842acbb2623de5f78a60ceabe00c63e0"}, - {file = "grpcio-1.42.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:bf916ee93ea2fd52b5286ed4e19cbbde5e82754914379ea91dc5748550df3b4e"}, - {file = "grpcio-1.42.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:6ef72f0abdb89fb7c366a99e04823ecae5cda9f762f2234f42fc280447277cd6"}, - {file = "grpcio-1.42.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47ab65be9ba7a0beee94bbe2fb1dd03cb7832db9df4d1f8fae215a16b3edeb5e"}, - {file = "grpcio-1.42.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0209f30741de1875413f40e89bec9c647e7afad4a3549a6a1682c1ee23da68ca"}, - {file = "grpcio-1.42.0-cp39-cp39-win32.whl", hash = "sha256:5441d343602ce10ba48fcb36bb5de197a15a01dc9ee0f71c2a73cd5cd3d7f5ac"}, - {file = "grpcio-1.42.0-cp39-cp39-win_amd64.whl", hash = "sha256:17433f7eb01737240581b33fbc2eae7b7fa6d3429571782580bceaf05ec56cb8"}, - {file = "grpcio-1.42.0.tar.gz", hash = "sha256:4a8f2c7490fe3696e0cdd566e2f099fb91b51bc75446125175c55581c2f7bc11"}, -] -heapdict = [ - {file = "HeapDict-1.0.1-py3-none-any.whl", hash = "sha256:6065f90933ab1bb7e50db403b90cab653c853690c5992e69294c2de2b253fc92"}, - {file = "HeapDict-1.0.1.tar.gz", hash = "sha256:8495f57b3e03d8e46d5f1b2cc62ca881aca392fd5cc048dc0aa2e1a6d23ecdb6"}, -] -httplib2 = [ - {file = "httplib2-0.20.4-py3-none-any.whl", hash = "sha256:8b6a905cb1c79eefd03f8669fd993c36dc341f7c558f056cb5a33b5c2f458543"}, - {file = "httplib2-0.20.4.tar.gz", hash = "sha256:58a98e45b4b1a48273073f905d2961666ecf0fbac4250ea5b47aef259eb5c585"}, -] -hvac = [ - {file = "hvac-0.11.2-py2.py3-none-any.whl", hash = "sha256:3e8a34804b1e20954a2b4991cc13ed9c09b32e50dadd9d3438224481150f6568"}, - {file = "hvac-0.11.2.tar.gz", hash = "sha256:f905c59d32d88d3f67571fe5a8a78de4659e04798ad809de439f667247d13626"}, -] -identify = [ - {file = "identify-2.5.3-py2.py3-none-any.whl", hash = "sha256:25851c8c1370effb22aaa3c987b30449e9ff0cece408f810ae6ce408fdd20893"}, - {file = "identify-2.5.3.tar.gz", hash = "sha256:887e7b91a1be152b0d46bbf072130235a8117392b9f1828446079a816a05ef44"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -ipeadatapy = [ - {file = "ipeadatapy-0.1.7-py3-none-any.whl", hash = "sha256:0de48658c0cd49d30fa23f69ef33ea954aea05b888051acca98afffc22b07ed5"}, - {file = "ipeadatapy-0.1.7.tar.gz", hash = "sha256:f5eff1d34769ea14f7cb26ed6899991f18df9dfa20d9a3c134d1ebcb72424dbc"}, -] -jinja2 = [ - {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, - {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, -] -kiwisolver = [ - {file = "kiwisolver-1.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e395ece147f0692ca7cdb05a028d31b83b72c369f7b4a2c1798f4b96af1e3d8"}, - {file = "kiwisolver-1.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b7f50a1a25361da3440f07c58cd1d79957c2244209e4f166990e770256b6b0b"}, - {file = "kiwisolver-1.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c032c41ae4c3a321b43a3650e6ecc7406b99ff3e5279f24c9b310f41bc98479"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1dcade8f6fe12a2bb4efe2cbe22116556e3b6899728d3b2a0d3b367db323eacc"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e45e780a74416ef2f173189ef4387e44b5494f45e290bcb1f03735faa6779bf"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d2bb56309fb75a811d81ed55fbe2208aa77a3a09ff5f546ca95e7bb5fac6eff"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b2d6c12f2ad5f55104a36a356192cfb680c049fe5e7c1f6620fc37f119cdc2"}, - {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:262c248c60f22c2b547683ad521e8a3db5909c71f679b93876921549107a0c24"}, - {file = "kiwisolver-1.4.2-cp310-cp310-win32.whl", hash = "sha256:1008346a7741620ab9cc6c96e8ad9b46f7a74ce839dbb8805ddf6b119d5fc6c2"}, - {file = "kiwisolver-1.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:6ece2e12e4b57bc5646b354f436416cd2a6f090c1dadcd92b0ca4542190d7190"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b978afdb913ca953cf128d57181da2e8798e8b6153be866ae2a9c446c6162f40"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f88c4b8e449908eeddb3bbd4242bd4dc2c7a15a7aa44bb33df893203f02dc2d"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e348f1904a4fab4153407f7ccc27e43b2a139752e8acf12e6640ba683093dd96"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c839bf28e45d7ddad4ae8f986928dbf5a6d42ff79760d54ec8ada8fb263e097c"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8ae5a071185f1a93777c79a9a1e67ac46544d4607f18d07131eece08d415083a"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c222f91a45da9e01a9bc4f760727ae49050f8e8345c4ff6525495f7a164c8973"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:a4e8f072db1d6fb7a7cc05a6dbef8442c93001f4bb604f1081d8c2db3ca97159"}, - {file = "kiwisolver-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:be9a650890fb60393e60aacb65878c4a38bb334720aa5ecb1c13d0dac54dd73b"}, - {file = "kiwisolver-1.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ec2e55bf31b43aabe32089125dca3b46fdfe9f50afbf0756ae11e14c97b80ca"}, - {file = "kiwisolver-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d1078ba770d6165abed3d9a1be1f9e79b61515de1dd00d942fa53bba79f01ae"}, - {file = "kiwisolver-1.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cbb5eb4a2ea1ffec26268d49766cafa8f957fe5c1b41ad00733763fae77f9436"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e6cda72db409eefad6b021e8a4f964965a629f577812afc7860c69df7bdb84a"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1605c7c38cc6a85212dfd6a641f3905a33412e49f7c003f35f9ac6d71f67720"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81237957b15469ea9151ec8ca08ce05656090ffabc476a752ef5ad7e2644c526"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:240009fdf4fa87844f805e23f48995537a8cb8f8c361e35fda6b5ac97fcb906f"}, - {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:240c2d51d098395c012ddbcb9bd7b3ba5de412a1d11840698859f51d0e643c4f"}, - {file = "kiwisolver-1.4.2-cp38-cp38-win32.whl", hash = "sha256:8b6086aa6936865962b2cee0e7aaecf01ab6778ce099288354a7229b4d9f1408"}, - {file = "kiwisolver-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:0d98dca86f77b851350c250f0149aa5852b36572514d20feeadd3c6b1efe38d0"}, - {file = "kiwisolver-1.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:91eb4916271655dfe3a952249cb37a5c00b6ba68b4417ee15af9ba549b5ba61d"}, - {file = "kiwisolver-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa4d97d7d2b2c082e67907c0b8d9f31b85aa5d3ba0d33096b7116f03f8061261"}, - {file = "kiwisolver-1.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:71469b5845b9876b8d3d252e201bef6f47bf7456804d2fbe9a1d6e19e78a1e65"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8ff3033e43e7ca1389ee59fb7ecb8303abb8713c008a1da49b00869e92e3dd7c"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89b57c2984f4464840e4b768affeff6b6809c6150d1166938ade3e22fbe22db8"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffbdb9a96c536f0405895b5e21ee39ec579cb0ed97bdbd169ae2b55f41d73219"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a830a03970c462d1a2311c90e05679da56d3bd8e78a4ba9985cb78ef7836c9f"}, - {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f74f2a13af201559e3d32b9ddfc303c94ae63d63d7f4326d06ce6fe67e7a8255"}, - {file = "kiwisolver-1.4.2-cp39-cp39-win32.whl", hash = "sha256:e677cc3626287f343de751e11b1e8a5b915a6ac897e8aecdbc996cd34de753a0"}, - {file = "kiwisolver-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b3e251e5c38ac623c5d786adb21477f018712f8c6fa54781bd38aa1c60b60fc2"}, - {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c380bb5ae20d829c1a5473cfcae64267b73aaa4060adc091f6df1743784aae0"}, - {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:484f2a5f0307bc944bc79db235f41048bae4106ffa764168a068d88b644b305d"}, - {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8afdf533b613122e4bbaf3c1e42c2a5e9e2d1dd3a0a017749a7658757cb377"}, - {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42f6ef9b640deb6f7d438e0a371aedd8bef6ddfde30683491b2e6f568b4e884e"}, - {file = "kiwisolver-1.4.2.tar.gz", hash = "sha256:7f606d91b8a8816be476513a77fd30abe66227039bd6f8b406c348cb0247dcc9"}, -] -locket = [ - {file = "locket-0.2.1-py2.py3-none-any.whl", hash = "sha256:12b6ada59d1f50710bca9704dbadd3f447dbf8dac6664575c1281cadab8e6449"}, - {file = "locket-0.2.1.tar.gz", hash = "sha256:3e1faba403619fe201552f083f1ecbf23f550941bc51985ac6ed4d02d25056dd"}, -] -loguru = [ - {file = "loguru-0.6.0-py3-none-any.whl", hash = "sha256:4e2414d534a2ab57573365b3e6d0234dfb1d84b68b7f3b948e6fb743860a77c3"}, - {file = "loguru-0.6.0.tar.gz", hash = "sha256:066bd06758d0a513e9836fd9c6b5a75bfb3fd36841f4b996bc60b547a309d41c"}, -] -markupsafe = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, -] -marshmallow = [ - {file = "marshmallow-3.14.1-py3-none-any.whl", hash = "sha256:04438610bc6dadbdddb22a4a55bcc7f6f8099e69580b2e67f5a681933a1f4400"}, - {file = "marshmallow-3.14.1.tar.gz", hash = "sha256:4c05c1684e0e97fe779c62b91878f173b937fe097b356cd82f793464f5bc6138"}, -] -marshmallow-oneofschema = [ - {file = "marshmallow-oneofschema-3.0.1.tar.gz", hash = "sha256:62cd2099b29188c92493c2940ee79d1bf2f2619a71721664e5a98ec2faa58237"}, - {file = "marshmallow_oneofschema-3.0.1-py2.py3-none-any.whl", hash = "sha256:bd29410a9f2f7457a2b428286e2a80ef76b8ddc3701527dc1f935a88914b02f2"}, -] -matplotlib = [ - {file = "matplotlib-3.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:03bbb3f5f78836855e127b5dab228d99551ad0642918ccbf3067fcd52ac7ac5e"}, - {file = "matplotlib-3.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49a5938ed6ef9dda560f26ea930a2baae11ea99e1c2080c8714341ecfda72a89"}, - {file = "matplotlib-3.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:77157be0fc4469cbfb901270c205e7d8adb3607af23cef8bd11419600647ceed"}, - {file = "matplotlib-3.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5844cea45d804174bf0fac219b4ab50774e504bef477fc10f8f730ce2d623441"}, - {file = "matplotlib-3.5.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c87973ddec10812bddc6c286b88fdd654a666080fbe846a1f7a3b4ba7b11ab78"}, - {file = "matplotlib-3.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a05f2b37222319753a5d43c0a4fd97ed4ff15ab502113e3f2625c26728040cf"}, - {file = "matplotlib-3.5.2-cp310-cp310-win32.whl", hash = "sha256:9776e1a10636ee5f06ca8efe0122c6de57ffe7e8c843e0fb6e001e9d9256ec95"}, - {file = "matplotlib-3.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:b4fedaa5a9aa9ce14001541812849ed1713112651295fdddd640ea6620e6cf98"}, - {file = "matplotlib-3.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ee175a571e692fc8ae8e41ac353c0e07259113f4cb063b0ec769eff9717e84bb"}, - {file = "matplotlib-3.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e8bda1088b941ead50caabd682601bece983cadb2283cafff56e8fcddbf7d7f"}, - {file = "matplotlib-3.5.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9480842d5aadb6e754f0b8f4ebeb73065ac8be1855baa93cd082e46e770591e9"}, - {file = "matplotlib-3.5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6c623b355d605a81c661546af7f24414165a8a2022cddbe7380a31a4170fa2e9"}, - {file = "matplotlib-3.5.2-cp37-cp37m-win32.whl", hash = "sha256:a91426ae910819383d337ba0dc7971c7cefdaa38599868476d94389a329e599b"}, - {file = "matplotlib-3.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c4b82c2ae6d305fcbeb0eb9c93df2602ebd2f174f6e8c8a5d92f9445baa0c1d3"}, - {file = "matplotlib-3.5.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ebc27ad11df3c1661f4677a7762e57a8a91dd41b466c3605e90717c9a5f90c82"}, - {file = "matplotlib-3.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a32ea6e12e80dedaca2d4795d9ed40f97bfa56e6011e14f31502fdd528b9c89"}, - {file = "matplotlib-3.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2a0967d4156adbd0d46db06bc1a877f0370bce28d10206a5071f9ecd6dc60b79"}, - {file = "matplotlib-3.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2b696699386766ef171a259d72b203a3c75d99d03ec383b97fc2054f52e15cf"}, - {file = "matplotlib-3.5.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7f409716119fa39b03da3d9602bd9b41142fab7a0568758cd136cd80b1bf36c8"}, - {file = "matplotlib-3.5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b8d3f4e71e26307e8c120b72c16671d70c5cd08ae412355c11254aa8254fb87f"}, - {file = "matplotlib-3.5.2-cp38-cp38-win32.whl", hash = "sha256:b6c63cd01cad0ea8704f1fd586e9dc5777ccedcd42f63cbbaa3eae8dd41172a1"}, - {file = "matplotlib-3.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:75c406c527a3aa07638689586343f4b344fcc7ab1f79c396699eb550cd2b91f7"}, - {file = "matplotlib-3.5.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4a44cdfdb9d1b2f18b1e7d315eb3843abb097869cd1ef89cfce6a488cd1b5182"}, - {file = "matplotlib-3.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3d8e129af95b156b41cb3be0d9a7512cc6d73e2b2109f82108f566dbabdbf377"}, - {file = "matplotlib-3.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:364e6bca34edc10a96aa3b1d7cd76eb2eea19a4097198c1b19e89bee47ed5781"}, - {file = "matplotlib-3.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea75df8e567743207e2b479ba3d8843537be1c146d4b1e3e395319a4e1a77fe9"}, - {file = "matplotlib-3.5.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:44c6436868186564450df8fd2fc20ed9daaef5caad699aa04069e87099f9b5a8"}, - {file = "matplotlib-3.5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d7705022df2c42bb02937a2a824f4ec3cca915700dd80dc23916af47ff05f1a"}, - {file = "matplotlib-3.5.2-cp39-cp39-win32.whl", hash = "sha256:ee0b8e586ac07f83bb2950717e66cb305e2859baf6f00a9c39cc576e0ce9629c"}, - {file = "matplotlib-3.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:c772264631e5ae61f0bd41313bbe48e1b9bcc95b974033e1118c9caa1a84d5c6"}, - {file = "matplotlib-3.5.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:751d3815b555dcd6187ad35b21736dc12ce6925fc3fa363bbc6dc0f86f16484f"}, - {file = "matplotlib-3.5.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:31fbc2af27ebb820763f077ec7adc79b5a031c2f3f7af446bd7909674cd59460"}, - {file = "matplotlib-3.5.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4fa28ca76ac5c2b2d54bc058b3dad8e22ee85d26d1ee1b116a6fd4d2277b6a04"}, - {file = "matplotlib-3.5.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:24173c23d1bcbaed5bf47b8785d27933a1ac26a5d772200a0f3e0e38f471b001"}, - {file = "matplotlib-3.5.2.tar.gz", hash = "sha256:48cf850ce14fa18067f2d9e0d646763681948487a8080ec0af2686468b4607a2"}, -] -more-itertools = [ - {file = "more-itertools-8.13.0.tar.gz", hash = "sha256:a42901a0a5b169d925f6f217cd5a190e32ef54360905b9c39ee7db5313bfec0f"}, - {file = "more_itertools-8.13.0-py3-none-any.whl", hash = "sha256:c5122bffc5f104d37c1626b8615b511f3427aa5389b94d61e5ef8236bfbc3ddb"}, -] -msgpack = [ - {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:96acc674bb9c9be63fa8b6dabc3248fdc575c4adc005c440ad02f87ca7edd079"}, - {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c3ca57c96c8e69c1a0d2926a6acf2d9a522b41dc4253a8945c4c6cd4981a4e3"}, - {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0a792c091bac433dfe0a70ac17fc2087d4595ab835b47b89defc8bbabcf5c73"}, - {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c58cdec1cb5fcea8c2f1771d7b5fec79307d056874f746690bd2bdd609ab147"}, - {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f97c0f35b3b096a330bb4a1a9247d0bd7e1f3a2eba7ab69795501504b1c2c39"}, - {file = "msgpack-1.0.3-cp310-cp310-win32.whl", hash = "sha256:36a64a10b16c2ab31dcd5f32d9787ed41fe68ab23dd66957ca2826c7f10d0b85"}, - {file = "msgpack-1.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c1ba333b4024c17c7591f0f372e2daa3c31db495a9b2af3cf664aef3c14354f7"}, - {file = "msgpack-1.0.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c2140cf7a3ec475ef0938edb6eb363fa704159e0bf71dde15d953bacc1cf9d7d"}, - {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f4c22717c74d44bcd7af353024ce71c6b55346dad5e2cc1ddc17ce8c4507c6b"}, - {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d733a15ade190540c703de209ffbc42a3367600421b62ac0c09fde594da6ec"}, - {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7e03b06f2982aa98d4ddd082a210c3db200471da523f9ac197f2828e80e7770"}, - {file = "msgpack-1.0.3-cp36-cp36m-win32.whl", hash = "sha256:3d875631ecab42f65f9dce6f55ce6d736696ced240f2634633188de2f5f21af9"}, - {file = "msgpack-1.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:40fb89b4625d12d6027a19f4df18a4de5c64f6f3314325049f219683e07e678a"}, - {file = "msgpack-1.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6eef0cf8db3857b2b556213d97dd82de76e28a6524853a9beb3264983391dc1a"}, - {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d8c332f53ffff01953ad25131272506500b14750c1d0ce8614b17d098252fbc"}, - {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c0903bd93cbd34653dd63bbfcb99d7539c372795201f39d16fdfde4418de43a"}, - {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf1e6bfed4860d72106f4e0a1ab519546982b45689937b40257cfd820650b920"}, - {file = "msgpack-1.0.3-cp37-cp37m-win32.whl", hash = "sha256:d02cea2252abc3756b2ac31f781f7a98e89ff9759b2e7450a1c7a0d13302ff50"}, - {file = "msgpack-1.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f30dd0dc4dfe6231ad253b6f9f7128ac3202ae49edd3f10d311adc358772dba"}, - {file = "msgpack-1.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f201d34dc89342fabb2a10ed7c9a9aaaed9b7af0f16a5923f1ae562b31258dea"}, - {file = "msgpack-1.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bb87f23ae7d14b7b3c21009c4b1705ec107cb21ee71975992f6aca571fb4a42a"}, - {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a3a5c4b16e9d0edb823fe54b59b5660cc8d4782d7bf2c214cb4b91a1940a8ef"}, - {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74da1e5fcf20ade12c6bf1baa17a2dc3604958922de8dc83cbe3eff22e8b611"}, - {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73a80bd6eb6bcb338c1ec0da273f87420829c266379c8c82fa14c23fb586cfa1"}, - {file = "msgpack-1.0.3-cp38-cp38-win32.whl", hash = "sha256:9fce00156e79af37bb6db4e7587b30d11e7ac6a02cb5bac387f023808cd7d7f4"}, - {file = "msgpack-1.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:9b6f2d714c506e79cbead331de9aae6837c8dd36190d02da74cb409b36162e8a"}, - {file = "msgpack-1.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:89908aea5f46ee1474cc37fbc146677f8529ac99201bc2faf4ef8edc023c2bf3"}, - {file = "msgpack-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:973ad69fd7e31159eae8f580f3f707b718b61141838321c6fa4d891c4a2cca52"}, - {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da24375ab4c50e5b7486c115a3198d207954fe10aaa5708f7b65105df09109b2"}, - {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a598d0685e4ae07a0672b59792d2cc767d09d7a7f39fd9bd37ff84e060b1a996"}, - {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4c309a68cb5d6bbd0c50d5c71a25ae81f268c2dc675c6f4ea8ab2feec2ac4e2"}, - {file = "msgpack-1.0.3-cp39-cp39-win32.whl", hash = "sha256:494471d65b25a8751d19c83f1a482fd411d7ca7a3b9e17d25980a74075ba0e88"}, - {file = "msgpack-1.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:f01b26c2290cbd74316990ba84a14ac3d599af9cebefc543d241a66e785cf17d"}, - {file = "msgpack-1.0.3.tar.gz", hash = "sha256:51fdc7fb93615286428ee7758cecc2f374d5ff363bdd884c7ea622a7a327a81e"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -nodeenv = [ - {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, - {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, -] -numpy = [ - {file = "numpy-1.21.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8890b3360f345e8360133bc078d2dacc2843b6ee6059b568781b15b97acbe39f"}, - {file = "numpy-1.21.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:69077388c5a4b997442b843dbdc3a85b420fb693ec8e33020bb24d647c164fa5"}, - {file = "numpy-1.21.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e89717274b41ebd568cd7943fc9418eeb49b1785b66031bc8a7f6300463c5898"}, - {file = "numpy-1.21.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b78ecfa070460104934e2caf51694ccd00f37d5e5dbe76f021b1b0b0d221823"}, - {file = "numpy-1.21.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:615d4e328af7204c13ae3d4df7615a13ff60a49cb0d9106fde07f541207883ca"}, - {file = "numpy-1.21.4-cp310-cp310-win_amd64.whl", hash = "sha256:1403b4e2181fc72664737d848b60e65150f272fe5a1c1cbc16145ed43884065a"}, - {file = "numpy-1.21.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:74b85a17528ca60cf98381a5e779fc0264b4a88b46025e6bcbe9621f46bb3e63"}, - {file = "numpy-1.21.4-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92aafa03da8658609f59f18722b88f0a73a249101169e28415b4fa148caf7e41"}, - {file = "numpy-1.21.4-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5d95668e727c75b3f5088ec7700e260f90ec83f488e4c0aaccb941148b2cd377"}, - {file = "numpy-1.21.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5162ec777ba7138906c9c274353ece5603646c6965570d82905546579573f73"}, - {file = "numpy-1.21.4-cp37-cp37m-win32.whl", hash = "sha256:81225e58ef5fce7f1d80399575576fc5febec79a8a2742e8ef86d7b03beef49f"}, - {file = "numpy-1.21.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32fe5b12061f6446adcbb32cf4060a14741f9c21e15aaee59a207b6ce6423469"}, - {file = "numpy-1.21.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c449eb870616a7b62e097982c622d2577b3dbc800aaf8689254ec6e0197cbf1e"}, - {file = "numpy-1.21.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2e4ed57f45f0aa38beca2a03b6532e70e548faf2debbeb3291cfc9b315d9be8f"}, - {file = "numpy-1.21.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1247ef28387b7bb7f21caf2dbe4767f4f4175df44d30604d42ad9bd701ebb31f"}, - {file = "numpy-1.21.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34f3456f530ae8b44231c63082c8899fe9c983fd9b108c997c4b1c8c2d435333"}, - {file = "numpy-1.21.4-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c9c23158b87ed0e70d9a50c67e5c0b3f75bcf2581a8e34668d4e9d7474d76c6"}, - {file = "numpy-1.21.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4799be6a2d7d3c33699a6f77201836ac975b2e1b98c2a07f66a38f499cb50ce"}, - {file = "numpy-1.21.4-cp38-cp38-win32.whl", hash = "sha256:bc988afcea53e6156546e5b2885b7efab089570783d9d82caf1cfd323b0bb3dd"}, - {file = "numpy-1.21.4-cp38-cp38-win_amd64.whl", hash = "sha256:170b2a0805c6891ca78c1d96ee72e4c3ed1ae0a992c75444b6ab20ff038ba2cd"}, - {file = "numpy-1.21.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fde96af889262e85aa033f8ee1d3241e32bf36228318a61f1ace579df4e8170d"}, - {file = "numpy-1.21.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c885bfc07f77e8fee3dc879152ba993732601f1f11de248d4f357f0ffea6a6d4"}, - {file = "numpy-1.21.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e6f5f50d1eff2f2f752b3089a118aee1ea0da63d56c44f3865681009b0af162"}, - {file = "numpy-1.21.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ad010846cdffe7ec27e3f933397f8a8d6c801a48634f419e3d075db27acf5880"}, - {file = "numpy-1.21.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c74c699b122918a6c4611285cc2cad4a3aafdb135c22a16ec483340ef97d573c"}, - {file = "numpy-1.21.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9864424631775b0c052f3bd98bc2712d131b3e2cd95d1c0c68b91709170890b0"}, - {file = "numpy-1.21.4-cp39-cp39-win32.whl", hash = "sha256:b1e2312f5b8843a3e4e8224b2b48fe16119617b8fc0a54df8f50098721b5bed2"}, - {file = "numpy-1.21.4-cp39-cp39-win_amd64.whl", hash = "sha256:e3c3e990274444031482a31280bf48674441e0a5b55ddb168f3a6db3e0c38ec8"}, - {file = "numpy-1.21.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a3deb31bc84f2b42584b8c4001c85d1934dbfb4030827110bc36bfd11509b7bf"}, - {file = "numpy-1.21.4.zip", hash = "sha256:e6c76a87633aa3fa16614b61ccedfae45b91df2767cf097aa9c933932a7ed1e0"}, -] -oauth2client = [ - {file = "oauth2client-4.1.3-py2.py3-none-any.whl", hash = "sha256:b8a81cc5d60e2d364f0b1b98f958dbd472887acaf1a5b05e21c28c31a2d6d3ac"}, - {file = "oauth2client-4.1.3.tar.gz", hash = "sha256:d486741e451287f69568a4d26d70d9acd73a2bbfa275746c535b4209891cccc6"}, -] -oauthlib = [ - {file = "oauthlib-3.1.1-py2.py3-none-any.whl", hash = "sha256:42bf6354c2ed8c6acb54d971fce6f88193d97297e18602a3a886603f9d7730cc"}, - {file = "oauthlib-3.1.1.tar.gz", hash = "sha256:8f0215fcc533dd8dd1bee6f4c412d4f0cd7297307d43ac61666389e3bc3198a3"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pandas = [ - {file = "pandas-1.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e9dbacd22555c2d47f262ef96bb4e30880e5956169741400af8b306bbb24a273"}, - {file = "pandas-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e2b83abd292194f350bb04e188f9379d36b8dfac24dd445d5c87575f3beaf789"}, - {file = "pandas-1.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2552bffc808641c6eb471e55aa6899fa002ac94e4eebfa9ec058649122db5824"}, - {file = "pandas-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fc87eac0541a7d24648a001d553406f4256e744d92df1df8ebe41829a915028"}, - {file = "pandas-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0d8fd58df5d17ddb8c72a5075d87cd80d71b542571b5f78178fb067fa4e9c72"}, - {file = "pandas-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:4aed257c7484d01c9a194d9a94758b37d3d751849c05a0050c087a358c41ad1f"}, - {file = "pandas-1.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:375262829c8c700c3e7cbb336810b94367b9c4889818bbd910d0ecb4e45dc261"}, - {file = "pandas-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc3cd122bea268998b79adebbb8343b735a5511ec14efb70a39e7acbc11ccbdc"}, - {file = "pandas-1.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4f5a82afa4f1ff482ab8ded2ae8a453a2cdfde2001567b3ca24a4c5c5ca0db3"}, - {file = "pandas-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8092a368d3eb7116e270525329a3e5c15ae796ccdf7ccb17839a73b4f5084a39"}, - {file = "pandas-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6257b314fc14958f8122779e5a1557517b0f8e500cfb2bd53fa1f75a8ad0af2"}, - {file = "pandas-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:82ae615826da838a8e5d4d630eb70c993ab8636f0eff13cb28aafc4291b632b5"}, - {file = "pandas-1.5.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:457d8c3d42314ff47cc2d6c54f8fc0d23954b47977b2caed09cd9635cb75388b"}, - {file = "pandas-1.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c009a92e81ce836212ce7aa98b219db7961a8b95999b97af566b8dc8c33e9519"}, - {file = "pandas-1.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:71f510b0efe1629bf2f7c0eadb1ff0b9cf611e87b73cd017e6b7d6adb40e2b3a"}, - {file = "pandas-1.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a40dd1e9f22e01e66ed534d6a965eb99546b41d4d52dbdb66565608fde48203f"}, - {file = "pandas-1.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ae7e989f12628f41e804847a8cc2943d362440132919a69429d4dea1f164da0"}, - {file = "pandas-1.5.2-cp38-cp38-win32.whl", hash = "sha256:530948945e7b6c95e6fa7aa4be2be25764af53fba93fe76d912e35d1c9ee46f5"}, - {file = "pandas-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:73f219fdc1777cf3c45fde7f0708732ec6950dfc598afc50588d0d285fddaefc"}, - {file = "pandas-1.5.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9608000a5a45f663be6af5c70c3cbe634fa19243e720eb380c0d378666bc7702"}, - {file = "pandas-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:315e19a3e5c2ab47a67467fc0362cb36c7c60a93b6457f675d7d9615edad2ebe"}, - {file = "pandas-1.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e18bc3764cbb5e118be139b3b611bc3fbc5d3be42a7e827d1096f46087b395eb"}, - {file = "pandas-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0183cb04a057cc38fde5244909fca9826d5d57c4a5b7390c0cc3fa7acd9fa883"}, - {file = "pandas-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:344021ed3e639e017b452aa8f5f6bf38a8806f5852e217a7594417fb9bbfa00e"}, - {file = "pandas-1.5.2-cp39-cp39-win32.whl", hash = "sha256:e7469271497960b6a781eaa930cba8af400dd59b62ec9ca2f4d31a19f2f91090"}, - {file = "pandas-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:c218796d59d5abd8780170c937b812c9637e84c32f8271bbf9845970f8c1351f"}, - {file = "pandas-1.5.2.tar.gz", hash = "sha256:220b98d15cee0b2cd839a6358bd1f273d0356bf964c1a1aeb32d47db0215488b"}, -] -pandas-gbq = [ - {file = "pandas-gbq-0.17.4.tar.gz", hash = "sha256:70ac57cc6ebf9d1e1c1c810f5ccac710163acd4c3d13e8badea27bb66fae19f7"}, - {file = "pandas_gbq-0.17.4-py2.py3-none-any.whl", hash = "sha256:3b3714167bdc4b1a6013ff6286a452727efbceb412922a2ca39aa996e8e8b129"}, -] -pandavro = [ - {file = "pandavro-1.6.0.tar.gz", hash = "sha256:d098da34529fbb20de5fd1a6f231918d1b60941b25bea5dc87897ef0d472cb6f"}, -] -partd = [ - {file = "partd-1.2.0-py3-none-any.whl", hash = "sha256:5c3a5d70da89485c27916328dc1e26232d0e270771bd4caef4a5124b6a457288"}, - {file = "partd-1.2.0.tar.gz", hash = "sha256:aa67897b84d522dcbc86a98b942afab8c6aa2f7f677d904a616b74ef5ddbc3eb"}, -] -pendulum = [ - {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, - {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, - {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, - {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, - {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, - {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, - {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, - {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, - {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, - {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, - {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, - {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, - {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, - {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, - {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, - {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, - {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, - {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, - {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, - {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, - {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, -] -pillow = [ - {file = "Pillow-9.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af79d3fde1fc2e33561166d62e3b63f0cc3e47b5a3a2e5fea40d4917754734ea"}, - {file = "Pillow-9.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:55dd1cf09a1fd7c7b78425967aacae9b0d70125f7d3ab973fadc7b5abc3de652"}, - {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66822d01e82506a19407d1afc104c3fcea3b81d5eb11485e593ad6b8492f995a"}, - {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5eaf3b42df2bcda61c53a742ee2c6e63f777d0e085bbc6b2ab7ed57deb13db7"}, - {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01ce45deec9df310cbbee11104bae1a2a43308dd9c317f99235b6d3080ddd66e"}, - {file = "Pillow-9.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aea7ce61328e15943d7b9eaca87e81f7c62ff90f669116f857262e9da4057ba3"}, - {file = "Pillow-9.1.0-cp310-cp310-win32.whl", hash = "sha256:7a053bd4d65a3294b153bdd7724dce864a1d548416a5ef61f6d03bf149205160"}, - {file = "Pillow-9.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:97bda660702a856c2c9e12ec26fc6d187631ddfd896ff685814ab21ef0597033"}, - {file = "Pillow-9.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:21dee8466b42912335151d24c1665fcf44dc2ee47e021d233a40c3ca5adae59c"}, - {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b6d4050b208c8ff886fd3db6690bf04f9a48749d78b41b7a5bf24c236ab0165"}, - {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5cfca31ab4c13552a0f354c87fbd7f162a4fafd25e6b521bba93a57fe6a3700a"}, - {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed742214068efa95e9844c2d9129e209ed63f61baa4d54dbf4cf8b5e2d30ccf2"}, - {file = "Pillow-9.1.0-cp37-cp37m-win32.whl", hash = "sha256:c9efef876c21788366ea1f50ecb39d5d6f65febe25ad1d4c0b8dff98843ac244"}, - {file = "Pillow-9.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:de344bcf6e2463bb25179d74d6e7989e375f906bcec8cb86edb8b12acbc7dfef"}, - {file = "Pillow-9.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:17869489de2fce6c36690a0c721bd3db176194af5f39249c1ac56d0bb0fcc512"}, - {file = "Pillow-9.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:25023a6209a4d7c42154073144608c9a71d3512b648a2f5d4465182cb93d3477"}, - {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8782189c796eff29dbb37dd87afa4ad4d40fc90b2742704f94812851b725964b"}, - {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:463acf531f5d0925ca55904fa668bb3461c3ef6bc779e1d6d8a488092bdee378"}, - {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f42364485bfdab19c1373b5cd62f7c5ab7cc052e19644862ec8f15bb8af289e"}, - {file = "Pillow-9.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3fddcdb619ba04491e8f771636583a7cc5a5051cd193ff1aa1ee8616d2a692c5"}, - {file = "Pillow-9.1.0-cp38-cp38-win32.whl", hash = "sha256:4fe29a070de394e449fd88ebe1624d1e2d7ddeed4c12e0b31624561b58948d9a"}, - {file = "Pillow-9.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c24f718f9dd73bb2b31a6201e6db5ea4a61fdd1d1c200f43ee585fc6dcd21b34"}, - {file = "Pillow-9.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fb89397013cf302f282f0fc998bb7abf11d49dcff72c8ecb320f76ea6e2c5717"}, - {file = "Pillow-9.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c870193cce4b76713a2b29be5d8327c8ccbe0d4a49bc22968aa1e680930f5581"}, - {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69e5ddc609230d4408277af135c5b5c8fe7a54b2bdb8ad7c5100b86b3aab04c6"}, - {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35be4a9f65441d9982240e6966c1eaa1c654c4e5e931eaf580130409e31804d4"}, - {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82283af99c1c3a5ba1da44c67296d5aad19f11c535b551a5ae55328a317ce331"}, - {file = "Pillow-9.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a325ac71914c5c043fa50441b36606e64a10cd262de12f7a179620f579752ff8"}, - {file = "Pillow-9.1.0-cp39-cp39-win32.whl", hash = "sha256:a598d8830f6ef5501002ae85c7dbfcd9c27cc4efc02a1989369303ba85573e58"}, - {file = "Pillow-9.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0c51cb9edac8a5abd069fd0758ac0a8bfe52c261ee0e330f363548aca6893595"}, - {file = "Pillow-9.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a336a4f74baf67e26f3acc4d61c913e378e931817cd1e2ef4dfb79d3e051b481"}, - {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb1b89b11256b5b6cad5e7593f9061ac4624f7651f7a8eb4dfa37caa1dfaa4d0"}, - {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:255c9d69754a4c90b0ee484967fc8818c7ff8311c6dddcc43a4340e10cd1636a"}, - {file = "Pillow-9.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5a3ecc026ea0e14d0ad7cd990ea7f48bfcb3eb4271034657dc9d06933c6629a7"}, - {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5b0ff59785d93b3437c3703e3c64c178aabada51dea2a7f2c5eccf1bcf565a3"}, - {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7110ec1701b0bf8df569a7592a196c9d07c764a0a74f65471ea56816f10e2c8"}, - {file = "Pillow-9.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8d79c6f468215d1a8415aa53d9868a6b40c4682165b8cb62a221b1baa47db458"}, - {file = "Pillow-9.1.0.tar.gz", hash = "sha256:f401ed2bbb155e1ade150ccc63db1a4f6c1909d3d378f7d1235a44e90d75fb97"}, -] -platformdirs = [ - {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, - {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, -] -pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, -] -pre-commit = [ - {file = "pre_commit-2.20.0-py2.py3-none-any.whl", hash = "sha256:51a5ba7c480ae8072ecdb6933df22d2f812dc897d5fe848778116129a681aac7"}, - {file = "pre_commit-2.20.0.tar.gz", hash = "sha256:a978dac7bc9ec0bcee55c18a277d553b0f419d259dadb4b9418ff2d00eb43959"}, -] -prefect = [ - {file = "prefect-0.15.9-py3-none-any.whl", hash = "sha256:595c9f229349528f7bcd2aa866c9c10dcfbf059a20803526924339d45604ec76"}, - {file = "prefect-0.15.9.tar.gz", hash = "sha256:52d4d28493cd1a90e1acf96b5a92b2902950849b481a49f762998448a41cf127"}, -] -proto-plus = [ - {file = "proto-plus-1.19.8.tar.gz", hash = "sha256:bdf45f0e0be71510eb2ec9db4da78afde7b5fb8b0a507a36340a9b6ce8e48e58"}, - {file = "proto_plus-1.19.8-py3-none-any.whl", hash = "sha256:3434eadaed845a337d6c488d2b7d055d733aaa231c0c0d4c778ec720bb91cf87"}, -] -protobuf = [ - {file = "protobuf-3.19.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d80f80eb175bf5f1169139c2e0c5ada98b1c098e2b3c3736667f28cbbea39fc8"}, - {file = "protobuf-3.19.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a529e7df52204565bcd33738a7a5f288f3d2d37d86caa5d78c458fa5fabbd54d"}, - {file = "protobuf-3.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28ccea56d4dc38d35cd70c43c2da2f40ac0be0a355ef882242e8586c6d66666f"}, - {file = "protobuf-3.19.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b30a7de128c46b5ecb343917d9fa737612a6e8280f440874e5cc2ba0d79b8f6"}, - {file = "protobuf-3.19.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5935c8ce02e3d89c7900140a8a42b35bc037ec07a6aeb61cc108be8d3c9438a6"}, - {file = "protobuf-3.19.1-cp36-cp36m-win32.whl", hash = "sha256:74f33edeb4f3b7ed13d567881da8e5a92a72b36495d57d696c2ea1ae0cfee80c"}, - {file = "protobuf-3.19.1-cp36-cp36m-win_amd64.whl", hash = "sha256:038daf4fa38a7e818dd61f51f22588d61755160a98db087a046f80d66b855942"}, - {file = "protobuf-3.19.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e51561d72efd5bd5c91490af1f13e32bcba8dab4643761eb7de3ce18e64a853"}, - {file = "protobuf-3.19.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:6e8ea9173403219239cdfd8d946ed101f2ab6ecc025b0fda0c6c713c35c9981d"}, - {file = "protobuf-3.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db3532d9f7a6ebbe2392041350437953b6d7a792de10e629c1e4f5a6b1fe1ac6"}, - {file = "protobuf-3.19.1-cp37-cp37m-win32.whl", hash = "sha256:615b426a177780ce381ecd212edc1e0f70db8557ed72560b82096bd36b01bc04"}, - {file = "protobuf-3.19.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d8919368410110633717c406ab5c97e8df5ce93020cfcf3012834f28b1fab1ea"}, - {file = "protobuf-3.19.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:71b0250b0cfb738442d60cab68abc166de43411f2a4f791d31378590bfb71bd7"}, - {file = "protobuf-3.19.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3cd0458870ea7d1c58e948ac8078f6ba8a7ecc44a57e03032ed066c5bb318089"}, - {file = "protobuf-3.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:655264ed0d0efe47a523e2255fc1106a22f6faab7cc46cfe99b5bae085c2a13e"}, - {file = "protobuf-3.19.1-cp38-cp38-win32.whl", hash = "sha256:b691d996c6d0984947c4cf8b7ae2fe372d99b32821d0584f0b90277aa36982d3"}, - {file = "protobuf-3.19.1-cp38-cp38-win_amd64.whl", hash = "sha256:e7e8d2c20921f8da0dea277dfefc6abac05903ceac8e72839b2da519db69206b"}, - {file = "protobuf-3.19.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fd390367fc211cc0ffcf3a9e149dfeca78fecc62adb911371db0cec5c8b7472d"}, - {file = "protobuf-3.19.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d83e1ef8cb74009bebee3e61cc84b1c9cd04935b72bca0cbc83217d140424995"}, - {file = "protobuf-3.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36d90676d6f426718463fe382ec6274909337ca6319d375eebd2044e6c6ac560"}, - {file = "protobuf-3.19.1-cp39-cp39-win32.whl", hash = "sha256:e7b24c11df36ee8e0c085e5b0dc560289e4b58804746fb487287dda51410f1e2"}, - {file = "protobuf-3.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:77d2fadcf369b3f22859ab25bd12bb8e98fb11e05d9ff9b7cd45b711c719c002"}, - {file = "protobuf-3.19.1-py2.py3-none-any.whl", hash = "sha256:e813b1c9006b6399308e917ac5d298f345d95bb31f46f02b60cd92970a9afa17"}, - {file = "protobuf-3.19.1.tar.gz", hash = "sha256:62a8e4baa9cb9e064eb62d1002eca820857ab2138440cb4b3ea4243830f94ca7"}, -] -psutil = [ - {file = "psutil-5.8.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64"}, - {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0ae6f386d8d297177fd288be6e8d1afc05966878704dad9847719650e44fc49c"}, - {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:12d844996d6c2b1d3881cfa6fa201fd635971869a9da945cf6756105af73d2df"}, - {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:02b8292609b1f7fcb34173b25e48d0da8667bc85f81d7476584d889c6e0f2131"}, - {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6ffe81843131ee0ffa02c317186ed1e759a145267d54fdef1bc4ea5f5931ab60"}, - {file = "psutil-5.8.0-cp27-none-win32.whl", hash = "sha256:ea313bb02e5e25224e518e4352af4bf5e062755160f77e4b1767dd5ccb65f876"}, - {file = "psutil-5.8.0-cp27-none-win_amd64.whl", hash = "sha256:5da29e394bdedd9144c7331192e20c1f79283fb03b06e6abd3a8ae45ffecee65"}, - {file = "psutil-5.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:74fb2557d1430fff18ff0d72613c5ca30c45cdbfcddd6a5773e9fc1fe9364be8"}, - {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:74f2d0be88db96ada78756cb3a3e1b107ce8ab79f65aa885f76d7664e56928f6"}, - {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99de3e8739258b3c3e8669cb9757c9a861b2a25ad0955f8e53ac662d66de61ac"}, - {file = "psutil-5.8.0-cp36-cp36m-win32.whl", hash = "sha256:36b3b6c9e2a34b7d7fbae330a85bf72c30b1c827a4366a07443fc4b6270449e2"}, - {file = "psutil-5.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:52de075468cd394ac98c66f9ca33b2f54ae1d9bff1ef6b67a212ee8f639ec06d"}, - {file = "psutil-5.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c6a5fd10ce6b6344e616cf01cc5b849fa8103fbb5ba507b6b2dee4c11e84c935"}, - {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:61f05864b42fedc0771d6d8e49c35f07efd209ade09a5afe6a5059e7bb7bf83d"}, - {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:0dd4465a039d343925cdc29023bb6960ccf4e74a65ad53e768403746a9207023"}, - {file = "psutil-5.8.0-cp37-cp37m-win32.whl", hash = "sha256:1bff0d07e76114ec24ee32e7f7f8d0c4b0514b3fae93e3d2aaafd65d22502394"}, - {file = "psutil-5.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:fcc01e900c1d7bee2a37e5d6e4f9194760a93597c97fee89c4ae51701de03563"}, - {file = "psutil-5.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6223d07a1ae93f86451d0198a0c361032c4c93ebd4bf6d25e2fb3edfad9571ef"}, - {file = "psutil-5.8.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d225cd8319aa1d3c85bf195c4e07d17d3cd68636b8fc97e6cf198f782f99af28"}, - {file = "psutil-5.8.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:28ff7c95293ae74bf1ca1a79e8805fcde005c18a122ca983abf676ea3466362b"}, - {file = "psutil-5.8.0-cp38-cp38-win32.whl", hash = "sha256:ce8b867423291cb65cfc6d9c4955ee9bfc1e21fe03bb50e177f2b957f1c2469d"}, - {file = "psutil-5.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:90f31c34d25b1b3ed6c40cdd34ff122b1887a825297c017e4cbd6796dd8b672d"}, - {file = "psutil-5.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6323d5d845c2785efb20aded4726636546b26d3b577aded22492908f7c1bdda7"}, - {file = "psutil-5.8.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:245b5509968ac0bd179287d91210cd3f37add77dad385ef238b275bad35fa1c4"}, - {file = "psutil-5.8.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:90d4091c2d30ddd0a03e0b97e6a33a48628469b99585e2ad6bf21f17423b112b"}, - {file = "psutil-5.8.0-cp39-cp39-win32.whl", hash = "sha256:ea372bcc129394485824ae3e3ddabe67dc0b118d262c568b4d2602a7070afdb0"}, - {file = "psutil-5.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3"}, - {file = "psutil-5.8.0.tar.gz", hash = "sha256:0c9ccb99ab76025f2f0bbecf341d4656e9c1351db8cc8a03ccd62e318ab4b5c6"}, -] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pyaml = [ - {file = "pyaml-20.4.0-py2.py3-none-any.whl", hash = "sha256:67081749a82b72c45e5f7f812ee3a14a03b3f5c25ff36ec3b290514f8c4c4b99"}, - {file = "pyaml-20.4.0.tar.gz", hash = "sha256:29a5c2a68660a799103d6949167bd6c7953d031449d08802386372de1db6ad71"}, -] -pyarrow = [ - {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_13_universal2.whl", hash = "sha256:c7a6e7e0bf8779e9c3428ced85507541f3da9a0675e2f4781d4eb2c7042cbf81"}, - {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:7a683f71b848eb6310b4ec48c0def55dac839e9994c1ac874c9b2d3d5625def1"}, - {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5144bd9db2920c7cb566c96462d62443cc239104f94771d110f74393f2fb42a2"}, - {file = "pyarrow-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed0be080cf595ea15ff1c9ff4097bbf1fcc4b50847d98c0a3c0412fbc6ede7e9"}, - {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:072c1a0fca4509eefd7d018b78542fb7e5c63aaf5698f1c0a6e45628ae17ba44"}, - {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5bed4f948c032c40597302e9bdfa65f62295240306976ecbe43a54924c6f94f"}, - {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:465f87fa0be0b2928b2beeba22b5813a0203fb05d90fd8563eea48e08ecc030e"}, - {file = "pyarrow-6.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:ddf2e6e3b321adaaf716f2d5af8e92d205a9671e0cb7c0779710a567fd1dd580"}, - {file = "pyarrow-6.0.0-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:0204e80777ab8f4e9abd3a765a8ec07ed1e3c4630bacda50d2ce212ef0f3826f"}, - {file = "pyarrow-6.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:82fe80309e01acf29e3943a1f6d3c98ec109fe1d356bc1ac37d639bcaadcf684"}, - {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:281ce5fa03621d786a9beb514abb09846db7f0221b50eabf543caa24037eaacd"}, - {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5408fa8d623e66a0445f3fb0e4027fd219bf99bfb57422d543d7b7876e2c5b55"}, - {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a19e58dfb04e451cd8b7bdec3ac8848373b95dfc53492c9a69789aa9074a3c1b"}, - {file = "pyarrow-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b86d175262db1eb46afdceb36d459409eb6f8e532d3dec162f8bf572c7f57623"}, - {file = "pyarrow-6.0.0-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:2d2c681659396c745e4f1988d5dd41dcc3ad557bb8d4a8c2e44030edafc08a91"}, - {file = "pyarrow-6.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c666bc6a1cebf01206e2dc1ab05f25f39f35d3a499e0ef5cd635225e07306ca"}, - {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8d41dfb09ba9236cca6245f33088eb42f3c54023da281139241e0f9f3b4b754e"}, - {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477c746ef42c039348a288584800e299456c80c5691401bb9b19aa9c02a427b7"}, - {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c38263ea438a1666b13372e7565450cfeec32dbcd1c2595749476a58465eaec"}, - {file = "pyarrow-6.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e81508239a71943759cee272ce625ae208092dd36ef2c6713fccee30bbcf52bb"}, - {file = "pyarrow-6.0.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:a50d2f77b86af38ceabf45617208b9105d20e7a5eebc584e7c8c0acededd82ce"}, - {file = "pyarrow-6.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbda7595f24a639bcef3419ecfac17216efacb09f7b0f1b4c4c97f900d65ca0e"}, - {file = "pyarrow-6.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bf3400780c4d3c9cb43b1e8a1aaf2e1b7199a0572d0a645529d2784e4d0d8497"}, - {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:15dc0d673d3f865ca63c877bd7a2eced70b0a08969fb733a28247134b8a1f18b"}, - {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1d9a2f4ee812ed0bd4182cabef99ea914ac297274f0de086f2488093d284ef"}, - {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d046dc78a9337baa6415be915c5a16222505233e238a1017f368243c89817eea"}, - {file = "pyarrow-6.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:ea64a48a85c631eb2a0ea13ccdec5143c85b5897836b16331ee4289d27a57247"}, - {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_13_universal2.whl", hash = "sha256:cc1d4a70efd583befe92d4ea6f74ed2e0aa31ccdde767cd5cae8e77c65a1c2d4"}, - {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:004185e0babc6f3c3fba6ba4f106e406a0113d0f82bb9ad9a8571a1978c45d04"}, - {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c23f8cdecd3d9e49f9b0f9a651ae5549d1d32fd4901fb1bdc2d327edfba844f"}, - {file = "pyarrow-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fb701ec4a94b92102606d4e88f0b8eba34f09a5ad8e014eaa4af76f42b7f62ae"}, - {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da7860688c33ca88ac05f1a487d32d96d9caa091412496c35f3d1d832145675a"}, - {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac941a147d14993987cc8b605b721735a34b3e54d167302501fb4db1ad7382c7"}, - {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6163d82cca7541774b00503c295fe86a1722820eddb958b57f091bb6f5b0a6db"}, - {file = "pyarrow-6.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:376c4b5f248ae63df21fe15c194e9013753164be2d38f4b3fb8bde63ac5a1958"}, - {file = "pyarrow-6.0.0.tar.gz", hash = "sha256:5be62679201c441356d3f2a739895dcc8d4d299f2a6eabcd2163bfb6a898abba"}, -] -pyasn1 = [ - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, -] -pyasn1-modules = [ - {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, - {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, -] -pydata-google-auth = [ - {file = "pydata-google-auth-1.2.0.tar.gz", hash = "sha256:076411ecd7a5ac927ba9741c32ea599bc66e54170dffc1259f3cd353cf25cbd7"}, - {file = "pydata_google_auth-1.2.0-py2.py3-none-any.whl", hash = "sha256:2e2b27425d6f8a9ead496c0fd677a09448cbca2b71055abe3ee72c7f8f1774f4"}, -] -pymssql = [ - {file = "pymssql-2.2.5-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:6462017183f05ae231c3f84efce4e9a8d085b4a2e9e3ed5c407ee643494a0842"}, - {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6a013c82f7320c92039ac20db935e897a3fcd7423435705cef177f863dbb32e4"}, - {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:45e9bba4870103363c865d2b867de8de082745dd753083f27927ded3d15df587"}, - {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20de2f718f3c99040637a0e7d3b81f22e62211bcac01fb65641b964e70f26e20"}, - {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18eb4fcb55b67aaa2811e124eb8750fd84eeba1668a695908c6cc13682f6be5d"}, - {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_24_i686.whl", hash = "sha256:9969971117401096a8a7c1e08d84ea3d5d3f598ee482822583a44e2e6d3791d0"}, - {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:bb858c8a64990dd0145d874ef01af4b6fe39e9202ee0a74a8dff8285b801db21"}, - {file = "pymssql-2.2.5-cp310-cp310-win32.whl", hash = "sha256:da78a94908d42aa0f8af1b917c49c4dea38273035f81ea168b095e0b3ba8e486"}, - {file = "pymssql-2.2.5-cp310-cp310-win_amd64.whl", hash = "sha256:b691779a450ebbbb98cd2ad89ae9f17799b0bf0c9dd2e65b316efcc74246716e"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92262bf5d21b6d80e887d6fd0f03ab6337dad39b642b1887416cc67b1bd04cbf"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00f5b7e22bf7eb0faa5c6693e02c00f10ecc89fe505bbe84d553352681c2a749"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac80d1d11703120b986c604ddf4993c3dcbcbe907b04e34729c5aae2891399c0"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bf813ea0e4a0bfbb53a3469125eed06635222ea729339403585fd45f18a7812"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_24_i686.whl", hash = "sha256:73b747261cdf8d69395823cf650cf143d618ada412cbec90a88e4d449e7fa7f8"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_24_x86_64.whl", hash = "sha256:ce9e7ed16793c72d28e80506abd59a06b594fc55fe24f6256b7007b5b5e26120"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b5dcb4e4ceb16592a5d9ea3868162f21e7c215dde5c5e7f992709696c84a69b0"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9c90bc134a0c5c60e9acf651d87275c7e6dc6682981f62d574fa3dd441acb0f2"}, - {file = "pymssql-2.2.5-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:29d647ef61641cebc0e16d4a549b3f793f32bab88e7ba7c7550772a7aba9dea3"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:633079e248cdefef2207c0a55608637d0f3410f53e5679c589b37ea7965a2cca"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e373764cc81719f830b113ce6fee6849f2c4e5dfe1037804864b7dfb9946817e"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b47c05da0fffd6dd77141c1c37975a8469334f63e6faf03f5eab6d83c9001cc"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc245011aad9c018105193585469461c35fb35e7255b8e66fa27479f835742aa"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_24_i686.whl", hash = "sha256:72bbccdaf4938db7ff99db1f82ecdf6dc78778d8b7bbe6080590dd01024988de"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:395ec9e512a8d5b707aea8f516eebf51291b6fb6bc18fe4da88b222843bd4d46"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bb912b4681d55dce63f940becb7f4533661cfdb99cd6cd3daa7d7b5e285e977"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14dee37da84653d1e483236d51bc0545e6442e0642ee362526db6599fd3c1733"}, - {file = "pymssql-2.2.5-cp37-cp37m-win32.whl", hash = "sha256:5e2cd5a6da441aa3e8ee13e8811f884791d77a4cb17028381543bf50d010c919"}, - {file = "pymssql-2.2.5-cp37-cp37m-win_amd64.whl", hash = "sha256:ba43efd1057018ab404c8603bbce643347b9165c08364df8a8c03d54dffc4453"}, - {file = "pymssql-2.2.5-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:ac8d6b7e0dc97a9261b7500f086772ff5cf2bf9a0340d0aaee4dff5b217dd526"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ed7c5e58cd0ffcf3448cc38dfd2a6011f657759fcae9509748320cd89a0b8d32"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:30c4ab08cff619c7fe4d309fa6a05219b343082a1f46ca368deab5841632b8bf"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49806c343a6dea5221e98cabed1532fdd14535c5e5bb183001e0ffad31e11032"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15cc71762ec75a66bcb3751c2534ba4151b8512252b0377b842efec7cae6d953"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_24_i686.whl", hash = "sha256:e42c7043c472d45db686ae67601c6680596a2f12ceaa99fb136e647d3d8cd643"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:c738d51181ab4b3332631644ef7b561543837d1d942a291f8bc36a9e2dfb65db"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e33770ad113a646a45e4fc75f30683e92c9b929431e12977f824d6c810f28162"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8c5ad8d09f9035009ccb6f20bc9829ef60c03c436efb4b5c33af395c4030ea3d"}, - {file = "pymssql-2.2.5-cp38-cp38-win32.whl", hash = "sha256:c0611a3ea2a7ac496df30506fd28e4f7389808c59743b2eac0069e89af7289b8"}, - {file = "pymssql-2.2.5-cp38-cp38-win_amd64.whl", hash = "sha256:45c1519c94f9915911075c95fc63d62ba612e152248093aa12b7e902499c6416"}, - {file = "pymssql-2.2.5-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:1089cd5871daedc9918f8958605bbd2621006c29c06b571b419be53ea46c113a"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8ac2b3213462f078671806702dfadb8e459923f0f5013d371febebf4caf598ba"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9b707e5867bb49ad9d8945231112dfa3e9588b98f6f1248714d1f1af88321230"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:538a8e7ce255cabf093b25b72f8037b1d5fd3ba28b13a34c761a029840dc1880"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b9f5ec7896fd2f19393cd564d8ef562b26692218a84088ce1b10e9fe1215032"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_24_i686.whl", hash = "sha256:6086f0b695b7ceb4603cdc2f66356a58e367a3f1828d1ca99255c4d92d1f0932"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:e0b1bcb8465d787d5141bfc02d98e1e507d02155848b1b5622528402760f5dbf"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ebb7867207cf4cd497ea1d01b42590ed1db3561ef3ab8e135239301b6ee2695e"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8b32ad436f293c8cbadc1ba3aaf2621ab82303d169b1ab6f30f55053640ab5b1"}, - {file = "pymssql-2.2.5-cp39-cp39-win32.whl", hash = "sha256:cc523bfd26671346faccb1273b16a74dcdf1a8ac81c93c6bfebdb240e4d5a042"}, - {file = "pymssql-2.2.5-cp39-cp39-win_amd64.whl", hash = "sha256:e9cce9c47e6d550992936f91f8f2e97a8f5132749bad1cd4f5f7923bf8732d1f"}, - {file = "pymssql-2.2.5.tar.gz", hash = "sha256:857411c308ecb584a3ca633be30f1971d2a8cc0bcd978709b1abf96ff43767ad"}, -] -pyparsing = [ - {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, - {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, -] -pytest = [ - {file = "pytest-6.0.2-py3-none-any.whl", hash = "sha256:0e37f61339c4578776e090c3b8f6b16ce4db333889d65d0efb305243ec544b40"}, - {file = "pytest-6.0.2.tar.gz", hash = "sha256:c8f57c2a30983f469bf03e68cdfa74dc474ce56b8f280ddcb080dfd91df01043"}, -] -pytest-cov = [ - {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, - {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, -] -python-box = [ - {file = "python-box-5.4.1.tar.gz", hash = "sha256:b68e0f8abc86f3deda751b3390f64df64a0989459de51ba4db949662a7b4d8ac"}, - {file = "python_box-5.4.1-py3-none-any.whl", hash = "sha256:60ae9156de34cf92b899bd099580950df70a5b0813e67a3310a1cdd1976457fa"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] -python-slugify = [ - {file = "python-slugify-5.0.2.tar.gz", hash = "sha256:f13383a0b9fcbe649a1892b9c8eb4f8eab1d6d84b84bb7a624317afa98159cab"}, - {file = "python_slugify-5.0.2-py2.py3-none-any.whl", hash = "sha256:6d8c5df75cd4a7c3a2d21e257633de53f52ab0265cd2d1dc62a730e8194a7380"}, -] -pytz = [ - {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, - {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, -] -pytzdata = [ - {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, - {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, -] -pywin32 = [ - {file = "pywin32-227-cp27-cp27m-win32.whl", hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"}, - {file = "pywin32-227-cp27-cp27m-win_amd64.whl", hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"}, - {file = "pywin32-227-cp35-cp35m-win32.whl", hash = "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"}, - {file = "pywin32-227-cp35-cp35m-win_amd64.whl", hash = "sha256:a929a4af626e530383a579431b70e512e736e9588106715215bf685a3ea508d4"}, - {file = "pywin32-227-cp36-cp36m-win32.whl", hash = "sha256:300a2db938e98c3e7e2093e4491439e62287d0d493fe07cce110db070b54c0be"}, - {file = "pywin32-227-cp36-cp36m-win_amd64.whl", hash = "sha256:9b31e009564fb95db160f154e2aa195ed66bcc4c058ed72850d047141b36f3a2"}, - {file = "pywin32-227-cp37-cp37m-win32.whl", hash = "sha256:47a3c7551376a865dd8d095a98deba954a98f326c6fe3c72d8726ca6e6b15507"}, - {file = "pywin32-227-cp37-cp37m-win_amd64.whl", hash = "sha256:31f88a89139cb2adc40f8f0e65ee56a8c585f629974f9e07622ba80199057511"}, - {file = "pywin32-227-cp38-cp38-win32.whl", hash = "sha256:7f18199fbf29ca99dff10e1f09451582ae9e372a892ff03a28528a24d55875bc"}, - {file = "pywin32-227-cp38-cp38-win_amd64.whl", hash = "sha256:7c1ae32c489dc012930787f06244426f8356e129184a02c25aef163917ce158e"}, - {file = "pywin32-227-cp39-cp39-win32.whl", hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"}, - {file = "pywin32-227-cp39-cp39-win_amd64.whl", hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"}, -] -pyyaml = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] -redis = [ - {file = "redis-4.3.4-py3-none-any.whl", hash = "sha256:a52d5694c9eb4292770084fa8c863f79367ca19884b329ab574d5cb2036b3e54"}, - {file = "redis-4.3.4.tar.gz", hash = "sha256:ddf27071df4adf3821c4f2ca59d67525c3a82e5f268bed97b813cb4fabf87880"}, -] -redis-pal = [ - {file = "redis-pal-1.0.0.tar.gz", hash = "sha256:8e20caf8127056a2d1208d6dd0873643efb8357602193e26c1ada8ed6737fa88"}, - {file = "redis_pal-1.0.0-py3-none-any.whl", hash = "sha256:8cbf55c926c761ce9d60803ed66ef2575f351b43c9554fd66f6458d323430bf0"}, -] -requests = [ - {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, - {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, -] -requests-oauthlib = [ - {file = "requests-oauthlib-1.3.0.tar.gz", hash = "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a"}, - {file = "requests_oauthlib-1.3.0-py2.py3-none-any.whl", hash = "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d"}, -] -rsa = [ - {file = "rsa-4.8-py3-none-any.whl", hash = "sha256:95c5d300c4e879ee69708c428ba566c59478fd653cc3a22243eeb8ed846950bb"}, - {file = "rsa-4.8.tar.gz", hash = "sha256:5c6bd9dc7a543b7fe4304a631f8a8a3b674e2bbfc49c2ae96200cdbe55df6b17"}, -] -"ruamel.yaml" = [ - {file = "ruamel.yaml-0.17.10-py3-none-any.whl", hash = "sha256:ffb9b703853e9e8b7861606dfdab1026cf02505bade0653d1880f4b2db47f815"}, - {file = "ruamel.yaml-0.17.10.tar.gz", hash = "sha256:106bc8d6dc6a0ff7c9196a47570432036f41d556b779c6b4e618085f57e39e67"}, -] -"ruamel.yaml.clib" = [ - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e7be2c5bcb297f5b82fee9c665eb2eb7001d1050deaba8471842979293a80b0"}, - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:066f886bc90cc2ce44df8b5f7acfc6a7e2b2e672713f027136464492b0c34d7c"}, - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:221eca6f35076c6ae472a531afa1c223b9c29377e62936f61bc8e6e8bdc5f9e7"}, - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win32.whl", hash = "sha256:1070ba9dd7f9370d0513d649420c3b362ac2d687fe78c6e888f5b12bf8bc7bee"}, - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:77df077d32921ad46f34816a9a16e6356d8100374579bc35e15bab5d4e9377de"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:cfdb9389d888c5b74af297e51ce357b800dd844898af9d4a547ffc143fa56751"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7b2927e92feb51d830f531de4ccb11b320255ee95e791022555971c466af4527"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win32.whl", hash = "sha256:ada3f400d9923a190ea8b59c8f60680c4ef8a4b0dfae134d2f2ff68429adfab5"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win_amd64.whl", hash = "sha256:de9c6b8a1ba52919ae919f3ae96abb72b994dd0350226e28f3686cb4f142165c"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d67f273097c368265a7b81e152e07fb90ed395df6e552b9fa858c6d2c9f42502"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:72a2b8b2ff0a627496aad76f37a652bcef400fd861721744201ef1b45199ab78"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d3c620a54748a3d4cf0bcfe623e388407c8e85a4b06b8188e126302bcab93ea8"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win32.whl", hash = "sha256:9efef4aab5353387b07f6b22ace0867032b900d8e91674b5d8ea9150db5cae94"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win_amd64.whl", hash = "sha256:846fc8336443106fe23f9b6d6b8c14a53d38cef9a375149d61f99d78782ea468"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0847201b767447fc33b9c235780d3aa90357d20dd6108b92be544427bea197dd"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:78988ed190206672da0f5d50c61afef8f67daa718d614377dcd5e3ed85ab4a99"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:210c8fcfeff90514b7133010bf14e3bad652c8efde6b20e00c43854bf94fa5a6"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win32.whl", hash = "sha256:a49e0161897901d1ac9c4a79984b8410f450565bbad64dbfcbf76152743a0cdb"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win_amd64.whl", hash = "sha256:bf75d28fa071645c529b5474a550a44686821decebdd00e21127ef1fd566eabe"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a32f8d81ea0c6173ab1b3da956869114cae53ba1e9f72374032e33ba3118c233"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7f7ecb53ae6848f959db6ae93bdff1740e651809780822270eab111500842a84"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:61bc5e5ca632d95925907c569daa559ea194a4d16084ba86084be98ab1cec1c6"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win32.whl", hash = "sha256:89221ec6d6026f8ae859c09b9718799fea22c0e8da8b766b0b2c9a9ba2db326b"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win_amd64.whl", hash = "sha256:31ea73e564a7b5fbbe8188ab8b334393e06d997914a4e184975348f204790277"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc6a613d6c74eef5a14a214d433d06291526145431c3b964f5e16529b1842bed"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1866cf2c284a03b9524a5cc00daca56d80057c5ce3cdc86a52020f4c720856f0"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1b4139a6ffbca8ef60fdaf9b33dec05143ba746a6f0ae0f9d11d38239211d335"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win32.whl", hash = "sha256:3fb9575a5acd13031c57a62cc7823e5d2ff8bc3835ba4d94b921b4e6ee664104"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win_amd64.whl", hash = "sha256:825d5fccef6da42f3c8eccd4281af399f21c02b32d98e113dbc631ea6a6ecbc7"}, - {file = "ruamel.yaml.clib-0.2.6.tar.gz", hash = "sha256:4ff604ce439abb20794f05613c374759ce10e3595d1867764dd1ae675b85acbd"}, -] -scipy = [ - {file = "scipy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:87b01c7d5761e8a266a0fbdb9d88dcba0910d63c1c671bdb4d99d29f469e9e03"}, - {file = "scipy-1.8.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ae3e327da323d82e918e593460e23babdce40d7ab21490ddf9fc06dec6b91a18"}, - {file = "scipy-1.8.0-cp310-cp310-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:16e09ef68b352d73befa8bcaf3ebe25d3941fe1a58c82909d5589856e6bc8174"}, - {file = "scipy-1.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c17a1878d00a5dd2797ccd73623ceca9d02375328f6218ee6d921e1325e61aff"}, - {file = "scipy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937d28722f13302febde29847bbe554b89073fbb924a30475e5ed7b028898b5f"}, - {file = "scipy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:8f4d059a97b29c91afad46b1737274cb282357a305a80bdd9e8adf3b0ca6a3f0"}, - {file = "scipy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:38aa39b6724cb65271e469013aeb6f2ce66fd44f093e241c28a9c6bc64fd79ed"}, - {file = "scipy-1.8.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:559a8a4c03a5ba9fe3232f39ed24f86457e4f3f6c0abbeae1fb945029f092720"}, - {file = "scipy-1.8.0-cp38-cp38-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:f4a6d3b9f9797eb2d43938ac2c5d96d02aed17ef170c8b38f11798717523ddba"}, - {file = "scipy-1.8.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92b2c2af4183ed09afb595709a8ef5783b2baf7f41e26ece24e1329c109691a7"}, - {file = "scipy-1.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a279e27c7f4566ef18bab1b1e2c37d168e365080974758d107e7d237d3f0f484"}, - {file = "scipy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad5be4039147c808e64f99c0e8a9641eb5d2fa079ff5894dcd8240e94e347af4"}, - {file = "scipy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:3d9dd6c8b93a22bf9a3a52d1327aca7e092b1299fb3afc4f89e8eba381be7b59"}, - {file = "scipy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:5e73343c5e0d413c1f937302b2e04fb07872f5843041bcfd50699aef6e95e399"}, - {file = "scipy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:de2e80ee1d925984c2504812a310841c241791c5279352be4707cdcd7c255039"}, - {file = "scipy-1.8.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:c2bae431d127bf0b1da81fc24e4bba0a84d058e3a96b9dd6475dfcb3c5e8761e"}, - {file = "scipy-1.8.0-cp39-cp39-macosx_12_0_universal2.macosx_10_9_x86_64.whl", hash = "sha256:723b9f878095ed994756fa4ee3060c450e2db0139c5ba248ee3f9628bd64e735"}, - {file = "scipy-1.8.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:011d4386b53b933142f58a652aa0f149c9b9242abd4f900b9f4ea5fbafc86b89"}, - {file = "scipy-1.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6f0cd9c0bd374ef834ee1e0f0999678d49dcc400ea6209113d81528958f97c7"}, - {file = "scipy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3720d0124aced49f6f2198a6900304411dbbeed12f56951d7c66ebef05e3df6"}, - {file = "scipy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:3d573228c10a3a8c32b9037be982e6440e411b443a6267b067cac72f690b8d56"}, - {file = "scipy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb7088e89cd751acf66195d2f00cf009a1ea113f3019664032d9075b1e727b6c"}, - {file = "scipy-1.8.0.tar.gz", hash = "sha256:31d4f2d6b724bc9a98e527b5849b8a7e589bf1ea630c33aa563eda912c9ff0bd"}, -] -seaborn = [ - {file = "seaborn-0.11.2-py3-none-any.whl", hash = "sha256:85a6baa9b55f81a0623abddc4a26b334653ff4c6b18c418361de19dbba0ef283"}, - {file = "seaborn-0.11.2.tar.gz", hash = "sha256:cf45e9286d40826864be0e3c066f98536982baf701a7caa386511792d61ff4f6"}, -] -setuptools = [ - {file = "setuptools-65.6.3-py3-none-any.whl", hash = "sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54"}, - {file = "setuptools-65.6.3.tar.gz", hash = "sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75"}, -] -setuptools-scm = [ - {file = "setuptools_scm-6.4.2-py3-none-any.whl", hash = "sha256:acea13255093849de7ccb11af9e1fb8bde7067783450cee9ef7a93139bddf6d4"}, - {file = "setuptools_scm-6.4.2.tar.gz", hash = "sha256:6833ac65c6ed9711a4d5d2266f8024cfa07c533a0e55f4c12f6eff280a5a9e30"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -sortedcontainers = [ - {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, - {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, -] -soupsieve = [ - {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, - {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, -] -tabulate = [ - {file = "tabulate-0.8.9-py3-none-any.whl", hash = "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4"}, - {file = "tabulate-0.8.9.tar.gz", hash = "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7"}, -] -tblib = [ - {file = "tblib-1.7.0-py2.py3-none-any.whl", hash = "sha256:289fa7359e580950e7d9743eab36b0691f0310fce64dee7d9c31065b8f723e23"}, - {file = "tblib-1.7.0.tar.gz", hash = "sha256:059bd77306ea7b419d4f76016aef6d7027cc8a0785579b5aad198803435f882c"}, -] -text-unidecode = [ - {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, - {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tomli = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] -tomlkit = [ - {file = "tomlkit-0.7.0-py2.py3-none-any.whl", hash = "sha256:6babbd33b17d5c9691896b0e68159215a9387ebfa938aa3ac42f4a4beeb2b831"}, - {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, -] -toolz = [ - {file = "toolz-0.11.2-py3-none-any.whl", hash = "sha256:a5700ce83414c64514d82d60bcda8aabfde092d1c1a8663f9200c07fdcc6da8f"}, - {file = "toolz-0.11.2.tar.gz", hash = "sha256:6b312d5e15138552f1bda8a4e66c30e236c831b612b2bf0005f8a1df10a4bc33"}, -] -tornado = [ - {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, - {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, - {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, - {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, - {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, - {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, - {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, - {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, - {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, - {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, - {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, - {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, - {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, - {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, - {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, - {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, - {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, - {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, - {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, - {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, - {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, - {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, - {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, - {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, - {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, - {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, - {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, - {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, - {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, - {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, - {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, - {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, -] -tqdm = [ - {file = "tqdm-4.50.2-py2.py3-none-any.whl", hash = "sha256:43ca183da3367578ebf2f1c2e3111d51ea161ed1dc4e6345b86e27c2a93beff7"}, - {file = "tqdm-4.50.2.tar.gz", hash = "sha256:69dfa6714dee976e2425a9aab84b622675b7b1742873041e3db8a8e86132a4af"}, -] -tweepy = [ - {file = "tweepy-4.4.0-py2.py3-none-any.whl", hash = "sha256:cf02c4fbbd027fbc7172c24d03f53f061329ac040b22d201e59592a1cff86364"}, - {file = "tweepy-4.4.0.tar.gz", hash = "sha256:8d4b4520271b796fa7efc4c5d5ef3228af4d79f6a4d3ace3900b2778ed8f6f1c"}, -] -unidecode = [ - {file = "Unidecode-1.3.4-py3-none-any.whl", hash = "sha256:afa04efcdd818a93237574791be9b2817d7077c25a068b00f8cff7baa4e59257"}, - {file = "Unidecode-1.3.4.tar.gz", hash = "sha256:8e4352fb93d5a735c788110d2e7ac8e8031eb06ccbfe8d324ab71735015f9342"}, -] -uritemplate = [ - {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, - {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, -] -urllib3 = [ - {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, - {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, -] -virtualenv = [ - {file = "virtualenv-20.16.3-py2.py3-none-any.whl", hash = "sha256:4193b7bc8a6cd23e4eb251ac64f29b4398ab2c233531e66e40b19a6b7b0d30c1"}, - {file = "virtualenv-20.16.3.tar.gz", hash = "sha256:d86ea0bb50e06252d79e6c241507cb904fcd66090c3271381372d6221a3970f9"}, -] -websocket-client = [ - {file = "websocket-client-1.2.1.tar.gz", hash = "sha256:8dfb715d8a992f5712fff8c843adae94e22b22a99b2c5e6b0ec4a1a981cc4e0d"}, - {file = "websocket_client-1.2.1-py2.py3-none-any.whl", hash = "sha256:0133d2f784858e59959ce82ddac316634229da55b498aac311f1620567a710ec"}, -] -wget = [ - {file = "wget-3.2.zip", hash = "sha256:35e630eca2aa50ce998b9b1a127bb26b30dfee573702782aa982f875e3f16061"}, -] -win32-setctime = [ - {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, - {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, -] -wrapt = [ - {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, - {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, - {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, - {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, - {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, - {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, - {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, - {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, - {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, - {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, - {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, - {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, - {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, - {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, - {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, - {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, -] -zict = [ - {file = "zict-2.0.0-py3-none-any.whl", hash = "sha256:26aa1adda8250a78dfc6a78d200bfb2ea43a34752cf58980bca75dde0ba0c6e9"}, - {file = "zict-2.0.0.tar.gz", hash = "sha256:8e2969797627c8a663575c2fc6fcb53a05e37cdb83ee65f341fc6e0c3d0ced16"}, -] -zipp = [ - {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, - {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, -] -zope-interface = [ - {file = "zope.interface-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f299c020c6679cb389814a3b81200fe55d428012c5e76da7e722491f5d205990"}, - {file = "zope.interface-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee4b43f35f5dc15e1fec55ccb53c130adb1d11e8ad8263d68b1284b66a04190d"}, - {file = "zope.interface-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a158846d0fca0a908c1afb281ddba88744d403f2550dc34405c3691769cdd85"}, - {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72f23bab1848edb7472309e9898603141644faec9fd57a823ea6b4d1c4c8995"}, - {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f4d38cf4b462e75fac78b6f11ad47b06b1c568eb59896db5b6ec1094eb467f"}, - {file = "zope.interface-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:87b690bbee9876163210fd3f500ee59f5803e4a6607d1b1238833b8885ebd410"}, - {file = "zope.interface-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2363e5fd81afb650085c6686f2ee3706975c54f331b426800b53531191fdf28"}, - {file = "zope.interface-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af169ba897692e9cd984a81cb0f02e46dacdc07d6cf9fd5c91e81f8efaf93d52"}, - {file = "zope.interface-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa90bac61c9dc3e1a563e5babb3fd2c0c1c80567e815442ddbe561eadc803b30"}, - {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89086c9d3490a0f265a3c4b794037a84541ff5ffa28bb9c24cc9f66566968464"}, - {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:809fe3bf1a91393abc7e92d607976bbb8586512913a79f2bf7d7ec15bd8ea518"}, - {file = "zope.interface-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:0ec9653825f837fbddc4e4b603d90269b501486c11800d7c761eee7ce46d1bbb"}, - {file = "zope.interface-6.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:790c1d9d8f9c92819c31ea660cd43c3d5451df1df61e2e814a6f99cebb292788"}, - {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b39b8711578dcfd45fc0140993403b8a81e879ec25d53189f3faa1f006087dca"}, - {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eba51599370c87088d8882ab74f637de0c4f04a6d08a312dce49368ba9ed5c2a"}, - {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee934f023f875ec2cfd2b05a937bd817efcc6c4c3f55c5778cbf78e58362ddc"}, - {file = "zope.interface-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:042f2381118b093714081fd82c98e3b189b68db38ee7d35b63c327c470ef8373"}, - {file = "zope.interface-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dfbbbf0809a3606046a41f8561c3eada9db811be94138f42d9135a5c47e75f6f"}, - {file = "zope.interface-6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:424d23b97fa1542d7be882eae0c0fc3d6827784105264a8169a26ce16db260d8"}, - {file = "zope.interface-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e538f2d4a6ffb6edfb303ce70ae7e88629ac6e5581870e66c306d9ad7b564a58"}, - {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12175ca6b4db7621aedd7c30aa7cfa0a2d65ea3a0105393e05482d7a2d367446"}, - {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3d7dfd897a588ec27e391edbe3dd320a03684457470415870254e714126b1f"}, - {file = "zope.interface-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b3f543ae9d3408549a9900720f18c0194ac0fe810cecda2a584fd4dca2eb3bb8"}, - {file = "zope.interface-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0583b75f2e70ec93f100931660328965bb9ff65ae54695fb3fa0a1255daa6f2"}, - {file = "zope.interface-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:23ac41d52fd15dd8be77e3257bc51bbb82469cf7f5e9a30b75e903e21439d16c"}, - {file = "zope.interface-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99856d6c98a326abbcc2363827e16bd6044f70f2ef42f453c0bd5440c4ce24e5"}, - {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1592f68ae11e557b9ff2bc96ac8fc30b187e77c45a3c9cd876e3368c53dc5ba8"}, - {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4407b1435572e3e1610797c9203ad2753666c62883b921318c5403fb7139dec2"}, - {file = "zope.interface-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:5171eb073474a5038321409a630904fd61f12dd1856dd7e9d19cd6fe092cbbc5"}, - {file = "zope.interface-6.0.tar.gz", hash = "sha256:aab584725afd10c710b8f1e6e208dbee2d0ad009f57d674cb9d1b3964037275d"}, -] - +content-hash = "31796561bd82fd5b03073c569cd09a0f59f724833667629c34f73e839b8e7142" From 26fe5956fcd5b68ce56879684ca8504ca648a2f2 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 2 May 2023 03:00:58 -0300 Subject: [PATCH 088/265] Relocate test and all works --- .../datasets/br_denatran_frota/functions_test.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename br_denatran_frota/code/test/download_frota_unit_test.py => pipelines/datasets/br_denatran_frota/functions_test.py (100%) diff --git a/br_denatran_frota/code/test/download_frota_unit_test.py b/pipelines/datasets/br_denatran_frota/functions_test.py similarity index 100% rename from br_denatran_frota/code/test/download_frota_unit_test.py rename to pipelines/datasets/br_denatran_frota/functions_test.py From f56900a4e0dc816d497c11a4dd64cdbfcda8585d Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 2 May 2023 07:39:26 -0300 Subject: [PATCH 089/265] Correct importing --- pipelines/datasets/br_denatran_frota/functions_test.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/functions_test.py b/pipelines/datasets/br_denatran_frota/functions_test.py index a43275729..88428f5f5 100644 --- a/pipelines/datasets/br_denatran_frota/functions_test.py +++ b/pipelines/datasets/br_denatran_frota/functions_test.py @@ -7,14 +7,17 @@ import pandas as pd from parameterized import parameterized -from br_denatran_frota.code.utils import ( +from pipelines.datasets.br_denatran_frota.utils import ( make_filename, make_dir_when_not_exists, ) -from br_denatran_frota.code.constants import DATASET +from pipelines.datasets.br_denatran_frota.constants import constants from br_denatran_frota.code.download_frota import download_frota from br_denatran_frota.code.utils import guess_header, get_year_month_from_filename + +DATASET = constants.DATASET.value + dir_list = glob.glob(f"**/{DATASET}", recursive=True) if dir_list: # I always want to be in the actual folder for this dataset: From 2624e483c1463611eea6a8d3c05a6ee186b78845 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 2 May 2023 08:14:02 -0300 Subject: [PATCH 090/265] Fix import yet again --- pipelines/datasets/br_denatran_frota/functions_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/functions_test.py b/pipelines/datasets/br_denatran_frota/functions_test.py index 88428f5f5..634c76104 100644 --- a/pipelines/datasets/br_denatran_frota/functions_test.py +++ b/pipelines/datasets/br_denatran_frota/functions_test.py @@ -10,10 +10,11 @@ from pipelines.datasets.br_denatran_frota.utils import ( make_filename, make_dir_when_not_exists, + guess_header, + get_year_month_from_filename, ) from pipelines.datasets.br_denatran_frota.constants import constants from br_denatran_frota.code.download_frota import download_frota -from br_denatran_frota.code.utils import guess_header, get_year_month_from_filename DATASET = constants.DATASET.value From 1283baf510db7d5ec2a2c088dd9aa3bf16ae9a53 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 2 May 2023 08:33:44 -0300 Subject: [PATCH 091/265] Add todo list for myself and ignore it. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b2973e34b..aa41b1ff4 100644 --- a/.gitignore +++ b/.gitignore @@ -141,3 +141,4 @@ dmypy.json notebooks/ /tests/ poetry.lock +pipelines/datasets/br_denatran_frota/todo_list.txt From 4a37eeac59b92cc541df2d2257a9a3c8aeca1953 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 2 May 2023 16:43:38 -0300 Subject: [PATCH 092/265] First task --- pipelines/datasets/br_denatran_frota/tasks.py | 57 +++++++++++++++++-- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 8ec526846..6c5052942 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -50,11 +50,60 @@ ############################################################################### from prefect import task +import glob +import os +from pipelines.datasets.br_denatran_frota.constants import constants +from pipelines.datasets.br_denatran_frota.utils import ( + make_dir_when_not_exists, + download_post_2012, +) + + +MONTHS = constants.MONTHS.value +DATASET = constants.DATASET.value @task # noqa -def say_hello(name: str = "World") -> str: - """ - Greeting task. +def crawl(month: int, year: int, temp_dir: str = ""): + """Função principal para baixar os dados de frota por município e tipo e também por UF e tipo. + + Args: + month (int): Mês desejado. + year (int): Ano desejado. + + Raises: + ValueError: Errors if the month is not a valid one. """ - return f"Hello, {name}!" + if month not in MONTHS.values(): + raise ValueError("Mês inválido.") + + dir_list = glob.glob(f"**/{DATASET}", recursive=True) + # Get the directory where this Python file is located + initial_dir = os.path.dirname(os.path.abspath(__file__)) + if temp_dir: + os.chdir(temp_dir) + # Construct the path to the "files" directory relative to this directory + files_dir = os.path.join(os.getcwd(), "files") + if dir_list: + # I always want to be in the actual folder for this dataset, because I might start in the pipelines full repo: + os.chdir(dir_list[0]) + + # I always need a files directory inside my dataset folder. + make_dir_when_not_exists(files_dir) + # I should always switch to the files dir now and save stuff inside it. + os.chdir(files_dir) + year_dir_name = f"{year}" + + # Create dir for that specific year should it be necessary. + make_dir_when_not_exists(year_dir_name) + os.chdir(year_dir_name) + if year > 2012: + download_post_2012(month, year) + # else: + # url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-senatran/estatisticas/renavam/{year}/frota{'_' if year > 2008 else ''}{year}.zip" + + # generic_zip_filename = f"geral_{year}.zip" + # urlretrieve(url, generic_zip_filename) + # with ZipFile(generic_zip_filename) as zip_file: + # zip_file.extractall() + os.chdir(initial_dir) From 2be72b086ad07fbc05b1ec724d30957bb677734b Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 2 May 2023 18:29:09 -0300 Subject: [PATCH 093/265] Extra arguments for task --- pipelines/datasets/br_denatran_frota/tasks.py | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 6c5052942..266d7ad5e 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -56,14 +56,22 @@ from pipelines.datasets.br_denatran_frota.utils import ( make_dir_when_not_exists, download_post_2012, + verify_total, + change_df_header, + guess_header, + get_year_month_from_filename, ) - +import pandas as pd +import polars as pl MONTHS = constants.MONTHS.value DATASET = constants.DATASET.value +DICT_UFS = constants.DICT_UFS.value -@task # noqa +@task( + name="crawler", description="Extrai os arquivos do Denatran para ano e mês." +) # noqa def crawl(month: int, year: int, temp_dir: str = ""): """Função principal para baixar os dados de frota por município e tipo e também por UF e tipo. @@ -107,3 +115,33 @@ def crawl(month: int, year: int, temp_dir: str = ""): # with ZipFile(generic_zip_filename) as zip_file: # zip_file.extractall() os.chdir(initial_dir) + + +@task(name="treatment of uf data", description="Trata os dados do Denatran para UF") +def treat_uf_tipo(file) -> pl.DataFrame: + filename = os.path.split(file)[1] + df = pd.read_excel(file) + new_df = change_df_header(df, guess_header(df)) + # This is ad hoc for UF_tipo. + new_df.rename( + columns={new_df.columns[0]: "sigla_uf"}, inplace=True + ) # Rename for ease of use. + new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace. + clean_df = new_df[new_df.sigla_uf.isin(DICT_UFS.values())].reset_index( + drop=True + ) # Now we get all the actual RELEVANT uf data. + month, year = get_year_month_from_filename(filename) + clean_pl_df = pl.from_pandas(clean_df).lazy() + verify_total(clean_pl_df.collect()) + # Add year and month + clean_pl_df = clean_pl_df.with_columns( + pl.lit(year, dtype=pl.Int64).alias("ano"), + pl.lit(month, dtype=pl.Int64).alias("mes"), + ) + clean_pl_df = clean_pl_df.select(pl.exclude("TOTAL")) + clean_pl_df = clean_pl_df.melt( + id_vars=["ano", "mes", "sigla_uf"], + variable_name="tipo_veiculo", + value_name="quantidade", + ) # Long format. + return clean_pl_df.collect() From 0e62488ff2185dcd4732af19ad8002cd353ea661 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 3 May 2023 07:02:12 -0300 Subject: [PATCH 094/265] Dirty test clean up + flow start --- pipelines/datasets/br_denatran_frota/flows.py | 50 +++++++++++++++---- .../br_denatran_frota/functions_test.py | 10 ---- pipelines/datasets/br_denatran_frota/tasks.py | 6 +-- 3 files changed, 41 insertions(+), 25 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 0d45deb50..4fa1e6422 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -57,25 +57,53 @@ # ############################################################################### - +from datetime import datetime, timedelta from prefect.run_configs import KubernetesRun from prefect.storage import GCS +from prefect import Parameter, case +from prefect.tasks.prefect import ( + create_flow_run, + wait_for_flow_run, +) + from pipelines.constants import constants -from pipelines.datasets.br_denatran_frota.tasks import say_hello +from pipelines.utils.constants import constants as utils_constants -# from pipelines.datasets.br_denatran_frota.schedules import every_two_weeks from pipelines.utils.decorators import Flow +from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants +from pipelines.utils.tasks import ( + create_table_and_upload_to_gcs, + rename_current_flow_run_dataset_table, + get_current_flow_labels, +) +from pipelines.datasets.br_denatran_frota.tasks import crawl, treat_uf_tipo + +# from pipelines.datasets.br_denatran_frota.schedules import every_two_weeks with Flow( - name="my_flow", + name="br_denatran_frota.uf_tipo", code_owners=[ - "discord-username", + "Tamir", ], -) as datasets_br_denatran_frota_flow: - say_hello() +) as br_denatran_frota_uf_tipo: + dataset_id = Parameter("dataset_id", default="br_denatran_frota", required=True) + table_id = Parameter("table_id", default="uf_tipo", required=True) -datasets_br_denatran_frota_flow.storage = GCS(constants.GCS_FLOWS_BUCKET.value) -datasets_br_denatran_frota_flow.run_config = KubernetesRun( - image=constants.DOCKER_IMAGE.value -) + # Materialization mode + materialization_mode = Parameter( + "materialization_mode", default="dev", required=False + ) + + materialize_after_dump = Parameter( + "materialize after dump", default=False, required=False + ) + + dbt_alias = Parameter("dbt_alias", default=True, required=False) + + rename_flow_run = rename_current_flow_run_dataset_table( + prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id + ) + +br_denatran_frota_uf_tipo.storage = GCS(constants.GCS_FLOWS_BUCKET.value) +br_denatran_frota_uf_tipo.run_config = KubernetesRun(image=constants.DOCKER_IMAGE.value) # flow.schedule = every_two_weeks diff --git a/pipelines/datasets/br_denatran_frota/functions_test.py b/pipelines/datasets/br_denatran_frota/functions_test.py index 634c76104..e637c2bb5 100644 --- a/pipelines/datasets/br_denatran_frota/functions_test.py +++ b/pipelines/datasets/br_denatran_frota/functions_test.py @@ -3,9 +3,7 @@ import shutil import tempfile import unittest -import glob import pandas as pd -from parameterized import parameterized from pipelines.datasets.br_denatran_frota.utils import ( make_filename, @@ -17,14 +15,6 @@ from br_denatran_frota.code.download_frota import download_frota -DATASET = constants.DATASET.value - -dir_list = glob.glob(f"**/{DATASET}", recursive=True) -if dir_list: - # I always want to be in the actual folder for this dataset: - os.chdir(dir_list[0]) - - class TestMakeFilename(unittest.TestCase): def test_make_filename(self): month = 2 diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 266d7ad5e..7c3678d08 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -69,9 +69,7 @@ DICT_UFS = constants.DICT_UFS.value -@task( - name="crawler", description="Extrai os arquivos do Denatran para ano e mês." -) # noqa +@task() # noqa def crawl(month: int, year: int, temp_dir: str = ""): """Função principal para baixar os dados de frota por município e tipo e também por UF e tipo. @@ -117,7 +115,7 @@ def crawl(month: int, year: int, temp_dir: str = ""): os.chdir(initial_dir) -@task(name="treatment of uf data", description="Trata os dados do Denatran para UF") +@task() def treat_uf_tipo(file) -> pl.DataFrame: filename = os.path.split(file)[1] df = pd.read_excel(file) From 0e495bca5967f86e8352fe19621b5539f335119e Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 3 May 2023 07:16:45 -0300 Subject: [PATCH 095/265] Tests are the bomb --- .../br_denatran_frota/functions_test.py | 4 +- .../datasets/br_denatran_frota/tasks_test.py | 48 +++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 pipelines/datasets/br_denatran_frota/tasks_test.py diff --git a/pipelines/datasets/br_denatran_frota/functions_test.py b/pipelines/datasets/br_denatran_frota/functions_test.py index e637c2bb5..e537606b6 100644 --- a/pipelines/datasets/br_denatran_frota/functions_test.py +++ b/pipelines/datasets/br_denatran_frota/functions_test.py @@ -12,7 +12,7 @@ get_year_month_from_filename, ) from pipelines.datasets.br_denatran_frota.constants import constants -from br_denatran_frota.code.download_frota import download_frota +from pipelines.datasets.br_denatran_frota.tasks import crawl class TestMakeFilename(unittest.TestCase): @@ -64,7 +64,7 @@ def test_make_dir_when_not_exists(self): class TestDownloadFrota(unittest.TestCase): def test_download_frota_with_invalid_month(self): with self.assertRaises(ValueError): - download_frota(13, 2013) + crawl(13, 2013) class TestGuessHeader(unittest.TestCase): diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py new file mode 100644 index 000000000..c26551fb6 --- /dev/null +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +import os +import shutil +import tempfile +import unittest + +from parameterized import parameterized +from br_denatran_frota.code.download_frota import ( + DATASET, + MONTHS, + download_frota, +) + + +def custom_name_func(testcase_func, param_num, param): + return "%s_%s" % ( + testcase_func.__name__, + parameterized.to_safe_name("_".join(str(x) for x in param.args)), + ) + + +class TestAllPossibleYears(unittest.TestCase): + def setUp(self): + file_dir = os.path.dirname(os.path.abspath(__file__)) + os.chdir(file_dir) + self.temp_dir = tempfile.TemporaryDirectory(dir=file_dir) + + def tearDown(self): + print("Deleting temporary directory") + shutil.rmtree(self.temp_dir.name) + + @parameterized.expand( + [(month, year) for year in range(2021, 2022) for month in range(1, 3)], + name_func=custom_name_func, + ) + def test_download_post_2012(self, month, year): + download_frota(month, year, self.temp_dir.name) + expected_files = { + f"frota_por_uf_e_tipo_de_veículo_{month}-{year}", + f"frota_por_município_e_tipo_{month}-{year}", + } + list_of_files = os.listdir(os.path.join(self.temp_dir.name, "files", f"{year}")) + files = set(os.path.splitext(file)[0] for file in list_of_files) + self.assertEqual(files, expected_files) + + +if __name__ == "__main__": + unittest.main() From 7d0ff674cecad95492212266ac914fa3c3a53424 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 3 May 2023 07:18:45 -0300 Subject: [PATCH 096/265] Clean up task tests --- pipelines/datasets/br_denatran_frota/tasks_test.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index c26551fb6..a8caafd69 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -5,11 +5,7 @@ import unittest from parameterized import parameterized -from br_denatran_frota.code.download_frota import ( - DATASET, - MONTHS, - download_frota, -) +from pipelines.datasets.br_denatran_frota.tasks import crawl def custom_name_func(testcase_func, param_num, param): @@ -34,7 +30,7 @@ def tearDown(self): name_func=custom_name_func, ) def test_download_post_2012(self, month, year): - download_frota(month, year, self.temp_dir.name) + crawl.run(month, year, self.temp_dir.name) expected_files = { f"frota_por_uf_e_tipo_de_veículo_{month}-{year}", f"frota_por_município_e_tipo_{month}-{year}", From f69fadbffbd9f3a4aa4a961e5b68b0bb87f51180 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 3 May 2023 07:22:01 -0300 Subject: [PATCH 097/265] Works as is --- pipelines/datasets/br_denatran_frota/tasks_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index a8caafd69..ef2d4bb41 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -19,7 +19,7 @@ class TestAllPossibleYears(unittest.TestCase): def setUp(self): file_dir = os.path.dirname(os.path.abspath(__file__)) os.chdir(file_dir) - self.temp_dir = tempfile.TemporaryDirectory(dir=file_dir) + self.temp_dir = tempfile.TemporaryDirectory(dir=os.getcwd()) def tearDown(self): print("Deleting temporary directory") From f49382492e70b3e86467ded8c6f39f2889222786 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 3 May 2023 08:55:44 -0300 Subject: [PATCH 098/265] Better encapsulation, all tests pass --- pipelines/datasets/br_denatran_frota/tasks.py | 29 +++++-------------- .../datasets/br_denatran_frota/tasks_test.py | 7 +++-- pipelines/datasets/br_denatran_frota/utils.py | 22 +++++--------- 3 files changed, 19 insertions(+), 39 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 7c3678d08..28314ad60 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -55,11 +55,12 @@ from pipelines.datasets.br_denatran_frota.constants import constants from pipelines.datasets.br_denatran_frota.utils import ( make_dir_when_not_exists, - download_post_2012, + extract_links_post_2012, verify_total, change_df_header, guess_header, get_year_month_from_filename, + call_downloader, ) import pandas as pd import polars as pl @@ -82,29 +83,14 @@ def crawl(month: int, year: int, temp_dir: str = ""): """ if month not in MONTHS.values(): raise ValueError("Mês inválido.") - - dir_list = glob.glob(f"**/{DATASET}", recursive=True) - # Get the directory where this Python file is located - initial_dir = os.path.dirname(os.path.abspath(__file__)) - if temp_dir: - os.chdir(temp_dir) - # Construct the path to the "files" directory relative to this directory - files_dir = os.path.join(os.getcwd(), "files") - if dir_list: - # I always want to be in the actual folder for this dataset, because I might start in the pipelines full repo: - os.chdir(dir_list[0]) - - # I always need a files directory inside my dataset folder. + files_dir = os.path.join(temp_dir, "files") make_dir_when_not_exists(files_dir) - # I should always switch to the files dir now and save stuff inside it. - os.chdir(files_dir) - year_dir_name = f"{year}" - - # Create dir for that specific year should it be necessary. + year_dir_name = os.path.join(files_dir, f"{year}") make_dir_when_not_exists(year_dir_name) - os.chdir(year_dir_name) if year > 2012: - download_post_2012(month, year) + files_to_download = extract_links_post_2012(month, year, year_dir_name) + for file_dict in files_to_download: + call_downloader(file_dict) # else: # url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-senatran/estatisticas/renavam/{year}/frota{'_' if year > 2008 else ''}{year}.zip" @@ -112,7 +98,6 @@ def crawl(month: int, year: int, temp_dir: str = ""): # urlretrieve(url, generic_zip_filename) # with ZipFile(generic_zip_filename) as zip_file: # zip_file.extractall() - os.chdir(initial_dir) @task() diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index ef2d4bb41..212820ec5 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -6,6 +6,9 @@ from parameterized import parameterized from pipelines.datasets.br_denatran_frota.tasks import crawl +from pipelines.datasets.br_denatran_frota.constants import constants + +DATASET = constants.DATASET.value def custom_name_func(testcase_func, param_num, param): @@ -17,9 +20,7 @@ def custom_name_func(testcase_func, param_num, param): class TestAllPossibleYears(unittest.TestCase): def setUp(self): - file_dir = os.path.dirname(os.path.abspath(__file__)) - os.chdir(file_dir) - self.temp_dir = tempfile.TemporaryDirectory(dir=os.getcwd()) + self.temp_dir = tempfile.TemporaryDirectory(dir=os.path.join(f"{DATASET}")) def tearDown(self): print("Deleting temporary directory") diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 272984bbb..5c4447190 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -222,16 +222,6 @@ def extract_zip(dest_path_file): z.extractall() -def handle_xl(i: dict) -> None: - """Actually downloads and deals with Excel files. - - Args: - i (dict): Dictionary with all the desired downloadable file's info. - """ - dest_path_file = make_filename(i) - download_file(i["href"], dest_path_file) - - def make_filename(i: dict, ext: bool = True) -> str: """Creates the filename using the sent dictionary. @@ -245,15 +235,16 @@ def make_filename(i: dict, ext: bool = True) -> str: txt = i["txt"] mes = i["mes"] ano = i["ano"] + directory = i["destination_dir"] filetype = i["filetype"] filename = re.sub("\\s+", "_", txt, flags=re.UNICODE).lower() - filename = f"{filename}_{mes}-{ano}" + filename = f"{directory}/{filename}_{mes}-{ano}" if ext: filename += f".{filetype}" return filename -def call_downloader(i): +def call_downloader(i: dict): filename = make_filename(i) if i["filetype"] in ["xlsx", "xls"]: download_file(i["href"], filename) @@ -262,7 +253,7 @@ def call_downloader(i): extract_zip(filename) -def download_post_2012(month: int, year: int): +def extract_links_post_2012(month: int, year: int, directory: str) -> list[dict]: """_summary_ Args: @@ -273,6 +264,7 @@ def download_post_2012(month: int, year: int): soup = BeautifulSoup(urlopen(url), "html.parser") # Só queremos os dados de frota nacional. nodes = soup.select("p:contains('rota por ') > a") + valid_links = [] for node in nodes: txt = node.text href = node.get("href") @@ -292,8 +284,10 @@ def download_post_2012(month: int, year: int): "mes": month, "ano": year, "filetype": filetype, + "destination_dir": directory, } - call_downloader(info) + valid_links.append(info) + return valid_links def make_dir_when_not_exists(dir_name: str): From e6a7c0088089e313564a95a07aaf32d2e3f41155 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 3 May 2023 09:29:23 -0300 Subject: [PATCH 099/265] flows goes --- pipelines/datasets/br_denatran_frota/flows.py | 5 +++-- pipelines/datasets/br_denatran_frota/run.py | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 pipelines/datasets/br_denatran_frota/run.py diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 4fa1e6422..5648d753b 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -86,8 +86,8 @@ "Tamir", ], ) as br_denatran_frota_uf_tipo: - dataset_id = Parameter("dataset_id", default="br_denatran_frota", required=True) - table_id = Parameter("table_id", default="uf_tipo", required=True) + dataset_id = Parameter("dataset_id", default="br_denatran_frota") + table_id = Parameter("table_id", default="uf_tipo") # Materialization mode materialization_mode = Parameter( @@ -103,6 +103,7 @@ rename_flow_run = rename_current_flow_run_dataset_table( prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) + crawl(month=2, year=2021) # Download the desired files. br_denatran_frota_uf_tipo.storage = GCS(constants.GCS_FLOWS_BUCKET.value) br_denatran_frota_uf_tipo.run_config = KubernetesRun(image=constants.DOCKER_IMAGE.value) diff --git a/pipelines/datasets/br_denatran_frota/run.py b/pipelines/datasets/br_denatran_frota/run.py new file mode 100644 index 000000000..a0ead7920 --- /dev/null +++ b/pipelines/datasets/br_denatran_frota/run.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +from flows import br_denatran_frota_uf_tipo + +br_denatran_frota_uf_tipo.run() From 2e986b8e40f4c927736dc516f3878bbe5a62d0dc Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 4 May 2023 23:39:11 -0300 Subject: [PATCH 100/265] Changes in header guess uses other flow for test --- .../datasets/br_denatran_frota/constants.py | 2 + pipelines/datasets/br_denatran_frota/flows.py | 54 +++++++++++-------- pipelines/datasets/br_denatran_frota/tasks.py | 3 +- pipelines/datasets/br_denatran_frota/utils.py | 9 ++-- 4 files changed, 42 insertions(+), 26 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index 5491b46cb..9316af09f 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -99,3 +99,5 @@ class constants(Enum): # pylint: disable=c0103 ("SP", "embu"): "embu das artes", ("TO", "sao valerio da natividade"): "sao valerio", } + + DOWNLOAD_PATH = f"pipelines/datasets/{DATASET}/tmp/input" diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 5648d753b..783214312 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -60,16 +60,16 @@ from datetime import datetime, timedelta from prefect.run_configs import KubernetesRun from prefect.storage import GCS -from prefect import Parameter, case +from prefect import Parameter, case, Flow from prefect.tasks.prefect import ( create_flow_run, wait_for_flow_run, ) -from pipelines.constants import constants +from pipelines.constants import constants as pipelines_constants from pipelines.utils.constants import constants as utils_constants -from pipelines.utils.decorators import Flow +# from pipelines.utils.decorators import Flow from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants from pipelines.utils.tasks import ( create_table_and_upload_to_gcs, @@ -77,34 +77,44 @@ get_current_flow_labels, ) from pipelines.datasets.br_denatran_frota.tasks import crawl, treat_uf_tipo +from pipelines.datasets.br_denatran_frota.constants import constants +download_path = constants.DOWNLOAD_PATH.value # from pipelines.datasets.br_denatran_frota.schedules import every_two_weeks with Flow( name="br_denatran_frota.uf_tipo", - code_owners=[ - "Tamir", - ], + # code_owners=[ + # "Tamir", + # ], ) as br_denatran_frota_uf_tipo: - dataset_id = Parameter("dataset_id", default="br_denatran_frota") - table_id = Parameter("table_id", default="uf_tipo") + # dataset_id = Parameter("dataset_id", default="br_denatran_frota") + # table_id = Parameter("table_id", default="uf_tipo") - # Materialization mode - materialization_mode = Parameter( - "materialization_mode", default="dev", required=False - ) + # # Materialization mode + # materialization_mode = Parameter( + # "materialization_mode", default="dev", required=False + # ) - materialize_after_dump = Parameter( - "materialize after dump", default=False, required=False - ) + # materialize_after_dump = Parameter( + # "materialize after dump", default=False, required=False + # ) - dbt_alias = Parameter("dbt_alias", default=True, required=False) + # dbt_alias = Parameter("dbt_alias", default=True, required=False) - rename_flow_run = rename_current_flow_run_dataset_table( - prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id - ) - crawl(month=2, year=2021) # Download the desired files. + # rename_flow_run = rename_current_flow_run_dataset_table( + # prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id + # ) + crawled = crawl( + month=2, year=2021, temp_dir=download_path + ) # Download the desired files. + uf_tipo_file = "/home/tamir/basedosdados/pipelines/pipelines/datasets/br_denatran_frota/tmp/input/files/2021/frota_por_uf_e_tipo_de_veículo_2-2021.xls" + df = treat_uf_tipo(file=uf_tipo_file, upstream_tasks=[crawled]) -br_denatran_frota_uf_tipo.storage = GCS(constants.GCS_FLOWS_BUCKET.value) -br_denatran_frota_uf_tipo.run_config = KubernetesRun(image=constants.DOCKER_IMAGE.value) + print("foi?") + +br_denatran_frota_uf_tipo.storage = GCS(pipelines_constants.GCS_FLOWS_BUCKET.value) +br_denatran_frota_uf_tipo.run_config = KubernetesRun( + image=pipelines_constants.DOCKER_IMAGE.value +) # flow.schedule = every_two_weeks diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 28314ad60..07a4b5ae8 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -127,4 +127,5 @@ def treat_uf_tipo(file) -> pl.DataFrame: variable_name="tipo_veiculo", value_name="quantidade", ) # Long format. - return clean_pl_df.collect() + clean_pl_df = clean_pl_df.collect() + return clean_pl_df.write_csv(file=f"{filename}.csv", has_header=True) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 5c4447190..d8185c671 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -61,15 +61,18 @@ def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int: int: Index of the row where the header is contained. """ header_guess = 0 + possible_guess_list = [header_guess] while header_guess < max_header_guess: if len(df) - 1 < header_guess: break # Iffy logic, but essentially: if all rows of the column are strings, then this is a good candidate for a header. if all(df.iloc[header_guess].apply(lambda x: isinstance(x, str))): - return header_guess + possible_guess_list.append(header_guess) header_guess += 1 - return 0 # If nothing is ever found until the max, let's just assume it's the first row as per usual. + return max( + possible_guess_list + ) # If nothing is ever found until the max, let's just assume it's the first row as per usual. def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame: @@ -297,4 +300,4 @@ def make_dir_when_not_exists(dir_name: str): dir_name (str): Name of the subdirectory to be created. """ if not os.path.exists(dir_name): - os.mkdir(dir_name) + os.makedirs(dir_name) From f0a3a687b99b7efd87932c8b71c7282e17bda7a6 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 5 May 2023 00:45:36 -0300 Subject: [PATCH 101/265] Adjustment in tests after adjusting function --- .../datasets/br_denatran_frota/functions_test.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/functions_test.py b/pipelines/datasets/br_denatran_frota/functions_test.py index e537606b6..f435c762f 100644 --- a/pipelines/datasets/br_denatran_frota/functions_test.py +++ b/pipelines/datasets/br_denatran_frota/functions_test.py @@ -14,6 +14,8 @@ from pipelines.datasets.br_denatran_frota.constants import constants from pipelines.datasets.br_denatran_frota.tasks import crawl +DOWNLOAD_PATH = constants.DOWNLOAD_PATH.value + class TestMakeFilename(unittest.TestCase): def test_make_filename(self): @@ -24,11 +26,12 @@ def test_make_filename(self): "mes": month, "ano": year, "filetype": "xlsx", + "destination_dir": DOWNLOAD_PATH, } filename = make_filename(i) self.assertEqual( filename, - f"frota-de-veiculos-por-municipio-tipo-e-combustivel_{month}-{year}.xlsx", + f"{DOWNLOAD_PATH}/frota-de-veiculos-por-municipio-tipo-e-combustivel_{month}-{year}.xlsx", ) def test_make_filename_without_ext(self): @@ -39,11 +42,12 @@ def test_make_filename_without_ext(self): "mes": 2, "ano": 2013, "filetype": "xlsx", + "destination_dir": DOWNLOAD_PATH, } filename = make_filename(i, ext=False) self.assertEqual( filename, - f"frota-de-veiculos-por-municipio-tipo-e-combustivel_{month}-{year}", + f"{DOWNLOAD_PATH}/frota-de-veiculos-por-municipio-tipo-e-combustivel_{month}-{year}", ) @@ -108,8 +112,8 @@ def test_all_columns_are_strings_not_in_header_row(self): {"A": ["1", "2", "3"], "B": ["4", "5", "6"], "C": ["7", "8", "9"]} ) self.assertEqual( - guess_header(df), 0 - ) # Header is assumed to be in the first row + guess_header(df), len(df) - 1 + ) # Header is assumed to be in the last row class TestFilenameExtraction(unittest.TestCase): From 6fb15561f49f73638f96dc1b48c496f76288f37f Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 5 May 2023 00:53:17 -0300 Subject: [PATCH 102/265] Cleaner task test --- pipelines/datasets/br_denatran_frota/tasks_test.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 212820ec5..3ba9a06e2 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -9,6 +9,7 @@ from pipelines.datasets.br_denatran_frota.constants import constants DATASET = constants.DATASET.value +DOWNLOAD_PATH = constants.DOWNLOAD_PATH.value def custom_name_func(testcase_func, param_num, param): @@ -20,7 +21,9 @@ def custom_name_func(testcase_func, param_num, param): class TestAllPossibleYears(unittest.TestCase): def setUp(self): - self.temp_dir = tempfile.TemporaryDirectory(dir=os.path.join(f"{DATASET}")) + self.temp_dir = tempfile.TemporaryDirectory( + dir=os.path.join(f"{DOWNLOAD_PATH}") + ) def tearDown(self): print("Deleting temporary directory") From f6e1f8c3a57f733ae9b70436de465acb4d8eb649 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 5 May 2023 01:15:51 -0300 Subject: [PATCH 103/265] Constant for the CSVs --- pipelines/datasets/br_denatran_frota/constants.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index 9316af09f..298dd1959 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -101,3 +101,5 @@ class constants(Enum): # pylint: disable=c0103 } DOWNLOAD_PATH = f"pipelines/datasets/{DATASET}/tmp/input" + + OUTPUT_PATH = f"pipelines/datasets/{DATASET}/tmp/output" From 87aa026512c4d031426d9a1e249e6fbfea708216 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 5 May 2023 03:36:54 -0300 Subject: [PATCH 104/265] Debugging via workaround --- .../datasets/br_denatran_frota/handlers.py | 137 ++++++++++++++++++ pipelines/datasets/br_denatran_frota/tasks.py | 39 ++--- .../datasets/br_denatran_frota/tasks_test.py | 4 +- 3 files changed, 150 insertions(+), 30 deletions(-) create mode 100644 pipelines/datasets/br_denatran_frota/handlers.py diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py new file mode 100644 index 000000000..daedaf045 --- /dev/null +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -0,0 +1,137 @@ +# -*- coding: utf-8 -*- +""" +Tasks for br_denatran_frota +""" + +############################################################################### +# +# Aqui é onde devem ser definidas as tasks para os flows do projeto. +# Cada task representa um passo da pipeline. Não é estritamente necessário +# tratar todas as exceções que podem ocorrer durante a execução de uma task, +# mas é recomendável, ainda que não vá implicar em uma quebra no sistema. +# Mais informações sobre tasks podem ser encontradas na documentação do +# Prefect: https://docs.prefect.io/core/concepts/tasks.html +# +# De modo a manter consistência na codebase, todo o código escrito passará +# pelo pylint. Todos os warnings e erros devem ser corrigidos. +# +# As tasks devem ser definidas como funções comuns ao Python, com o decorador +# @task acima. É recomendado inserir type hints para as variáveis. +# +# Um exemplo de task é o seguinte: +# +# ----------------------------------------------------------------------------- +# from prefect import task +# +# @task +# def my_task(param1: str, param2: int) -> str: +# """ +# My task description. +# """ +# return f'{param1} {param2}' +# ----------------------------------------------------------------------------- +# +# Você também pode usar pacotes Python arbitrários, como numpy, pandas, etc. +# +# ----------------------------------------------------------------------------- +# from prefect import task +# import numpy as np +# +# @task +# def my_task(a: np.ndarray, b: np.ndarray) -> str: +# """ +# My task description. +# """ +# return np.add(a, b) +# ----------------------------------------------------------------------------- +# +# Abaixo segue um código para exemplificação, que pode ser removido. +# +############################################################################### + +from prefect import task +import glob +import os +from pipelines.datasets.br_denatran_frota.constants import constants +from pipelines.datasets.br_denatran_frota.utils import ( + make_dir_when_not_exists, + extract_links_post_2012, + verify_total, + change_df_header, + guess_header, + get_year_month_from_filename, + call_downloader, +) +import pandas as pd +import polars as pl + +MONTHS = constants.MONTHS.value +DATASET = constants.DATASET.value +DICT_UFS = constants.DICT_UFS.value +OUTPUT_PATH = constants.OUTPUT_PATH.value + + +def crawl(month: int, year: int, temp_dir: str = ""): + """Função principal para baixar os dados de frota por município e tipo e também por UF e tipo. + + Args: + month (int): Mês desejado. + year (int): Ano desejado. + + Raises: + ValueError: Errors if the month is not a valid one. + """ + if month not in MONTHS.values(): + raise ValueError("Mês inválido.") + files_dir = os.path.join(temp_dir, "files") + make_dir_when_not_exists(files_dir) + year_dir_name = os.path.join(files_dir, f"{year}") + make_dir_when_not_exists(year_dir_name) + if year > 2012: + files_to_download = extract_links_post_2012(month, year, year_dir_name) + for file_dict in files_to_download: + call_downloader(file_dict) + # else: + # url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-senatran/estatisticas/renavam/{year}/frota{'_' if year > 2008 else ''}{year}.zip" + + # generic_zip_filename = f"geral_{year}.zip" + # urlretrieve(url, generic_zip_filename) + # with ZipFile(generic_zip_filename) as zip_file: + # zip_file.extractall() + + +def treat_uf_tipo(file) -> pl.DataFrame: + filename = os.path.split(file)[1] + df = pd.read_excel(file) + new_df = change_df_header(df, guess_header(df)) + # This is ad hoc for UF_tipo. + new_df.rename( + columns={new_df.columns[0]: "sigla_uf"}, inplace=True + ) # Rename for ease of use. + new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace. + clean_df = new_df[new_df.sigla_uf.isin(DICT_UFS.values())].reset_index( + drop=True + ) # Now we get all the actual RELEVANT uf data. + month, year = get_year_month_from_filename(filename) + clean_pl_df = pl.from_pandas(clean_df).lazy() + verify_total(clean_pl_df.collect()) + # Add year and month + clean_pl_df = clean_pl_df.with_columns( + pl.lit(year, dtype=pl.Int64).alias("ano"), + pl.lit(month, dtype=pl.Int64).alias("mes"), + ) + clean_pl_df = clean_pl_df.select(pl.exclude("TOTAL")) + clean_pl_df = clean_pl_df.melt( + id_vars=["ano", "mes", "sigla_uf"], + variable_name="tipo_veiculo", + value_name="quantidade", + ) # Long format. + clean_pl_df = clean_pl_df.collect() + return clean_pl_df + + +def output_file_to_csv(df: pl.DataFrame) -> None: + pass + + +# df.write_csv(file=f"{OUTPUT_PATH}/{filename}.csv", has_header=True) diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 07a4b5ae8..15972fd46 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -64,40 +64,17 @@ ) import pandas as pd import polars as pl +from pipelines.datasets.br_denatran_frota.handlers import crawl MONTHS = constants.MONTHS.value DATASET = constants.DATASET.value DICT_UFS = constants.DICT_UFS.value +OUTPUT_PATH = constants.OUTPUT_PATH.value @task() # noqa -def crawl(month: int, year: int, temp_dir: str = ""): - """Função principal para baixar os dados de frota por município e tipo e também por UF e tipo. - - Args: - month (int): Mês desejado. - year (int): Ano desejado. - - Raises: - ValueError: Errors if the month is not a valid one. - """ - if month not in MONTHS.values(): - raise ValueError("Mês inválido.") - files_dir = os.path.join(temp_dir, "files") - make_dir_when_not_exists(files_dir) - year_dir_name = os.path.join(files_dir, f"{year}") - make_dir_when_not_exists(year_dir_name) - if year > 2012: - files_to_download = extract_links_post_2012(month, year, year_dir_name) - for file_dict in files_to_download: - call_downloader(file_dict) - # else: - # url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-senatran/estatisticas/renavam/{year}/frota{'_' if year > 2008 else ''}{year}.zip" - - # generic_zip_filename = f"geral_{year}.zip" - # urlretrieve(url, generic_zip_filename) - # with ZipFile(generic_zip_filename) as zip_file: - # zip_file.extractall() +def crawler(month: int, year: int, temp_dir: str = ""): + crawl(month, year, temp_dir) @task() @@ -128,4 +105,10 @@ def treat_uf_tipo(file) -> pl.DataFrame: value_name="quantidade", ) # Long format. clean_pl_df = clean_pl_df.collect() - return clean_pl_df.write_csv(file=f"{filename}.csv", has_header=True) + return clean_pl_df + + +@task() +def output_file_to_csv(df: pl.DataFrame) -> None: + pass + # df.write_csv(file=f"{OUTPUT_PATH}/{filename}.csv", has_header=True) diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 3ba9a06e2..aba59aeab 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -5,7 +5,7 @@ import unittest from parameterized import parameterized -from pipelines.datasets.br_denatran_frota.tasks import crawl +from pipelines.datasets.br_denatran_frota.handlers import crawl from pipelines.datasets.br_denatran_frota.constants import constants DATASET = constants.DATASET.value @@ -30,7 +30,7 @@ def tearDown(self): shutil.rmtree(self.temp_dir.name) @parameterized.expand( - [(month, year) for year in range(2021, 2022) for month in range(1, 3)], + [(month, year) for year in range(2013, 2014) for month in range(1, 3)], name_func=custom_name_func, ) def test_download_post_2012(self, month, year): From d2a5eec6d41e4cff52409133457d09b998f0f473 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 5 May 2023 03:38:36 -0300 Subject: [PATCH 105/265] Adjustment still makes tests pass --- pipelines/datasets/br_denatran_frota/tasks_test.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index aba59aeab..56453020c 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -5,7 +5,7 @@ import unittest from parameterized import parameterized -from pipelines.datasets.br_denatran_frota.handlers import crawl +from pipelines.datasets.br_denatran_frota.handlers import crawl, treat_uf_tipo from pipelines.datasets.br_denatran_frota.constants import constants DATASET = constants.DATASET.value @@ -30,11 +30,11 @@ def tearDown(self): shutil.rmtree(self.temp_dir.name) @parameterized.expand( - [(month, year) for year in range(2013, 2014) for month in range(1, 3)], + [(month, year) for year in range(2022, 2023) for month in range(1, 3)], name_func=custom_name_func, ) def test_download_post_2012(self, month, year): - crawl.run(month, year, self.temp_dir.name) + crawl(month, year, self.temp_dir.name) expected_files = { f"frota_por_uf_e_tipo_de_veículo_{month}-{year}", f"frota_por_município_e_tipo_{month}-{year}", From 63b999889912efc366ede5df0363ef916917b209 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 5 May 2023 03:56:00 -0300 Subject: [PATCH 106/265] No test side effects --- pipelines/datasets/br_denatran_frota/flows.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 783214312..0c3926d12 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -76,7 +76,7 @@ rename_current_flow_run_dataset_table, get_current_flow_labels, ) -from pipelines.datasets.br_denatran_frota.tasks import crawl, treat_uf_tipo +from pipelines.datasets.br_denatran_frota.tasks import crawler, treat_uf_tipo from pipelines.datasets.br_denatran_frota.constants import constants download_path = constants.DOWNLOAD_PATH.value @@ -105,7 +105,7 @@ # rename_flow_run = rename_current_flow_run_dataset_table( # prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id # ) - crawled = crawl( + crawled = crawler( month=2, year=2021, temp_dir=download_path ) # Download the desired files. uf_tipo_file = "/home/tamir/basedosdados/pipelines/pipelines/datasets/br_denatran_frota/tmp/input/files/2021/frota_por_uf_e_tipo_de_veículo_2-2021.xls" From 9b3665b44d06a10dbf886d609649bd34e45a6c0b Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 5 May 2023 05:33:31 -0300 Subject: [PATCH 107/265] RAR files work now --- .../datasets/br_denatran_frota/constants.py | 2 ++ .../datasets/br_denatran_frota/tasks_test.py | 8 +++--- pipelines/datasets/br_denatran_frota/utils.py | 28 ++++++++++++++++++- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index 298dd1959..80cbc5f13 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -103,3 +103,5 @@ class constants(Enum): # pylint: disable=c0103 DOWNLOAD_PATH = f"pipelines/datasets/{DATASET}/tmp/input" OUTPUT_PATH = f"pipelines/datasets/{DATASET}/tmp/output" + + UF_TIPO_BASIC_FILENAME = "frota_por_uf_e_tipo_de_veículo" diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 56453020c..9655c1b95 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -30,18 +30,18 @@ def tearDown(self): shutil.rmtree(self.temp_dir.name) @parameterized.expand( - [(month, year) for year in range(2022, 2023) for month in range(1, 3)], + [(month, year) for year in range(2014, 2016) for month in range(1, 3)], name_func=custom_name_func, ) def test_download_post_2012(self, month, year): crawl(month, year, self.temp_dir.name) expected_files = { - f"frota_por_uf_e_tipo_de_veículo_{month}-{year}", - f"frota_por_município_e_tipo_{month}-{year}", + f"frota_por_uf_e_tipo_de_veiculo_{month}-{year}", + f"frota_por_municipio_e_tipo_{month}-{year}", } list_of_files = os.listdir(os.path.join(self.temp_dir.name, "files", f"{year}")) files = set(os.path.splitext(file)[0] for file in list_of_files) - self.assertEqual(files, expected_files) + self.assertTrue(expected_files.issubset(files)) if __name__ == "__main__": diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index d8185c671..976c5a7e2 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -36,7 +36,9 @@ import re import os from zipfile import ZipFile +from rarfile import RarFile import requests +from string_utils import asciify from pipelines.datasets.br_denatran_frota.constants import constants from bs4 import BeautifulSoup from urllib.request import urlopen @@ -45,6 +47,7 @@ SUBSTITUTIONS = constants.SUBSTITUTIONS.value HEADERS = constants.HEADERS.value MONTHS = constants.MONTHS.value +UF_TIPO_BASIC_FILENAME = constants.UF_TIPO_BASIC_FILENAME def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int: @@ -225,6 +228,25 @@ def extract_zip(dest_path_file): z.extractall() +def extract_rar(dest_path_file): + with RarFile(dest_path_file, "r") as r: + files_inside_rar = [f.filename for f in r.infolist()] + rar_filename = r.filename + rar_filename_split = rar_filename.split("/") + directory = "/".join(rar_filename_split[: len(rar_filename_split) - 1]) + for file in files_inside_rar: + if re.search("UF", file, re.IGNORECASE): + new_extension = file.split(".")[-1] + new_filename = f"{r.filename.split('.')[0]}.{new_extension}" + r.extract(file, path=directory) + os.rename(f"{directory}/{file}", new_filename) + elif re.search("municipio", file, re.IGNORECASE): + new_extension = file.split(".")[-1] + new_filename = f"{r.filename.split('.')[0]}.{new_extension}" + r.extract(file, path=directory) + os.rename(f"{directory}/{file}", new_filename) + + def make_filename(i: dict, ext: bool = True) -> str: """Creates the filename using the sent dictionary. @@ -235,7 +257,7 @@ def make_filename(i: dict, ext: bool = True) -> str: Returns: str: The full filename. """ - txt = i["txt"] + txt = asciify(i["txt"]) mes = i["mes"] ano = i["ano"] directory = i["destination_dir"] @@ -254,6 +276,10 @@ def call_downloader(i: dict): elif i["filetype"] == "zip": download_file(i["href"], filename) extract_zip(filename) + elif i["filetype"] == "rar": + download_file(i["href"], filename) + extract_rar(filename) + print(2) def extract_links_post_2012(month: int, year: int, directory: str) -> list[dict]: From e3032f61df653cb17ee49055879592734f7312bb Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 5 May 2023 05:52:28 -0300 Subject: [PATCH 108/265] Awesome trick for reusing code for zip and rar --- pipelines/datasets/br_denatran_frota/utils.py | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 976c5a7e2..9756d2bae 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -228,22 +228,26 @@ def extract_zip(dest_path_file): z.extractall() -def extract_rar(dest_path_file): - with RarFile(dest_path_file, "r") as r: - files_inside_rar = [f.filename for f in r.infolist()] - rar_filename = r.filename - rar_filename_split = rar_filename.split("/") - directory = "/".join(rar_filename_split[: len(rar_filename_split) - 1]) - for file in files_inside_rar: - if re.search("UF", file, re.IGNORECASE): - new_extension = file.split(".")[-1] - new_filename = f"{r.filename.split('.')[0]}.{new_extension}" - r.extract(file, path=directory) - os.rename(f"{directory}/{file}", new_filename) - elif re.search("municipio", file, re.IGNORECASE): +def generic_extractor(dest_path_file): + extension = dest_path_file.split(".")[-1] + if extension == "rar": + extractor_function = RarFile + elif extension == "zip": + extractor_function = ZipFile + else: + raise ValueError(f"Unsupported type {extension} for compressed file.") + with extractor_function(dest_path_file, "r") as f: + files_inside_compressed = [f.filename for f in f.infolist()] + compressed_filename = f.filename + compressed_filename_split = compressed_filename.split("/") + directory = "/".join( + compressed_filename_split[: len(compressed_filename_split) - 1] + ) + for file in files_inside_compressed: + if re.search("UF|municipio", file, re.IGNORECASE): new_extension = file.split(".")[-1] - new_filename = f"{r.filename.split('.')[0]}.{new_extension}" - r.extract(file, path=directory) + new_filename = f"{f.filename.split('.')[0]}.{new_extension}" + f.extract(file, path=directory) os.rename(f"{directory}/{file}", new_filename) @@ -273,13 +277,9 @@ def call_downloader(i: dict): filename = make_filename(i) if i["filetype"] in ["xlsx", "xls"]: download_file(i["href"], filename) - elif i["filetype"] == "zip": - download_file(i["href"], filename) - extract_zip(filename) - elif i["filetype"] == "rar": + elif i["filetype"] == "zip" or i["filetype"] == "rar": download_file(i["href"], filename) - extract_rar(filename) - print(2) + generic_extractor(filename) def extract_links_post_2012(month: int, year: int, directory: str) -> list[dict]: From d3d9599f864bf917e5d9cc0915cc7dd80e5d5a13 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 5 May 2023 05:54:11 -0300 Subject: [PATCH 109/265] No need for specific zip function anymore --- pipelines/datasets/br_denatran_frota/utils.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 9756d2bae..c51ed8ae1 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -223,11 +223,6 @@ def download_file(url, filename): print(f"Download of {filename} complete") -def extract_zip(dest_path_file): - with ZipFile(dest_path_file, "r") as z: - z.extractall() - - def generic_extractor(dest_path_file): extension = dest_path_file.split(".")[-1] if extension == "rar": From d88e64ebfae196559cb9505ff7cd92f62435e6f1 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 5 May 2023 06:13:04 -0300 Subject: [PATCH 110/265] Treat 2013 exception --- pipelines/datasets/br_denatran_frota/tasks_test.py | 2 +- pipelines/datasets/br_denatran_frota/utils.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 9655c1b95..8a6735346 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -30,7 +30,7 @@ def tearDown(self): shutil.rmtree(self.temp_dir.name) @parameterized.expand( - [(month, year) for year in range(2014, 2016) for month in range(1, 3)], + [(month, year) for year in range(2013, 2023) for month in range(1, 3)], name_func=custom_name_func, ) def test_download_post_2012(self, month, year): diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index c51ed8ae1..9eb55a9fd 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -259,6 +259,10 @@ def make_filename(i: dict, ext: bool = True) -> str: txt = asciify(i["txt"]) mes = i["mes"] ano = i["ano"] + if ano == 2013: + # Need to treat this specific difference because name is misleading. This should solve + txt = txt.replace("tipo", "uf e tipo") + txt = txt.replace("Municipio", "municipio e tipo") directory = i["destination_dir"] filetype = i["filetype"] filename = re.sub("\\s+", "_", txt, flags=re.UNICODE).lower() From 0d8cea23469c0d60a2e642e9d42d33ec28fcd292 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sat, 6 May 2023 22:42:03 -0300 Subject: [PATCH 111/265] Modifications to deal with pre 2013 data --- .../datasets/br_denatran_frota/handlers.py | 21 ++++++++++++------- .../datasets/br_denatran_frota/tasks_test.py | 7 +++++++ pipelines/datasets/br_denatran_frota/utils.py | 19 ++++++++--------- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index daedaf045..49ae1c0ba 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -50,7 +50,6 @@ ############################################################################### from prefect import task -import glob import os from pipelines.datasets.br_denatran_frota.constants import constants from pipelines.datasets.br_denatran_frota.utils import ( @@ -61,6 +60,7 @@ guess_header, get_year_month_from_filename, call_downloader, + generic_extractor, ) import pandas as pd import polars as pl @@ -91,13 +91,18 @@ def crawl(month: int, year: int, temp_dir: str = ""): files_to_download = extract_links_post_2012(month, year, year_dir_name) for file_dict in files_to_download: call_downloader(file_dict) - # else: - # url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-senatran/estatisticas/renavam/{year}/frota{'_' if year > 2008 else ''}{year}.zip" - - # generic_zip_filename = f"geral_{year}.zip" - # urlretrieve(url, generic_zip_filename) - # with ZipFile(generic_zip_filename) as zip_file: - # zip_file.extractall() + else: + url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-senatran/estatisticas/renavam/{year}/frota{'_' if year > 2008 else ''}{year}.zip" + info = { + "txt": "Dados anuais", + "href": url, + "mes_name": MONTHS.get(month), + "mes": month, + "ano": year, + "filetype": "zip", + "destination_dir": temp_dir, + } + call_downloader(info) def treat_uf_tipo(file) -> pl.DataFrame: diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 8a6735346..311c99a58 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -43,6 +43,13 @@ def test_download_post_2012(self, month, year): files = set(os.path.splitext(file)[0] for file in list_of_files) self.assertTrue(expected_files.issubset(files)) + @parameterized.expand( + [(month, year) for year in range(2012, 2013) for month in range(1, 3)], + name_func=custom_name_func, + ) + def test_download_pre_2012(self, month, year): + crawl(month, year, self.temp_dir.name) + if __name__ == "__main__": unittest.main() diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 9eb55a9fd..f53d328bd 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -223,7 +223,7 @@ def download_file(url, filename): print(f"Download of {filename} complete") -def generic_extractor(dest_path_file): +def generic_extractor(dest_path_file: str): extension = dest_path_file.split(".")[-1] if extension == "rar": extractor_function = RarFile @@ -232,18 +232,17 @@ def generic_extractor(dest_path_file): else: raise ValueError(f"Unsupported type {extension} for compressed file.") with extractor_function(dest_path_file, "r") as f: - files_inside_compressed = [f.filename for f in f.infolist()] compressed_filename = f.filename compressed_filename_split = compressed_filename.split("/") directory = "/".join( compressed_filename_split[: len(compressed_filename_split) - 1] ) - for file in files_inside_compressed: - if re.search("UF|municipio", file, re.IGNORECASE): - new_extension = file.split(".")[-1] + for file in f.infolist(): + if re.search("UF|municipio", file.filename, re.IGNORECASE): + new_extension = file.filename.split(".")[-1] new_filename = f"{f.filename.split('.')[0]}.{new_extension}" - f.extract(file, path=directory) - os.rename(f"{directory}/{file}", new_filename) + f.extract(file.filename, path=directory) + os.rename(f"{directory}/{file.filename}", new_filename) def make_filename(i: dict, ext: bool = True) -> str: @@ -282,11 +281,11 @@ def call_downloader(i: dict): def extract_links_post_2012(month: int, year: int, directory: str) -> list[dict]: - """_summary_ + """Extracts links of the Denatran files post 2012. Args: - year (int): _description_ - month (int): _description_ + year (int): A year starting from 2013 onwards. + month (int): A month from 1 to 12. """ url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-Senatran/frota-de-veiculos-{year}" soup = BeautifulSoup(urlopen(url), "html.parser") From 20cc2b17b9352bd77a68b27238ed981fcd80e472 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 7 May 2023 02:47:29 -0300 Subject: [PATCH 112/265] Pre-2013: crude but getting there --- .../datasets/br_denatran_frota/constants.py | 4 ++ .../datasets/br_denatran_frota/handlers.py | 53 +++++++++++++++---- .../datasets/br_denatran_frota/tasks_test.py | 14 ++--- pipelines/datasets/br_denatran_frota/utils.py | 6 ++- 4 files changed, 58 insertions(+), 19 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index 80cbc5f13..003e1401b 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -105,3 +105,7 @@ class constants(Enum): # pylint: disable=c0103 OUTPUT_PATH = f"pipelines/datasets/{DATASET}/tmp/output" UF_TIPO_BASIC_FILENAME = "frota_por_uf_e_tipo_de_veículo" + + MUNIC_TIPO_BASIC_FILENAME = "frota_por_municipio_e_tipo" + + MONTHS_SHORT = {month[:3]: number for month, number in MONTHS.items()} diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 49ae1c0ba..adaec0416 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -51,6 +51,7 @@ from prefect import task import os +import re from pipelines.datasets.br_denatran_frota.constants import constants from pipelines.datasets.br_denatran_frota.utils import ( make_dir_when_not_exists, @@ -60,15 +61,19 @@ guess_header, get_year_month_from_filename, call_downloader, - generic_extractor, + download_file, ) import pandas as pd import polars as pl +from zipfile import ZipFile MONTHS = constants.MONTHS.value DATASET = constants.DATASET.value DICT_UFS = constants.DICT_UFS.value OUTPUT_PATH = constants.OUTPUT_PATH.value +MONTHS_SHORT = constants.MONTHS_SHORT.value +UF_TIPO_BASIC_FILENAME = constants.UF_TIPO_BASIC_FILENAME.value +MUNIC_TIPO_BASIC_FILENAME = constants.MUNIC_TIPO_BASIC_FILENAME.value def crawl(month: int, year: int, temp_dir: str = ""): @@ -93,16 +98,42 @@ def crawl(month: int, year: int, temp_dir: str = ""): call_downloader(file_dict) else: url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-senatran/estatisticas/renavam/{year}/frota{'_' if year > 2008 else ''}{year}.zip" - info = { - "txt": "Dados anuais", - "href": url, - "mes_name": MONTHS.get(month), - "mes": month, - "ano": year, - "filetype": "zip", - "destination_dir": temp_dir, - } - call_downloader(info) + # info = { + # "txt": "Dados anuais", + # "href": url, + # "mes_name": MONTHS.get(month), + # "mes": month, + # "ano": year, + # "filetype": "zip", + # "destination_dir": temp_dir, + # } + # call_downloader(info) + # Nesse caso aqui, o que eu quero? Eu quero baixar o zip: + filename = f"{year_dir_name}/dados_anuais.zip" + download_file(url, filename) + # Aí depois eu preciso andar pelo zip: + with ZipFile(filename, "r") as f: + compressed_files = [file for file in f.infolist() if not file.is_dir()] + for file in compressed_files: + filename = file.filename.split("/")[-1] + if re.search("Tipo UF", filename, re.IGNORECASE): + match = re.search(rf"Tipo UF\.\s*(.*?)\s*\.{year}", filename) + if match: + month = match.group(1).lower() + month_value = MONTHS.get(month) or MONTHS_SHORT.get(month) + extension = filename.split(".")[-1] + new_filename = f"{year_dir_name}/{UF_TIPO_BASIC_FILENAME}_{month_value}-{year}.{extension}" + f.extract(file, path=year_dir_name) + os.rename(f"{year_dir_name}/{file.filename}", new_filename) + elif re.search("Munic", filename, re.IGNORECASE): + match = re.search(rf"Munic\.\s*(.*?)\s*\.{year}", filename) + if match: + month = match.group(1).lower() + month_value = MONTHS.get(month) or MONTHS_SHORT.get(month) + extension = filename.split(".")[-1] + new_filename = f"{year_dir_name}/{MUNIC_TIPO_BASIC_FILENAME}_{month_value}-{year}.{extension}" + f.extract(file, path=year_dir_name) + os.rename(f"{year_dir_name}/{file.filename}", new_filename) def treat_uf_tipo(file) -> pl.DataFrame: diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 311c99a58..59815d423 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -30,7 +30,7 @@ def tearDown(self): shutil.rmtree(self.temp_dir.name) @parameterized.expand( - [(month, year) for year in range(2013, 2023) for month in range(1, 3)], + [(month, year) for year in range(2012, 2023) for month in range(1, 3)], name_func=custom_name_func, ) def test_download_post_2012(self, month, year): @@ -43,12 +43,12 @@ def test_download_post_2012(self, month, year): files = set(os.path.splitext(file)[0] for file in list_of_files) self.assertTrue(expected_files.issubset(files)) - @parameterized.expand( - [(month, year) for year in range(2012, 2013) for month in range(1, 3)], - name_func=custom_name_func, - ) - def test_download_pre_2012(self, month, year): - crawl(month, year, self.temp_dir.name) + # @parameterized.expand( + # [(month, year) for year in range(2012, 2013) for month in range(1, 3)], + # name_func=custom_name_func, + # ) + # def test_download_pre_2012(self, month, year): + # crawl(month, year, self.temp_dir.name) if __name__ == "__main__": diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index f53d328bd..33c6f7e7d 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -238,7 +238,11 @@ def generic_extractor(dest_path_file: str): compressed_filename_split[: len(compressed_filename_split) - 1] ) for file in f.infolist(): - if re.search("UF|municipio", file.filename, re.IGNORECASE): + print(file) + if ( + re.search("UF|municipio", file.filename, re.IGNORECASE) + and not file.is_dir() + ): new_extension = file.filename.split(".")[-1] new_filename = f"{f.filename.split('.')[0]}.{new_extension}" f.extract(file.filename, path=directory) From 653fcf43caa3bc6fcf4530cd0e3d2ea49d7a1c5c Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 7 May 2023 18:53:42 -0300 Subject: [PATCH 113/265] 2012 extraction works! --- pipelines/datasets/br_denatran_frota/constants.py | 2 +- pipelines/datasets/br_denatran_frota/handlers.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index 003e1401b..24cb62653 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -104,7 +104,7 @@ class constants(Enum): # pylint: disable=c0103 OUTPUT_PATH = f"pipelines/datasets/{DATASET}/tmp/output" - UF_TIPO_BASIC_FILENAME = "frota_por_uf_e_tipo_de_veículo" + UF_TIPO_BASIC_FILENAME = "frota_por_uf_e_tipo_de_veiculo" MUNIC_TIPO_BASIC_FILENAME = "frota_por_municipio_e_tipo" diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index adaec0416..b989a3aef 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -116,10 +116,10 @@ def crawl(month: int, year: int, temp_dir: str = ""): compressed_files = [file for file in f.infolist() if not file.is_dir()] for file in compressed_files: filename = file.filename.split("/")[-1] - if re.search("Tipo UF", filename, re.IGNORECASE): - match = re.search(rf"Tipo UF\.\s*(.*?)\s*\.{year}", filename) + if re.search("Tipo", filename, re.IGNORECASE): + match = re.search(r"Tipo UF\s+([^\s\d]+\s*)*([12]\d{3})", filename) if match: - month = match.group(1).lower() + month = match.group(1).lower().replace(".", "") month_value = MONTHS.get(month) or MONTHS_SHORT.get(month) extension = filename.split(".")[-1] new_filename = f"{year_dir_name}/{UF_TIPO_BASIC_FILENAME}_{month_value}-{year}.{extension}" From ab1f39c3d5dcf82735e13ee8322a0a32b58eb1ac Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 7 May 2023 19:03:10 -0300 Subject: [PATCH 114/265] 2011 also works now --- pipelines/datasets/br_denatran_frota/handlers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index b989a3aef..f17b252c4 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -126,7 +126,7 @@ def crawl(month: int, year: int, temp_dir: str = ""): f.extract(file, path=year_dir_name) os.rename(f"{year_dir_name}/{file.filename}", new_filename) elif re.search("Munic", filename, re.IGNORECASE): - match = re.search(rf"Munic\.\s*(.*?)\s*\.{year}", filename) + match = re.search(rf"Munic\.?\s*(.*?)\s*\.?{year}", filename) if match: month = match.group(1).lower() month_value = MONTHS.get(month) or MONTHS_SHORT.get(month) From c474f0c4424da125ba0ff094079ca15c40f7c5b4 Mon Sep 17 00:00:00 2001 From: Tamir Date: Mon, 8 May 2023 02:57:15 -0300 Subject: [PATCH 115/265] Fixing toml, lock + adding code2flow --- poetry.lock | 1580 ++++-------------------------------------------- pyproject.toml | 3 +- 2 files changed, 131 insertions(+), 1452 deletions(-) diff --git a/poetry.lock b/poetry.lock index 828aa57a0..fc0d1fcf2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -16,7 +16,7 @@ files = [ name = "arrow" version = "1.2.3" description = "Better dates & times for Python" -category = "main" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -80,10 +80,6 @@ files = [ {file = "basedosdados-1.6.9-py3-none-any.whl", hash = "sha256:9a73ad8a3667cca327d81c5d41ec809ed0675825dfc5d93d1efcf45f9bd1e867"}, {file = "basedosdados-1.6.9.tar.gz", hash = "sha256:51783ea130944295dbc6b7dcbad8676ca0ff0234cdf2b4d212177bcd12db7921"}, ] -files = [ - {file = "basedosdados-1.6.9-py3-none-any.whl", hash = "sha256:9a73ad8a3667cca327d81c5d41ec809ed0675825dfc5d93d1efcf45f9bd1e867"}, - {file = "basedosdados-1.6.9.tar.gz", hash = "sha256:51783ea130944295dbc6b7dcbad8676ca0ff0234cdf2b4d212177bcd12db7921"}, -] [package.dependencies] ckanapi = "4.6" @@ -115,10 +111,6 @@ files = [ {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, ] -files = [ - {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, - {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, -] [package.dependencies] soupsieve = ">1.2" @@ -131,7 +123,7 @@ lxml = ["lxml"] name = "binaryornot" version = "0.4.4" description = "Ultra-lightweight pure Python package to check if a file is binary or text." -category = "main" +category = "dev" optional = false python-versions = "*" files = [ @@ -153,10 +145,6 @@ files = [ {file = "cachetools-4.2.4-py3-none-any.whl", hash = "sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1"}, {file = "cachetools-4.2.4.tar.gz", hash = "sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693"}, ] -files = [ - {file = "cachetools-4.2.4-py3-none-any.whl", hash = "sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1"}, - {file = "cachetools-4.2.4.tar.gz", hash = "sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693"}, -] [[package]] name = "certifi" @@ -263,7 +251,7 @@ files = [ name = "chardet" version = "5.1.0" description = "Universal encoding detector for Python 3" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -282,10 +270,6 @@ files = [ {file = "charset-normalizer-2.0.8.tar.gz", hash = "sha256:735e240d9a8506778cd7a453d97e817e536bb1fc29f4f6961ce297b9c7a917b0"}, {file = "charset_normalizer-2.0.8-py3-none-any.whl", hash = "sha256:83fcdeb225499d6344c8f7f34684c2981270beacc32ede2e669e94f7fa544405"}, ] -files = [ - {file = "charset-normalizer-2.0.8.tar.gz", hash = "sha256:735e240d9a8506778cd7a453d97e817e536bb1fc29f4f6961ce297b9c7a917b0"}, - {file = "charset_normalizer-2.0.8-py3-none-any.whl", hash = "sha256:83fcdeb225499d6344c8f7f34684c2981270beacc32ede2e669e94f7fa544405"}, -] [package.extras] unicode-backport = ["unicodedata2"] @@ -300,9 +284,6 @@ python-versions = "*" files = [ {file = "ckanapi-4.6.tar.gz", hash = "sha256:35361965bfb38c8e146d7229f2d7c3aaf1c0f2ef547de4239b4d38931bf081d2"}, ] -files = [ - {file = "ckanapi-4.6.tar.gz", hash = "sha256:35361965bfb38c8e146d7229f2d7c3aaf1c0f2ef547de4239b4d38931bf081d2"}, -] [package.dependencies] docopt = "*" @@ -322,10 +303,6 @@ files = [ {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, ] -files = [ - {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, - {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, -] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -341,105 +318,24 @@ files = [ {file = "cloudpickle-2.0.0-py3-none-any.whl", hash = "sha256:6b2df9741d06f43839a3275c4e6632f7df6487a1f181f5f46a052d3c917c3d11"}, {file = "cloudpickle-2.0.0.tar.gz", hash = "sha256:5cd02f3b417a783ba84a4ec3e290ff7929009fe51f6405423cfccfadd43ba4a4"}, ] -files = [ - {file = "cloudpickle-2.0.0-py3-none-any.whl", hash = "sha256:6b2df9741d06f43839a3275c4e6632f7df6487a1f181f5f46a052d3c917c3d11"}, - {file = "cloudpickle-2.0.0.tar.gz", hash = "sha256:5cd02f3b417a783ba84a4ec3e290ff7929009fe51f6405423cfccfadd43ba4a4"}, -] [[package]] -name = "colorama" -version = "0.4.6" -version = "0.4.6" -description = "Cross-platform colored terminal text." +name = "code2flow" +version = "2.5.1" +description = "Visualize your source code as DOT flowcharts" category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +python-versions = ">=3.6" files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, + {file = "code2flow-2.5.1.tar.gz", hash = "sha256:ad98717920da6598dac38a1951f38b84891f4aa4bd2f36c119b0dbac729f4785"}, ] [[package]] -name = "contourpy" -version = "1.0.7" -description = "Python library for calculating contours of 2D quadrilateral grids" +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." category = "main" optional = false -python-versions = ">=3.8" -files = [ - {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d"}, - {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab"}, - {file = "contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69"}, - {file = "contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3"}, - {file = "contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566"}, - {file = "contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0"}, - {file = "contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc"}, - {file = "contourpy-1.0.7-cp38-cp38-win32.whl", hash = "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66"}, - {file = "contourpy-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967"}, - {file = "contourpy-1.0.7-cp39-cp39-win32.whl", hash = "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693"}, - {file = "contourpy-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd"}, - {file = "contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e"}, -] - -[package.dependencies] -numpy = ">=1.16" - -[package.extras] -bokeh = ["bokeh", "chromedriver", "selenium"] -docs = ["furo", "sphinx-copybutton"] -mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"] -test = ["Pillow", "matplotlib", "pytest"] -test-no-images = ["pytest"] - -[[package]] -name = "cookiecutter" -version = "1.7.3" -description = "A command-line utility that creates projects from project templates, e.g. creating a Python package project from a Python package project template." -category = "dev" -optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, @@ -543,24 +439,25 @@ test-no-images = ["pytest"] [[package]] name = "cookiecutter" -version = "2.1.1" +version = "1.7.3" description = "A command-line utility that creates projects from project templates, e.g. creating a Python package project from a Python package project template." -category = "main" +category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ - {file = "cookiecutter-2.1.1-py2.py3-none-any.whl", hash = "sha256:9f3ab027cec4f70916e28f03470bdb41e637a3ad354b4d65c765d93aad160022"}, - {file = "cookiecutter-2.1.1.tar.gz", hash = "sha256:f3982be8d9c53dac1261864013fdec7f83afd2e42ede6f6dd069c5e149c540d5"}, + {file = "cookiecutter-1.7.3-py2.py3-none-any.whl", hash = "sha256:f8671531fa96ab14339d0c59b4f662a4f12a2ecacd94a0f70a3500843da588e2"}, + {file = "cookiecutter-1.7.3.tar.gz", hash = "sha256:6b9a4d72882e243be077a7397d0f1f76fe66cf3df91f3115dbb5330e214fa457"}, ] [package.dependencies] binaryornot = ">=0.4.4" -click = ">=7.0,<9.0.0" +click = ">=7.0" Jinja2 = ">=2.7,<4.0.0" jinja2-time = ">=0.2.0" +poyo = ">=0.5.0" python-slugify = ">=4.0.0" -pyyaml = ">=5.3.1" requests = ">=2.23.0" +six = ">=1.10" [[package]] name = "coverage" @@ -640,10 +537,6 @@ files = [ {file = "croniter-1.0.15-py2.py3-none-any.whl", hash = "sha256:0f97b361fe343301a8f66f852e7d84e4fb7f21379948f71e1bbfe10f5d015fbd"}, {file = "croniter-1.0.15.tar.gz", hash = "sha256:a70dfc9d52de9fc1a886128b9148c89dd9e76b67d55f46516ca94d2d73d58219"}, ] -files = [ - {file = "croniter-1.0.15-py2.py3-none-any.whl", hash = "sha256:0f97b361fe343301a8f66f852e7d84e4fb7f21379948f71e1bbfe10f5d015fbd"}, - {file = "croniter-1.0.15.tar.gz", hash = "sha256:a70dfc9d52de9fc1a886128b9148c89dd9e76b67d55f46516ca94d2d73d58219"}, -] [package.dependencies] python-dateutil = "*" @@ -659,10 +552,6 @@ files = [ {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, ] -files = [ - {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, - {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, -] [[package]] name = "dask" @@ -675,10 +564,6 @@ files = [ {file = "dask-2021.11.2-py3-none-any.whl", hash = "sha256:2b0ad7beba8950add4fdc7c5cb94fa9444915ddb00c711d5743e2c4bb0a95ef5"}, {file = "dask-2021.11.2.tar.gz", hash = "sha256:e12bfe272928d62fa99623d98d0e0b0c045b33a47509ef31a22175aa5fd10917"}, ] -files = [ - {file = "dask-2021.11.2-py3-none-any.whl", hash = "sha256:2b0ad7beba8950add4fdc7c5cb94fa9444915ddb00c711d5743e2c4bb0a95ef5"}, - {file = "dask-2021.11.2.tar.gz", hash = "sha256:e12bfe272928d62fa99623d98d0e0b0c045b33a47509ef31a22175aa5fd10917"}, -] [package.dependencies] cloudpickle = ">=1.1.1" @@ -699,7 +584,6 @@ test = ["pre-commit", "pytest", "pytest-rerunfailures", "pytest-xdist"] [[package]] name = "db-dtypes" version = "1.1.1" -version = "1.1.1" description = "Pandas Data Types for SQL systems (BigQuery, Spanner)" category = "main" optional = false @@ -708,20 +592,12 @@ files = [ {file = "db-dtypes-1.1.1.tar.gz", hash = "sha256:ab485c85fef2454f3182427def0b0a3ab179b2871542787d33ba519d62078883"}, {file = "db_dtypes-1.1.1-py2.py3-none-any.whl", hash = "sha256:23be34ea2bc91065447ecea4d5f107e46d1de223d152e69fa73673a62d5bd27d"}, ] -python-versions = ">=3.7" -files = [ - {file = "db-dtypes-1.1.1.tar.gz", hash = "sha256:ab485c85fef2454f3182427def0b0a3ab179b2871542787d33ba519d62078883"}, - {file = "db_dtypes-1.1.1-py2.py3-none-any.whl", hash = "sha256:23be34ea2bc91065447ecea4d5f107e46d1de223d152e69fa73673a62d5bd27d"}, -] [package.dependencies] numpy = ">=1.16.6" -numpy = ">=1.16.6" packaging = ">=17.0" pandas = ">=0.24.2" pyarrow = ">=3.0.0" -pandas = ">=0.24.2" -pyarrow = ">=3.0.0" [[package]] name = "dbt-client" @@ -734,10 +610,6 @@ files = [ {file = "dbt-client-0.1.3.tar.gz", hash = "sha256:192fff51a51d6d002d4048dd494e601592599e004c0f31f1ea5156aa6d516cf5"}, {file = "dbt_client-0.1.3-py3-none-any.whl", hash = "sha256:31a0db4844c1559c95c643a6f57d1e39d4e9c3b4d9a8c867f7b3e6ed75cedca0"}, ] -files = [ - {file = "dbt-client-0.1.3.tar.gz", hash = "sha256:192fff51a51d6d002d4048dd494e601592599e004c0f31f1ea5156aa6d516cf5"}, - {file = "dbt_client-0.1.3-py3-none-any.whl", hash = "sha256:31a0db4844c1559c95c643a6f57d1e39d4e9c3b4d9a8c867f7b3e6ed75cedca0"}, -] [package.dependencies] requests = ">=2.26.0,<3.0.0" @@ -785,7 +657,6 @@ files = [ [[package]] name = "dill" version = "0.3.6" -version = "0.3.6" description = "serialize all of python" category = "main" optional = false @@ -794,11 +665,6 @@ files = [ {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, ] -python-versions = ">=3.7" -files = [ - {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, - {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, -] [package.extras] graph = ["objgraph (>=1.7.2)"] @@ -806,7 +672,6 @@ graph = ["objgraph (>=1.7.2)"] [[package]] name = "distlib" version = "0.3.6" -version = "0.3.6" description = "Distribution utilities" category = "main" optional = false @@ -815,10 +680,6 @@ files = [ {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, ] -files = [ - {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, - {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, -] [[package]] name = "distributed" @@ -831,10 +692,6 @@ files = [ {file = "distributed-2021.11.2-py3-none-any.whl", hash = "sha256:af1f7b98d85d43886fefe2354379c848c7a5aa6ae4d2313a7aca9ab9081a7e56"}, {file = "distributed-2021.11.2.tar.gz", hash = "sha256:f86a01a2e1e678865d2e42300c47552b5012cd81a2d354e47827a1fd074cc302"}, ] -files = [ - {file = "distributed-2021.11.2-py3-none-any.whl", hash = "sha256:af1f7b98d85d43886fefe2354379c848c7a5aa6ae4d2313a7aca9ab9081a7e56"}, - {file = "distributed-2021.11.2.tar.gz", hash = "sha256:f86a01a2e1e678865d2e42300c47552b5012cd81a2d354e47827a1fd074cc302"}, -] [package.dependencies] click = ">=6.6" @@ -862,10 +719,6 @@ files = [ {file = "docker-5.0.3-py2.py3-none-any.whl", hash = "sha256:7a79bb439e3df59d0a72621775d600bc8bc8b422d285824cb37103eab91d1ce0"}, {file = "docker-5.0.3.tar.gz", hash = "sha256:d916a26b62970e7c2f554110ed6af04c7ccff8e9f81ad17d0d40c75637e227fb"}, ] -files = [ - {file = "docker-5.0.3-py2.py3-none-any.whl", hash = "sha256:7a79bb439e3df59d0a72621775d600bc8bc8b422d285824cb37103eab91d1ce0"}, - {file = "docker-5.0.3.tar.gz", hash = "sha256:d916a26b62970e7c2f554110ed6af04c7ccff8e9f81ad17d0d40c75637e227fb"}, -] [package.dependencies] pywin32 = {version = "227", markers = "sys_platform == \"win32\""} @@ -899,6 +752,18 @@ files = [ {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, ] +[[package]] +name = "et-xmlfile" +version = "1.1.0" +description = "An implementation of lxml.xmlfile for the standard library" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, + {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, +] + [[package]] name = "exceptiongroup" version = "1.1.1" @@ -932,7 +797,6 @@ tests = ["asttokens", "littleutils", "pytest", "rich"] [[package]] name = "fastavro" version = "1.5.4" -version = "1.5.4" description = "Fast read/write of AVRO files" category = "main" optional = false @@ -956,25 +820,6 @@ files = [ {file = "fastavro-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:18250aa2ab0f7a095b1865565cf9976ea4605c201129636e6defe24ec3ef112c"}, {file = "fastavro-1.5.4.tar.gz", hash = "sha256:d86f72c966713fb699570a18f7960cf4110b069c70681d7538be8d671c9db7c8"}, ] -files = [ - {file = "fastavro-1.5.4-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:d316cc476b2b24ef06402b8bfa047f8f72a9d6df2de777bb30d9ededda7e3a02"}, - {file = "fastavro-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8459faec46e34f2dfeb9b70ee8c36e935e626cff8608d675724718987a5f9ce5"}, - {file = "fastavro-1.5.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd44636d7ff8365a57b88707b747371fffb676c8c1f68c0d423ec36623888668"}, - {file = "fastavro-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:2402428b26d3c08a58acfa723833e19fb75077872bcb2475a4c81195cdae6a5d"}, - {file = "fastavro-1.5.4-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:5afc14398f4191d1a807aa59d2fba5ed869b31343679ec43dbc289db0a8e35c5"}, - {file = "fastavro-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5217e9713a3ea03205532394fba4d743749155b04b10b12a12fc26d225b89792"}, - {file = "fastavro-1.5.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e93a5eecb28cc35d670c9c4df70223fa9bcd6d9ca21b38b1b7ae13ece60c7fb"}, - {file = "fastavro-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:1a2f2465efd0e7de557c4034e8d4d88a132750cfa51e1582362a1b3a1a9fa911"}, - {file = "fastavro-1.5.4-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f7d5bc76c03c692d9acea0e5d5baceec19e1c059b26cb8ae9f4481e842be95a5"}, - {file = "fastavro-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80fe920229ab1f40eccb1b4918481cdd8a20e5e7dce19308ab38b23732da8a70"}, - {file = "fastavro-1.5.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3d190aee86ab73caa1aa550eba850be2ca5dd29d814b38720f4e300184e01d5"}, - {file = "fastavro-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:b6c30299a49b11f42251cb81c8e15db67750642eac7ba5c194a5ee95c83ebb11"}, - {file = "fastavro-1.5.4-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:1f7685f3a3c38352abab432bad2f9f2229a0e5f5f8548831e887c30f8396f2e9"}, - {file = "fastavro-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd021ec850fd30020b7c4fa868466fb7f95450f1f06eac92bd2204cbd8e45fb8"}, - {file = "fastavro-1.5.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06a7b5602dfa032c92f20ca90b8bde88251573773e501bedf5e8b76b9feb14a3"}, - {file = "fastavro-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:18250aa2ab0f7a095b1865565cf9976ea4605c201129636e6defe24ec3ef112c"}, - {file = "fastavro-1.5.4.tar.gz", hash = "sha256:d86f72c966713fb699570a18f7960cf4110b069c70681d7538be8d671c9db7c8"}, -] [package.extras] codecs = ["lz4", "python-snappy", "zstandard"] @@ -985,7 +830,6 @@ zstandard = ["zstandard"] [[package]] name = "filelock" version = "3.12.0" -version = "3.12.0" description = "A platform independent file lock." category = "main" optional = false @@ -994,21 +838,14 @@ files = [ {file = "filelock-3.12.0-py3-none-any.whl", hash = "sha256:ad98852315c2ab702aeb628412cbf7e95b7ce8c3bf9565670b4eaecf1db370a9"}, {file = "filelock-3.12.0.tar.gz", hash = "sha256:fc03ae43288c013d2ea83c8597001b1129db351aad9c57fe2409327916b8e718"}, ] -files = [ - {file = "filelock-3.12.0-py3-none-any.whl", hash = "sha256:ad98852315c2ab702aeb628412cbf7e95b7ce8c3bf9565670b4eaecf1db370a9"}, - {file = "filelock-3.12.0.tar.gz", hash = "sha256:fc03ae43288c013d2ea83c8597001b1129db351aad9c57fe2409327916b8e718"}, -] [package.extras] docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] -docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] [[package]] name = "fonttools" version = "4.39.3" -version = "4.39.3" description = "Tools to manipulate font files" category = "main" optional = false @@ -1017,15 +854,9 @@ files = [ {file = "fonttools-4.39.3-py3-none-any.whl", hash = "sha256:64c0c05c337f826183637570ac5ab49ee220eec66cf50248e8df527edfa95aeb"}, {file = "fonttools-4.39.3.zip", hash = "sha256:9234b9f57b74e31b192c3fc32ef1a40750a8fbc1cd9837a7b7bfc4ca4a5c51d7"}, ] -python-versions = ">=3.8" -files = [ - {file = "fonttools-4.39.3-py3-none-any.whl", hash = "sha256:64c0c05c337f826183637570ac5ab49ee220eec66cf50248e8df527edfa95aeb"}, - {file = "fonttools-4.39.3.zip", hash = "sha256:9234b9f57b74e31b192c3fc32ef1a40750a8fbc1cd9837a7b7bfc4ca4a5c51d7"}, -] [package.extras] all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres", "scipy"] lxml = ["lxml (>=4.0,<5)"] @@ -1036,7 +867,6 @@ symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] unicode = ["unicodedata2 (>=15.0.0)"] -unicode = ["unicodedata2 (>=15.0.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] @@ -1050,10 +880,6 @@ files = [ {file = "fsspec-2021.11.1-py3-none-any.whl", hash = "sha256:bcb136caa37e1470dd8314a7d3917cb9b25dd9da44c10d36df556ab4ef038185"}, {file = "fsspec-2021.11.1.tar.gz", hash = "sha256:03683e606651d5e4bd9180525d57477bd5430e5dc68d2e459835dc14cecc3dd4"}, ] -files = [ - {file = "fsspec-2021.11.1-py3-none-any.whl", hash = "sha256:bcb136caa37e1470dd8314a7d3917cb9b25dd9da44c10d36df556ab4ef038185"}, - {file = "fsspec-2021.11.1.tar.gz", hash = "sha256:03683e606651d5e4bd9180525d57477bd5430e5dc68d2e459835dc14cecc3dd4"}, -] [package.extras] abfs = ["adlfs"] @@ -1088,10 +914,6 @@ files = [ {file = "google-analytics-data-0.12.1.tar.gz", hash = "sha256:8d5436797338683ff80988d6303e1bbeca01a1d7ece73c248fe2315aa2ae70dc"}, {file = "google_analytics_data-0.12.1-py2.py3-none-any.whl", hash = "sha256:320a16df6624606abbceef85c6b0a67727eff48f27da347630929b3ee28cd5ff"}, ] -files = [ - {file = "google-analytics-data-0.12.1.tar.gz", hash = "sha256:8d5436797338683ff80988d6303e1bbeca01a1d7ece73c248fe2315aa2ae70dc"}, - {file = "google_analytics_data-0.12.1-py2.py3-none-any.whl", hash = "sha256:320a16df6624606abbceef85c6b0a67727eff48f27da347630929b3ee28cd5ff"}, -] [package.dependencies] google-api-core = {version = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} @@ -1109,10 +931,6 @@ files = [ {file = "google-api-core-1.31.5.tar.gz", hash = "sha256:85d2074f2c8f9c07e614d7f978767d71ceb7d40647814ef4236d3a0ef671ee75"}, {file = "google_api_core-1.31.5-py2.py3-none-any.whl", hash = "sha256:6815207a8b422e9da42c200681603f304b25f98c98b675a9db9fdc3717e44280"}, ] -files = [ - {file = "google-api-core-1.31.5.tar.gz", hash = "sha256:85d2074f2c8f9c07e614d7f978767d71ceb7d40647814ef4236d3a0ef671ee75"}, - {file = "google_api_core-1.31.5-py2.py3-none-any.whl", hash = "sha256:6815207a8b422e9da42c200681603f304b25f98c98b675a9db9fdc3717e44280"}, -] [package.dependencies] google-auth = ">=1.25.0,<2.0dev" @@ -1133,7 +951,6 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2)"] [[package]] name = "google-api-python-client" version = "2.86.0" -version = "2.86.0" description = "Google API Client Library for Python" category = "main" optional = false @@ -1142,10 +959,6 @@ files = [ {file = "google-api-python-client-2.86.0.tar.gz", hash = "sha256:3ca4e93821f4e9ac29b91ab0d9df168b42c8ad0fb8bff65b8c2ccb2d462b0464"}, {file = "google_api_python_client-2.86.0-py2.py3-none-any.whl", hash = "sha256:0f320190ab9d5bd2fdb0cb894e8e53bb5e17d4888ee8dc4d26ba65ce378409e2"}, ] -files = [ - {file = "google-api-python-client-2.86.0.tar.gz", hash = "sha256:3ca4e93821f4e9ac29b91ab0d9df168b42c8ad0fb8bff65b8c2ccb2d462b0464"}, - {file = "google_api_python_client-2.86.0-py2.py3-none-any.whl", hash = "sha256:0f320190ab9d5bd2fdb0cb894e8e53bb5e17d4888ee8dc4d26ba65ce378409e2"}, -] [package.dependencies] google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev" @@ -1165,10 +978,6 @@ files = [ {file = "google-auth-1.35.0.tar.gz", hash = "sha256:b7033be9028c188ee30200b204ea00ed82ea1162e8ac1df4aa6ded19a191d88e"}, {file = "google_auth-1.35.0-py2.py3-none-any.whl", hash = "sha256:997516b42ecb5b63e8d80f5632c1a61dddf41d2a4c2748057837e06e00014258"}, ] -files = [ - {file = "google-auth-1.35.0.tar.gz", hash = "sha256:b7033be9028c188ee30200b204ea00ed82ea1162e8ac1df4aa6ded19a191d88e"}, - {file = "google_auth-1.35.0-py2.py3-none-any.whl", hash = "sha256:997516b42ecb5b63e8d80f5632c1a61dddf41d2a4c2748057837e06e00014258"}, -] [package.dependencies] cachetools = ">=2.0.0,<5.0" @@ -1193,10 +1002,6 @@ files = [ {file = "google-auth-httplib2-0.1.0.tar.gz", hash = "sha256:a07c39fd632becacd3f07718dfd6021bf396978f03ad3ce4321d060015cc30ac"}, {file = "google_auth_httplib2-0.1.0-py2.py3-none-any.whl", hash = "sha256:31e49c36c6b5643b57e82617cb3e021e3e1d2df9da63af67252c02fa9c1f4a10"}, ] -files = [ - {file = "google-auth-httplib2-0.1.0.tar.gz", hash = "sha256:a07c39fd632becacd3f07718dfd6021bf396978f03ad3ce4321d060015cc30ac"}, - {file = "google_auth_httplib2-0.1.0-py2.py3-none-any.whl", hash = "sha256:31e49c36c6b5643b57e82617cb3e021e3e1d2df9da63af67252c02fa9c1f4a10"}, -] [package.dependencies] google-auth = "*" @@ -1214,10 +1019,6 @@ files = [ {file = "google-auth-oauthlib-0.4.6.tar.gz", hash = "sha256:a90a072f6993f2c327067bf65270046384cda5a8ecb20b94ea9a687f1f233a7a"}, {file = "google_auth_oauthlib-0.4.6-py2.py3-none-any.whl", hash = "sha256:3f2a6e802eebbb6fb736a370fbf3b055edcb6b52878bf2f26330b5e041316c73"}, ] -files = [ - {file = "google-auth-oauthlib-0.4.6.tar.gz", hash = "sha256:a90a072f6993f2c327067bf65270046384cda5a8ecb20b94ea9a687f1f233a7a"}, - {file = "google_auth_oauthlib-0.4.6-py2.py3-none-any.whl", hash = "sha256:3f2a6e802eebbb6fb736a370fbf3b055edcb6b52878bf2f26330b5e041316c73"}, -] [package.dependencies] google-auth = ">=1.0.0" @@ -1237,10 +1038,6 @@ files = [ {file = "google-cloud-bigquery-2.30.1.tar.gz", hash = "sha256:4e3b5e3dcc475d5a601d84872ac0b63e059540be2251b1c4165c51106d572855"}, {file = "google_cloud_bigquery-2.30.1-py2.py3-none-any.whl", hash = "sha256:c62d601aa0f62388e1909d11de40db7597b02fb8602ccb7f21a3ac2a0997495b"}, ] -files = [ - {file = "google-cloud-bigquery-2.30.1.tar.gz", hash = "sha256:4e3b5e3dcc475d5a601d84872ac0b63e059540be2251b1c4165c51106d572855"}, - {file = "google_cloud_bigquery-2.30.1-py2.py3-none-any.whl", hash = "sha256:c62d601aa0f62388e1909d11de40db7597b02fb8602ccb7f21a3ac2a0997495b"}, -] [package.dependencies] google-api-core = {version = ">=1.29.0,<3.0.0dev", extras = ["grpc"]} @@ -1273,10 +1070,6 @@ files = [ {file = "google-cloud-bigquery-storage-1.1.0.tar.gz", hash = "sha256:c92533cedbb672f1a35555c112d4d5cccb9f8f6d0e98a604fbf98223773adad3"}, {file = "google_cloud_bigquery_storage-1.1.0-py2.py3-none-any.whl", hash = "sha256:fc543e9d2343d34c043ad48984333ba84de10be31b7af8435548aaf8555507c4"}, ] -files = [ - {file = "google-cloud-bigquery-storage-1.1.0.tar.gz", hash = "sha256:c92533cedbb672f1a35555c112d4d5cccb9f8f6d0e98a604fbf98223773adad3"}, - {file = "google_cloud_bigquery_storage-1.1.0-py2.py3-none-any.whl", hash = "sha256:fc543e9d2343d34c043ad48984333ba84de10be31b7af8435548aaf8555507c4"}, -] [package.dependencies] google-api-core = {version = ">=1.14.0,<2.0.0dev", extras = ["grpc"]} @@ -1297,10 +1090,6 @@ files = [ {file = "google-cloud-core-2.2.1.tar.gz", hash = "sha256:476d1f71ab78089e0638e0aaf34bfdc99bab4fce8f4170ba6321a5243d13c5c7"}, {file = "google_cloud_core-2.2.1-py2.py3-none-any.whl", hash = "sha256:ab6cee07791afe4e210807ceeab749da6a076ab16d496ac734bf7e6ffea27486"}, ] -files = [ - {file = "google-cloud-core-2.2.1.tar.gz", hash = "sha256:476d1f71ab78089e0638e0aaf34bfdc99bab4fce8f4170ba6321a5243d13c5c7"}, - {file = "google_cloud_core-2.2.1-py2.py3-none-any.whl", hash = "sha256:ab6cee07791afe4e210807ceeab749da6a076ab16d496ac734bf7e6ffea27486"}, -] [package.dependencies] google-api-core = ">=1.21.0,<3.0.0dev" @@ -1320,10 +1109,6 @@ files = [ {file = "google-cloud-storage-1.42.3.tar.gz", hash = "sha256:7754d4dcaa45975514b404ece0da2bb4292acbc67ca559a69e12a19d54fcdb06"}, {file = "google_cloud_storage-1.42.3-py2.py3-none-any.whl", hash = "sha256:71ee3a0dcf2c139f034a054181cd7658f1ec8f12837d2769c450a8a00fcd4c6d"}, ] -files = [ - {file = "google-cloud-storage-1.42.3.tar.gz", hash = "sha256:7754d4dcaa45975514b404ece0da2bb4292acbc67ca559a69e12a19d54fcdb06"}, - {file = "google_cloud_storage-1.42.3-py2.py3-none-any.whl", hash = "sha256:71ee3a0dcf2c139f034a054181cd7658f1ec8f12837d2769c450a8a00fcd4c6d"}, -] [package.dependencies] google-api-core = {version = ">=1.29.0,<3.0dev", markers = "python_version >= \"3.6\""} @@ -1386,51 +1171,6 @@ files = [ {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:891f712ce54e0d631370e1f4997b3f182f3368179198efc30d477c75d1f44942"}, {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:7f6fe42536d9dcd3e2ffb9d3053f5d05221ae3bbcefbe472bdf2c71c793e3183"}, ] -files = [ - {file = "google-crc32c-1.3.0.tar.gz", hash = "sha256:276de6273eb074a35bc598f8efbc00c7869c5cf2e29c90748fccc8c898c244df"}, - {file = "google_crc32c-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cb6994fff247987c66a8a4e550ef374671c2b82e3c0d2115e689d21e511a652d"}, - {file = "google_crc32c-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9da0a39b53d2fab3e5467329ed50e951eb91386e9d0d5b12daf593973c3b168"}, - {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:eb0b14523758e37802f27b7f8cd973f5f3d33be7613952c0df904b68c4842f0e"}, - {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:95c68a4b9b7828ba0428f8f7e3109c5d476ca44996ed9a5f8aac6269296e2d59"}, - {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c3cf890c3c0ecfe1510a452a165431b5831e24160c5fcf2071f0f85ca5a47cd"}, - {file = "google_crc32c-1.3.0-cp310-cp310-win32.whl", hash = "sha256:3bbce1be3687bbfebe29abdb7631b83e6b25da3f4e1856a1611eb21854b689ea"}, - {file = "google_crc32c-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:c124b8c8779bf2d35d9b721e52d4adb41c9bfbde45e6a3f25f0820caa9aba73f"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:42ae4781333e331a1743445931b08ebdad73e188fd554259e772556fc4937c48"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ff71073ebf0e42258a42a0b34f2c09ec384977e7f6808999102eedd5b49920e3"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fe31de3002e7b08eb20823b3735b97c86c5926dd0581c7710a680b418a8709d4"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd7760a88a8d3d705ff562aa93f8445ead54f58fd482e4f9e2bafb7e177375d4"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0b9e622c3b2b8d0ce32f77eba617ab0d6768b82836391e4f8f9e2074582bf02"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-win32.whl", hash = "sha256:779cbf1ce375b96111db98fca913c1f5ec11b1d870e529b1dc7354b2681a8c3a"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:04e7c220798a72fd0f08242bc8d7a05986b2a08a0573396187fd32c1dcdd58b3"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e7a539b9be7b9c00f11ef16b55486141bc2cdb0c54762f84e3c6fc091917436d"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ca60076c388728d3b6ac3846842474f4250c91efbfe5afa872d3ffd69dd4b318"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05340b60bf05b574159e9bd940152a47d38af3fb43803ffe71f11d704b7696a6"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:318f73f5484b5671f0c7f5f63741ab020a599504ed81d209b5c7129ee4667407"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f58099ad7affc0754ae42e6d87443299f15d739b0ce03c76f515153a5cda06c"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-win32.whl", hash = "sha256:f52a4ad2568314ee713715b1e2d79ab55fab11e8b304fd1462ff5cccf4264b3e"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bab4aebd525218bab4ee615786c4581952eadc16b1ff031813a2fd51f0cc7b08"}, - {file = "google_crc32c-1.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dda4d8a3bb0b50f540f6ff4b6033f3a74e8bf0bd5320b70fab2c03e512a62812"}, - {file = "google_crc32c-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fec221a051150eeddfdfcff162e6db92c65ecf46cb0f7bb1bf812a1520ec026b"}, - {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:226f2f9b8e128a6ca6a9af9b9e8384f7b53a801907425c9a292553a3a7218ce0"}, - {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a7f9cbea4245ee36190f85fe1814e2d7b1e5f2186381b082f5d59f99b7f11328"}, - {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a4db36f9721fdf391646685ecffa404eb986cbe007a3289499020daf72e88a2"}, - {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:12674a4c3b56b706153a358eaa1018c4137a5a04635b92b4652440d3d7386206"}, - {file = "google_crc32c-1.3.0-cp38-cp38-win32.whl", hash = "sha256:650e2917660e696041ab3dcd7abac160b4121cd9a484c08406f24c5964099829"}, - {file = "google_crc32c-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:58be56ae0529c664cc04a9c76e68bb92b091e0194d6e3c50bea7e0f266f73713"}, - {file = "google_crc32c-1.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:96a8918a78d5d64e07c8ea4ed2bc44354e3f93f46a4866a40e8db934e4c0d74b"}, - {file = "google_crc32c-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:13af315c3a0eec8bb8b8d80b8b128cb3fcd17d7e4edafc39647846345a3f003a"}, - {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6311853aa2bba4064d0c28ca54e7b50c4d48e3de04f6770f6c60ebda1e975267"}, - {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ed447680ff21c14aaceb6a9f99a5f639f583ccfe4ce1a5e1d48eb41c3d6b3217"}, - {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1c1d6236feab51200272d79b3d3e0f12cf2cbb12b208c835b175a21efdb0a73"}, - {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e0f1ff55dde0ebcfbef027edc21f71c205845585fffe30d4ec4979416613e9b3"}, - {file = "google_crc32c-1.3.0-cp39-cp39-win32.whl", hash = "sha256:fbd60c6aaa07c31d7754edbc2334aef50601b7f1ada67a96eb1eb57c7c72378f"}, - {file = "google_crc32c-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:127f9cc3ac41b6a859bd9dc4321097b1a4f6aa7fdf71b4f9227b9e3ebffb4422"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fc28e0db232c62ca0c3600884933178f0825c99be4474cdd645e378a10588125"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1926fd8de0acb9d15ee757175ce7242e235482a783cd4ec711cc999fc103c24e"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5da2c81575cc3ccf05d9830f9e8d3c70954819ca9a63828210498c0774fda1a3"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:891f712ce54e0d631370e1f4997b3f182f3368179198efc30d477c75d1f44942"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:7f6fe42536d9dcd3e2ffb9d3053f5d05221ae3bbcefbe472bdf2c71c793e3183"}, -] [package.extras] testing = ["pytest"] @@ -1446,10 +1186,6 @@ files = [ {file = "google-resumable-media-2.1.0.tar.gz", hash = "sha256:725b989e0dd387ef2703d1cc8e86217474217f4549593c477fd94f4024a0f911"}, {file = "google_resumable_media-2.1.0-py2.py3-none-any.whl", hash = "sha256:cdc75ea0361e39704dc7df7da59fbd419e73c8bc92eac94d8a020d36baa9944b"}, ] -files = [ - {file = "google-resumable-media-2.1.0.tar.gz", hash = "sha256:725b989e0dd387ef2703d1cc8e86217474217f4549593c477fd94f4024a0f911"}, - {file = "google_resumable_media-2.1.0-py2.py3-none-any.whl", hash = "sha256:cdc75ea0361e39704dc7df7da59fbd419e73c8bc92eac94d8a020d36baa9944b"}, -] [package.dependencies] google-crc32c = ">=1.0,<2.0dev" @@ -1469,10 +1205,6 @@ files = [ {file = "googleapis-common-protos-1.53.0.tar.gz", hash = "sha256:a88ee8903aa0a81f6c3cec2d5cf62d3c8aa67c06439b0496b49048fb1854ebf4"}, {file = "googleapis_common_protos-1.53.0-py2.py3-none-any.whl", hash = "sha256:f6d561ab8fb16b30020b940e2dd01cd80082f4762fa9f3ee670f4419b4b8dbd0"}, ] -files = [ - {file = "googleapis-common-protos-1.53.0.tar.gz", hash = "sha256:a88ee8903aa0a81f6c3cec2d5cf62d3c8aa67c06439b0496b49048fb1854ebf4"}, - {file = "googleapis_common_protos-1.53.0-py2.py3-none-any.whl", hash = "sha256:f6d561ab8fb16b30020b940e2dd01cd80082f4762fa9f3ee670f4419b4b8dbd0"}, -] [package.dependencies] protobuf = ">=3.12.0" @@ -1533,52 +1265,6 @@ files = [ {file = "grpcio-1.42.0-cp39-cp39-win_amd64.whl", hash = "sha256:17433f7eb01737240581b33fbc2eae7b7fa6d3429571782580bceaf05ec56cb8"}, {file = "grpcio-1.42.0.tar.gz", hash = "sha256:4a8f2c7490fe3696e0cdd566e2f099fb91b51bc75446125175c55581c2f7bc11"}, ] -files = [ - {file = "grpcio-1.42.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:6e5eec67909795f7b1ff2bd941bd6c2661ca5217ea9c35003d73314100786f60"}, - {file = "grpcio-1.42.0-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:8e8cd9909fdd232ecffb954936fd90c935ebe0b5fce36c88813f8247ce54019c"}, - {file = "grpcio-1.42.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:b4d7115ee08a36f3f50a6233bd78280e40847e078d2a5bb39c0ab0db4490d58f"}, - {file = "grpcio-1.42.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b781f412546830be55644f7c48251d30860f4725981862d4a1ea322f80d9cd34"}, - {file = "grpcio-1.42.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e62140c46d8125927c673c72c960cb387c02b2a1a3c6985a8b0a3914d27c0018"}, - {file = "grpcio-1.42.0-cp310-cp310-win32.whl", hash = "sha256:6b69726d7bbb633133c1b0d780b1357aa9b7a7f714fead6470bab1feb8012806"}, - {file = "grpcio-1.42.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6c0b159b38fcc3bbc3331105197c1f58ac0d294eb83910d136a325a85def88f"}, - {file = "grpcio-1.42.0-cp36-cp36m-linux_armv7l.whl", hash = "sha256:53e10d07e541073eb9a84d49ecffb831c3cbb970bcd8cd8de8431e935bf66c2e"}, - {file = "grpcio-1.42.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:7a3c9b8e13365529f9426d4754085e8a9c2ad718a41a46a97e4e30e87bb45eae"}, - {file = "grpcio-1.42.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:66f910b6324ae69625e63db2eb29d833c307cfa36736fe13d2f841656c5f658f"}, - {file = "grpcio-1.42.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:59163b8d2e0d85f0ecbee52b348f867eec7e0f909177564fb3956363f7e616e5"}, - {file = "grpcio-1.42.0-cp36-cp36m-manylinux_2_17_aarch64.whl", hash = "sha256:d92c1721c7981812d0f42dfc8248b15d3b6a2ea79eb8870776364423de2aa245"}, - {file = "grpcio-1.42.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65720d2bf05e2b78c4bffe372f13c41845bae5658fd3f5dd300c374dd240e5cb"}, - {file = "grpcio-1.42.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f385e40846ff81d1c6dce98dcc192c7988a46540758804c4a2e6da5a0e3e3e05"}, - {file = "grpcio-1.42.0-cp36-cp36m-win32.whl", hash = "sha256:ea3560ffbfe08327024380508190103937fef25e355d2259f8b5c003a0732f55"}, - {file = "grpcio-1.42.0-cp36-cp36m-win_amd64.whl", hash = "sha256:29fc36c99161ff307c8ca438346b2e36f81dac5ecdbabc983d0b255d7913fb19"}, - {file = "grpcio-1.42.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:76b5fa4c6d88f804456e763461cf7a1db38b200669f1ba00c579014ab5aa7965"}, - {file = "grpcio-1.42.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:d1451a8c0c01c5b5fdfeb8f777820cb277fb5d797d972f57a41bb82483c44a79"}, - {file = "grpcio-1.42.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6655df5f31664bac4cd6c9b52f389fd92cd10025504ad83685038f47e11e29d8"}, - {file = "grpcio-1.42.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:5b9f0c4822e3a52a1663a315752c6bbdbed0ec15a660d3e64137335acbb5b7ce"}, - {file = "grpcio-1.42.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:7742606ac2bc03ed10360f4f630e0cc01dce864fe63557254e9adea21bb51416"}, - {file = "grpcio-1.42.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:603d71de14ab1f1fd1254b69ceda73545943461b1f51f82fda9477503330b6ea"}, - {file = "grpcio-1.42.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d08ce780bbd8d1a442d855bd681ed0f7483c65d2c8ed83701a9ea4f13678411f"}, - {file = "grpcio-1.42.0-cp37-cp37m-win32.whl", hash = "sha256:2aba7f93671ec971c5c70db81633b49a2f974aa09a2d811aede344a32bad1896"}, - {file = "grpcio-1.42.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2956da789d74fc35d2c869b3aa45dbf41c5d862c056ca8b5e35a688347ede809"}, - {file = "grpcio-1.42.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:21aa4a111b3381d3dd982a3df62348713b29f651aa9f6dfbc9415adbfe28d2ba"}, - {file = "grpcio-1.42.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a6f9ed5320b93c029615b75f6c8caf2c76aa6545d8845f3813908892cfc5f84e"}, - {file = "grpcio-1.42.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:3a13953e12dc40ee247b5fe6ef22b5fac8f040a76b814a11bf9f423e82402f28"}, - {file = "grpcio-1.42.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:f721b42a20d886c03d9b1f461b228cdaf02ccf6c4550e263f7fd3ce3ff19a8f1"}, - {file = "grpcio-1.42.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:e2d9c6690d4c88cd51ee395d7ba5bd1d26d7c37e94cb59e7fd62ff21ecaf891d"}, - {file = "grpcio-1.42.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7f66eb220898787d7821a7931e35ae2512ed74f79f75adcd7ea2fb3119ca87d"}, - {file = "grpcio-1.42.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2e3f250e5398bf474c6e140df1b67494bf1e31c5277b5bf93841a564cbc22d0"}, - {file = "grpcio-1.42.0-cp38-cp38-win32.whl", hash = "sha256:06d5364e85e0fa50ee68bffd9c93a6aff869a91c68f1fd7ba1b944e063a0ff9f"}, - {file = "grpcio-1.42.0-cp38-cp38-win_amd64.whl", hash = "sha256:d58b3774ee2084c31aad140586a42e18328d9823959ca006a0b85ad7937fe405"}, - {file = "grpcio-1.42.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:b74bbac7e039cf23ed0c8edd820c31e90a52a22e28a03d45274a0956addde8d2"}, - {file = "grpcio-1.42.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2b264cf303a22c46f8d455f42425c546ad6ce22f183debb8d64226ddf1e039f4"}, - {file = "grpcio-1.42.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:64f2b3e6474e2ad865478b64f0850d15842acbb2623de5f78a60ceabe00c63e0"}, - {file = "grpcio-1.42.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:bf916ee93ea2fd52b5286ed4e19cbbde5e82754914379ea91dc5748550df3b4e"}, - {file = "grpcio-1.42.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:6ef72f0abdb89fb7c366a99e04823ecae5cda9f762f2234f42fc280447277cd6"}, - {file = "grpcio-1.42.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47ab65be9ba7a0beee94bbe2fb1dd03cb7832db9df4d1f8fae215a16b3edeb5e"}, - {file = "grpcio-1.42.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0209f30741de1875413f40e89bec9c647e7afad4a3549a6a1682c1ee23da68ca"}, - {file = "grpcio-1.42.0-cp39-cp39-win32.whl", hash = "sha256:5441d343602ce10ba48fcb36bb5de197a15a01dc9ee0f71c2a73cd5cd3d7f5ac"}, - {file = "grpcio-1.42.0-cp39-cp39-win_amd64.whl", hash = "sha256:17433f7eb01737240581b33fbc2eae7b7fa6d3429571782580bceaf05ec56cb8"}, - {file = "grpcio-1.42.0.tar.gz", hash = "sha256:4a8f2c7490fe3696e0cdd566e2f099fb91b51bc75446125175c55581c2f7bc11"}, -] [package.dependencies] six = ">=1.5.2" @@ -1597,15 +1283,10 @@ files = [ {file = "HeapDict-1.0.1-py3-none-any.whl", hash = "sha256:6065f90933ab1bb7e50db403b90cab653c853690c5992e69294c2de2b253fc92"}, {file = "HeapDict-1.0.1.tar.gz", hash = "sha256:8495f57b3e03d8e46d5f1b2cc62ca881aca392fd5cc048dc0aa2e1a6d23ecdb6"}, ] -files = [ - {file = "HeapDict-1.0.1-py3-none-any.whl", hash = "sha256:6065f90933ab1bb7e50db403b90cab653c853690c5992e69294c2de2b253fc92"}, - {file = "HeapDict-1.0.1.tar.gz", hash = "sha256:8495f57b3e03d8e46d5f1b2cc62ca881aca392fd5cc048dc0aa2e1a6d23ecdb6"}, -] [[package]] name = "httplib2" version = "0.22.0" -version = "0.22.0" description = "A comprehensive HTTP client library." category = "main" optional = false @@ -1614,10 +1295,6 @@ files = [ {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, ] -files = [ - {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, - {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, -] [package.dependencies] pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""} @@ -1633,10 +1310,6 @@ files = [ {file = "hvac-0.11.2-py2.py3-none-any.whl", hash = "sha256:3e8a34804b1e20954a2b4991cc13ed9c09b32e50dadd9d3438224481150f6568"}, {file = "hvac-0.11.2.tar.gz", hash = "sha256:f905c59d32d88d3f67571fe5a8a78de4659e04798ad809de439f667247d13626"}, ] -files = [ - {file = "hvac-0.11.2-py2.py3-none-any.whl", hash = "sha256:3e8a34804b1e20954a2b4991cc13ed9c09b32e50dadd9d3438224481150f6568"}, - {file = "hvac-0.11.2.tar.gz", hash = "sha256:f905c59d32d88d3f67571fe5a8a78de4659e04798ad809de439f667247d13626"}, -] [package.dependencies] requests = ">=2.21.0" @@ -1647,14 +1320,14 @@ parser = ["pyhcl (>=0.3.10)"] [[package]] name = "identify" -version = "2.5.23" +version = "2.5.24" description = "File identification library for Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "identify-2.5.23-py2.py3-none-any.whl", hash = "sha256:17d9351c028a781456965e781ed2a435755cac655df1ebd930f7186b54399312"}, - {file = "identify-2.5.23.tar.gz", hash = "sha256:50b01b9d5f73c6b53e5fa2caf9f543d3e657a9d0bbdeb203ebb8d45960ba7433"}, + {file = "identify-2.5.24-py2.py3-none-any.whl", hash = "sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d"}, + {file = "identify-2.5.24.tar.gz", hash = "sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4"}, ] [package.extras] @@ -1671,15 +1344,10 @@ files = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] -files = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] [[package]] name = "importlib-metadata" version = "4.13.0" -version = "4.13.0" description = "Read metadata from Python packages" category = "main" optional = false @@ -1688,39 +1356,14 @@ files = [ {file = "importlib_metadata-4.13.0-py3-none-any.whl", hash = "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116"}, {file = "importlib_metadata-4.13.0.tar.gz", hash = "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d"}, ] -files = [ - {file = "importlib_metadata-4.13.0-py3-none-any.whl", hash = "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116"}, - {file = "importlib_metadata-4.13.0.tar.gz", hash = "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d"}, -] [package.dependencies] zipp = ">=0.5" [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] perf = ["ipython"] testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] - -[[package]] -name = "importlib-resources" -version = "5.12.0" -description = "Read resources from Python packages" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, - {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, -] - -[package.dependencies] -zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] name = "importlib-resources" @@ -1752,18 +1395,11 @@ files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] [[package]] name = "ipeadatapy" version = "0.1.9" description = "An API wrapper for Ipeadata" -version = "0.1.9" -description = "An API wrapper for Ipeadata" category = "main" optional = false python-versions = "*" @@ -1812,14 +1448,14 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio" [[package]] name = "ipython" -version = "8.12.1" +version = "8.12.2" description = "IPython: Productive Interactive Computing" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "ipython-8.12.1-py3-none-any.whl", hash = "sha256:e3015a1a4aa09b3984fb81b9cef4f0772af5a549878b81efb094cda8bb121993"}, - {file = "ipython-8.12.1.tar.gz", hash = "sha256:2442915417763b62181009259782975fa50bb5eedb97ae97fb614204bf6ecc21"}, + {file = "ipython-8.12.2-py3-none-any.whl", hash = "sha256:ea8801f15dfe4ffb76dea1b09b847430ffd70d827b41735c64a0638a04103bfc"}, + {file = "ipython-8.12.2.tar.gz", hash = "sha256:c7b80eb7f5a855a88efc971fda506ff7a91c280b42cdae26643e0f601ea281ea"}, ] [package.dependencies] @@ -1881,10 +1517,6 @@ files = [ {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, ] -files = [ - {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, - {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, -] [package.dependencies] MarkupSafe = ">=2.0" @@ -1896,7 +1528,7 @@ i18n = ["Babel (>=2.7)"] name = "jinja2-time" version = "0.2.0" description = "Jinja2 Extension for Dates and Times" -category = "main" +category = "dev" optional = false python-versions = "*" files = [ @@ -1957,7 +1589,6 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] name = "kiwisolver" version = "1.4.4" -version = "1.4.4" description = "A fast implementation of the Cassowary constraint solver" category = "main" optional = false @@ -2032,76 +1663,6 @@ files = [ {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, ] -files = [ - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, - {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, -] [[package]] name = "locket" @@ -2114,10 +1675,6 @@ files = [ {file = "locket-0.2.1-py2.py3-none-any.whl", hash = "sha256:12b6ada59d1f50710bca9704dbadd3f447dbf8dac6664575c1281cadab8e6449"}, {file = "locket-0.2.1.tar.gz", hash = "sha256:3e1faba403619fe201552f083f1ecbf23f550941bc51985ac6ed4d02d25056dd"}, ] -files = [ - {file = "locket-0.2.1-py2.py3-none-any.whl", hash = "sha256:12b6ada59d1f50710bca9704dbadd3f447dbf8dac6664575c1281cadab8e6449"}, - {file = "locket-0.2.1.tar.gz", hash = "sha256:3e1faba403619fe201552f083f1ecbf23f550941bc51985ac6ed4d02d25056dd"}, -] [[package]] name = "loguru" @@ -2130,10 +1687,6 @@ files = [ {file = "loguru-0.6.0-py3-none-any.whl", hash = "sha256:4e2414d534a2ab57573365b3e6d0234dfb1d84b68b7f3b948e6fb743860a77c3"}, {file = "loguru-0.6.0.tar.gz", hash = "sha256:066bd06758d0a513e9836fd9c6b5a75bfb3fd36841f4b996bc60b547a309d41c"}, ] -files = [ - {file = "loguru-0.6.0-py3-none-any.whl", hash = "sha256:4e2414d534a2ab57573365b3e6d0234dfb1d84b68b7f3b948e6fb743860a77c3"}, - {file = "loguru-0.6.0.tar.gz", hash = "sha256:066bd06758d0a513e9836fd9c6b5a75bfb3fd36841f4b996bc60b547a309d41c"}, -] [package.dependencies] colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} @@ -2236,176 +1789,12 @@ htmlsoup = ["BeautifulSoup4"] source = ["Cython (>=0.29.7)"] [[package]] -name = "lxml" -version = "4.9.2" -description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +name = "markupsafe" +version = "2.0.1" +description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" -files = [ - {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, - {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, - {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, - {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, - {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, - {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, - {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, - {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, - {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, - {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, - {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, - {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, - {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, - {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, - {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, - {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, - {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, - {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, - {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, - {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, - {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, - {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, - {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, -] - -[package.extras] -cssselect = ["cssselect (>=0.7)"] -html5 = ["html5lib"] -htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=0.29.7)"] - -[[package]] -name = "markupsafe" -version = "2.0.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, -] +python-versions = ">=3.6" files = [ {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, @@ -2489,10 +1878,6 @@ files = [ {file = "marshmallow-3.14.1-py3-none-any.whl", hash = "sha256:04438610bc6dadbdddb22a4a55bcc7f6f8099e69580b2e67f5a681933a1f4400"}, {file = "marshmallow-3.14.1.tar.gz", hash = "sha256:4c05c1684e0e97fe779c62b91878f173b937fe097b356cd82f793464f5bc6138"}, ] -files = [ - {file = "marshmallow-3.14.1-py3-none-any.whl", hash = "sha256:04438610bc6dadbdddb22a4a55bcc7f6f8099e69580b2e67f5a681933a1f4400"}, - {file = "marshmallow-3.14.1.tar.gz", hash = "sha256:4c05c1684e0e97fe779c62b91878f173b937fe097b356cd82f793464f5bc6138"}, -] [package.extras] dev = ["flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] @@ -2511,10 +1896,6 @@ files = [ {file = "marshmallow-oneofschema-3.0.1.tar.gz", hash = "sha256:62cd2099b29188c92493c2940ee79d1bf2f2619a71721664e5a98ec2faa58237"}, {file = "marshmallow_oneofschema-3.0.1-py2.py3-none-any.whl", hash = "sha256:bd29410a9f2f7457a2b428286e2a80ef76b8ddc3701527dc1f935a88914b02f2"}, ] -files = [ - {file = "marshmallow-oneofschema-3.0.1.tar.gz", hash = "sha256:62cd2099b29188c92493c2940ee79d1bf2f2619a71721664e5a98ec2faa58237"}, - {file = "marshmallow_oneofschema-3.0.1-py2.py3-none-any.whl", hash = "sha256:bd29410a9f2f7457a2b428286e2a80ef76b8ddc3701527dc1f935a88914b02f2"}, -] [package.dependencies] marshmallow = ">=3.0.0,<4.0.0" @@ -2527,7 +1908,6 @@ tests = ["mock", "pytest"] [[package]] name = "matplotlib" version = "3.7.1" -version = "3.7.1" description = "Python plotting package" category = "main" optional = false @@ -2575,65 +1955,17 @@ files = [ {file = "matplotlib-3.7.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:97cc368a7268141afb5690760921765ed34867ffb9655dd325ed207af85c7529"}, {file = "matplotlib-3.7.1.tar.gz", hash = "sha256:7b73305f25eab4541bd7ee0b96d87e53ae9c9f1823be5659b806cd85786fe882"}, ] -python-versions = ">=3.8" -files = [ - {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:95cbc13c1fc6844ab8812a525bbc237fa1470863ff3dace7352e910519e194b1"}, - {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:08308bae9e91aca1ec6fd6dda66237eef9f6294ddb17f0d0b3c863169bf82353"}, - {file = "matplotlib-3.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:544764ba51900da4639c0f983b323d288f94f65f4024dc40ecb1542d74dc0500"}, - {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d94989191de3fcc4e002f93f7f1be5da476385dde410ddafbb70686acf00ea"}, - {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99bc9e65901bb9a7ce5e7bb24af03675cbd7c70b30ac670aa263240635999a4"}, - {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb7d248c34a341cd4c31a06fd34d64306624c8cd8d0def7abb08792a5abfd556"}, - {file = "matplotlib-3.7.1-cp310-cp310-win32.whl", hash = "sha256:ce463ce590f3825b52e9fe5c19a3c6a69fd7675a39d589e8b5fbe772272b3a24"}, - {file = "matplotlib-3.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:3d7bc90727351fb841e4d8ae620d2d86d8ed92b50473cd2b42ce9186104ecbba"}, - {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:770a205966d641627fd5cf9d3cb4b6280a716522cd36b8b284a8eb1581310f61"}, - {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f67bfdb83a8232cb7a92b869f9355d677bce24485c460b19d01970b64b2ed476"}, - {file = "matplotlib-3.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2bf092f9210e105f414a043b92af583c98f50050559616930d884387d0772aba"}, - {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89768d84187f31717349c6bfadc0e0d8c321e8eb34522acec8a67b1236a66332"}, - {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83111e6388dec67822e2534e13b243cc644c7494a4bb60584edbff91585a83c6"}, - {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a867bf73a7eb808ef2afbca03bcdb785dae09595fbe550e1bab0cd023eba3de0"}, - {file = "matplotlib-3.7.1-cp311-cp311-win32.whl", hash = "sha256:fbdeeb58c0cf0595efe89c05c224e0a502d1aa6a8696e68a73c3efc6bc354304"}, - {file = "matplotlib-3.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c0bd19c72ae53e6ab979f0ac6a3fafceb02d2ecafa023c5cca47acd934d10be7"}, - {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:6eb88d87cb2c49af00d3bbc33a003f89fd9f78d318848da029383bfc08ecfbfb"}, - {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:cf0e4f727534b7b1457898c4f4ae838af1ef87c359b76dcd5330fa31893a3ac7"}, - {file = "matplotlib-3.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:46a561d23b91f30bccfd25429c3c706afe7d73a5cc64ef2dfaf2b2ac47c1a5dc"}, - {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8704726d33e9aa8a6d5215044b8d00804561971163563e6e6591f9dcf64340cc"}, - {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4cf327e98ecf08fcbb82685acaf1939d3338548620ab8dfa02828706402c34de"}, - {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:617f14ae9d53292ece33f45cba8503494ee199a75b44de7717964f70637a36aa"}, - {file = "matplotlib-3.7.1-cp38-cp38-win32.whl", hash = "sha256:7c9a4b2da6fac77bcc41b1ea95fadb314e92508bf5493ceff058e727e7ecf5b0"}, - {file = "matplotlib-3.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:14645aad967684e92fc349493fa10c08a6da514b3d03a5931a1bac26e6792bd1"}, - {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:81a6b377ea444336538638d31fdb39af6be1a043ca5e343fe18d0f17e098770b"}, - {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:28506a03bd7f3fe59cd3cd4ceb2a8d8a2b1db41afede01f66c42561b9be7b4b7"}, - {file = "matplotlib-3.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c587963b85ce41e0a8af53b9b2de8dddbf5ece4c34553f7bd9d066148dc719c"}, - {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8bf26ade3ff0f27668989d98c8435ce9327d24cffb7f07d24ef609e33d582439"}, - {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:def58098f96a05f90af7e92fd127d21a287068202aa43b2a93476170ebd99e87"}, - {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f883a22a56a84dba3b588696a2b8a1ab0d2c3d41be53264115c71b0a942d8fdb"}, - {file = "matplotlib-3.7.1-cp39-cp39-win32.whl", hash = "sha256:4f99e1b234c30c1e9714610eb0c6d2f11809c9c78c984a613ae539ea2ad2eb4b"}, - {file = "matplotlib-3.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:3ba2af245e36990facf67fde840a760128ddd71210b2ab6406e640188d69d136"}, - {file = "matplotlib-3.7.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3032884084f541163f295db8a6536e0abb0db464008fadca6c98aaf84ccf4717"}, - {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a2cb34336110e0ed8bb4f650e817eed61fa064acbefeb3591f1b33e3a84fd96"}, - {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b867e2f952ed592237a1828f027d332d8ee219ad722345b79a001f49df0936eb"}, - {file = "matplotlib-3.7.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:57bfb8c8ea253be947ccb2bc2d1bb3862c2bccc662ad1b4626e1f5e004557042"}, - {file = "matplotlib-3.7.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:438196cdf5dc8d39b50a45cb6e3f6274edbcf2254f85fa9b895bf85851c3a613"}, - {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21e9cff1a58d42e74d01153360de92b326708fb205250150018a52c70f43c290"}, - {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75d4725d70b7c03e082bbb8a34639ede17f333d7247f56caceb3801cb6ff703d"}, - {file = "matplotlib-3.7.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:97cc368a7268141afb5690760921765ed34867ffb9655dd325ed207af85c7529"}, - {file = "matplotlib-3.7.1.tar.gz", hash = "sha256:7b73305f25eab4541bd7ee0b96d87e53ae9c9f1823be5659b806cd85786fe882"}, -] [package.dependencies] contourpy = ">=1.0.1" -contourpy = ">=1.0.1" cycler = ">=0.10" fonttools = ">=4.22.0" importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} -importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} kiwisolver = ">=1.0.1" numpy = ">=1.20" -numpy = ">=1.20" packaging = ">=20.0" pillow = ">=6.2.0" pyparsing = ">=2.3.1" -pyparsing = ">=2.3.1" python-dateutil = ">=2.7" [[package]] @@ -2694,42 +2026,6 @@ files = [ {file = "msgpack-1.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:f01b26c2290cbd74316990ba84a14ac3d599af9cebefc543d241a66e785cf17d"}, {file = "msgpack-1.0.3.tar.gz", hash = "sha256:51fdc7fb93615286428ee7758cecc2f374d5ff363bdd884c7ea622a7a327a81e"}, ] -files = [ - {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:96acc674bb9c9be63fa8b6dabc3248fdc575c4adc005c440ad02f87ca7edd079"}, - {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c3ca57c96c8e69c1a0d2926a6acf2d9a522b41dc4253a8945c4c6cd4981a4e3"}, - {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0a792c091bac433dfe0a70ac17fc2087d4595ab835b47b89defc8bbabcf5c73"}, - {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c58cdec1cb5fcea8c2f1771d7b5fec79307d056874f746690bd2bdd609ab147"}, - {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f97c0f35b3b096a330bb4a1a9247d0bd7e1f3a2eba7ab69795501504b1c2c39"}, - {file = "msgpack-1.0.3-cp310-cp310-win32.whl", hash = "sha256:36a64a10b16c2ab31dcd5f32d9787ed41fe68ab23dd66957ca2826c7f10d0b85"}, - {file = "msgpack-1.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c1ba333b4024c17c7591f0f372e2daa3c31db495a9b2af3cf664aef3c14354f7"}, - {file = "msgpack-1.0.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c2140cf7a3ec475ef0938edb6eb363fa704159e0bf71dde15d953bacc1cf9d7d"}, - {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f4c22717c74d44bcd7af353024ce71c6b55346dad5e2cc1ddc17ce8c4507c6b"}, - {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d733a15ade190540c703de209ffbc42a3367600421b62ac0c09fde594da6ec"}, - {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7e03b06f2982aa98d4ddd082a210c3db200471da523f9ac197f2828e80e7770"}, - {file = "msgpack-1.0.3-cp36-cp36m-win32.whl", hash = "sha256:3d875631ecab42f65f9dce6f55ce6d736696ced240f2634633188de2f5f21af9"}, - {file = "msgpack-1.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:40fb89b4625d12d6027a19f4df18a4de5c64f6f3314325049f219683e07e678a"}, - {file = "msgpack-1.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6eef0cf8db3857b2b556213d97dd82de76e28a6524853a9beb3264983391dc1a"}, - {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d8c332f53ffff01953ad25131272506500b14750c1d0ce8614b17d098252fbc"}, - {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c0903bd93cbd34653dd63bbfcb99d7539c372795201f39d16fdfde4418de43a"}, - {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf1e6bfed4860d72106f4e0a1ab519546982b45689937b40257cfd820650b920"}, - {file = "msgpack-1.0.3-cp37-cp37m-win32.whl", hash = "sha256:d02cea2252abc3756b2ac31f781f7a98e89ff9759b2e7450a1c7a0d13302ff50"}, - {file = "msgpack-1.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f30dd0dc4dfe6231ad253b6f9f7128ac3202ae49edd3f10d311adc358772dba"}, - {file = "msgpack-1.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f201d34dc89342fabb2a10ed7c9a9aaaed9b7af0f16a5923f1ae562b31258dea"}, - {file = "msgpack-1.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bb87f23ae7d14b7b3c21009c4b1705ec107cb21ee71975992f6aca571fb4a42a"}, - {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a3a5c4b16e9d0edb823fe54b59b5660cc8d4782d7bf2c214cb4b91a1940a8ef"}, - {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74da1e5fcf20ade12c6bf1baa17a2dc3604958922de8dc83cbe3eff22e8b611"}, - {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73a80bd6eb6bcb338c1ec0da273f87420829c266379c8c82fa14c23fb586cfa1"}, - {file = "msgpack-1.0.3-cp38-cp38-win32.whl", hash = "sha256:9fce00156e79af37bb6db4e7587b30d11e7ac6a02cb5bac387f023808cd7d7f4"}, - {file = "msgpack-1.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:9b6f2d714c506e79cbead331de9aae6837c8dd36190d02da74cb409b36162e8a"}, - {file = "msgpack-1.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:89908aea5f46ee1474cc37fbc146677f8529ac99201bc2faf4ef8edc023c2bf3"}, - {file = "msgpack-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:973ad69fd7e31159eae8f580f3f707b718b61141838321c6fa4d891c4a2cca52"}, - {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da24375ab4c50e5b7486c115a3198d207954fe10aaa5708f7b65105df09109b2"}, - {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a598d0685e4ae07a0672b59792d2cc767d09d7a7f39fd9bd37ff84e060b1a996"}, - {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4c309a68cb5d6bbd0c50d5c71a25ae81f268c2dc675c6f4ea8ab2feec2ac4e2"}, - {file = "msgpack-1.0.3-cp39-cp39-win32.whl", hash = "sha256:494471d65b25a8751d19c83f1a482fd411d7ca7a3b9e17d25980a74075ba0e88"}, - {file = "msgpack-1.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:f01b26c2290cbd74316990ba84a14ac3d599af9cebefc543d241a66e785cf17d"}, - {file = "msgpack-1.0.3.tar.gz", hash = "sha256:51fdc7fb93615286428ee7758cecc2f374d5ff363bdd884c7ea622a7a327a81e"}, -] [[package]] name = "mypy-extensions" @@ -2766,10 +2062,6 @@ files = [ {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, ] -files = [ - {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, - {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, -] [package.dependencies] setuptools = "*" @@ -2813,38 +2105,6 @@ files = [ {file = "numpy-1.21.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a3deb31bc84f2b42584b8c4001c85d1934dbfb4030827110bc36bfd11509b7bf"}, {file = "numpy-1.21.4.zip", hash = "sha256:e6c76a87633aa3fa16614b61ccedfae45b91df2767cf097aa9c933932a7ed1e0"}, ] -files = [ - {file = "numpy-1.21.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8890b3360f345e8360133bc078d2dacc2843b6ee6059b568781b15b97acbe39f"}, - {file = "numpy-1.21.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:69077388c5a4b997442b843dbdc3a85b420fb693ec8e33020bb24d647c164fa5"}, - {file = "numpy-1.21.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e89717274b41ebd568cd7943fc9418eeb49b1785b66031bc8a7f6300463c5898"}, - {file = "numpy-1.21.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b78ecfa070460104934e2caf51694ccd00f37d5e5dbe76f021b1b0b0d221823"}, - {file = "numpy-1.21.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:615d4e328af7204c13ae3d4df7615a13ff60a49cb0d9106fde07f541207883ca"}, - {file = "numpy-1.21.4-cp310-cp310-win_amd64.whl", hash = "sha256:1403b4e2181fc72664737d848b60e65150f272fe5a1c1cbc16145ed43884065a"}, - {file = "numpy-1.21.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:74b85a17528ca60cf98381a5e779fc0264b4a88b46025e6bcbe9621f46bb3e63"}, - {file = "numpy-1.21.4-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92aafa03da8658609f59f18722b88f0a73a249101169e28415b4fa148caf7e41"}, - {file = "numpy-1.21.4-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5d95668e727c75b3f5088ec7700e260f90ec83f488e4c0aaccb941148b2cd377"}, - {file = "numpy-1.21.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5162ec777ba7138906c9c274353ece5603646c6965570d82905546579573f73"}, - {file = "numpy-1.21.4-cp37-cp37m-win32.whl", hash = "sha256:81225e58ef5fce7f1d80399575576fc5febec79a8a2742e8ef86d7b03beef49f"}, - {file = "numpy-1.21.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32fe5b12061f6446adcbb32cf4060a14741f9c21e15aaee59a207b6ce6423469"}, - {file = "numpy-1.21.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c449eb870616a7b62e097982c622d2577b3dbc800aaf8689254ec6e0197cbf1e"}, - {file = "numpy-1.21.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2e4ed57f45f0aa38beca2a03b6532e70e548faf2debbeb3291cfc9b315d9be8f"}, - {file = "numpy-1.21.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1247ef28387b7bb7f21caf2dbe4767f4f4175df44d30604d42ad9bd701ebb31f"}, - {file = "numpy-1.21.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34f3456f530ae8b44231c63082c8899fe9c983fd9b108c997c4b1c8c2d435333"}, - {file = "numpy-1.21.4-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c9c23158b87ed0e70d9a50c67e5c0b3f75bcf2581a8e34668d4e9d7474d76c6"}, - {file = "numpy-1.21.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4799be6a2d7d3c33699a6f77201836ac975b2e1b98c2a07f66a38f499cb50ce"}, - {file = "numpy-1.21.4-cp38-cp38-win32.whl", hash = "sha256:bc988afcea53e6156546e5b2885b7efab089570783d9d82caf1cfd323b0bb3dd"}, - {file = "numpy-1.21.4-cp38-cp38-win_amd64.whl", hash = "sha256:170b2a0805c6891ca78c1d96ee72e4c3ed1ae0a992c75444b6ab20ff038ba2cd"}, - {file = "numpy-1.21.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fde96af889262e85aa033f8ee1d3241e32bf36228318a61f1ace579df4e8170d"}, - {file = "numpy-1.21.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c885bfc07f77e8fee3dc879152ba993732601f1f11de248d4f357f0ffea6a6d4"}, - {file = "numpy-1.21.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e6f5f50d1eff2f2f752b3089a118aee1ea0da63d56c44f3865681009b0af162"}, - {file = "numpy-1.21.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ad010846cdffe7ec27e3f933397f8a8d6c801a48634f419e3d075db27acf5880"}, - {file = "numpy-1.21.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c74c699b122918a6c4611285cc2cad4a3aafdb135c22a16ec483340ef97d573c"}, - {file = "numpy-1.21.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9864424631775b0c052f3bd98bc2712d131b3e2cd95d1c0c68b91709170890b0"}, - {file = "numpy-1.21.4-cp39-cp39-win32.whl", hash = "sha256:b1e2312f5b8843a3e4e8224b2b48fe16119617b8fc0a54df8f50098721b5bed2"}, - {file = "numpy-1.21.4-cp39-cp39-win_amd64.whl", hash = "sha256:e3c3e990274444031482a31280bf48674441e0a5b55ddb168f3a6db3e0c38ec8"}, - {file = "numpy-1.21.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a3deb31bc84f2b42584b8c4001c85d1934dbfb4030827110bc36bfd11509b7bf"}, - {file = "numpy-1.21.4.zip", hash = "sha256:e6c76a87633aa3fa16614b61ccedfae45b91df2767cf097aa9c933932a7ed1e0"}, -] [[package]] name = "oauth2client" @@ -2857,10 +2117,6 @@ files = [ {file = "oauth2client-4.1.3-py2.py3-none-any.whl", hash = "sha256:b8a81cc5d60e2d364f0b1b98f958dbd472887acaf1a5b05e21c28c31a2d6d3ac"}, {file = "oauth2client-4.1.3.tar.gz", hash = "sha256:d486741e451287f69568a4d26d70d9acd73a2bbfa275746c535b4209891cccc6"}, ] -files = [ - {file = "oauth2client-4.1.3-py2.py3-none-any.whl", hash = "sha256:b8a81cc5d60e2d364f0b1b98f958dbd472887acaf1a5b05e21c28c31a2d6d3ac"}, - {file = "oauth2client-4.1.3.tar.gz", hash = "sha256:d486741e451287f69568a4d26d70d9acd73a2bbfa275746c535b4209891cccc6"}, -] [package.dependencies] httplib2 = ">=0.9.1" @@ -2880,16 +2136,27 @@ files = [ {file = "oauthlib-3.1.1-py2.py3-none-any.whl", hash = "sha256:42bf6354c2ed8c6acb54d971fce6f88193d97297e18602a3a886603f9d7730cc"}, {file = "oauthlib-3.1.1.tar.gz", hash = "sha256:8f0215fcc533dd8dd1bee6f4c412d4f0cd7297307d43ac61666389e3bc3198a3"}, ] -files = [ - {file = "oauthlib-3.1.1-py2.py3-none-any.whl", hash = "sha256:42bf6354c2ed8c6acb54d971fce6f88193d97297e18602a3a886603f9d7730cc"}, - {file = "oauthlib-3.1.1.tar.gz", hash = "sha256:8f0215fcc533dd8dd1bee6f4c412d4f0cd7297307d43ac61666389e3bc3198a3"}, -] [package.extras] rsa = ["cryptography (>=3.0.0,<4)"] signals = ["blinker (>=1.4.0)"] signedtoken = ["cryptography (>=3.0.0,<4)", "pyjwt (>=2.0.0,<3)"] +[[package]] +name = "openpyxl" +version = "3.0.9" +description = "A Python library to read/write Excel 2010 xlsx/xlsm files" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "openpyxl-3.0.9-py2.py3-none-any.whl", hash = "sha256:8f3b11bd896a95468a4ab162fc4fcd260d46157155d1f8bfaabb99d88cfcf79f"}, + {file = "openpyxl-3.0.9.tar.gz", hash = "sha256:40f568b9829bf9e446acfffce30250ac1fa39035124d55fc024025c41481c90f"}, +] + +[package.dependencies] +et-xmlfile = "*" + [[package]] name = "packaging" version = "21.3" @@ -2901,10 +2168,6 @@ files = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] -files = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] [package.dependencies] pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" @@ -2912,7 +2175,6 @@ pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pandas" version = "1.5.3" -version = "1.5.3" description = "Powerful data structures for data analysis, time series, and statistics" category = "main" optional = false @@ -2946,35 +2208,6 @@ files = [ {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, ] -files = [ - {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, - {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, - {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, - {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, - {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, - {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, - {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, - {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, - {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, - {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, - {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, - {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, - {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, - {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, - {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, - {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, - {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, - {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, - {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, - {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, - {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, - {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, - {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, - {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, - {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, - {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, - {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, -] [package.dependencies] numpy = [ @@ -2998,10 +2231,6 @@ files = [ {file = "pandas-gbq-0.17.4.tar.gz", hash = "sha256:70ac57cc6ebf9d1e1c1c810f5ccac710163acd4c3d13e8badea27bb66fae19f7"}, {file = "pandas_gbq-0.17.4-py2.py3-none-any.whl", hash = "sha256:3b3714167bdc4b1a6013ff6286a452727efbceb412922a2ca39aa996e8e8b129"}, ] -files = [ - {file = "pandas-gbq-0.17.4.tar.gz", hash = "sha256:70ac57cc6ebf9d1e1c1c810f5ccac710163acd4c3d13e8badea27bb66fae19f7"}, - {file = "pandas_gbq-0.17.4-py2.py3-none-any.whl", hash = "sha256:3b3714167bdc4b1a6013ff6286a452727efbceb412922a2ca39aa996e8e8b129"}, -] [package.dependencies] db-dtypes = ">=0.3.1,<2.0.0" @@ -3022,7 +2251,6 @@ tqdm = ["tqdm (>=4.23.0)"] [[package]] name = "pandavro" version = "1.7.2" -version = "1.7.2" description = "The interface between Avro and pandas DataFrame" category = "main" optional = false @@ -3031,19 +2259,11 @@ files = [ {file = "pandavro-1.7.2-py3-none-any.whl", hash = "sha256:5b4a2fbc86fb2b102e5b2b24490084e4775a5ac546fc8981931abecf6bb4a34b"}, {file = "pandavro-1.7.2.tar.gz", hash = "sha256:4f2b7b6823522f54e8bfe33c091fb29898349892b70634f46c928e6a42a76e69"}, ] -python-versions = ">=3.6.1" -files = [ - {file = "pandavro-1.7.2-py3-none-any.whl", hash = "sha256:5b4a2fbc86fb2b102e5b2b24490084e4775a5ac546fc8981931abecf6bb4a34b"}, - {file = "pandavro-1.7.2.tar.gz", hash = "sha256:4f2b7b6823522f54e8bfe33c091fb29898349892b70634f46c928e6a42a76e69"}, -] [package.dependencies] fastavro = ">=1.5.1,<1.6.0" numpy = ">=1.15.4" pandas = ">=1.1" -fastavro = ">=1.5.1,<1.6.0" -numpy = ">=1.15.4" -pandas = ">=1.1" [package.extras] tests = ["pytest (==7.1.2)"] @@ -3090,10 +2310,6 @@ files = [ {file = "partd-1.2.0-py3-none-any.whl", hash = "sha256:5c3a5d70da89485c27916328dc1e26232d0e270771bd4caef4a5124b6a457288"}, {file = "partd-1.2.0.tar.gz", hash = "sha256:aa67897b84d522dcbc86a98b942afab8c6aa2f7f677d904a616b74ef5ddbc3eb"}, ] -files = [ - {file = "partd-1.2.0-py3-none-any.whl", hash = "sha256:5c3a5d70da89485c27916328dc1e26232d0e270771bd4caef4a5124b6a457288"}, - {file = "partd-1.2.0.tar.gz", hash = "sha256:aa67897b84d522dcbc86a98b942afab8c6aa2f7f677d904a616b74ef5ddbc3eb"}, -] [package.dependencies] locket = "*" @@ -3132,137 +2348,45 @@ files = [ {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, ] -files = [ - {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, - {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, - {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, - {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, - {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, - {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, - {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, - {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, - {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, - {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, - {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, - {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, - {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, - {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, - {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, - {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, - {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, - {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, - {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, - {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, - {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, -] [package.dependencies] python-dateutil = ">=2.6,<3.0" pytzdata = ">=2020.1" - -[[package]] -name = "pexpect" -version = "4.8.0" -description = "Pexpect allows easy control of interactive console applications." -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, -] - -[package.dependencies] -ptyprocess = ">=0.5" - -[[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] - -[[package]] -name = "pillow" -version = "9.5.0" -version = "9.5.0" -description = "Python Imaging Library (Fork)" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, - {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, - {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, - {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, - {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, - {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, - {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, - {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, - {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, - {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, - {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, - {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, - {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, - {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, - {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, - {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, - {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, ] + +[[package]] +name = "pillow" +version = "9.5.0" +description = "Python Imaging Library (Fork)" +category = "main" +optional = false +python-versions = ">=3.7" files = [ {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, @@ -3334,7 +2458,6 @@ files = [ [package.extras] docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] [[package]] @@ -3356,7 +2479,6 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest- [[package]] name = "pluggy" version = "1.0.0" -version = "1.0.0" description = "plugin and hook calling mechanisms for python" category = "main" optional = false @@ -3365,11 +2487,6 @@ files = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -python-versions = ">=3.6" -files = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] [package.extras] dev = ["pre-commit", "tox"] @@ -3377,23 +2494,20 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "polars" -version = "0.17.11" +version = "0.17.12" description = "Blazingly fast DataFrame library" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "polars-0.17.11-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:07ecde540830bad035fecadbd07721a0dd3cba5887ba6d49844242de83a9ace8"}, - {file = "polars-0.17.11-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:accf4719953f0e2f27db4c87e3ebac9569ebce8675fe3c6b710af2c313aedb81"}, - {file = "polars-0.17.11-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38db6e92726c36ffd80fc39c511c725c34391b4b33a1fb1d2866cbe14d7c9c07"}, - {file = "polars-0.17.11-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54aca5e4cb157cd3d177fe46c6f5b167cd2dd466d2fa4b8a7ff65c3e627a1037"}, - {file = "polars-0.17.11-cp37-abi3-win_amd64.whl", hash = "sha256:2b8d7055809017f0d1aab122cd5a818d502086f2ed7d57c2e5057f7374aa9831"}, - {file = "polars-0.17.11.tar.gz", hash = "sha256:103579cf6f1784740f88fc1510c4f349ebdf062d093a4155d87d09a80d40b342"}, + {file = "polars-0.17.12-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:0e14abda95c572261e4029dc87419179517faf0fb4ea11a2c0bb10c2eca7da4d"}, + {file = "polars-0.17.12-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:7bf7e865c11a151306296f730817ffa0e3df971765e0d5643ada185c627b3599"}, + {file = "polars-0.17.12-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1958ce4213ca491a5fa3cb307d9a47a1d101a0fe15382648ee87ee4d23cc356b"}, + {file = "polars-0.17.12-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfe4b9b0e1c9501bf3ea73522923b757a0b125e6d4fe72d1c943036b2aac0f49"}, + {file = "polars-0.17.12-cp37-abi3-win_amd64.whl", hash = "sha256:d998917bf3ea1149c33c901f3311a69f0a2bde64b6198635c7d72658ceb898f9"}, + {file = "polars-0.17.12.tar.gz", hash = "sha256:0d043f1fbcf4efced53b048f76ffd7cf2e203caec635517de2e9cf2e235cb3e5"}, ] -[package.dependencies] -typing_extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} - [package.extras] all = ["polars[connectorx,deltalake,fsspec,matplotlib,numpy,pandas,pyarrow,sqlalchemy,timezone,xlsx2csv,xlsxwriter]"] connectorx = ["connectorx"] @@ -3408,10 +2522,21 @@ timezone = ["backports.zoneinfo", "tzdata"] xlsx2csv = ["xlsx2csv (>=0.8.0)"] xlsxwriter = ["xlsxwriter"] +[[package]] +name = "poyo" +version = "0.5.0" +description = "A lightweight YAML Parser for Python. 🐓" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "poyo-0.5.0-py2.py3-none-any.whl", hash = "sha256:3e2ca8e33fdc3c411cd101ca395668395dd5dc7ac775b8e809e3def9f9fe041a"}, + {file = "poyo-0.5.0.tar.gz", hash = "sha256:e26956aa780c45f011ca9886f044590e2d8fd8b61db7b1c1cf4e0869f48ed4dd"}, +] + [[package]] name = "pre-commit" version = "2.21.0" -version = "2.21.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." category = "main" optional = false @@ -3420,10 +2545,6 @@ files = [ {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, ] -files = [ - {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, - {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, -] [package.dependencies] cfgv = ">=2.0.0" @@ -3431,7 +2552,6 @@ identify = ">=1.0.0" nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" -virtualenv = ">=20.10.0" [[package]] name = "prefect" @@ -3444,10 +2564,6 @@ files = [ {file = "prefect-0.15.9-py3-none-any.whl", hash = "sha256:595c9f229349528f7bcd2aa866c9c10dcfbf059a20803526924339d45604ec76"}, {file = "prefect-0.15.9.tar.gz", hash = "sha256:52d4d28493cd1a90e1acf96b5a92b2902950849b481a49f762998448a41cf127"}, ] -files = [ - {file = "prefect-0.15.9-py3-none-any.whl", hash = "sha256:595c9f229349528f7bcd2aa866c9c10dcfbf059a20803526924339d45604ec76"}, - {file = "prefect-0.15.9.tar.gz", hash = "sha256:52d4d28493cd1a90e1acf96b5a92b2902950849b481a49f762998448a41cf127"}, -] [package.dependencies] click = ">=7.0,<9.0" @@ -3540,10 +2656,6 @@ files = [ {file = "proto-plus-1.19.8.tar.gz", hash = "sha256:bdf45f0e0be71510eb2ec9db4da78afde7b5fb8b0a507a36340a9b6ce8e48e58"}, {file = "proto_plus-1.19.8-py3-none-any.whl", hash = "sha256:3434eadaed845a337d6c488d2b7d055d733aaa231c0c0d4c778ec720bb91cf87"}, ] -files = [ - {file = "proto-plus-1.19.8.tar.gz", hash = "sha256:bdf45f0e0be71510eb2ec9db4da78afde7b5fb8b0a507a36340a9b6ce8e48e58"}, - {file = "proto_plus-1.19.8-py3-none-any.whl", hash = "sha256:3434eadaed845a337d6c488d2b7d055d733aaa231c0c0d4c778ec720bb91cf87"}, -] [package.dependencies] protobuf = ">=3.19.0" @@ -3584,32 +2696,6 @@ files = [ {file = "protobuf-3.19.1-py2.py3-none-any.whl", hash = "sha256:e813b1c9006b6399308e917ac5d298f345d95bb31f46f02b60cd92970a9afa17"}, {file = "protobuf-3.19.1.tar.gz", hash = "sha256:62a8e4baa9cb9e064eb62d1002eca820857ab2138440cb4b3ea4243830f94ca7"}, ] -files = [ - {file = "protobuf-3.19.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d80f80eb175bf5f1169139c2e0c5ada98b1c098e2b3c3736667f28cbbea39fc8"}, - {file = "protobuf-3.19.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a529e7df52204565bcd33738a7a5f288f3d2d37d86caa5d78c458fa5fabbd54d"}, - {file = "protobuf-3.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28ccea56d4dc38d35cd70c43c2da2f40ac0be0a355ef882242e8586c6d66666f"}, - {file = "protobuf-3.19.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b30a7de128c46b5ecb343917d9fa737612a6e8280f440874e5cc2ba0d79b8f6"}, - {file = "protobuf-3.19.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5935c8ce02e3d89c7900140a8a42b35bc037ec07a6aeb61cc108be8d3c9438a6"}, - {file = "protobuf-3.19.1-cp36-cp36m-win32.whl", hash = "sha256:74f33edeb4f3b7ed13d567881da8e5a92a72b36495d57d696c2ea1ae0cfee80c"}, - {file = "protobuf-3.19.1-cp36-cp36m-win_amd64.whl", hash = "sha256:038daf4fa38a7e818dd61f51f22588d61755160a98db087a046f80d66b855942"}, - {file = "protobuf-3.19.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e51561d72efd5bd5c91490af1f13e32bcba8dab4643761eb7de3ce18e64a853"}, - {file = "protobuf-3.19.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:6e8ea9173403219239cdfd8d946ed101f2ab6ecc025b0fda0c6c713c35c9981d"}, - {file = "protobuf-3.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db3532d9f7a6ebbe2392041350437953b6d7a792de10e629c1e4f5a6b1fe1ac6"}, - {file = "protobuf-3.19.1-cp37-cp37m-win32.whl", hash = "sha256:615b426a177780ce381ecd212edc1e0f70db8557ed72560b82096bd36b01bc04"}, - {file = "protobuf-3.19.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d8919368410110633717c406ab5c97e8df5ce93020cfcf3012834f28b1fab1ea"}, - {file = "protobuf-3.19.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:71b0250b0cfb738442d60cab68abc166de43411f2a4f791d31378590bfb71bd7"}, - {file = "protobuf-3.19.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3cd0458870ea7d1c58e948ac8078f6ba8a7ecc44a57e03032ed066c5bb318089"}, - {file = "protobuf-3.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:655264ed0d0efe47a523e2255fc1106a22f6faab7cc46cfe99b5bae085c2a13e"}, - {file = "protobuf-3.19.1-cp38-cp38-win32.whl", hash = "sha256:b691d996c6d0984947c4cf8b7ae2fe372d99b32821d0584f0b90277aa36982d3"}, - {file = "protobuf-3.19.1-cp38-cp38-win_amd64.whl", hash = "sha256:e7e8d2c20921f8da0dea277dfefc6abac05903ceac8e72839b2da519db69206b"}, - {file = "protobuf-3.19.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fd390367fc211cc0ffcf3a9e149dfeca78fecc62adb911371db0cec5c8b7472d"}, - {file = "protobuf-3.19.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d83e1ef8cb74009bebee3e61cc84b1c9cd04935b72bca0cbc83217d140424995"}, - {file = "protobuf-3.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36d90676d6f426718463fe382ec6274909337ca6319d375eebd2044e6c6ac560"}, - {file = "protobuf-3.19.1-cp39-cp39-win32.whl", hash = "sha256:e7b24c11df36ee8e0c085e5b0dc560289e4b58804746fb487287dda51410f1e2"}, - {file = "protobuf-3.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:77d2fadcf369b3f22859ab25bd12bb8e98fb11e05d9ff9b7cd45b711c719c002"}, - {file = "protobuf-3.19.1-py2.py3-none-any.whl", hash = "sha256:e813b1c9006b6399308e917ac5d298f345d95bb31f46f02b60cd92970a9afa17"}, - {file = "protobuf-3.19.1.tar.gz", hash = "sha256:62a8e4baa9cb9e064eb62d1002eca820857ab2138440cb4b3ea4243830f94ca7"}, -] [[package]] name = "psutil" @@ -3648,36 +2734,6 @@ files = [ {file = "psutil-5.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3"}, {file = "psutil-5.8.0.tar.gz", hash = "sha256:0c9ccb99ab76025f2f0bbecf341d4656e9c1351db8cc8a03ccd62e318ab4b5c6"}, ] -files = [ - {file = "psutil-5.8.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64"}, - {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0ae6f386d8d297177fd288be6e8d1afc05966878704dad9847719650e44fc49c"}, - {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:12d844996d6c2b1d3881cfa6fa201fd635971869a9da945cf6756105af73d2df"}, - {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:02b8292609b1f7fcb34173b25e48d0da8667bc85f81d7476584d889c6e0f2131"}, - {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6ffe81843131ee0ffa02c317186ed1e759a145267d54fdef1bc4ea5f5931ab60"}, - {file = "psutil-5.8.0-cp27-none-win32.whl", hash = "sha256:ea313bb02e5e25224e518e4352af4bf5e062755160f77e4b1767dd5ccb65f876"}, - {file = "psutil-5.8.0-cp27-none-win_amd64.whl", hash = "sha256:5da29e394bdedd9144c7331192e20c1f79283fb03b06e6abd3a8ae45ffecee65"}, - {file = "psutil-5.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:74fb2557d1430fff18ff0d72613c5ca30c45cdbfcddd6a5773e9fc1fe9364be8"}, - {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:74f2d0be88db96ada78756cb3a3e1b107ce8ab79f65aa885f76d7664e56928f6"}, - {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99de3e8739258b3c3e8669cb9757c9a861b2a25ad0955f8e53ac662d66de61ac"}, - {file = "psutil-5.8.0-cp36-cp36m-win32.whl", hash = "sha256:36b3b6c9e2a34b7d7fbae330a85bf72c30b1c827a4366a07443fc4b6270449e2"}, - {file = "psutil-5.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:52de075468cd394ac98c66f9ca33b2f54ae1d9bff1ef6b67a212ee8f639ec06d"}, - {file = "psutil-5.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c6a5fd10ce6b6344e616cf01cc5b849fa8103fbb5ba507b6b2dee4c11e84c935"}, - {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:61f05864b42fedc0771d6d8e49c35f07efd209ade09a5afe6a5059e7bb7bf83d"}, - {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:0dd4465a039d343925cdc29023bb6960ccf4e74a65ad53e768403746a9207023"}, - {file = "psutil-5.8.0-cp37-cp37m-win32.whl", hash = "sha256:1bff0d07e76114ec24ee32e7f7f8d0c4b0514b3fae93e3d2aaafd65d22502394"}, - {file = "psutil-5.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:fcc01e900c1d7bee2a37e5d6e4f9194760a93597c97fee89c4ae51701de03563"}, - {file = "psutil-5.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6223d07a1ae93f86451d0198a0c361032c4c93ebd4bf6d25e2fb3edfad9571ef"}, - {file = "psutil-5.8.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d225cd8319aa1d3c85bf195c4e07d17d3cd68636b8fc97e6cf198f782f99af28"}, - {file = "psutil-5.8.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:28ff7c95293ae74bf1ca1a79e8805fcde005c18a122ca983abf676ea3466362b"}, - {file = "psutil-5.8.0-cp38-cp38-win32.whl", hash = "sha256:ce8b867423291cb65cfc6d9c4955ee9bfc1e21fe03bb50e177f2b957f1c2469d"}, - {file = "psutil-5.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:90f31c34d25b1b3ed6c40cdd34ff122b1887a825297c017e4cbd6796dd8b672d"}, - {file = "psutil-5.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6323d5d845c2785efb20aded4726636546b26d3b577aded22492908f7c1bdda7"}, - {file = "psutil-5.8.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:245b5509968ac0bd179287d91210cd3f37add77dad385ef238b275bad35fa1c4"}, - {file = "psutil-5.8.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:90d4091c2d30ddd0a03e0b97e6a33a48628469b99585e2ad6bf21f17423b112b"}, - {file = "psutil-5.8.0-cp39-cp39-win32.whl", hash = "sha256:ea372bcc129394485824ae3e3ddabe67dc0b118d262c568b4d2602a7070afdb0"}, - {file = "psutil-5.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3"}, - {file = "psutil-5.8.0.tar.gz", hash = "sha256:0c9ccb99ab76025f2f0bbecf341d4656e9c1351db8cc8a03ccd62e318ab4b5c6"}, -] [package.extras] test = ["enum34", "ipaddress", "mock", "pywin32", "unittest2", "wmi"] @@ -3720,10 +2776,6 @@ files = [ {file = "pyaml-20.4.0-py2.py3-none-any.whl", hash = "sha256:67081749a82b72c45e5f7f812ee3a14a03b3f5c25ff36ec3b290514f8c4c4b99"}, {file = "pyaml-20.4.0.tar.gz", hash = "sha256:29a5c2a68660a799103d6949167bd6c7953d031449d08802386372de1db6ad71"}, ] -files = [ - {file = "pyaml-20.4.0-py2.py3-none-any.whl", hash = "sha256:67081749a82b72c45e5f7f812ee3a14a03b3f5c25ff36ec3b290514f8c4c4b99"}, - {file = "pyaml-20.4.0.tar.gz", hash = "sha256:29a5c2a68660a799103d6949167bd6c7953d031449d08802386372de1db6ad71"}, -] [package.dependencies] PyYAML = "*" @@ -3773,44 +2825,6 @@ files = [ {file = "pyarrow-6.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:376c4b5f248ae63df21fe15c194e9013753164be2d38f4b3fb8bde63ac5a1958"}, {file = "pyarrow-6.0.0.tar.gz", hash = "sha256:5be62679201c441356d3f2a739895dcc8d4d299f2a6eabcd2163bfb6a898abba"}, ] -files = [ - {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_13_universal2.whl", hash = "sha256:c7a6e7e0bf8779e9c3428ced85507541f3da9a0675e2f4781d4eb2c7042cbf81"}, - {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:7a683f71b848eb6310b4ec48c0def55dac839e9994c1ac874c9b2d3d5625def1"}, - {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5144bd9db2920c7cb566c96462d62443cc239104f94771d110f74393f2fb42a2"}, - {file = "pyarrow-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed0be080cf595ea15ff1c9ff4097bbf1fcc4b50847d98c0a3c0412fbc6ede7e9"}, - {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:072c1a0fca4509eefd7d018b78542fb7e5c63aaf5698f1c0a6e45628ae17ba44"}, - {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5bed4f948c032c40597302e9bdfa65f62295240306976ecbe43a54924c6f94f"}, - {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:465f87fa0be0b2928b2beeba22b5813a0203fb05d90fd8563eea48e08ecc030e"}, - {file = "pyarrow-6.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:ddf2e6e3b321adaaf716f2d5af8e92d205a9671e0cb7c0779710a567fd1dd580"}, - {file = "pyarrow-6.0.0-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:0204e80777ab8f4e9abd3a765a8ec07ed1e3c4630bacda50d2ce212ef0f3826f"}, - {file = "pyarrow-6.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:82fe80309e01acf29e3943a1f6d3c98ec109fe1d356bc1ac37d639bcaadcf684"}, - {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:281ce5fa03621d786a9beb514abb09846db7f0221b50eabf543caa24037eaacd"}, - {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5408fa8d623e66a0445f3fb0e4027fd219bf99bfb57422d543d7b7876e2c5b55"}, - {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a19e58dfb04e451cd8b7bdec3ac8848373b95dfc53492c9a69789aa9074a3c1b"}, - {file = "pyarrow-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b86d175262db1eb46afdceb36d459409eb6f8e532d3dec162f8bf572c7f57623"}, - {file = "pyarrow-6.0.0-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:2d2c681659396c745e4f1988d5dd41dcc3ad557bb8d4a8c2e44030edafc08a91"}, - {file = "pyarrow-6.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c666bc6a1cebf01206e2dc1ab05f25f39f35d3a499e0ef5cd635225e07306ca"}, - {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8d41dfb09ba9236cca6245f33088eb42f3c54023da281139241e0f9f3b4b754e"}, - {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477c746ef42c039348a288584800e299456c80c5691401bb9b19aa9c02a427b7"}, - {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c38263ea438a1666b13372e7565450cfeec32dbcd1c2595749476a58465eaec"}, - {file = "pyarrow-6.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e81508239a71943759cee272ce625ae208092dd36ef2c6713fccee30bbcf52bb"}, - {file = "pyarrow-6.0.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:a50d2f77b86af38ceabf45617208b9105d20e7a5eebc584e7c8c0acededd82ce"}, - {file = "pyarrow-6.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbda7595f24a639bcef3419ecfac17216efacb09f7b0f1b4c4c97f900d65ca0e"}, - {file = "pyarrow-6.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bf3400780c4d3c9cb43b1e8a1aaf2e1b7199a0572d0a645529d2784e4d0d8497"}, - {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:15dc0d673d3f865ca63c877bd7a2eced70b0a08969fb733a28247134b8a1f18b"}, - {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1d9a2f4ee812ed0bd4182cabef99ea914ac297274f0de086f2488093d284ef"}, - {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d046dc78a9337baa6415be915c5a16222505233e238a1017f368243c89817eea"}, - {file = "pyarrow-6.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:ea64a48a85c631eb2a0ea13ccdec5143c85b5897836b16331ee4289d27a57247"}, - {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_13_universal2.whl", hash = "sha256:cc1d4a70efd583befe92d4ea6f74ed2e0aa31ccdde767cd5cae8e77c65a1c2d4"}, - {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:004185e0babc6f3c3fba6ba4f106e406a0113d0f82bb9ad9a8571a1978c45d04"}, - {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c23f8cdecd3d9e49f9b0f9a651ae5549d1d32fd4901fb1bdc2d327edfba844f"}, - {file = "pyarrow-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fb701ec4a94b92102606d4e88f0b8eba34f09a5ad8e014eaa4af76f42b7f62ae"}, - {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da7860688c33ca88ac05f1a487d32d96d9caa091412496c35f3d1d832145675a"}, - {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac941a147d14993987cc8b605b721735a34b3e54d167302501fb4db1ad7382c7"}, - {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6163d82cca7541774b00503c295fe86a1722820eddb958b57f091bb6f5b0a6db"}, - {file = "pyarrow-6.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:376c4b5f248ae63df21fe15c194e9013753164be2d38f4b3fb8bde63ac5a1958"}, - {file = "pyarrow-6.0.0.tar.gz", hash = "sha256:5be62679201c441356d3f2a739895dcc8d4d299f2a6eabcd2163bfb6a898abba"}, -] [package.dependencies] numpy = ">=1.16.6" @@ -3826,10 +2840,6 @@ files = [ {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, ] -files = [ - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, -] [[package]] name = "pyasn1-modules" @@ -3842,10 +2852,6 @@ files = [ {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, ] -files = [ - {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, - {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, -] [package.dependencies] pyasn1 = ">=0.4.6,<0.5.0" @@ -3873,10 +2879,6 @@ files = [ {file = "pydata-google-auth-1.2.0.tar.gz", hash = "sha256:076411ecd7a5ac927ba9741c32ea599bc66e54170dffc1259f3cd353cf25cbd7"}, {file = "pydata_google_auth-1.2.0-py2.py3-none-any.whl", hash = "sha256:2e2b27425d6f8a9ead496c0fd677a09448cbca2b71055abe3ee72c7f8f1774f4"}, ] -files = [ - {file = "pydata-google-auth-1.2.0.tar.gz", hash = "sha256:076411ecd7a5ac927ba9741c32ea599bc66e54170dffc1259f3cd353cf25cbd7"}, - {file = "pydata_google_auth-1.2.0-py2.py3-none-any.whl", hash = "sha256:2e2b27425d6f8a9ead496c0fd677a09448cbca2b71055abe3ee72c7f8f1774f4"}, -] [package.dependencies] google-auth = "*" @@ -3958,59 +2960,6 @@ files = [ {file = "pymssql-2.2.5-cp39-cp39-win_amd64.whl", hash = "sha256:e9cce9c47e6d550992936f91f8f2e97a8f5132749bad1cd4f5f7923bf8732d1f"}, {file = "pymssql-2.2.5.tar.gz", hash = "sha256:857411c308ecb584a3ca633be30f1971d2a8cc0bcd978709b1abf96ff43767ad"}, ] -files = [ - {file = "pymssql-2.2.5-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:6462017183f05ae231c3f84efce4e9a8d085b4a2e9e3ed5c407ee643494a0842"}, - {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6a013c82f7320c92039ac20db935e897a3fcd7423435705cef177f863dbb32e4"}, - {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:45e9bba4870103363c865d2b867de8de082745dd753083f27927ded3d15df587"}, - {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20de2f718f3c99040637a0e7d3b81f22e62211bcac01fb65641b964e70f26e20"}, - {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18eb4fcb55b67aaa2811e124eb8750fd84eeba1668a695908c6cc13682f6be5d"}, - {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_24_i686.whl", hash = "sha256:9969971117401096a8a7c1e08d84ea3d5d3f598ee482822583a44e2e6d3791d0"}, - {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:bb858c8a64990dd0145d874ef01af4b6fe39e9202ee0a74a8dff8285b801db21"}, - {file = "pymssql-2.2.5-cp310-cp310-win32.whl", hash = "sha256:da78a94908d42aa0f8af1b917c49c4dea38273035f81ea168b095e0b3ba8e486"}, - {file = "pymssql-2.2.5-cp310-cp310-win_amd64.whl", hash = "sha256:b691779a450ebbbb98cd2ad89ae9f17799b0bf0c9dd2e65b316efcc74246716e"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92262bf5d21b6d80e887d6fd0f03ab6337dad39b642b1887416cc67b1bd04cbf"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00f5b7e22bf7eb0faa5c6693e02c00f10ecc89fe505bbe84d553352681c2a749"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac80d1d11703120b986c604ddf4993c3dcbcbe907b04e34729c5aae2891399c0"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bf813ea0e4a0bfbb53a3469125eed06635222ea729339403585fd45f18a7812"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_24_i686.whl", hash = "sha256:73b747261cdf8d69395823cf650cf143d618ada412cbec90a88e4d449e7fa7f8"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_24_x86_64.whl", hash = "sha256:ce9e7ed16793c72d28e80506abd59a06b594fc55fe24f6256b7007b5b5e26120"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b5dcb4e4ceb16592a5d9ea3868162f21e7c215dde5c5e7f992709696c84a69b0"}, - {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9c90bc134a0c5c60e9acf651d87275c7e6dc6682981f62d574fa3dd441acb0f2"}, - {file = "pymssql-2.2.5-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:29d647ef61641cebc0e16d4a549b3f793f32bab88e7ba7c7550772a7aba9dea3"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:633079e248cdefef2207c0a55608637d0f3410f53e5679c589b37ea7965a2cca"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e373764cc81719f830b113ce6fee6849f2c4e5dfe1037804864b7dfb9946817e"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b47c05da0fffd6dd77141c1c37975a8469334f63e6faf03f5eab6d83c9001cc"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc245011aad9c018105193585469461c35fb35e7255b8e66fa27479f835742aa"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_24_i686.whl", hash = "sha256:72bbccdaf4938db7ff99db1f82ecdf6dc78778d8b7bbe6080590dd01024988de"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:395ec9e512a8d5b707aea8f516eebf51291b6fb6bc18fe4da88b222843bd4d46"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bb912b4681d55dce63f940becb7f4533661cfdb99cd6cd3daa7d7b5e285e977"}, - {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14dee37da84653d1e483236d51bc0545e6442e0642ee362526db6599fd3c1733"}, - {file = "pymssql-2.2.5-cp37-cp37m-win32.whl", hash = "sha256:5e2cd5a6da441aa3e8ee13e8811f884791d77a4cb17028381543bf50d010c919"}, - {file = "pymssql-2.2.5-cp37-cp37m-win_amd64.whl", hash = "sha256:ba43efd1057018ab404c8603bbce643347b9165c08364df8a8c03d54dffc4453"}, - {file = "pymssql-2.2.5-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:ac8d6b7e0dc97a9261b7500f086772ff5cf2bf9a0340d0aaee4dff5b217dd526"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ed7c5e58cd0ffcf3448cc38dfd2a6011f657759fcae9509748320cd89a0b8d32"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:30c4ab08cff619c7fe4d309fa6a05219b343082a1f46ca368deab5841632b8bf"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49806c343a6dea5221e98cabed1532fdd14535c5e5bb183001e0ffad31e11032"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15cc71762ec75a66bcb3751c2534ba4151b8512252b0377b842efec7cae6d953"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_24_i686.whl", hash = "sha256:e42c7043c472d45db686ae67601c6680596a2f12ceaa99fb136e647d3d8cd643"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:c738d51181ab4b3332631644ef7b561543837d1d942a291f8bc36a9e2dfb65db"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e33770ad113a646a45e4fc75f30683e92c9b929431e12977f824d6c810f28162"}, - {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8c5ad8d09f9035009ccb6f20bc9829ef60c03c436efb4b5c33af395c4030ea3d"}, - {file = "pymssql-2.2.5-cp38-cp38-win32.whl", hash = "sha256:c0611a3ea2a7ac496df30506fd28e4f7389808c59743b2eac0069e89af7289b8"}, - {file = "pymssql-2.2.5-cp38-cp38-win_amd64.whl", hash = "sha256:45c1519c94f9915911075c95fc63d62ba612e152248093aa12b7e902499c6416"}, - {file = "pymssql-2.2.5-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:1089cd5871daedc9918f8958605bbd2621006c29c06b571b419be53ea46c113a"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8ac2b3213462f078671806702dfadb8e459923f0f5013d371febebf4caf598ba"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9b707e5867bb49ad9d8945231112dfa3e9588b98f6f1248714d1f1af88321230"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:538a8e7ce255cabf093b25b72f8037b1d5fd3ba28b13a34c761a029840dc1880"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b9f5ec7896fd2f19393cd564d8ef562b26692218a84088ce1b10e9fe1215032"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_24_i686.whl", hash = "sha256:6086f0b695b7ceb4603cdc2f66356a58e367a3f1828d1ca99255c4d92d1f0932"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:e0b1bcb8465d787d5141bfc02d98e1e507d02155848b1b5622528402760f5dbf"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ebb7867207cf4cd497ea1d01b42590ed1db3561ef3ab8e135239301b6ee2695e"}, - {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8b32ad436f293c8cbadc1ba3aaf2621ab82303d169b1ab6f30f55053640ab5b1"}, - {file = "pymssql-2.2.5-cp39-cp39-win32.whl", hash = "sha256:cc523bfd26671346faccb1273b16a74dcdf1a8ac81c93c6bfebdb240e4d5a042"}, - {file = "pymssql-2.2.5-cp39-cp39-win_amd64.whl", hash = "sha256:e9cce9c47e6d550992936f91f8f2e97a8f5132749bad1cd4f5f7923bf8732d1f"}, - {file = "pymssql-2.2.5.tar.gz", hash = "sha256:857411c308ecb584a3ca633be30f1971d2a8cc0bcd978709b1abf96ff43767ad"}, -] [[package]] name = "pyparsing" @@ -4023,10 +2972,6 @@ files = [ {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, ] -files = [ - {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, - {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, -] [package.extras] diagrams = ["jinja2", "railroad-diagrams"] @@ -4034,7 +2979,6 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" version = "7.3.1" -version = "7.3.1" description = "pytest: simple powerful testing with Python" category = "main" optional = false @@ -4043,26 +2987,17 @@ files = [ {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, ] -python-versions = ">=3.7" -files = [ - {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, - {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, -] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] [[package]] name = "pytest-cov" @@ -4094,10 +3029,6 @@ files = [ {file = "python-box-5.4.1.tar.gz", hash = "sha256:b68e0f8abc86f3deda751b3390f64df64a0989459de51ba4db949662a7b4d8ac"}, {file = "python_box-5.4.1-py3-none-any.whl", hash = "sha256:60ae9156de34cf92b899bd099580950df70a5b0813e67a3310a1cdd1976457fa"}, ] -files = [ - {file = "python-box-5.4.1.tar.gz", hash = "sha256:b68e0f8abc86f3deda751b3390f64df64a0989459de51ba4db949662a7b4d8ac"}, - {file = "python_box-5.4.1-py3-none-any.whl", hash = "sha256:60ae9156de34cf92b899bd099580950df70a5b0813e67a3310a1cdd1976457fa"}, -] [package.extras] all = ["msgpack", "ruamel.yaml", "toml"] @@ -4118,10 +3049,6 @@ files = [ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, ] -files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] [package.dependencies] six = ">=1.5" @@ -4137,10 +3064,6 @@ files = [ {file = "python-slugify-5.0.2.tar.gz", hash = "sha256:f13383a0b9fcbe649a1892b9c8eb4f8eab1d6d84b84bb7a624317afa98159cab"}, {file = "python_slugify-5.0.2-py2.py3-none-any.whl", hash = "sha256:6d8c5df75cd4a7c3a2d21e257633de53f52ab0265cd2d1dc62a730e8194a7380"}, ] -files = [ - {file = "python-slugify-5.0.2.tar.gz", hash = "sha256:f13383a0b9fcbe649a1892b9c8eb4f8eab1d6d84b84bb7a624317afa98159cab"}, - {file = "python_slugify-5.0.2-py2.py3-none-any.whl", hash = "sha256:6d8c5df75cd4a7c3a2d21e257633de53f52ab0265cd2d1dc62a730e8194a7380"}, -] [package.dependencies] text-unidecode = ">=1.3" @@ -4154,11 +3077,15 @@ version = "1.0.0" description = "Utility functions for strings validation and manipulation." category = "main" optional = false -python-versions = ">=3.5" -files = [ - {file = "python-string-utils-1.0.0.tar.gz", hash = "sha256:dcf9060b03f07647c0a603408dc8b03f807f3b54a05c6e19eb14460256fac0cb"}, - {file = "python_string_utils-1.0.0-py3-none-any.whl", hash = "sha256:f1a88700baf99db1a9b6953f44181ad9ca56623c81e257e6009707e2e7851fa4"}, -] +python-versions = ">=3.5" +files = [] +develop = false + +[package.source] +type = "git" +url = "https://github.com/daveoncode/python-string-utils.git" +reference = "master" +resolved_reference = "78929d88d90b1f90cb4837528ed955166bf0f559" [[package]] name = "pytz" @@ -4171,10 +3098,6 @@ files = [ {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, ] -files = [ - {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, - {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, -] [[package]] name = "pytzdata" @@ -4187,10 +3110,6 @@ files = [ {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, ] -files = [ - {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, - {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, -] [[package]] name = "pywin32" @@ -4213,20 +3132,6 @@ files = [ {file = "pywin32-227-cp39-cp39-win32.whl", hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"}, {file = "pywin32-227-cp39-cp39-win_amd64.whl", hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"}, ] -files = [ - {file = "pywin32-227-cp27-cp27m-win32.whl", hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"}, - {file = "pywin32-227-cp27-cp27m-win_amd64.whl", hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"}, - {file = "pywin32-227-cp35-cp35m-win32.whl", hash = "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"}, - {file = "pywin32-227-cp35-cp35m-win_amd64.whl", hash = "sha256:a929a4af626e530383a579431b70e512e736e9588106715215bf685a3ea508d4"}, - {file = "pywin32-227-cp36-cp36m-win32.whl", hash = "sha256:300a2db938e98c3e7e2093e4491439e62287d0d493fe07cce110db070b54c0be"}, - {file = "pywin32-227-cp36-cp36m-win_amd64.whl", hash = "sha256:9b31e009564fb95db160f154e2aa195ed66bcc4c058ed72850d047141b36f3a2"}, - {file = "pywin32-227-cp37-cp37m-win32.whl", hash = "sha256:47a3c7551376a865dd8d095a98deba954a98f326c6fe3c72d8726ca6e6b15507"}, - {file = "pywin32-227-cp37-cp37m-win_amd64.whl", hash = "sha256:31f88a89139cb2adc40f8f0e65ee56a8c585f629974f9e07622ba80199057511"}, - {file = "pywin32-227-cp38-cp38-win32.whl", hash = "sha256:7f18199fbf29ca99dff10e1f09451582ae9e372a892ff03a28528a24d55875bc"}, - {file = "pywin32-227-cp38-cp38-win_amd64.whl", hash = "sha256:7c1ae32c489dc012930787f06244426f8356e129184a02c25aef163917ce158e"}, - {file = "pywin32-227-cp39-cp39-win32.whl", hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"}, - {file = "pywin32-227-cp39-cp39-win_amd64.whl", hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"}, -] [[package]] name = "pyyaml" @@ -4383,7 +3288,6 @@ files = [ [[package]] name = "redis" version = "4.5.4" -version = "4.5.4" description = "Python client for Redis database and key-value store" category = "main" optional = false @@ -4392,15 +3296,9 @@ files = [ {file = "redis-4.5.4-py3-none-any.whl", hash = "sha256:2c19e6767c474f2e85167909061d525ed65bea9301c0770bb151e041b7ac89a2"}, {file = "redis-4.5.4.tar.gz", hash = "sha256:73ec35da4da267d6847e47f68730fdd5f62e2ca69e3ef5885c6a78a9374c3893"}, ] -python-versions = ">=3.7" -files = [ - {file = "redis-4.5.4-py3-none-any.whl", hash = "sha256:2c19e6767c474f2e85167909061d525ed65bea9301c0770bb151e041b7ac89a2"}, - {file = "redis-4.5.4.tar.gz", hash = "sha256:73ec35da4da267d6847e47f68730fdd5f62e2ca69e3ef5885c6a78a9374c3893"}, -] [package.dependencies] async-timeout = {version = ">=4.0.2", markers = "python_version <= \"3.11.2\""} -async-timeout = {version = ">=4.0.2", markers = "python_version <= \"3.11.2\""} [package.extras] hiredis = ["hiredis (>=1.0.0)"] @@ -4417,10 +3315,6 @@ files = [ {file = "redis-pal-1.0.0.tar.gz", hash = "sha256:8e20caf8127056a2d1208d6dd0873643efb8357602193e26c1ada8ed6737fa88"}, {file = "redis_pal-1.0.0-py3-none-any.whl", hash = "sha256:8cbf55c926c761ce9d60803ed66ef2575f351b43c9554fd66f6458d323430bf0"}, ] -files = [ - {file = "redis-pal-1.0.0.tar.gz", hash = "sha256:8e20caf8127056a2d1208d6dd0873643efb8357602193e26c1ada8ed6737fa88"}, - {file = "redis_pal-1.0.0-py3-none-any.whl", hash = "sha256:8cbf55c926c761ce9d60803ed66ef2575f351b43c9554fd66f6458d323430bf0"}, -] [package.dependencies] dill = ">=0.3.5,<0.4.0" @@ -4437,10 +3331,6 @@ files = [ {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, ] -files = [ - {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, - {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, -] [package.dependencies] certifi = ">=2017.4.17" @@ -4463,10 +3353,6 @@ files = [ {file = "requests-oauthlib-1.3.0.tar.gz", hash = "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a"}, {file = "requests_oauthlib-1.3.0-py2.py3-none-any.whl", hash = "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d"}, ] -files = [ - {file = "requests-oauthlib-1.3.0.tar.gz", hash = "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a"}, - {file = "requests_oauthlib-1.3.0-py2.py3-none-any.whl", hash = "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d"}, -] [package.dependencies] oauthlib = ">=3.0.0" @@ -4486,17 +3372,12 @@ files = [ {file = "rsa-4.8-py3-none-any.whl", hash = "sha256:95c5d300c4e879ee69708c428ba566c59478fd653cc3a22243eeb8ed846950bb"}, {file = "rsa-4.8.tar.gz", hash = "sha256:5c6bd9dc7a543b7fe4304a631f8a8a3b674e2bbfc49c2ae96200cdbe55df6b17"}, ] -files = [ - {file = "rsa-4.8-py3-none-any.whl", hash = "sha256:95c5d300c4e879ee69708c428ba566c59478fd653cc3a22243eeb8ed846950bb"}, - {file = "rsa-4.8.tar.gz", hash = "sha256:5c6bd9dc7a543b7fe4304a631f8a8a3b674e2bbfc49c2ae96200cdbe55df6b17"}, -] [package.dependencies] pyasn1 = ">=0.1.3" [[package]] name = "ruamel-yaml" -name = "ruamel-yaml" version = "0.17.10" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" category = "main" @@ -4506,10 +3387,6 @@ files = [ {file = "ruamel.yaml-0.17.10-py3-none-any.whl", hash = "sha256:ffb9b703853e9e8b7861606dfdab1026cf02505bade0653d1880f4b2db47f815"}, {file = "ruamel.yaml-0.17.10.tar.gz", hash = "sha256:106bc8d6dc6a0ff7c9196a47570432036f41d556b779c6b4e618085f57e39e67"}, ] -files = [ - {file = "ruamel.yaml-0.17.10-py3-none-any.whl", hash = "sha256:ffb9b703853e9e8b7861606dfdab1026cf02505bade0653d1880f4b2db47f815"}, - {file = "ruamel.yaml-0.17.10.tar.gz", hash = "sha256:106bc8d6dc6a0ff7c9196a47570432036f41d556b779c6b4e618085f57e39e67"}, -] [package.dependencies] "ruamel.yaml.clib" = {version = ">=0.1.2", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.10\""} @@ -4520,7 +3397,6 @@ jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [[package]] name = "ruamel-yaml-clib" -name = "ruamel-yaml-clib" version = "0.2.6" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" category = "main" @@ -4558,45 +3434,11 @@ files = [ {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win_amd64.whl", hash = "sha256:825d5fccef6da42f3c8eccd4281af399f21c02b32d98e113dbc631ea6a6ecbc7"}, {file = "ruamel.yaml.clib-0.2.6.tar.gz", hash = "sha256:4ff604ce439abb20794f05613c374759ce10e3595d1867764dd1ae675b85acbd"}, ] -files = [ - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e7be2c5bcb297f5b82fee9c665eb2eb7001d1050deaba8471842979293a80b0"}, - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:066f886bc90cc2ce44df8b5f7acfc6a7e2b2e672713f027136464492b0c34d7c"}, - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:221eca6f35076c6ae472a531afa1c223b9c29377e62936f61bc8e6e8bdc5f9e7"}, - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win32.whl", hash = "sha256:1070ba9dd7f9370d0513d649420c3b362ac2d687fe78c6e888f5b12bf8bc7bee"}, - {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:77df077d32921ad46f34816a9a16e6356d8100374579bc35e15bab5d4e9377de"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:cfdb9389d888c5b74af297e51ce357b800dd844898af9d4a547ffc143fa56751"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7b2927e92feb51d830f531de4ccb11b320255ee95e791022555971c466af4527"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win32.whl", hash = "sha256:ada3f400d9923a190ea8b59c8f60680c4ef8a4b0dfae134d2f2ff68429adfab5"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win_amd64.whl", hash = "sha256:de9c6b8a1ba52919ae919f3ae96abb72b994dd0350226e28f3686cb4f142165c"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d67f273097c368265a7b81e152e07fb90ed395df6e552b9fa858c6d2c9f42502"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:72a2b8b2ff0a627496aad76f37a652bcef400fd861721744201ef1b45199ab78"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d3c620a54748a3d4cf0bcfe623e388407c8e85a4b06b8188e126302bcab93ea8"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win32.whl", hash = "sha256:9efef4aab5353387b07f6b22ace0867032b900d8e91674b5d8ea9150db5cae94"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win_amd64.whl", hash = "sha256:846fc8336443106fe23f9b6d6b8c14a53d38cef9a375149d61f99d78782ea468"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0847201b767447fc33b9c235780d3aa90357d20dd6108b92be544427bea197dd"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:78988ed190206672da0f5d50c61afef8f67daa718d614377dcd5e3ed85ab4a99"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:210c8fcfeff90514b7133010bf14e3bad652c8efde6b20e00c43854bf94fa5a6"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win32.whl", hash = "sha256:a49e0161897901d1ac9c4a79984b8410f450565bbad64dbfcbf76152743a0cdb"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win_amd64.whl", hash = "sha256:bf75d28fa071645c529b5474a550a44686821decebdd00e21127ef1fd566eabe"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a32f8d81ea0c6173ab1b3da956869114cae53ba1e9f72374032e33ba3118c233"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7f7ecb53ae6848f959db6ae93bdff1740e651809780822270eab111500842a84"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:61bc5e5ca632d95925907c569daa559ea194a4d16084ba86084be98ab1cec1c6"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win32.whl", hash = "sha256:89221ec6d6026f8ae859c09b9718799fea22c0e8da8b766b0b2c9a9ba2db326b"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win_amd64.whl", hash = "sha256:31ea73e564a7b5fbbe8188ab8b334393e06d997914a4e184975348f204790277"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc6a613d6c74eef5a14a214d433d06291526145431c3b964f5e16529b1842bed"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1866cf2c284a03b9524a5cc00daca56d80057c5ce3cdc86a52020f4c720856f0"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1b4139a6ffbca8ef60fdaf9b33dec05143ba746a6f0ae0f9d11d38239211d335"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win32.whl", hash = "sha256:3fb9575a5acd13031c57a62cc7823e5d2ff8bc3835ba4d94b921b4e6ee664104"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win_amd64.whl", hash = "sha256:825d5fccef6da42f3c8eccd4281af399f21c02b32d98e113dbc631ea6a6ecbc7"}, - {file = "ruamel.yaml.clib-0.2.6.tar.gz", hash = "sha256:4ff604ce439abb20794f05613c374759ce10e3595d1867764dd1ae675b85acbd"}, -] [[package]] name = "scipy" version = "1.10.1" description = "Fundamental algorithms for scientific computing in Python" -version = "1.10.1" -description = "Fundamental algorithms for scientific computing in Python" category = "main" optional = false python-versions = "<3.12,>=3.8" @@ -4623,39 +3465,9 @@ files = [ {file = "scipy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ff7f37b1bf4417baca958d254e8e2875d0cc23aaadbe65b3d5b3077b0eb23ea"}, {file = "scipy-1.10.1.tar.gz", hash = "sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5"}, ] -python-versions = "<3.12,>=3.8" -files = [ - {file = "scipy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7354fd7527a4b0377ce55f286805b34e8c54b91be865bac273f527e1b839019"}, - {file = "scipy-1.10.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4b3f429188c66603a1a5c549fb414e4d3bdc2a24792e061ffbd607d3d75fd84e"}, - {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1553b5dcddd64ba9a0d95355e63fe6c3fc303a8fd77c7bc91e77d61363f7433f"}, - {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c0ff64b06b10e35215abce517252b375e580a6125fd5fdf6421b98efbefb2d2"}, - {file = "scipy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:fae8a7b898c42dffe3f7361c40d5952b6bf32d10c4569098d276b4c547905ee1"}, - {file = "scipy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f1564ea217e82c1bbe75ddf7285ba0709ecd503f048cb1236ae9995f64217bd"}, - {file = "scipy-1.10.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d925fa1c81b772882aa55bcc10bf88324dadb66ff85d548c71515f6689c6dac5"}, - {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaea0a6be54462ec027de54fca511540980d1e9eea68b2d5c1dbfe084797be35"}, - {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15a35c4242ec5f292c3dd364a7c71a61be87a3d4ddcc693372813c0b73c9af1d"}, - {file = "scipy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:43b8e0bcb877faf0abfb613d51026cd5cc78918e9530e375727bf0625c82788f"}, - {file = "scipy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5678f88c68ea866ed9ebe3a989091088553ba12c6090244fdae3e467b1139c35"}, - {file = "scipy-1.10.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:39becb03541f9e58243f4197584286e339029e8908c46f7221abeea4b749fa88"}, - {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bce5869c8d68cf383ce240e44c1d9ae7c06078a9396df68ce88a1230f93a30c1"}, - {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07c3457ce0b3ad5124f98a86533106b643dd811dd61b548e78cf4c8786652f6f"}, - {file = "scipy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:049a8bbf0ad95277ffba9b3b7d23e5369cc39e66406d60422c8cfef40ccc8415"}, - {file = "scipy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd9f1027ff30d90618914a64ca9b1a77a431159df0e2a195d8a9e8a04c78abf9"}, - {file = "scipy-1.10.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:79c8e5a6c6ffaf3a2262ef1be1e108a035cf4f05c14df56057b64acc5bebffb6"}, - {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51af417a000d2dbe1ec6c372dfe688e041a7084da4fdd350aeb139bd3fb55353"}, - {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b4735d6c28aad3cdcf52117e0e91d6b39acd4272f3f5cd9907c24ee931ad601"}, - {file = "scipy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ff7f37b1bf4417baca958d254e8e2875d0cc23aaadbe65b3d5b3077b0eb23ea"}, - {file = "scipy-1.10.1.tar.gz", hash = "sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5"}, -] [package.dependencies] numpy = ">=1.19.5,<1.27.0" -numpy = ">=1.19.5,<1.27.0" - -[package.extras] -dev = ["click", "doit (>=0.36.0)", "flake8", "mypy", "pycodestyle", "pydevtool", "rich-click", "typing_extensions"] -doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [package.extras] dev = ["click", "doit (>=0.36.0)", "flake8", "mypy", "pycodestyle", "pydevtool", "rich-click", "typing_extensions"] @@ -4673,10 +3485,6 @@ files = [ {file = "seaborn-0.11.2-py3-none-any.whl", hash = "sha256:85a6baa9b55f81a0623abddc4a26b334653ff4c6b18c418361de19dbba0ef283"}, {file = "seaborn-0.11.2.tar.gz", hash = "sha256:cf45e9286d40826864be0e3c066f98536982baf701a7caa386511792d61ff4f6"}, ] -files = [ - {file = "seaborn-0.11.2-py3-none-any.whl", hash = "sha256:85a6baa9b55f81a0623abddc4a26b334653ff4c6b18c418361de19dbba0ef283"}, - {file = "seaborn-0.11.2.tar.gz", hash = "sha256:cf45e9286d40826864be0e3c066f98536982baf701a7caa386511792d61ff4f6"}, -] [package.dependencies] matplotlib = ">=2.2" @@ -4698,7 +3506,6 @@ files = [ [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] @@ -4713,10 +3520,6 @@ files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] [[package]] name = "sortedcontainers" @@ -4729,15 +3532,10 @@ files = [ {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, ] -files = [ - {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, - {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, -] [[package]] name = "soupsieve" version = "2.4.1" -version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." category = "main" optional = false @@ -4778,10 +3576,6 @@ files = [ {file = "tabulate-0.8.9-py3-none-any.whl", hash = "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4"}, {file = "tabulate-0.8.9.tar.gz", hash = "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7"}, ] -files = [ - {file = "tabulate-0.8.9-py3-none-any.whl", hash = "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4"}, - {file = "tabulate-0.8.9.tar.gz", hash = "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7"}, -] [package.extras] widechars = ["wcwidth"] @@ -4797,10 +3591,6 @@ files = [ {file = "tblib-1.7.0-py2.py3-none-any.whl", hash = "sha256:289fa7359e580950e7d9743eab36b0691f0310fce64dee7d9c31065b8f723e23"}, {file = "tblib-1.7.0.tar.gz", hash = "sha256:059bd77306ea7b419d4f76016aef6d7027cc8a0785579b5aad198803435f882c"}, ] -files = [ - {file = "tblib-1.7.0-py2.py3-none-any.whl", hash = "sha256:289fa7359e580950e7d9743eab36b0691f0310fce64dee7d9c31065b8f723e23"}, - {file = "tblib-1.7.0.tar.gz", hash = "sha256:059bd77306ea7b419d4f76016aef6d7027cc8a0785579b5aad198803435f882c"}, -] [[package]] name = "text-unidecode" @@ -4813,10 +3603,6 @@ files = [ {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, ] -files = [ - {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, - {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, -] [[package]] name = "toml" @@ -4829,26 +3615,18 @@ files = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] -files = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] [[package]] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] [[package]] name = "tomlkit" @@ -4861,10 +3639,6 @@ files = [ {file = "tomlkit-0.7.0-py2.py3-none-any.whl", hash = "sha256:6babbd33b17d5c9691896b0e68159215a9387ebfa938aa3ac42f4a4beeb2b831"}, {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, ] -files = [ - {file = "tomlkit-0.7.0-py2.py3-none-any.whl", hash = "sha256:6babbd33b17d5c9691896b0e68159215a9387ebfa938aa3ac42f4a4beeb2b831"}, - {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, -] [[package]] name = "toolz" @@ -4877,10 +3651,6 @@ files = [ {file = "toolz-0.11.2-py3-none-any.whl", hash = "sha256:a5700ce83414c64514d82d60bcda8aabfde092d1c1a8663f9200c07fdcc6da8f"}, {file = "toolz-0.11.2.tar.gz", hash = "sha256:6b312d5e15138552f1bda8a4e66c30e236c831b612b2bf0005f8a1df10a4bc33"}, ] -files = [ - {file = "toolz-0.11.2-py3-none-any.whl", hash = "sha256:a5700ce83414c64514d82d60bcda8aabfde092d1c1a8663f9200c07fdcc6da8f"}, - {file = "toolz-0.11.2.tar.gz", hash = "sha256:6b312d5e15138552f1bda8a4e66c30e236c831b612b2bf0005f8a1df10a4bc33"}, -] [[package]] name = "tornado" @@ -4932,49 +3702,6 @@ files = [ {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, ] -files = [ - {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, - {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, - {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, - {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, - {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, - {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, - {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, - {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, - {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, - {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, - {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, - {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, - {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, - {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, - {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, - {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, - {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, - {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, - {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, - {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, - {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, - {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, - {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, - {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, - {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, - {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, - {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, - {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, - {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, - {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, - {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, - {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, -] [[package]] name = "tqdm" @@ -4987,10 +3714,6 @@ files = [ {file = "tqdm-4.50.2-py2.py3-none-any.whl", hash = "sha256:43ca183da3367578ebf2f1c2e3111d51ea161ed1dc4e6345b86e27c2a93beff7"}, {file = "tqdm-4.50.2.tar.gz", hash = "sha256:69dfa6714dee976e2425a9aab84b622675b7b1742873041e3db8a8e86132a4af"}, ] -files = [ - {file = "tqdm-4.50.2-py2.py3-none-any.whl", hash = "sha256:43ca183da3367578ebf2f1c2e3111d51ea161ed1dc4e6345b86e27c2a93beff7"}, - {file = "tqdm-4.50.2.tar.gz", hash = "sha256:69dfa6714dee976e2425a9aab84b622675b7b1742873041e3db8a8e86132a4af"}, -] [package.extras] dev = ["argopt", "py-make (>=0.1.0)", "pydoc-markdown", "twine"] @@ -5022,10 +3745,6 @@ files = [ {file = "tweepy-4.4.0-py2.py3-none-any.whl", hash = "sha256:cf02c4fbbd027fbc7172c24d03f53f061329ac040b22d201e59592a1cff86364"}, {file = "tweepy-4.4.0.tar.gz", hash = "sha256:8d4b4520271b796fa7efc4c5d5ef3228af4d79f6a4d3ace3900b2778ed8f6f1c"}, ] -files = [ - {file = "tweepy-4.4.0-py2.py3-none-any.whl", hash = "sha256:cf02c4fbbd027fbc7172c24d03f53f061329ac040b22d201e59592a1cff86364"}, - {file = "tweepy-4.4.0.tar.gz", hash = "sha256:8d4b4520271b796fa7efc4c5d5ef3228af4d79f6a4d3ace3900b2778ed8f6f1c"}, -] [package.dependencies] requests = ">=2.11.1,<3" @@ -5039,30 +3758,30 @@ test = ["vcrpy (>=1.10.3)"] [[package]] name = "typer" -version = "0.7.0" +version = "0.4.0" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." -category = "main" +category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "typer-0.7.0-py3-none-any.whl", hash = "sha256:b5e704f4e48ec263de1c0b3a2387cd405a13767d2f907f44c1a08cbad96f606d"}, - {file = "typer-0.7.0.tar.gz", hash = "sha256:ff797846578a9f2a201b53442aedeb543319466870fbe1c701eab66dd7681165"}, + {file = "typer-0.4.0-py3-none-any.whl", hash = "sha256:d81169725140423d072df464cad1ff25ee154ef381aaf5b8225352ea187ca338"}, + {file = "typer-0.4.0.tar.gz", hash = "sha256:63c3aeab0549750ffe40da79a1b524f60e08a2cbc3126c520ebf2eeaf507f5dd"}, ] [package.dependencies] click = ">=7.1.1,<9.0.0" [package.extras] -all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<13.0.0)", "shellingham (>=1.3.0,<2.0.0)"] -dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] -doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] -test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<13.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +all = ["colorama (>=0.4.3,<0.5.0)", "shellingham (>=1.3.0,<2.0.0)"] +dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)"] +doc = ["markdown-include (>=0.5.1,<0.6.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=5.4.0,<6.0.0)"] +test = ["black (>=19.10b0,<20.0b0)", "coverage (>=5.2,<6.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<5.4.0)", "pytest-cov (>=2.10.0,<3.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<2.0.0)", "shellingham (>=1.3.0,<2.0.0)"] [[package]] name = "typing-extensions" version = "4.5.0" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -5073,7 +3792,6 @@ files = [ [[package]] name = "unidecode" version = "1.3.6" -version = "1.3.6" description = "ASCII transliterations of Unicode text" category = "main" optional = false @@ -5082,10 +3800,6 @@ files = [ {file = "Unidecode-1.3.6-py3-none-any.whl", hash = "sha256:547d7c479e4f377b430dd91ac1275d593308dce0fc464fb2ab7d41f82ec653be"}, {file = "Unidecode-1.3.6.tar.gz", hash = "sha256:fed09cf0be8cf415b391642c2a5addfc72194407caee4f98719e40ec2a72b830"}, ] -files = [ - {file = "Unidecode-1.3.6-py3-none-any.whl", hash = "sha256:547d7c479e4f377b430dd91ac1275d593308dce0fc464fb2ab7d41f82ec653be"}, - {file = "Unidecode-1.3.6.tar.gz", hash = "sha256:fed09cf0be8cf415b391642c2a5addfc72194407caee4f98719e40ec2a72b830"}, -] [[package]] name = "uritemplate" @@ -5098,10 +3812,6 @@ files = [ {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, ] -files = [ - {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, - {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, -] [[package]] name = "urllib3" @@ -5114,10 +3824,6 @@ files = [ {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, ] -files = [ - {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, - {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, -] [package.extras] brotli = ["brotlipy (>=0.6.0)"] @@ -5140,9 +3846,6 @@ files = [ distlib = ">=0.3.6,<1" filelock = ">=3.11,<4" platformdirs = ">=3.2,<4" -distlib = ">=0.3.6,<1" -filelock = ">=3.11,<4" -platformdirs = ">=3.2,<4" [package.extras] docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] @@ -5171,10 +3874,6 @@ files = [ {file = "websocket-client-1.2.1.tar.gz", hash = "sha256:8dfb715d8a992f5712fff8c843adae94e22b22a99b2c5e6b0ec4a1a981cc4e0d"}, {file = "websocket_client-1.2.1-py2.py3-none-any.whl", hash = "sha256:0133d2f784858e59959ce82ddac316634229da55b498aac311f1620567a710ec"}, ] -files = [ - {file = "websocket-client-1.2.1.tar.gz", hash = "sha256:8dfb715d8a992f5712fff8c843adae94e22b22a99b2c5e6b0ec4a1a981cc4e0d"}, - {file = "websocket_client-1.2.1-py2.py3-none-any.whl", hash = "sha256:0133d2f784858e59959ce82ddac316634229da55b498aac311f1620567a710ec"}, -] [package.extras] optional = ["python-socks", "wsaccel"] @@ -5190,9 +3889,6 @@ python-versions = "*" files = [ {file = "wget-3.2.zip", hash = "sha256:35e630eca2aa50ce998b9b1a127bb26b30dfee573702782aa982f875e3f16061"}, ] -files = [ - {file = "wget-3.2.zip", hash = "sha256:35e630eca2aa50ce998b9b1a127bb26b30dfee573702782aa982f875e3f16061"}, -] [[package]] name = "win32-setctime" @@ -5205,10 +3901,6 @@ files = [ {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, ] -files = [ - {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, - {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, -] [package.extras] dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] @@ -5253,10 +3945,6 @@ files = [ {file = "zict-2.0.0-py3-none-any.whl", hash = "sha256:26aa1adda8250a78dfc6a78d200bfb2ea43a34752cf58980bca75dde0ba0c6e9"}, {file = "zict-2.0.0.tar.gz", hash = "sha256:8e2969797627c8a663575c2fc6fcb53a05e37cdb83ee65f341fc6e0c3d0ced16"}, ] -files = [ - {file = "zict-2.0.0-py3-none-any.whl", hash = "sha256:26aa1adda8250a78dfc6a78d200bfb2ea43a34752cf58980bca75dde0ba0c6e9"}, - {file = "zict-2.0.0.tar.gz", hash = "sha256:8e2969797627c8a663575c2fc6fcb53a05e37cdb83ee65f341fc6e0c3d0ced16"}, -] [package.dependencies] heapdict = "*" @@ -5264,7 +3952,6 @@ heapdict = "*" [[package]] name = "zipp" version = "3.15.0" -version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false @@ -5273,19 +3960,12 @@ files = [ {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, ] -files = [ - {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, - {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, -] [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "2.0" -lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "31796561bd82fd5b03073c569cd09a0f59f724833667629c34f73e839b8e7142" +content-hash = "fc4b6b6372ea9f8d243ee5515ed993bef5576343475a6459c4703d50079fff6c" diff --git a/pyproject.toml b/pyproject.toml index 6c626c404..8e4d6a4b9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -104,10 +104,9 @@ setuptools = "^67.6.1" polars = "^0.17.5" xlsx2csv = "^0.8.1" xlrd = "^2.0.1" -typer = "^0.7.0" -cookiecutter = "^2.1.1" python-string-utils = "^1.0.0" pytest-cov = "^4.0.0" +code2flow = "^2.5.1" [tool.poetry.group.dev.dependencies] From aa22448f52e2753b35790b715007111421d0b9da Mon Sep 17 00:00:00 2001 From: Tamir Date: Mon, 8 May 2023 05:24:33 -0300 Subject: [PATCH 116/265] Refactoring for cleaner 2010-2012 code --- .../datasets/br_denatran_frota/handlers.py | 27 ++++++++----------- .../datasets/br_denatran_frota/tasks_test.py | 9 +------ pipelines/datasets/br_denatran_frota/utils.py | 27 ++++++++++++++++++- 3 files changed, 38 insertions(+), 25 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index f17b252c4..3e856a9d3 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -62,6 +62,7 @@ get_year_month_from_filename, call_downloader, download_file, + make_filename_2010_to_2012, ) import pandas as pd import polars as pl @@ -114,26 +115,20 @@ def crawl(month: int, year: int, temp_dir: str = ""): # Aí depois eu preciso andar pelo zip: with ZipFile(filename, "r") as f: compressed_files = [file for file in f.infolist() if not file.is_dir()] + new_filename = None for file in compressed_files: filename = file.filename.split("/")[-1] if re.search("Tipo", filename, re.IGNORECASE): - match = re.search(r"Tipo UF\s+([^\s\d]+\s*)*([12]\d{3})", filename) - if match: - month = match.group(1).lower().replace(".", "") - month_value = MONTHS.get(month) or MONTHS_SHORT.get(month) - extension = filename.split(".")[-1] - new_filename = f"{year_dir_name}/{UF_TIPO_BASIC_FILENAME}_{month_value}-{year}.{extension}" - f.extract(file, path=year_dir_name) - os.rename(f"{year_dir_name}/{file.filename}", new_filename) + new_filename = make_filename_2010_to_2012( + "Tipo", year, filename, year_dir_name, month + ) elif re.search("Munic", filename, re.IGNORECASE): - match = re.search(rf"Munic\.?\s*(.*?)\s*\.?{year}", filename) - if match: - month = match.group(1).lower() - month_value = MONTHS.get(month) or MONTHS_SHORT.get(month) - extension = filename.split(".")[-1] - new_filename = f"{year_dir_name}/{MUNIC_TIPO_BASIC_FILENAME}_{month_value}-{year}.{extension}" - f.extract(file, path=year_dir_name) - os.rename(f"{year_dir_name}/{file.filename}", new_filename) + new_filename = make_filename_2010_to_2012( + "Munic", year, filename, year_dir_name, month + ) + if new_filename: + f.extract(file, path=year_dir_name) + os.rename(f"{year_dir_name}/{file.filename}", new_filename) def treat_uf_tipo(file) -> pl.DataFrame: diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 59815d423..9b2005652 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -30,7 +30,7 @@ def tearDown(self): shutil.rmtree(self.temp_dir.name) @parameterized.expand( - [(month, year) for year in range(2012, 2023) for month in range(1, 3)], + [(month, year) for year in range(2010, 2013) for month in range(1, 3)], name_func=custom_name_func, ) def test_download_post_2012(self, month, year): @@ -43,13 +43,6 @@ def test_download_post_2012(self, month, year): files = set(os.path.splitext(file)[0] for file in list_of_files) self.assertTrue(expected_files.issubset(files)) - # @parameterized.expand( - # [(month, year) for year in range(2012, 2013) for month in range(1, 3)], - # name_func=custom_name_func, - # ) - # def test_download_pre_2012(self, month, year): - # crawl(month, year, self.temp_dir.name) - if __name__ == "__main__": unittest.main() diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 33c6f7e7d..fea1e719d 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -47,7 +47,9 @@ SUBSTITUTIONS = constants.SUBSTITUTIONS.value HEADERS = constants.HEADERS.value MONTHS = constants.MONTHS.value -UF_TIPO_BASIC_FILENAME = constants.UF_TIPO_BASIC_FILENAME +UF_TIPO_BASIC_FILENAME = constants.UF_TIPO_BASIC_FILENAME.value +MONTHS_SHORT = constants.MONTHS_SHORT.value +MUNIC_TIPO_BASIC_FILENAME = constants.MUNIC_TIPO_BASIC_FILENAME.value def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int: @@ -284,6 +286,29 @@ def call_downloader(i: dict): generic_extractor(filename) +def make_filename_2010_to_2012( + type_of_file: str, year: int, filename: str, year_dir_name: str, month: int +): + if type_of_file == "Tipo": + regex_to_search = r"Tipo UF\s+([^\s\d]+\s*)*([12]\d{3})" + basic_filename = UF_TIPO_BASIC_FILENAME + elif type_of_file == "Munic": + regex_to_search = rf"Munic\.?\s*(.*?)\s*\.?{year}" + basic_filename = MUNIC_TIPO_BASIC_FILENAME + else: + raise ValueError + match = re.search(regex_to_search, filename) + if match: + month_in_file = match.group(1).lower().replace(".", "") + month_value = MONTHS.get(month_in_file) or MONTHS_SHORT.get(month_in_file) + extension = filename.split(".")[-1] + new_filename = ( + f"{year_dir_name}/{basic_filename}_{month_value}-{year}.{extension}" + ) + if month_value == month: + return new_filename + + def extract_links_post_2012(month: int, year: int, directory: str) -> list[dict]: """Extracts links of the Denatran files post 2012. From 3644bb0b3bacbf19aee752e7bd1c824e89d315e7 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 9 May 2023 03:26:51 -0300 Subject: [PATCH 117/265] Better encapsulation --- .../datasets/br_denatran_frota/handlers.py | 33 ++----------------- pipelines/datasets/br_denatran_frota/utils.py | 22 +++++++++++++ 2 files changed, 24 insertions(+), 31 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 3e856a9d3..7694e282b 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -62,7 +62,7 @@ get_year_month_from_filename, call_downloader, download_file, - make_filename_2010_to_2012, + extraction_pre_2012, ) import pandas as pd import polars as pl @@ -99,36 +99,7 @@ def crawl(month: int, year: int, temp_dir: str = ""): call_downloader(file_dict) else: url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-senatran/estatisticas/renavam/{year}/frota{'_' if year > 2008 else ''}{year}.zip" - # info = { - # "txt": "Dados anuais", - # "href": url, - # "mes_name": MONTHS.get(month), - # "mes": month, - # "ano": year, - # "filetype": "zip", - # "destination_dir": temp_dir, - # } - # call_downloader(info) - # Nesse caso aqui, o que eu quero? Eu quero baixar o zip: - filename = f"{year_dir_name}/dados_anuais.zip" - download_file(url, filename) - # Aí depois eu preciso andar pelo zip: - with ZipFile(filename, "r") as f: - compressed_files = [file for file in f.infolist() if not file.is_dir()] - new_filename = None - for file in compressed_files: - filename = file.filename.split("/")[-1] - if re.search("Tipo", filename, re.IGNORECASE): - new_filename = make_filename_2010_to_2012( - "Tipo", year, filename, year_dir_name, month - ) - elif re.search("Munic", filename, re.IGNORECASE): - new_filename = make_filename_2010_to_2012( - "Munic", year, filename, year_dir_name, month - ) - if new_filename: - f.extract(file, path=year_dir_name) - os.rename(f"{year_dir_name}/{file.filename}", new_filename) + extraction_pre_2012(url, month, year, year_dir_name) def treat_uf_tipo(file) -> pl.DataFrame: diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index fea1e719d..c3549bf11 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -346,6 +346,28 @@ def extract_links_post_2012(month: int, year: int, directory: str) -> list[dict] return valid_links +def extraction_pre_2012(url: str, month: int, year: int, year_dir_name: str): + filename = f"{year_dir_name}/dados_anuais.zip" + download_file(url, filename) + # Aí depois eu preciso andar pelo zip: + with ZipFile(filename, "r") as f: + compressed_files = [file for file in f.infolist() if not file.is_dir()] + new_filename = None + for file in compressed_files: + filename = file.filename.split("/")[-1] + if re.search("Tipo", filename, re.IGNORECASE): + new_filename = make_filename_2010_to_2012( + "Tipo", year, filename, year_dir_name, month + ) + elif re.search("Munic", filename, re.IGNORECASE): + new_filename = make_filename_2010_to_2012( + "Munic", year, filename, year_dir_name, month + ) + if new_filename: + f.extract(file, path=year_dir_name) + os.rename(f"{year_dir_name}/{file.filename}", new_filename) + + def make_dir_when_not_exists(dir_name: str): """Auxiliary function to create a subdirectory when it is not present. From b7d1c090f6488d02a2f2f29eaf2b99ca69ebb313 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 9 May 2023 20:36:26 -0300 Subject: [PATCH 118/265] Trying to solve 2009 and down --- pipelines/datasets/br_denatran_frota/handlers.py | 6 +++++- pipelines/datasets/br_denatran_frota/tasks_test.py | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 7694e282b..8c5477a97 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -99,7 +99,11 @@ def crawl(month: int, year: int, temp_dir: str = ""): call_downloader(file_dict) else: url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-senatran/estatisticas/renavam/{year}/frota{'_' if year > 2008 else ''}{year}.zip" - extraction_pre_2012(url, month, year, year_dir_name) + filename = f"{year_dir_name}/dados_anuais.zip" + download_file(url, filename) + if year < 2010: + print(2) + extraction_pre_2012(url, month, year, year_dir_name, filename) def treat_uf_tipo(file) -> pl.DataFrame: diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 9b2005652..dde6af23d 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -30,7 +30,7 @@ def tearDown(self): shutil.rmtree(self.temp_dir.name) @parameterized.expand( - [(month, year) for year in range(2010, 2013) for month in range(1, 3)], + [(month, year) for year in range(2002, 2013) for month in range(1, 2)], name_func=custom_name_func, ) def test_download_post_2012(self, month, year): From f5bb766bf3a29310c11534a4b21e3456d8cad12c Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 9 May 2023 20:48:11 -0300 Subject: [PATCH 119/265] Adhoc treatment for pre 2010 --- pipelines/datasets/br_denatran_frota/handlers.py | 6 +++++- pipelines/datasets/br_denatran_frota/utils.py | 6 +++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 8c5477a97..5e31619a6 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -102,7 +102,11 @@ def crawl(month: int, year: int, temp_dir: str = ""): filename = f"{year_dir_name}/dados_anuais.zip" download_file(url, filename) if year < 2010: - print(2) + with ZipFile(filename, "r") as f: + f.extractall(path=f"{year_dir_name}") + for aggregate_file in os.listdir(f"{year_dir_name}"): + print(aggregate_file) + extraction_pre_2012(url, month, year, year_dir_name, aggregate_file) extraction_pre_2012(url, month, year, year_dir_name, filename) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index c3549bf11..4ba04cb89 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -346,9 +346,9 @@ def extract_links_post_2012(month: int, year: int, directory: str) -> list[dict] return valid_links -def extraction_pre_2012(url: str, month: int, year: int, year_dir_name: str): - filename = f"{year_dir_name}/dados_anuais.zip" - download_file(url, filename) +def extraction_pre_2012( + url: str, month: int, year: int, year_dir_name: str, filename: str +): # Aí depois eu preciso andar pelo zip: with ZipFile(filename, "r") as f: compressed_files = [file for file in f.infolist() if not file.is_dir()] From 4800468692a637033d2489edf8b3325f6d636f25 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 9 May 2023 22:34:11 -0300 Subject: [PATCH 120/265] Almost there --- pipelines/datasets/br_denatran_frota/handlers.py | 10 ++++++++-- pipelines/datasets/br_denatran_frota/utils.py | 8 +++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 5e31619a6..3c8bbf603 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -105,8 +105,14 @@ def crawl(month: int, year: int, temp_dir: str = ""): with ZipFile(filename, "r") as f: f.extractall(path=f"{year_dir_name}") for aggregate_file in os.listdir(f"{year_dir_name}"): - print(aggregate_file) - extraction_pre_2012(url, month, year, year_dir_name, aggregate_file) + if aggregate_file != "dados_anuais.zip": + extraction_pre_2012( + url, + month, + year, + year_dir_name, + os.path.join(year_dir_name, aggregate_file), + ) extraction_pre_2012(url, month, year, year_dir_name, filename) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 4ba04cb89..bb32285e3 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -350,8 +350,9 @@ def extraction_pre_2012( url: str, month: int, year: int, year_dir_name: str, filename: str ): # Aí depois eu preciso andar pelo zip: - with ZipFile(filename, "r") as f: - compressed_files = [file for file in f.infolist() if not file.is_dir()] + print("Bom dia") + with ZipFile(filename, "r") as g: + compressed_files = [file for file in g.infolist() if not file.is_dir()] new_filename = None for file in compressed_files: filename = file.filename.split("/")[-1] @@ -364,8 +365,9 @@ def extraction_pre_2012( "Munic", year, filename, year_dir_name, month ) if new_filename: - f.extract(file, path=year_dir_name) + g.extract(file, path=year_dir_name) os.rename(f"{year_dir_name}/{file.filename}", new_filename) + print("Bom dia") def make_dir_when_not_exists(dir_name: str): From b011ce1a817f037a4687d2ed193e71e79b26d587 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 9 May 2023 23:43:23 -0300 Subject: [PATCH 121/265] Works from 2005 onwards --- pipelines/datasets/br_denatran_frota/handlers.py | 3 ++- pipelines/datasets/br_denatran_frota/utils.py | 10 ++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 3c8bbf603..3b6354d1f 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -113,7 +113,8 @@ def crawl(month: int, year: int, temp_dir: str = ""): year_dir_name, os.path.join(year_dir_name, aggregate_file), ) - extraction_pre_2012(url, month, year, year_dir_name, filename) + else: + extraction_pre_2012(url, month, year, year_dir_name, filename) def treat_uf_tipo(file) -> pl.DataFrame: diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index bb32285e3..7bc130555 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -290,7 +290,7 @@ def make_filename_2010_to_2012( type_of_file: str, year: int, filename: str, year_dir_name: str, month: int ): if type_of_file == "Tipo": - regex_to_search = r"Tipo UF\s+([^\s\d]+\s*)*([12]\d{3})" + regex_to_search = r"UF\s+([^\s\d]+\s*)*([12]\d{3})" basic_filename = UF_TIPO_BASIC_FILENAME elif type_of_file == "Munic": regex_to_search = rf"Munic\.?\s*(.*?)\s*\.?{year}" @@ -347,16 +347,18 @@ def extract_links_post_2012(month: int, year: int, directory: str) -> list[dict] def extraction_pre_2012( - url: str, month: int, year: int, year_dir_name: str, filename: str + url: str, month: int, year: int, year_dir_name: str, zip_file: str ): # Aí depois eu preciso andar pelo zip: print("Bom dia") - with ZipFile(filename, "r") as g: + with ZipFile(zip_file, "r") as g: compressed_files = [file for file in g.infolist() if not file.is_dir()] new_filename = None for file in compressed_files: filename = file.filename.split("/")[-1] - if re.search("Tipo", filename, re.IGNORECASE): + if re.search("Tipo", filename, re.IGNORECASE) or re.search( + "Tipo UF", zip_file.split("/")[-1] + ): new_filename = make_filename_2010_to_2012( "Tipo", year, filename, year_dir_name, month ) From ac0117cc5465da93945f22dad8137c06b1fa65eb Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 10 May 2023 01:05:08 -0300 Subject: [PATCH 122/265] 2005 is the best I have so far --- pipelines/datasets/br_denatran_frota/utils.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 7bc130555..4ffa7bb16 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -290,17 +290,23 @@ def make_filename_2010_to_2012( type_of_file: str, year: int, filename: str, year_dir_name: str, month: int ): if type_of_file == "Tipo": - regex_to_search = r"UF\s+([^\s\d]+\s*)*([12]\d{3})" basic_filename = UF_TIPO_BASIC_FILENAME + if year > 2005: + regex_to_search = r"UF\s+([^\s\d]+\s*)*([12]\d{3})" + else: + regex_to_search = rf"UF_([^\s\d]+\s*)_{str(year)[2:4]}" elif type_of_file == "Munic": - regex_to_search = rf"Munic\.?\s*(.*?)\s*\.?{year}" basic_filename = MUNIC_TIPO_BASIC_FILENAME + regex_to_search = rf"Munic\.?\s*(.*?)\s*\.?{year}" else: raise ValueError match = re.search(regex_to_search, filename) if match: - month_in_file = match.group(1).lower().replace(".", "") - month_value = MONTHS.get(month_in_file) or MONTHS_SHORT.get(month_in_file) + if year <= 2005 and type_of_file == "Munic": + month_value = int(match.group(1)) + else: + month_in_file = match.group(1).lower().replace(".", "") + month_value = MONTHS.get(month_in_file) or MONTHS_SHORT.get(month_in_file) extension = filename.split(".")[-1] new_filename = ( f"{year_dir_name}/{basic_filename}_{month_value}-{year}.{extension}" From 80cb5808849366c15a06caf1d5a1bec12076ca7c Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 10 May 2023 01:08:49 -0300 Subject: [PATCH 123/265] And now we also have 2004 --- pipelines/datasets/br_denatran_frota/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 4ffa7bb16..9e7471dc1 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -363,7 +363,7 @@ def extraction_pre_2012( for file in compressed_files: filename = file.filename.split("/")[-1] if re.search("Tipo", filename, re.IGNORECASE) or re.search( - "Tipo UF", zip_file.split("/")[-1] + r"Tipo[-\s]UF", zip_file.split("/")[-1] ): new_filename = make_filename_2010_to_2012( "Tipo", year, filename, year_dir_name, month From af180923f9a4218b9e22b68b7a2813e92b3d2db8 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 10 May 2023 01:59:31 -0300 Subject: [PATCH 124/265] Almost 2003 --- pipelines/datasets/br_denatran_frota/utils.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 9e7471dc1..d06a81950 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -297,12 +297,15 @@ def make_filename_2010_to_2012( regex_to_search = rf"UF_([^\s\d]+\s*)_{str(year)[2:4]}" elif type_of_file == "Munic": basic_filename = MUNIC_TIPO_BASIC_FILENAME - regex_to_search = rf"Munic\.?\s*(.*?)\s*\.?{year}" + if year > 2003: + regex_to_search = rf"Munic\.?\s*(.*?)\s*\.?{year}" + else: + regex_to_search = rf"Mun\w*_(.*?)_{str(year)[2:4]}" else: raise ValueError match = re.search(regex_to_search, filename) if match: - if year <= 2005 and type_of_file == "Munic": + if (year == 2004 or year == 2005) and type_of_file == "Munic": month_value = int(match.group(1)) else: month_in_file = match.group(1).lower().replace(".", "") From 2d9fbf7eadde0903d19e27409148b8d587872fe1 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 10 May 2023 02:09:09 -0300 Subject: [PATCH 125/265] Almost 2003 --- pipelines/datasets/br_denatran_frota/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index d06a81950..c73fb8604 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -371,7 +371,7 @@ def extraction_pre_2012( new_filename = make_filename_2010_to_2012( "Tipo", year, filename, year_dir_name, month ) - elif re.search("Munic", filename, re.IGNORECASE): + elif re.search(r"Mun\w*", filename, re.IGNORECASE): new_filename = make_filename_2010_to_2012( "Munic", year, filename, year_dir_name, month ) From 8ac4dcfa2f0a13337b01a6a41fa57f74f54646db Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 10 May 2023 02:26:37 -0300 Subject: [PATCH 126/265] 2003 extraction works --- pipelines/datasets/br_denatran_frota/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index c73fb8604..924e47785 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -294,7 +294,7 @@ def make_filename_2010_to_2012( if year > 2005: regex_to_search = r"UF\s+([^\s\d]+\s*)*([12]\d{3})" else: - regex_to_search = rf"UF_([^\s\d]+\s*)_{str(year)[2:4]}" + regex_to_search = rf"UF[_\s]?([^\s\d]+\s*)_{str(year)[2:4]}" elif type_of_file == "Munic": basic_filename = MUNIC_TIPO_BASIC_FILENAME if year > 2003: From e09bca853490d7d02602378f25898da8051d3166 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 10 May 2023 02:33:02 -0300 Subject: [PATCH 127/265] Extraction task is fully functional --- pipelines/datasets/br_denatran_frota/handlers.py | 3 +-- pipelines/datasets/br_denatran_frota/tasks_test.py | 2 +- pipelines/datasets/br_denatran_frota/utils.py | 10 ++++------ 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 3b6354d1f..5250b3e3d 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -107,14 +107,13 @@ def crawl(month: int, year: int, temp_dir: str = ""): for aggregate_file in os.listdir(f"{year_dir_name}"): if aggregate_file != "dados_anuais.zip": extraction_pre_2012( - url, month, year, year_dir_name, os.path.join(year_dir_name, aggregate_file), ) else: - extraction_pre_2012(url, month, year, year_dir_name, filename) + extraction_pre_2012(month, year, year_dir_name, filename) def treat_uf_tipo(file) -> pl.DataFrame: diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index dde6af23d..8356407e8 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -30,7 +30,7 @@ def tearDown(self): shutil.rmtree(self.temp_dir.name) @parameterized.expand( - [(month, year) for year in range(2002, 2013) for month in range(1, 2)], + [(month, year) for year in range(2003, 2024) for month in range(1, 2)], name_func=custom_name_func, ) def test_download_post_2012(self, month, year): diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 924e47785..e3a6565b0 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -286,7 +286,7 @@ def call_downloader(i: dict): generic_extractor(filename) -def make_filename_2010_to_2012( +def make_filename_pre_2012( type_of_file: str, year: int, filename: str, year_dir_name: str, month: int ): if type_of_file == "Tipo": @@ -355,9 +355,7 @@ def extract_links_post_2012(month: int, year: int, directory: str) -> list[dict] return valid_links -def extraction_pre_2012( - url: str, month: int, year: int, year_dir_name: str, zip_file: str -): +def extraction_pre_2012(month: int, year: int, year_dir_name: str, zip_file: str): # Aí depois eu preciso andar pelo zip: print("Bom dia") with ZipFile(zip_file, "r") as g: @@ -368,11 +366,11 @@ def extraction_pre_2012( if re.search("Tipo", filename, re.IGNORECASE) or re.search( r"Tipo[-\s]UF", zip_file.split("/")[-1] ): - new_filename = make_filename_2010_to_2012( + new_filename = make_filename_pre_2012( "Tipo", year, filename, year_dir_name, month ) elif re.search(r"Mun\w*", filename, re.IGNORECASE): - new_filename = make_filename_2010_to_2012( + new_filename = make_filename_pre_2012( "Munic", year, filename, year_dir_name, month ) if new_filename: From 8c50f077c10613e444fa9733880fd02b5b100243 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 10 May 2023 03:00:37 -0300 Subject: [PATCH 128/265] Rename task for consistency --- pipelines/datasets/br_denatran_frota/flows.py | 6 ++-- pipelines/datasets/br_denatran_frota/tasks.py | 34 +++---------------- 2 files changed, 7 insertions(+), 33 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 0c3926d12..8fcace90a 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -76,7 +76,7 @@ rename_current_flow_run_dataset_table, get_current_flow_labels, ) -from pipelines.datasets.br_denatran_frota.tasks import crawler, treat_uf_tipo +from pipelines.datasets.br_denatran_frota.tasks import crawl_task, treat_uf_tipo_task from pipelines.datasets.br_denatran_frota.constants import constants download_path = constants.DOWNLOAD_PATH.value @@ -105,11 +105,11 @@ # rename_flow_run = rename_current_flow_run_dataset_table( # prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id # ) - crawled = crawler( + crawled = crawl_task( month=2, year=2021, temp_dir=download_path ) # Download the desired files. uf_tipo_file = "/home/tamir/basedosdados/pipelines/pipelines/datasets/br_denatran_frota/tmp/input/files/2021/frota_por_uf_e_tipo_de_veículo_2-2021.xls" - df = treat_uf_tipo(file=uf_tipo_file, upstream_tasks=[crawled]) + df = treat_uf_tipo_task(file=uf_tipo_file, upstream_tasks=[crawled]) print("foi?") diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 15972fd46..5ca214f8d 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -64,7 +64,7 @@ ) import pandas as pd import polars as pl -from pipelines.datasets.br_denatran_frota.handlers import crawl +from pipelines.datasets.br_denatran_frota.handlers import crawl, treat_uf_tipo MONTHS = constants.MONTHS.value DATASET = constants.DATASET.value @@ -73,39 +73,13 @@ @task() # noqa -def crawler(month: int, year: int, temp_dir: str = ""): +def crawl_task(month: int, year: int, temp_dir: str = ""): crawl(month, year, temp_dir) @task() -def treat_uf_tipo(file) -> pl.DataFrame: - filename = os.path.split(file)[1] - df = pd.read_excel(file) - new_df = change_df_header(df, guess_header(df)) - # This is ad hoc for UF_tipo. - new_df.rename( - columns={new_df.columns[0]: "sigla_uf"}, inplace=True - ) # Rename for ease of use. - new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace. - clean_df = new_df[new_df.sigla_uf.isin(DICT_UFS.values())].reset_index( - drop=True - ) # Now we get all the actual RELEVANT uf data. - month, year = get_year_month_from_filename(filename) - clean_pl_df = pl.from_pandas(clean_df).lazy() - verify_total(clean_pl_df.collect()) - # Add year and month - clean_pl_df = clean_pl_df.with_columns( - pl.lit(year, dtype=pl.Int64).alias("ano"), - pl.lit(month, dtype=pl.Int64).alias("mes"), - ) - clean_pl_df = clean_pl_df.select(pl.exclude("TOTAL")) - clean_pl_df = clean_pl_df.melt( - id_vars=["ano", "mes", "sigla_uf"], - variable_name="tipo_veiculo", - value_name="quantidade", - ) # Long format. - clean_pl_df = clean_pl_df.collect() - return clean_pl_df +def treat_uf_tipo_task(file) -> pl.DataFrame: + treat_uf_tipo(file) @task() From ea8d254ac0dc949d52a13567785d430392b28330 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 10 May 2023 03:26:28 -0300 Subject: [PATCH 129/265] Begin testing of UF tipo treatment --- .../datasets/br_denatran_frota/handlers.py | 2 +- .../datasets/br_denatran_frota/tasks_test.py | 31 ++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 5250b3e3d..9404c6738 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -116,7 +116,7 @@ def crawl(month: int, year: int, temp_dir: str = ""): extraction_pre_2012(month, year, year_dir_name, filename) -def treat_uf_tipo(file) -> pl.DataFrame: +def treat_uf_tipo(file: str) -> pl.DataFrame: filename = os.path.split(file)[1] df = pd.read_excel(file) new_df = change_df_header(df, guess_header(df)) diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 8356407e8..2d2ff7509 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -3,6 +3,7 @@ import shutil import tempfile import unittest +import re from parameterized import parameterized from pipelines.datasets.br_denatran_frota.handlers import crawl, treat_uf_tipo @@ -10,6 +11,8 @@ DATASET = constants.DATASET.value DOWNLOAD_PATH = constants.DOWNLOAD_PATH.value +MUNIC_TIPO_BASIC_FILENAME = constants.MUNIC_TIPO_BASIC_FILENAME.value +UF_TIPO_BASIC_FILENAME = constants.UF_TIPO_BASIC_FILENAME.value def custom_name_func(testcase_func, param_num, param): @@ -33,7 +36,7 @@ def tearDown(self): [(month, year) for year in range(2003, 2024) for month in range(1, 2)], name_func=custom_name_func, ) - def test_download_post_2012(self, month, year): + def test_extract_denatran_files(self, month, year): crawl(month, year, self.temp_dir.name) expected_files = { f"frota_por_uf_e_tipo_de_veiculo_{month}-{year}", @@ -44,5 +47,31 @@ def test_download_post_2012(self, month, year): self.assertTrue(expected_files.issubset(files)) +class TestTreatmentPostCrawl(unittest.TestCase): + def setUp(self): + self.temp_dir = tempfile.TemporaryDirectory( + dir=os.path.join(f"{DOWNLOAD_PATH}") + ) + + def tearDown(self): + print("Deleting temporary directory") + shutil.rmtree(self.temp_dir.name) + + @parameterized.expand( + [(month, year) for year in range(2020, 2023) for month in range(1, 2)], + name_func=custom_name_func, + ) + def test_treat_files_uf_tipo(self, month, year): + crawl(month, year, self.temp_dir.name) + directory_to_search = os.path.join(self.temp_dir.name, "files", f"{year}") + desired_files = [ + f + for f in os.listdir(directory_to_search) + if re.search(UF_TIPO_BASIC_FILENAME, f) is not None + ] + for file in desired_files: + treat_uf_tipo(os.path.join(directory_to_search, file)) + + if __name__ == "__main__": unittest.main() From cbed8807098a69e7bfd225f25bf1d94d76444e58 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 10 May 2023 04:01:44 -0300 Subject: [PATCH 130/265] Treatment for UF tipo works up for 2009-> --- pipelines/datasets/br_denatran_frota/handlers.py | 6 +++++- .../datasets/br_denatran_frota/tasks_test.py | 16 ++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 9404c6738..4b547597e 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -118,7 +118,11 @@ def crawl(month: int, year: int, temp_dir: str = ""): def treat_uf_tipo(file: str) -> pl.DataFrame: filename = os.path.split(file)[1] - df = pd.read_excel(file) + correct_sheet = [ + sheet for sheet in pd.ExcelFile(file).sheet_names if sheet != "Glossário" + ][0] + + df = pd.read_excel(file, sheet_name=correct_sheet) new_df = change_df_header(df, guess_header(df)) # This is ad hoc for UF_tipo. new_df.rename( diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 2d2ff7509..021d33808 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -58,19 +58,19 @@ def tearDown(self): shutil.rmtree(self.temp_dir.name) @parameterized.expand( - [(month, year) for year in range(2020, 2023) for month in range(1, 2)], + [(month, year) for year in range(2003, 2024) for month in range(1, 2)], name_func=custom_name_func, ) def test_treat_files_uf_tipo(self, month, year): crawl(month, year, self.temp_dir.name) directory_to_search = os.path.join(self.temp_dir.name, "files", f"{year}") - desired_files = [ - f - for f in os.listdir(directory_to_search) - if re.search(UF_TIPO_BASIC_FILENAME, f) is not None - ] - for file in desired_files: - treat_uf_tipo(os.path.join(directory_to_search, file)) + for file in os.listdir(directory_to_search): + if re.search(UF_TIPO_BASIC_FILENAME, file) and file.split(".")[-1] in [ + "xls", + "xlsx", + ]: + treated_df = treat_uf_tipo(os.path.join(directory_to_search, file)) + self.assertEqual(len(treated_df), 21 * 27) if __name__ == "__main__": From 93c13708af5067ad006ac1387ff87dbb7231385a Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Fri, 12 May 2023 03:18:50 -0300 Subject: [PATCH 131/265] I have become Death, the destroyer of Worlds. --- .../datasets/br_denatran_frota/trash.ipynb | 441 ++++++++++++++++++ poetry.lock | 113 ++++- pyproject.toml | 1 + 3 files changed, 551 insertions(+), 4 deletions(-) create mode 100644 pipelines/datasets/br_denatran_frota/trash.ipynb diff --git a/pipelines/datasets/br_denatran_frota/trash.ipynb b/pipelines/datasets/br_denatran_frota/trash.ipynb new file mode 100644 index 000000000..a33af4cd6 --- /dev/null +++ b/pipelines/datasets/br_denatran_frota/trash.ipynb @@ -0,0 +1,441 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import pandas as pd\n", + "import xlrd\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Frota RegiΣes Tipo UF JAN2009.xls']" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "os.listdir('.')" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "ename": "UnicodeDecodeError", + "evalue": "'utf-16-le' codec can't decode bytes in position 24-25: illegal encoding", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mUnicodeDecodeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[64], line 13\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[39m# Open the Excel file with xlrd\u001b[39;00m\n\u001b[1;32m 12\u001b[0m \u001b[39mif\u001b[39;00m file_like_object\u001b[39m.\u001b[39mgetvalue()\u001b[39m.\u001b[39mstartswith(xlrd\u001b[39m.\u001b[39mXLS_SIGNATURE):\n\u001b[0;32m---> 13\u001b[0m workbook \u001b[39m=\u001b[39m xlrd\u001b[39m.\u001b[39;49mopen_workbook(file_contents\u001b[39m=\u001b[39;49mfile_like_object\u001b[39m.\u001b[39;49mread(), encoding_override\u001b[39m=\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39mlatin-1\u001b[39;49m\u001b[39m'\u001b[39;49m)\n\u001b[1;32m 14\u001b[0m \u001b[39m# ... rest of the code goes here\u001b[39;00m\n", + "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/__init__.py:172\u001b[0m, in \u001b[0;36mopen_workbook\u001b[0;34m(filename, logfile, verbosity, use_mmap, file_contents, encoding_override, formatting_info, on_demand, ragged_rows, ignore_workbook_corruption)\u001b[0m\n\u001b[1;32m 169\u001b[0m \u001b[39mif\u001b[39;00m file_format \u001b[39mand\u001b[39;00m file_format \u001b[39m!=\u001b[39m \u001b[39m'\u001b[39m\u001b[39mxls\u001b[39m\u001b[39m'\u001b[39m:\n\u001b[1;32m 170\u001b[0m \u001b[39mraise\u001b[39;00m XLRDError(FILE_FORMAT_DESCRIPTIONS[file_format]\u001b[39m+\u001b[39m\u001b[39m'\u001b[39m\u001b[39m; not supported\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[0;32m--> 172\u001b[0m bk \u001b[39m=\u001b[39m open_workbook_xls(\n\u001b[1;32m 173\u001b[0m filename\u001b[39m=\u001b[39;49mfilename,\n\u001b[1;32m 174\u001b[0m logfile\u001b[39m=\u001b[39;49mlogfile,\n\u001b[1;32m 175\u001b[0m verbosity\u001b[39m=\u001b[39;49mverbosity,\n\u001b[1;32m 176\u001b[0m use_mmap\u001b[39m=\u001b[39;49muse_mmap,\n\u001b[1;32m 177\u001b[0m file_contents\u001b[39m=\u001b[39;49mfile_contents,\n\u001b[1;32m 178\u001b[0m encoding_override\u001b[39m=\u001b[39;49mencoding_override,\n\u001b[1;32m 179\u001b[0m formatting_info\u001b[39m=\u001b[39;49mformatting_info,\n\u001b[1;32m 180\u001b[0m on_demand\u001b[39m=\u001b[39;49mon_demand,\n\u001b[1;32m 181\u001b[0m ragged_rows\u001b[39m=\u001b[39;49mragged_rows,\n\u001b[1;32m 182\u001b[0m ignore_workbook_corruption\u001b[39m=\u001b[39;49mignore_workbook_corruption,\n\u001b[1;32m 183\u001b[0m )\n\u001b[1;32m 185\u001b[0m \u001b[39mreturn\u001b[39;00m bk\n", + "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/book.py:104\u001b[0m, in \u001b[0;36mopen_workbook_xls\u001b[0;34m(filename, logfile, verbosity, use_mmap, file_contents, encoding_override, formatting_info, on_demand, ragged_rows, ignore_workbook_corruption)\u001b[0m\n\u001b[1;32m 102\u001b[0m bk\u001b[39m.\u001b[39mon_demand \u001b[39m=\u001b[39m on_demand \u001b[39m=\u001b[39m \u001b[39mFalse\u001b[39;00m\n\u001b[1;32m 103\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m--> 104\u001b[0m bk\u001b[39m.\u001b[39;49mparse_globals()\n\u001b[1;32m 105\u001b[0m bk\u001b[39m.\u001b[39m_sheet_list \u001b[39m=\u001b[39m [\u001b[39mNone\u001b[39;00m \u001b[39mfor\u001b[39;00m sh \u001b[39min\u001b[39;00m bk\u001b[39m.\u001b[39m_sheet_names]\n\u001b[1;32m 106\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m on_demand:\n", + "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/book.py:1215\u001b[0m, in \u001b[0;36mBook.parse_globals\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1213\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mhandle_font(data)\n\u001b[1;32m 1214\u001b[0m \u001b[39melif\u001b[39;00m rc \u001b[39m==\u001b[39m XL_FORMAT: \u001b[39m# XL_FORMAT2 is BIFF <= 3.0, can't appear in globals\u001b[39;00m\n\u001b[0;32m-> 1215\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mhandle_format(data)\n\u001b[1;32m 1216\u001b[0m \u001b[39melif\u001b[39;00m rc \u001b[39m==\u001b[39m XL_XF:\n\u001b[1;32m 1217\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mhandle_xf(data)\n", + "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/formatting.py:541\u001b[0m, in \u001b[0;36mhandle_format\u001b[0;34m(self, data, rectype)\u001b[0m\n\u001b[1;32m 539\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mactualfmtcount \u001b[39m+\u001b[39m\u001b[39m=\u001b[39m \u001b[39m1\u001b[39m\n\u001b[1;32m 540\u001b[0m \u001b[39mif\u001b[39;00m bv \u001b[39m>\u001b[39m\u001b[39m=\u001b[39m \u001b[39m80\u001b[39m:\n\u001b[0;32m--> 541\u001b[0m unistrg \u001b[39m=\u001b[39m unpack_unicode(data, \u001b[39m2\u001b[39;49m)\n\u001b[1;32m 542\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 543\u001b[0m unistrg \u001b[39m=\u001b[39m unpack_string(data, strpos, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mencoding, lenlen\u001b[39m=\u001b[39m\u001b[39m1\u001b[39m)\n", + "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/biffh.py:284\u001b[0m, in \u001b[0;36munpack_unicode\u001b[0;34m(data, pos, lenlen)\u001b[0m\n\u001b[1;32m 282\u001b[0m rawstrg \u001b[39m=\u001b[39m data[pos:pos\u001b[39m+\u001b[39m\u001b[39m2\u001b[39m\u001b[39m*\u001b[39mnchars]\n\u001b[1;32m 283\u001b[0m \u001b[39m# if DEBUG: print \"nchars=%d pos=%d rawstrg=%r\" % (nchars, pos, rawstrg)\u001b[39;00m\n\u001b[0;32m--> 284\u001b[0m strg \u001b[39m=\u001b[39m unicode(rawstrg, \u001b[39m'\u001b[39;49m\u001b[39mutf_16_le\u001b[39;49m\u001b[39m'\u001b[39;49m)\n\u001b[1;32m 285\u001b[0m \u001b[39m# pos += 2*nchars\u001b[39;00m\n\u001b[1;32m 286\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 287\u001b[0m \u001b[39m# Note: this is COMPRESSED (not ASCII!) encoding!!!\u001b[39;00m\n\u001b[1;32m 288\u001b[0m \u001b[39m# Merely returning the raw bytes would work OK 99.99% of the time\u001b[39;00m\n\u001b[1;32m 289\u001b[0m \u001b[39m# if the local codepage was cp1252 -- however this would rapidly go pear-shaped\u001b[39;00m\n\u001b[1;32m 290\u001b[0m \u001b[39m# for other codepages so we grit our Anglocentric teeth and return Unicode :-)\u001b[39;00m\n\u001b[1;32m 292\u001b[0m strg \u001b[39m=\u001b[39m unicode(data[pos:pos\u001b[39m+\u001b[39mnchars], \u001b[39m\"\u001b[39m\u001b[39mlatin_1\u001b[39m\u001b[39m\"\u001b[39m)\n", + "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/timemachine.py:31\u001b[0m, in \u001b[0;36m\u001b[0;34m(b, enc)\u001b[0m\n\u001b[1;32m 29\u001b[0m REPR \u001b[39m=\u001b[39m ascii\n\u001b[1;32m 30\u001b[0m xrange \u001b[39m=\u001b[39m \u001b[39mrange\u001b[39m\n\u001b[0;32m---> 31\u001b[0m unicode \u001b[39m=\u001b[39m \u001b[39mlambda\u001b[39;00m b, enc: b\u001b[39m.\u001b[39;49mdecode(enc)\n\u001b[1;32m 32\u001b[0m ensure_unicode \u001b[39m=\u001b[39m \u001b[39mlambda\u001b[39;00m s: s\n\u001b[1;32m 33\u001b[0m unichr \u001b[39m=\u001b[39m \u001b[39mchr\u001b[39m\n", + "File \u001b[0;32m/usr/lib/python3.10/encodings/utf_16_le.py:16\u001b[0m, in \u001b[0;36mdecode\u001b[0;34m(input, errors)\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mdecode\u001b[39m(\u001b[39minput\u001b[39m, errors\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mstrict\u001b[39m\u001b[39m'\u001b[39m):\n\u001b[0;32m---> 16\u001b[0m \u001b[39mreturn\u001b[39;00m codecs\u001b[39m.\u001b[39;49mutf_16_le_decode(\u001b[39minput\u001b[39;49m, errors, \u001b[39mTrue\u001b[39;49;00m)\n", + "\u001b[0;31mUnicodeDecodeError\u001b[0m: 'utf-16-le' codec can't decode bytes in position 24-25: illegal encoding" + ] + } + ], + "source": [ + "import io\n", + "import xlrd\n", + "\n", + "# Read the Excel file as bytes\n", + "with open('Frota RegiΣes Tipo UF JAN2009.xls', 'rb') as f:\n", + " contents = f.read()\n", + "\n", + "# Create a file-like object in memory\n", + "file_like_object = io.BytesIO(contents)\n", + "\n", + "# Open the Excel file with xlrd\n", + "if file_like_object.getvalue().startswith(xlrd.XLS_SIGNATURE):\n", + " workbook = xlrd.open_workbook(file_contents=file_like_object.read(), encoding_override='latin-1')\n", + " # ... rest of the code goes here\n" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "ename": "UnicodeDecodeError", + "evalue": "'utf-16-le' codec can't decode bytes in position 24-25: illegal encoding", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mUnicodeDecodeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[56], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m xlrd\u001b[39m.\u001b[39;49mopen_workbook_xls(\u001b[39m'\u001b[39;49m\u001b[39mFrota RegiΣes Tipo UF JAN2009.xls\u001b[39;49m\u001b[39m'\u001b[39;49m, encoding_override\u001b[39m=\u001b[39;49m \u001b[39m'\u001b[39;49m\u001b[39mlatin-1\u001b[39;49m\u001b[39m'\u001b[39;49m)\n", + "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/book.py:104\u001b[0m, in \u001b[0;36mopen_workbook_xls\u001b[0;34m(filename, logfile, verbosity, use_mmap, file_contents, encoding_override, formatting_info, on_demand, ragged_rows, ignore_workbook_corruption)\u001b[0m\n\u001b[1;32m 102\u001b[0m bk\u001b[39m.\u001b[39mon_demand \u001b[39m=\u001b[39m on_demand \u001b[39m=\u001b[39m \u001b[39mFalse\u001b[39;00m\n\u001b[1;32m 103\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m--> 104\u001b[0m bk\u001b[39m.\u001b[39;49mparse_globals()\n\u001b[1;32m 105\u001b[0m bk\u001b[39m.\u001b[39m_sheet_list \u001b[39m=\u001b[39m [\u001b[39mNone\u001b[39;00m \u001b[39mfor\u001b[39;00m sh \u001b[39min\u001b[39;00m bk\u001b[39m.\u001b[39m_sheet_names]\n\u001b[1;32m 106\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m on_demand:\n", + "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/book.py:1215\u001b[0m, in \u001b[0;36mBook.parse_globals\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1213\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mhandle_font(data)\n\u001b[1;32m 1214\u001b[0m \u001b[39melif\u001b[39;00m rc \u001b[39m==\u001b[39m XL_FORMAT: \u001b[39m# XL_FORMAT2 is BIFF <= 3.0, can't appear in globals\u001b[39;00m\n\u001b[0;32m-> 1215\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mhandle_format(data)\n\u001b[1;32m 1216\u001b[0m \u001b[39melif\u001b[39;00m rc \u001b[39m==\u001b[39m XL_XF:\n\u001b[1;32m 1217\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mhandle_xf(data)\n", + "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/formatting.py:541\u001b[0m, in \u001b[0;36mhandle_format\u001b[0;34m(self, data, rectype)\u001b[0m\n\u001b[1;32m 539\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mactualfmtcount \u001b[39m+\u001b[39m\u001b[39m=\u001b[39m \u001b[39m1\u001b[39m\n\u001b[1;32m 540\u001b[0m \u001b[39mif\u001b[39;00m bv \u001b[39m>\u001b[39m\u001b[39m=\u001b[39m \u001b[39m80\u001b[39m:\n\u001b[0;32m--> 541\u001b[0m unistrg \u001b[39m=\u001b[39m unpack_unicode(data, \u001b[39m2\u001b[39;49m)\n\u001b[1;32m 542\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 543\u001b[0m unistrg \u001b[39m=\u001b[39m unpack_string(data, strpos, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mencoding, lenlen\u001b[39m=\u001b[39m\u001b[39m1\u001b[39m)\n", + "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/biffh.py:284\u001b[0m, in \u001b[0;36munpack_unicode\u001b[0;34m(data, pos, lenlen)\u001b[0m\n\u001b[1;32m 282\u001b[0m rawstrg \u001b[39m=\u001b[39m data[pos:pos\u001b[39m+\u001b[39m\u001b[39m2\u001b[39m\u001b[39m*\u001b[39mnchars]\n\u001b[1;32m 283\u001b[0m \u001b[39m# if DEBUG: print \"nchars=%d pos=%d rawstrg=%r\" % (nchars, pos, rawstrg)\u001b[39;00m\n\u001b[0;32m--> 284\u001b[0m strg \u001b[39m=\u001b[39m unicode(rawstrg, \u001b[39m'\u001b[39;49m\u001b[39mutf_16_le\u001b[39;49m\u001b[39m'\u001b[39;49m)\n\u001b[1;32m 285\u001b[0m \u001b[39m# pos += 2*nchars\u001b[39;00m\n\u001b[1;32m 286\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 287\u001b[0m \u001b[39m# Note: this is COMPRESSED (not ASCII!) encoding!!!\u001b[39;00m\n\u001b[1;32m 288\u001b[0m \u001b[39m# Merely returning the raw bytes would work OK 99.99% of the time\u001b[39;00m\n\u001b[1;32m 289\u001b[0m \u001b[39m# if the local codepage was cp1252 -- however this would rapidly go pear-shaped\u001b[39;00m\n\u001b[1;32m 290\u001b[0m \u001b[39m# for other codepages so we grit our Anglocentric teeth and return Unicode :-)\u001b[39;00m\n\u001b[1;32m 292\u001b[0m strg \u001b[39m=\u001b[39m unicode(data[pos:pos\u001b[39m+\u001b[39mnchars], \u001b[39m\"\u001b[39m\u001b[39mlatin_1\u001b[39m\u001b[39m\"\u001b[39m)\n", + "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/timemachine.py:31\u001b[0m, in \u001b[0;36m\u001b[0;34m(b, enc)\u001b[0m\n\u001b[1;32m 29\u001b[0m REPR \u001b[39m=\u001b[39m ascii\n\u001b[1;32m 30\u001b[0m xrange \u001b[39m=\u001b[39m \u001b[39mrange\u001b[39m\n\u001b[0;32m---> 31\u001b[0m unicode \u001b[39m=\u001b[39m \u001b[39mlambda\u001b[39;00m b, enc: b\u001b[39m.\u001b[39;49mdecode(enc)\n\u001b[1;32m 32\u001b[0m ensure_unicode \u001b[39m=\u001b[39m \u001b[39mlambda\u001b[39;00m s: s\n\u001b[1;32m 33\u001b[0m unichr \u001b[39m=\u001b[39m \u001b[39mchr\u001b[39m\n", + "File \u001b[0;32m/usr/lib/python3.10/encodings/utf_16_le.py:16\u001b[0m, in \u001b[0;36mdecode\u001b[0;34m(input, errors)\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mdecode\u001b[39m(\u001b[39minput\u001b[39m, errors\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mstrict\u001b[39m\u001b[39m'\u001b[39m):\n\u001b[0;32m---> 16\u001b[0m \u001b[39mreturn\u001b[39;00m codecs\u001b[39m.\u001b[39;49mutf_16_le_decode(\u001b[39minput\u001b[39;49m, errors, \u001b[39mTrue\u001b[39;49;00m)\n", + "\u001b[0;31mUnicodeDecodeError\u001b[0m: 'utf-16-le' codec can't decode bytes in position 24-25: illegal encoding" + ] + } + ], + "source": [ + "xlrd.open_workbook_xls('Frota RegiΣes Tipo UF JAN2009.xls', encoding_override= 'latin-1')" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ÐÏ\u0011ࡱ\u001aá\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000>\u0000\u0003\u0000þÿ\t\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000B\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000þÿÿÿ\u0000\u0000\u0000\u0000þÿÿÿ\u0000\u0000\u0000\u0000A\u0000\u0000\u0000ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\u0010\u0000\u0000\u0006\u0005\u0000' Í\u0007ÉÀ\u0000\u0000\u0006\u0003\u0000\u0000á\u0000\u0002\u0000°\u0004Á\u0000\u0002\u0000\u0000\u0000â\u0000\u0000\u0000\\\u0000p\u0000\n", + "\u0000\u0000Denatran/CGIE B\u0000\u0002\u0000°\u0004a\u0001\u0002\u0000\u0000\u0000À\u0001\u0000\u0000=\u0001\u0004\u0000\u0002\u0000\u0001\u0000œ\u0000\u0002\u0000\u000e\u0000\u0019\u0000\u0002\u0000\u0000\u0000\u0012\u0000\u0002\u0000\u0000\u0000\u0013\u0000\u0002\u0000\u0000\u0000¯\u0001\u0002\u0000\u0000\u0000¼\u0001\u0002\u0000\u0000\u0000=\u0000\u0012\u0000\u0000\u0000‡\u0000X/Ï!8\u0000\u0001\u0000\u0000\u0000\u0001\u0000X\u0002@\u0000\u0002\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\"\u0000\u0002\u0000\u0000\u0000\u000e\u0000\u0002\u0000\u0001\u0000·\u0001\u0002\u0000\u0000\u0000Ú\u0000\u0002\u0000\u0000\u00001\u0000\u001a\u0000È\u0000\u0000\u0000ÿ\u0001\u0000\u0000\u0000\u0000\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001a\u0000È\u0000\u0000\u0000ÿ\u0001\u0000\u0000\u0000\u0000\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001a\u0000È\u0000\u0000\u0000ÿ\u0001\u0000\u0000\u0000\u0000\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001a\u0000È\u0000\u0000\u0000ÿ\u0001\u0000\u0000\u0000\u0000\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001a\u0000È\u0000\u0004\u0000\f\u0000\u0001\u0000\u0000\u0001\u0000\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001a\u0000È\u0000\u0004\u0000$\u0000\u0001\u0000\u0000\u0001\u0000\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001a\u0000È\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001a\u0000È\u0000\u0001\u0000ÿ¼\u0002\u0000\u0000\u0000\u0002\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001a\u0000 \u0000\u0001\u0000ÿ¼\u0002\u0000\u0000\u0000\u0002\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001a\u0000ð\u0000\u0001\u0000ÿ¼\u0002\u0000\u0000\u0000\u0002\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001c\u0000È\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0002\u0000í\u0006\u0001T\u0000a\u0000h\u0000o\u0000m\u0000a\u00001\u0000\u001a\u0000È\u0000\u0000\u0000ÿ\u0001\u0000\u0000\u0000\u0002\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u0000\u001e\u0004 \u0000\u0005\u0000\u001b\u0000\u0000\"R$ \"#,##0_);\\(\"R$ \"#,##0\\)\u001e\u0004%\u0000\u0006\u0000 \u0000\u0000\"R$ \"#,##0_);[Red]\\(\"R$ \"#,##0\\)\u001e\u0004&\u0000\u0007\u0000!\u0000\u0000\"R$ \"#,##0.00_);\\(\"R$ \"#,##0.00\\)\u001e\u0004+\u0000&\u0000\u0000\"R$ \"#,##0.00_);[Red]\\(\"R$ \"#,##0.00\\)\u001e\u0004=\u0000*\u00008\u0000\u0000_(\"R$ \"* #,##0_);_(\"R$ \"* \\(#,##0\\);_(\"R$ \"* \"-\"_);_(@_)\u001e\u0004.\u0000)\u0000)\u0000\u0000_(* #,##0_);_(* \\(#,##0\\);_(* \"-\"_);_(@_)\u001e\u0004E\u0000,\u0000@\u0000\u0000_(\"R$ \"* #,##0.00_);_(\"R$ \"* \\(#,##0.00\\);_(\"R$ \"* \"-\"??_);_(@_)\u001e\u00046\u0000+\u00001\u0000\u0000_(* #,##0.00_);_(* \\(#,##0.00\\);_(* \"-\"??_);_(@_)\u001e\u0004\u001e\u0000¤\u0000\u0019\u0000\u0000\"R$\"#,##0_);\\(\"R$\"#,##0\\)\u001e\u0004#\u0000¥\u0000\u001e\u0000\u0000\"R$\"#,##0_);[Red]\\(\"R$\"#,##0\\)\u001e\u0004$\u0000¦\u0000\u001f\u0000\u0000\"R$\"#,##0.00_);\\(\"R$\"#,##0.00\\)\u001e\u0004)\u0000§\u0000$\u0000\u0000\"R$\"#,##0.00_);[Red]\\(\"R$\"#,##0.00\\)\u001e\u0004:\u0000¨\u00005\u0000\u0000_(\"R$\"* #,##0_);_(\"R$\"* \\(#,##0\\);_(\"R$\"* \"-\"_);_(@_)\u001e\u0004B\u0000©\u0000=\u0000\u0000_(\"R$\"* #,##0.00_);_(\"R$\"* \\(#,##0.00\\);_(\"R$\"* \"-\"??_);_(@_)\u001e\u00040\u0000ª\u0000+\u0000\u0000_(* #,##0_);_(* \\(#,##0\\);_(* \"-\"??_);_(@_)\u001e\u0004\u000e\u0000«\u0000\t\u0000\u0000#,##0\\ \\ \u001e\u0004\f\u0000¬\u0000\u0007\u0000\u0000#,##0.0\u001e\u0004\u000e\u0000­\u0000\t\u0000\u0000#,##0.000\u001e\u0004\u000f\u0000®\u0000\n", + "\u0000\u0000#,##0.0000\u001e\u0004\u0010\u0000¯\u0000\u000b\u0000\u0000#,##0.00000\u001e\u0004\u0011\u0000°\u0000\f\u0000\u0000#,##0.000000\u001e\u0004\t\u0000±\u0000\u0004\u0000\u00000.0%\u001e\u0004\u000b\u0000²\u0000\u0006\u0000\u00000.000%\u001e\u0004\f\u0000³\u0000\u0007\u0000\u00000.0000%\u001e\u0004\n", + "\u0000´\u0000\u00000.00000%\u001e\u0004\u000e\u0000µ\u0000\t\u0000\u00000.000000%\u001e\u0004\u0012\u0000¶\u0000\n", + "\u0000\u0000#,##0.0000000\u001e\u0004\u0013\u0000·\u0000\u000e\u0000\u0000#,##0.00000000\u001e\u0004\u0014\u0000¸\u0000\u000f\u0000\u0000#,##0.000000000\u001e\u0004\u0015\u0000¹\u0000\u0010\u0000\u0000#,##0.0000000000\u001e\u0004\u0016\u0000º\u0000\u0011\u0000\u0000#,##0.00000000000\u001e\u0004\u0017\u0000»\u0000\u0012\u0000\u0000#,##0.000000000000\u001e\u0004\u0018\u0000¼\u0000\u0013\u0000\u0000#,##0.0000000000000\u001e\u0004\u0019\u0000½\u0000\u0014\u0000\u0000#,##0.00000000000000\u001e\u0004\u001a\u0000¾\u0000\u0015\u0000\u0000#,##0.000000000000000\u001e\u0004\u001b\u0000¿\u0000\u0016\u0000\u0000#,##0.0000000000000000\u001e\u0004\u001c\u0000À\u0000\u0017\u0000\u0000#,##0.00000000000000000\u001e\u0004\u001d\u0000Á\u0000\u0018\u0000\u0000#,##0.000000000000000000\u001e\u0004\u001e\u0000Â\u0000\u0019\u0000\u0000#,##0.0000000000000000000\u001e\u0004\u001f\u0000Ã\u0000\u001a\u0000\u0000#,##0.00000000000000000000\u001e\u0004 \u0000Ä\u0000\u001b\u0000\u0000#,##0.000000000000000000000\u001e\u0004\f\u0000Å\u0000\u0007\u0000\u00000.00000\u001e\u0004\u000b\u0000Æ\u0000\u0006\u0000\u00000.0000\u001e\u0004\n", + "\u0000Ç\u0000\u0005\u0000\u00000.000\u001e\u0000È\u0000\u0003\u0000\u00000.0\u001e\u0004\n", + "\u0000É\u0000\u00000.000000\u001e\u0004\u000e\u0000Ê\u0000\t\u0000\u00000.0000000\u001e\u0004\u000f\u0000Ë\u0000\n", + "\u0000\u00000.00000000\u001e\u00044\u0000Ì\u0000/\u0000\u0000_(* #,##0.0_);_(* \\(#,##0.0\\);_(* \"-\"??_);_(@_)\u001e\u0004\u001f\u0000Í\u0000\n", + "\u0000\u00010\u0000.\u00000\u00000\u00000\u00000\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u0000(Ü\u001e\u0004\u001f\u0000Î\u0000\n", + "\u0000\u00010\u0000.\u00000\u00000\u00000\u00000\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u0000TØ\u001e\u0004\u001d\u0000Ï\u0000\f\u0000\u00010\u0000.\u00000\u00000\u00000\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u0000TØ\u001e\u0004\u001b\u0000Ð\u0000\u000b\u0000\u00010\u0000.\u00000\u00000\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u0000TØ\u001e\u0004\u0019\u0000Ñ\u0000\n", + "\u0000\u00010\u0000.\u00000\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u0000TØ\u001e\u0004\u0015\u0000Ò\u0000\u00010\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u0000TØ\u001e\u0004\u001f\u0000Ó\u0000\n", + "\u0000\u00010\u0000.\u00000\u00000\u00000\u00000\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u00004Ü\u001e\u0004\u001d\u0000Ô\u0000\f\u0000\u00010\u0000.\u00000\u00000\u00000\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u00004Ü\u001e\u0004\u001b\u0000Õ\u0000\u000b\u0000\u00010\u0000.\u00000\u00000\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u00004Ü\u001e\u0004\u0019\u0000Ö\u0000\n", + "\u0000\u00010\u0000.\u00000\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u00004Ü\u001e\u0004\u0015\u0000×\u0000\u00010\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u00004Ü\u001e\u0004\u0015\u0000Ø\u0000\u0010\u0000\u0000#,##0;[Red]#,##0\u001e\u0004\u0015\u0000Ù\u0000\u0010\u0000\u0000#\\ ###\\ ###\\ ##0\u001e\u0004\u0015\u0000Ú\u0000\u0010\u0000\u0000#\\ ###\\ ###\\ ###\u001e\u0004?\u0000Û\u0000:\u0000\u0000_(\"$\"* #,##0.00_);_(\"$\"* \\(#,##0.00\\);_(\"$\"* \"-\"??_);_(@_)\u001e\u00047\u0000Ü\u00002\u0000\u0000_(\"$\"* #,##0_);_(\"$\"* \\(#,##0\\);_(\"$\"* \"-\"_);_(@_)\u001e\u0004\u0016\u0000Ý\u0000\u0011\u0000\u0000\"Sim\";\"Sim\";\"Não\"\u001e\u0004&\u0000Þ\u0000!\u0000\u0000\"Verdadeiro\";\"Verdadeiro\";\"Falso\"\u001e\u0004\"\u0000ß\u0000\u001d\u0000\u0000\"Ativar\";\"Ativar\";\"Desativar\"à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0001\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0001\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0002\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0002\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0005\u0000\u0000\u0000ôÿ\u0000\u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0006\u0000\u0000\u0000ôÿ\u0000\u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0001\u0000,\u0000õÿ \u0000\u0000ø\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0001\u0000*\u0000õÿ \u0000\u0000ø\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0001\u0000\t\u0000õÿ \u0000\u0000ø\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0001\u0000+\u0000õÿ \u0000\u0000ø\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0001\u0000)\u0000õÿ \u0000\u0000ø\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0003\u0000\u0001\u0000 \u0000\u0000\f\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000Ú\u0000\u0001\u0000 \u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0003\u0000\u0001\u0000 \u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0001\u0000\"\u0000\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0001\u0000\u0012\u0000\u0000x\u0011\u0011@ @ \u0000\u0004* à\u0000\u0014\u0000\t\u0000\u0000\u0000\u0001\u0000\u001a\u0000\u0000x\u0011\u0011@ @ \u0000\u0004* à\u0000\u0014\u0000ª\u0000Q\u0001 \u0000\u0000,\u0011\u0011@ @ \u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0001\u0000\u001a\u0000\u0000x\u0011\u0011@ @ \u0000\u0004* à\u0000\u0014\u0000\u0003\u0000\u0001\u0000 \u0000\u0000l\u0011\u0011@ @ \u0000\u0004* à\u0000\u0014\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0007\u0000ª\u0000Q\u0001+\u0000\u0000|\u0011\u0011@ @ \u0000 à\u0000\u0014\u0000\u0000\u0000\u0001\u0000\"\u0000\u0000x\u0011\u0011@ @ \u0000\u0004* à\u0000\u0014\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000 \u0000`\u0000\u0000\u0000 \u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0003\u0000\u0001\u0000 \u0000\u0000$\u0000`\u0000\u0000\u0000 \u0000\u0000À à\u0000\u0014\u0000\u0000\u0000Æ\u0000A\u0001#\u0000\u00004\u0011\u0011@ @ \u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000\u0001\u0000\t\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0001\u0000\u0000\u0000\u0001\u0000\u00008\u0011\u0011@ @ \u0000\u0000À à\u0000\u0014\u0000\u000b\u0000\u0000\u0000\u0001\u0000\u00008\u0011\u0011@ @ \u0000\u0000À à\u0000\u0014\u0000\f\u0000\u0000\u0000\u0001\u0000\u00008\u0011\u0011@ @ \u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000x\u0011\u0011@ @ \u0000\u0004* à\u0000\u0014\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0001\u0000\t\u0000\u00008\u0011\u0011@ @ \u0000\u0000À à\u0000\u0014\u0000\n", + "\u0000\u0000\u0000\u0001\u0000\"\u0000\u0000x\u0011\u0011@ @ \u0000\u0004* à\u0000\u0014\u0000\u0000\u0000\u0001\u0000\u001a\u0000\u0000x\u0011\u0011@ @ \u0000\u0004* à\u0000\u0014\u0000\u0000\u0000\u0001\u0000 \u0000\u0000x\u0011\u0011@ @ \u0000\u0004* à\u0000\u0014\u0000\f\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\t\u0000A\u0001\"\u0000\u00000\u0011\u0011@ @ \u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0002\u0000A\u0001#\u0000\u00004\u0011\u0011@ @ \u0000\u0000À “\u0002\u0004\u0000\u0010ÿ“\u0002\u0004\u0000\u0011€\tÿ“\u0002\u0004\u0000\u0012€\u0004ÿ“\u0002\u0004\u0000\u0013€\u0007ÿ“\u0002\u0004\u0000\u0000€\u0000ÿ“\u0002\u0004\u0000\u0014€\u0005ÿ“\u0002\u0004\u0000\u0015€\u0003ÿ“\u0002\u0004\u0000\u0016€\u0006ÿ`\u0001\u0002\u0000\u0000\u0000…\u0000\u0011\u0000ž\u001e\u0000\u0000\u0000\u0000\t\u0000Glossário…\u0000\u0010\u0000“)\u0000\u0000\u0000\u0000JAN_2009Œ\u0000\u0004\u00007\u00007\u0000®\u0001\u0004\u0000\u0002\u0000\u0001\u0004\u0017\u0000\u000e\u0000\u0002\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0018\u0000\u001b\u0000 \u0000\u0000\u0001\u000b\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0006;\u0001\u0000\u0000\u0000\u0017\u0000\u0000\u0000\u0002\u0000\u0018\u0000\u001b\u0000 \u0000\u0000\u0001\u000b\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0006=\u0000\u0000\u0000\u0000-\u0000\u0000\u0000\u0016\u0000Á\u0000Á\u0001\u0000\u0000\"¾\u0001\u0000ü\u0000A\n", + "€\u0000\u0000\u0000S\u0000\u0000\u0000'\u0000\u0000Grandes Regiões e\n", + "Unidades da Federação\u0005\u0000\u0000TOTAL\t\u0000\u0000AUTOMÓVEL\u0005\u0000\u0000BOND\u0000\u0000CAMINHÃO\u000f\u0000\u0000CAMINHÃO TRATOR\u000b\u0000\u0000CAMINHONETE\t\u0000\u0000CAMIONETA\u0011\u0000\u0000CHASSI PLATAFORMA\n", + "\u0000\u0000CICLOMOTOR\u000b\u0000\u0000MICROÔNIBUS\u000b\u0000\u0000MOTOCICLET\u0000\u0000MOTONETA\u0006\u0000\u0000ÔNIBUS\u000b\u0000\u0000QUADRICICLO\u0007\u0000\u0000REBOQUE\f\u0000\u0000SEMI-REBOQU\u0000\u0000SIDE-CAR\u0006\u0000\u0000OUTROS\u000e\u0000\u0000TRATOR ESTEIRA\f\u0000\u0000TRATOR RODA\u0000\u0000TRICICLO\n", + "\u0000\u0000UTILITÁRIO\u0005\u0000\u0000Acre \u0006\u0000\u0000Amapá\u0000\u0000Amazonas\u0005\u0000\u0000Pará \t\u0000\u0000Rondônia \u0007\u0000\u0000Roraima\t\u0000\u0000Tocantins\u0007\u0000\u0000Alagoas\u0005\u0000\u0000Bahia\u0005\u0000\u0000Ceará\t\u0000\u0000Maranhão\u0000\u0000Paraíba \u000b\u0000\u0000Pernambuco \u0005\u0000\u0000Piauí\u0014\u0000\u0000Rio Grande do Norte \u0007\u0000\u0000Sergipe\u000e\u0000\u0000Espírito Santo\n", + "\u0000\u0000Minas Gerais \u000e\u0000\u0000Rio de Janeiro\n", + "\u0000\u0000São Paulo \u0006\u0000\u0000Paraná\u0012\u0000\u0000Rio Grande do Sul \u000e\u0000\u0000Santa Catarina\u0010\u0000\u0000Distrito Federal\u0005\u0000\u0000Goiás\u000b\u0000\u0000Mato Grosso\u0012\u0000\u0000Mato Grosso do Sul°\u0000\u0000Fonte: Ministério das Cidades, Departamento Nacional de Trânsito - DENATRAN, Sistema Nacional de Registro de Veículos/RENAVAM, Sistema Nacional de Estatística de Trânsito/SINET\u0006\u0000\u0000Brasil\u0005\u0000\u0000Nort\u0000\u0000Nordeste\u0007\u0000\u0000Sudeste\u0003\u0000\u0000Sul\f\u0000\u0000Centro-Oestet\u0000\u0000veículo automotor destinado ao transporte de passageiros, com capacidade para até oito pessoas, exclusive o condutor7\u0000\u0000veículo de propulsão elétrica que se move sobre trilhosi\u0000\u0000veículo automotor destinado ao transporte de carga, com carroçaria, e peso bruto total superior a 3500 Kg9\u0000\u0000veículo automotor destinado a tracionar ou arrastar outroX\u0000\u0000veículo automotor destinado ao transporte de carga, com peso bruto total de até 3500 Kg.\u0000\u0000veículo inacabado, com equipamento que permita seu deslocamento em vias de rolamento, preparado para receber carroçaria de ônibus¿\u0000\u0000veículo de duas ou três rodas, provido de um motor de combustão interna cuja cilindrada não exceda a 50 cm3(3,05 polegadas cúbicas) e cuja velocidade máxima de fabricação não exceda a 50 Km/hO\u0000\u0000veículo automotor de transporte coletivo com capacidade para até 20 passageirosJ\u0000\u0000veículo auto-motor de duas rodas, dirigido por condutor em posição sentadaµ\u0000\u0000veículo automotor de transporte coletivo com capacidade para mais de 20 passageiros, ainda que, em virtude de adaptações com vista à maior comodidade destes, transporte número menorr\u0000\u0000veículo de estrutura mecânica igual às motocicletas, possuindo eixos dianteiro e traseiro, dotados de quatro rodas>\u0000\u0000veículo destinado a ser engatado atrás de um veículo automotorj\u0000\u0000veículo de um ou mais eixos que se apóia na sua unidade tratora ou é a ela ligado por meio de articulação.G\u0000\u0000carro ou caçamba provido de uma roda acoplada na lateral da motocicleta?\u0000\u0000Argumento que não se enquadra em nenhuma definição estabelecida+\u0000\u0000trator que se movimenta por meio de esteiraK\u0000\u0000trator que se movimenta sobre rodas,podendo ter chassi rígido ou articulado\\\u0000\u0000veículo rodoviário automotor de estrutura mecânica igual à motocicleta dotado de três rodas.U\u0000\u0000veículo misto caracterizado pela versatilidade do seu uso, inclusive fora da estrada.?\u0000\u0000Regiões Norte, Nordeste, Sul, Suldeste e Centro Oeste e Estados\u0013\u0000\u0000Termos e DefiniçõesR\u0000\u0000veículo automotor de duas rodas, com ou sem side-car, dirigido em posição montada.˜\u0000\u0000veículo automotor, misto, com quatro rodas, com carroçaria, destinado ao transporte simultâneo ou alternativo de pessoas e carga no mesmo compartimento.~\u0000\u0000Fonte: Ministério das Cidades, DENATRAN - Departamento Nacional de Trânsito, RENAVAM-Registro Nacional de Veículos Automotoresf\u0000\u0000Frota de veículos, por tipo e com placa, segundo as Grandes Regiões e Unidades da Federação - JAN/2009H\u0000\u0000Tabela 2 - Percentagem de veículos, por tipo segundo o Brasil - JAN/2009ÿ\u0000Z\u0000ê\u0010\u0000\u0000\f\u0000\u0000\u0000g\u0011\u0000\u0000‰\u0000\u0000\u0000Ð\u0011\u0000\u0000ò\u0000\u0000\u00003\u0012\u0000\u0000U\u0001\u0000\u0000ƒ\u0012\u0000\u0000¥\u0001\u0000\u0000ê\u0012\u0000\u0000\f\u0002\u0000\u0000b\u0013\u0000\u0000„\u0002\u0000\u0000d\u0014\u0000\u0000†\u0003\u0000\u0000m\u0017\u0000\u0000\u0006\u0000\u0000s\u001a\u0000\u0000•\t\u0000\u0000î\u001c\u0000\u0000\u0010\f\u0000\u0000\u0015\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0015\u0000\u0000\u0000\u0000\u0000\u0000\u0000¶\n", + "\u0000\u0000\u0000\u0010\u0000\u0000\u0006\u0010\u0000' Í\u0007ÉÀ\u0000\u0000\u0006\u0003\u0000\u0000\u000b\u0002\u0014\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0018\u0000\u0000\u00006$\u0000\u0000\u0006)\u0000\u0000\n", + "\u0000\u0002\u0000\u0001\u0000\f\u0000\u0002\u0000d\u0000\u000f\u0000\u0002\u0000\u0001\u0000\u0011\u0000\u0002\u0000\u0000\u0000\u0010\u0000ü©ñÒMbP?_\u0000\u0002\u0000\u0001\u0000*\u0000\u0002\u0000\u0000\u0000+\u0000\u0002\u0000\u0000\u0000‚\u0000\u0002\u0000\u0001\u0000€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000%\u0002\u0004\u0000\u0000\u0000ÿ\u0000\u0000\u0002\u0000À\u0004\u0014\u0000 \u0000\u001d\u0000\u0000&CFrota - Termos e Definições\u0015\u0000\u0012\u0000\u000f\u0000\u0000&CDENATRAN-CGIEƒ\u0000\u0002\u0000\u0000\u0000„\u0000\u0002\u0000\u0000\u0000&\u0000ffffffÖ?'\u0000¤p=\n", + "×£Ð?(\u0000ffffffæ?)\u0000ÍÌÌÌÌÌä?M\u0000v\u0004\u0000\u0000\\\u0000\\\u0000m\u0000j\u0000-\u00000\u00002\u00009\u00007\u00007\u00002\u0000\\\u0000L\u0000e\u0000x\u0000m\u0000a\u0000r\u0000k\u0000 \u0000T\u00005\u00002\u00000\u0000 \u0000S\u0000B\u0000E\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\fÜ\u0000˜\u0003\u0003÷\u0000\u0004\u0001\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0007\u0000X\u0002\u0001\u0000\u0001\u0000X\u0002\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000⤗¼\u0000\u0001\u0001\u0002ÿ\u0002\u0002\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000Lexmark T520 SBE\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Lexmark T520 SBE\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0002\u0000\u0000Lexmark T520\u0000 R\u0000\u0000\u0000\u0007\u0000\u0007\u0000\u0000ð\n", + "\u0000\u0000ð\n", + "\u0000\u0010\u0001ÿÿ\u0000\u0000\u0014\u0000\u0001\u0000\f\u0000\u000e\u0000\u0005\u0000\u0006\u0000\u0003\u0000\u0005\u0000\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\t\u0000\u0000\u0000‰\u0001\u0003\u0000\u000fÆ\u0000\u0000çr\u0001\u0000\u0001\u0000\u0015\u0000\u0010\u0000\u000e\u0000'\u0000\u0013\u0000\u0000\u0000A\u0000>\u0001⤗¼\u0002\u0000\u0001\u0000ÿ\u0000°\u0004X\u0002,\u0001\u0000\u0000\u0000\u0000X\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000ñ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n", + "\u0000\u0000\u0000\n", + "\u0000\u0000\u0000\n", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Æ^\u0000\u0000\u0000\u0000\u0000\u0000⤗¼¡\u0000\"\u0000\t\u0000d\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0002\u0000X\u0002X\u0002éÅüý~ß?{\u0014®GázÔ?\u0001\u0000U\u0000\u0002\u0000}\u0000\f\u0000\u0000\u0000\u0000\u0000Û\u0002\u000f\u0000\u0002\u0000\u0002\u0000}\u0000\f\u0000\u0001\u0000\u0001\u0000Û\u0018,\u0000\u0002\u0000\u0002\u0000}\u0000\f\u0000\u0002\u0000\u0002\u0000$E\u000f\u0000\u0002\u0000\u0002\u0000\u0000\u0002\u000e\u0000\u0000\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0000\u0000\n", + "\u0000\u0000\u0002\u0010\u0000\u0000\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0001\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0002\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0003\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0004\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0005\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0006\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0007\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\t\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\n", + "\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u000b\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\f\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\n", + "\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u000e\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u000f\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0010\u0000\u0001\u0000\n", + "\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0011\u0000\u0001\u0000\n", + "\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0012\u0000\u0001\u0000\n", + "\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0013\u0000\u0001\u0000\n", + "\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0014\u0000\u0001\u0000\n", + "\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0015\u0000\u0001\u0000\n", + "\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0016\u0000\u0001\u0000\n", + "\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0017\u0000\u0001\u0000\n", + "\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0000ý\u0000\n", + "\u0000\u0000\u0000\u0001\u0000.\u0000M\u0000\u0000\u0000\u0001\u0002\u0006\u0000\u0000\u0000\u0002\u0000.\u0000ý\u0000\n", + "\u0000\u0001\u0000\u0001\u0000\u001f\u0000\u0000\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0001\u0000\u0002\u0000(\u0000L\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u0001\u0000+\u0000\u0002\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u0002\u0000)\u00009\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0003\u0000\u0001\u0000+\u0000\u0003\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0003\u0000\u0002\u0000)\u0000:\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0004\u0000\u0001\u0000+\u0000\u0004\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0004\u0000\u0002\u0000)\u0000;\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0005\u0000\u0001\u0000+\u0000\u0005\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0005\u0000\u0002\u0000)\u0000<\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0006\u0000\u0001\u0000+\u0000\u0006\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0006\u0000\u0002\u0000)\u0000=\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0007\u0000\u0001\u0000+\u0000\u0007\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0007\u0000\u0002\u0000)\u0000O\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0001\u0000+\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000*\u0000>\u0000\u0000\u0000ý\u0000\n", + "\u0000\t\u0000\u0001\u0000+\u0000\t\u0000\u0000\u0000ý\u0000\n", + "\u0000\t\u0000\u0002\u0000)\u0000?\u0000\u0000\u0000ý\u0000\n", + "\u0000\n", + "\u0000\u0001\u0000+\u0000\n", + "\u0000\u0000\u0000ý\u0000\n", + "\u0000\n", + "\u0000\u0002\u0000)\u0000@\u0000\u0000\u0000ý\u0000\n", + "\u0000\u000b\u0000\u0001\u0000+\u0000\u000b\u0000\u0000\u0000ý\u0000\n", + "\u0000\u000b\u0000\u0002\u0000)\u0000N\u0000\u0000\u0000ý\u0000\n", + "\u0000\f\u0000\u0001\u0000+\u0000\f\u0000\u0000\u0000ý\u0000\n", + "\u0000\f\u0000\u0002\u0000)\u0000A\u0000\u0000\u0000ý\u0000\n", + "\u0000\n", + "\u0000\u0001\u0000+\u0000\n", + "\u0000\u0000\u0000ý\u0000\n", + "\u0000\n", + "\u0000\u0002\u0000)\u0000B\u0000\u0000\u0000ý\u0000\n", + "\u0000\u000e\u0000\u0001\u0000+\u0000\u000e\u0000\u0000\u0000ý\u0000\n", + "\u0000\u000e\u0000\u0002\u0000*\u0000C\u0000\u0000\u0000ý\u0000\n", + "\u0000\u000f\u0000\u0001\u0000+\u0000\u000f\u0000\u0000\u0000ý\u0000\n", + "\u0000\u000f\u0000\u0002\u0000)\u0000D\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0010\u0000\u0001\u0000+\u0000\u0010\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0010\u0000\u0002\u0000)\u0000E\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0011\u0000\u0001\u0000+\u0000\u0011\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0011\u0000\u0002\u0000)\u0000F\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0012\u0000\u0001\u0000+\u0000\u0012\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0012\u0000\u0002\u0000)\u0000G\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0013\u0000\u0001\u0000+\u0000\u0013\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0013\u0000\u0002\u0000)\u0000H\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0014\u0000\u0001\u0000+\u0000\u0014\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0014\u0000\u0002\u0000)\u0000I\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0015\u0000\u0001\u0000+\u0000\u0015\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0015\u0000\u0002\u0000)\u0000J\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0016\u0000\u0001\u0000+\u0000\u0016\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0016\u0000\u0002\u0000)\u0000K\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0017\u0000\u0001\u0000-\u00002\u0000\u0000\u0000¾\u0000\u0016\u0000\u0017\u0000\u0002\u0000-\u0000'\u0000'\u0000'\u0000'\u0000'\u0000'\u0000'\u0000\t\u0000×\u00004\u0000ˆ\u0004\u0000\u0000Ì\u0001\u0018\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000>\u0002\u0012\u0000°\u0000\u0000\u0000\u0000\u0000@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0004\u0000\u0003\u0000\u0004\u0000\u001d\u0000\u000f\u0000\u0003\u0001\u0000\u0003\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0003\u0003å\u0000\u0012\u0000\u0002\u0000\u0017\u0000\u0017\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000ï\u0000\u0006\u0000\u0000\u00007\u0000\u0000\u0000\n", + "\u0000\u0000\u0000\u0010\u0000\u0000\u0006\u0010\u0000' Í\u0007ÉÀ\u0000\u0000\u0006\u0003\u0000\u0000\u000b\u0002\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000.\u0000\u0000\u0000™1\u0000\u0000ˆX\u0000\u0000@a\u0000\u0000\n", + "\u0000\u0002\u0000\u0001\u0000\f\u0000\u0002\u0000d\u0000\u000f\u0000\u0002\u0000\u0001\u0000\u0011\u0000\u0002\u0000\u0000\u0000\u0010\u0000ü©ñÒMbP?_\u0000\u0002\u0000\u0001\u0000*\u0000\u0002\u0000\u0000\u0000+\u0000\u0002\u0000\u0000\u0000‚\u0000\u0002\u0000\u0001\u0000€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000%\u0002\u0004\u0000\u0000\u0000ÿ\u0000\u0000\u0002\u0000Á\u0005\u0014\u0000\u0010\u0000\n", + "\u0000\u0000&F&RPágina &P\u0015\u0000\u0000\u0000ƒ\u0000\u0002\u0000\u0000\u0000„\u0000\u0002\u0000\u0000\u0000&\u0000Ház\u0014®GÑ?'\u0000)\\Âõ(Ì?(\u0000=\n", + "×£p=Ú?M\u0000\u000e\u0007\u0000\u0000\\\u0000\\\u0000h\u0000o\u0000b\u0000b\u0000e\u0000s\u0000\\\u0000L\u0000E\u0000X\u0000-\u0000M\u0000O\u0000N\u0000O\u0000-\u0000S\u0000L\u00005\u00002\u00004\u0000-\u00000\u00004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0001Ü\u00000\u0006\u0013×\u0001\u0000\u0002\u0000\t\u0000š\u000b3\u0000\u0001\u0000\u000f\u0000X\u0002\u0001\u0000\u0001\u0000\u0000\u0000\u0003\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000+\u0000\u0000\u0000\u0000L\u0005@\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0010'\u0010'\u0010'\u0000\u0000\u0010'\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000°\u0004°\u0004j\u0000-\u0000X\u0002X\u0002<\u0000-\u0000X\u0002X\u0002<\u0000-\u0000X\u0002X\u0002<\u0000-\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000(\u0000N\u0000o\u0000n\u0000e\u0000)\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000(\u0000N\u0000o\u0000n\u0000e\u0000)\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000(None)\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000(None)\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000¿ó\u000b\u0000\u0000\u0000\u0001\u0000<\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000+\u0000\u0000\u0000¡\u0000\"\u0000\t\u00003\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0000\u0000X\u0002X\u0002Ãõ(\\ÂÅ?éÅüý~ß?\u0001\u0000U\u0000\u0002\u0000}\u0000\f\u0000\u0000\u0000\u0000\u0000$\u0012\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0001\u0000\u0001\u0000I\u000b\u000f\u0000\u0006\u0000\u0000\u0000}\u0000\f\u0000\u0002\u0000\u0002\u0000¶\f\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0003\u0000\u0003\u0000¶\u000b\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0004\u0000\u0004\u0000\u0000\u000b\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0005\u0000\u0005\u0000$\u000b\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0006\u0000\u0006\u0000$\n", + "\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0007\u0000\u0007\u0000I\n", + "\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000’\t\u000f\u0000\u0006\u0000\u0000\u0000}\u0000\f\u0000\t\u0000\t\u0000\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\n", + "\u0000\n", + "\u0000$\t\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u000b\u0000\u000b\u0000m\n", + "\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\f\u0000\f\u0000¶\t\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\n", + "\u0000\n", + "\u0000’\t\u000f\u0000\u0006\u0000\u0000\u0000}\u0000\f\u0000\u000e\u0000\u000e\u0000\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u000f\u0000\u000f\u0000\u000f\u0000\u0006\u0000\u0000\u0000}\u0000\f\u0000\u0010\u0000\u0010\u0000m\n", + "\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0011\u0000\u0011\u0000m\u0007\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0012\u0000\u0012\u0000\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0013\u0000\u0013\u0000\u000f\u0000\u0006\u0000\u0000\u0000}\u0000\f\u0000\u0014\u0000\u0014\u0000I\u0007\u000f\u0000\u0006\u0000\u0000\u0000}\u0000\f\u0000\u0015\u0000\u0015\u0000m\u0005\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0016\u0000\u0016\u0000’\t\u000f\u0000\u0006\u0000\u0000\u0000\u0000\u0002\u000e\u0000\u0000\u0000\u0000\u0000.\u0000\u0000\u0000\u0000\u0000\u0017\u0000\u0000\u0002\u0010\u0000\u0000\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0002\u0000\u0000\u0000\u0017\u0000ü\u0003\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0003\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0004\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0005\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0006\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0007\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\t\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\n", + "\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u000b\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\f\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\n", + "\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u000e\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u000f\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0010\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0011\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0012\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0013\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0014\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0015\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0016\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0017\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0018\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0019\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u001a\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u001b\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u001c\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u001d\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u001e\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u001f\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0000ý\u0000\n", + "\u0000\u0000\u0000\u0000\u0000\u0017\u0000Q\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u0000\u0000\u001f\u0000\u0000\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u0001\u0000\u001d\u0000\u0001\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u0002\u0000\u001d\u0000\u0002\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u0003\u0000\u001d\u0000\u0003\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u0004\u0000\u001d\u0000\u0004\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u0005\u0000\u001d\u0000\u0005\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u0006\u0000\u001d\u0000\u0006\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u0007\u0000\u001d\u0000\u0007\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u001d\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\t\u0000\u001d\u0000\t\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\n", + "\u0000\u001d\u0000\n", + "\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u000b\u0000\u001d\u0000\u000b\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\f\u0000\u001d\u0000\f\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\n", + "\u0000\u001d\u0000\n", + "\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u000e\u0000\u001d\u0000\u000e\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u000f\u0000\u001d\u0000\u000f\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u0010\u0000\u001d\u0000\u0010\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u0011\u0000\u001d\u0000\u0011\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u0012\u0000\u001d\u0000\u0012\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u0013\u0000\u001d\u0000\u0013\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u0014\u0000\u001d\u0000\u0014\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u0015\u0000\u001d\u0000\u0015\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0002\u0000\u0016\u0000\u001d\u0000\u0016\u0000\u0000\u0000ý\u0000\n", + "\u0000\u0003\u0000\u0000\u0000#\u00003\u0000\u0000\u0000\u0006\u00003\u0000\u0003\u0000\u0001\u0000 \u0000\u0000\u0000\u0000È´%ŠA \u0000\u0018<Šý\u001d\u0000$\u0004\u0000\u0001À$\f\u0000\u0001À$\u0016\u0000\u0001À$\u001b\u0000\u0001À$\u001f\u0000\u0001ÀB\u0005\u0004\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0002\u0000 \u0000\u0000\u0000\u0000¸~A(\u0000\u0003\u0000\u0001ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000¼\u0004'\u0000\u0003\u0000\u0003\u0000\u0002\u0016\u0000\u0015\u001d\u0000,\u0001\u0000\u0000À,\t\u0000\u0000À,\u0013\u0000\u0000À,\u0018\u0000\u0000À,\u001c\u0000\u0000ÀB\u0005\u0004\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0003\u0000 \u0000\u0000\u0000\u0000\u0000\u0000`f@(\u0000\u0003\u0000\u0002ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0004\u0000 \u0000\u0000\u0000\u0000\u0000M«=A(\u0000\u0003\u0000\u0003ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0005\u0000 \u0000\u0000\u0000\u0000\u0000<Õ\u0014A(\u0000\u0003\u0000\u0004ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0006\u0000 \u0000\u0000\u0000\u0000\u0000ã¶JA(\u0000\u0003\u0000\u0005ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0007\u0000 \u0000\u0000\u0000\u0000\u0000b8A(\u0000\u0003\u0000\u0006ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000 \u0000\u0000\u0000\u0000\u0000\u0000‰¶@(\u0000\u0003\u0000\u0007ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\t\u0000 \u0000\u0000\u0000\u0000\u0000 sô@(\u0000\u0003ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\n", + "\u0000 \u0000\u0000\u0000\u0000\u0000@‚\fA(\u0000\u0003\u0000\tÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u000b\u0000 \u0000\u0000\u0000\u0000@ŒEeA(\u0000\u0003\u0000\n", + "ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\f\u0000 \u0000\u0000\u0000\u0000\u0000ª\u0005>A(\u0000\u0003\u0000\u000bÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\n", + "\u0000 \u0000\u0000\u0000\u0000\u00004‘\u0018A(\u0000\u0003\u0000\fÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u000e\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000c@(\u0000\u0003\u0000\n", + "ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u000f\u0000 \u0000\u0000\u0000\u0000\u0000f0#A(\u0000\u0003\u0000\u000eÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0010\u0000 \u0000\u0000\u0000\u0000\u0000²Ö A(\u0000\u0003\u0000\u000fÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0011\u0000 \u0000\u0000\u0000\u0000\u0000\u0000]À@(\u0000\u0003\u0000\u0010ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0012\u0000 \u0000\u0000\u0000\u0000\u0000\u0000›¹@(\u0000\u0003\u0000\u0011ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0013\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000Z@(\u0000\u0003\u0000\u0012ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0014\u0000 \u0000\u0000\u0000\u0000\u0000À{Ð@(\u0000\u0003\u0000\u0013ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0015\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0013±@(\u0000\u0003\u0000\u0014ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0016\u0000 \u0000\u0000\u0000\u0000\u0000 -\u0005A(\u0000\u0003\u0000\u0015ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000ý\u0000\n", + "\u0000\u0004\u0000\u0000\u0000\u001b\u00004\u0000\u0000\u0000\u0006\u0000#\u0000\u0004\u0000\u0001\u0000\u0018\u0000\u0000\u0000\u0000€\u0005ý@A \u0000\u0003\u0000\u0016ÿ\n", + "\u0000%\u0005\u0000\u000b\u0000\u0001À\u0001À\u0019\u0010Èó\u0006\u0000\u001b\u0000\u0004\u0000\u0002\u0000\u0018\u0000\u0000\u0000\u0000\u0000î.)A(\u0000\u0004\u0000\u0001ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000¼\u0004\u0017\u0000\u0004\u0000\u0004\u0000\u0002\u0016\u0000\u0015\n", + "\u0000-\u0001\u0000\u0007\u0000\u0000À\u0000À\u0019\u0010Èó\u0006\u0000\u001b\u0000\u0004\u0000\u0003\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000(\u0000\u0004\u0000\u0002ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0004\u0000\u0018\u0000\u0000\u0000\u0000\u00000d÷@(\u0000\u0004\u0000\u0003ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0005\u0000\u0018\u0000\u0000\u0000\u0000\u0000€èÆ@(\u0000\u0004\u0000\u0004ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0006\u0000\u0018\u0000\u0000\u0000\u0000\u0000°\u0007A(\u0000\u0004\u0000\u0005ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0007\u0000\u0018\u0000\u0000\u0000\u0000\u0000@Þë@(\u0000\u0004\u0000\u0006ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000€u@(\u0000\u0004\u0000\u0007ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\t\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000Ø @(\u0000\u0004ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\n", + "\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000^Á@(\u0000\u0004\u0000\tÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u000b\u0000\u0018\u0000\u0000\u0000\u0000\u0000ʾ&A(\u0000\u0004\u0000\n", + "ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\f\u0000\u0018\u0000\u0000\u0000\u0000\u00008–\tA(\u0000\u0004\u0000\u000bÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\n", + "\u0000\u0018\u0000\u0000\u0000\u0000\u0000@kÔ@(\u0000\u0004\u0000\fÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u000e\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000ð?(\u0000\u0004\u0000\n", + "ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u000f\u0000\u0018\u0000\u0000\u0000\u0000\u0000@ÿÔ@(\u0000\u0004\u0000\u000eÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0010\u0000\u0018\u0000\u0000\u0000\u0000\u0000ÀBÚ@(\u0000\u0004\u0000\u000fÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0011\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000Ðy@(\u0000\u0004\u0000\u0010ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0012\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000W@(\u0000\u0004\u0000\u0011ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0013\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000ð?(\u0000\u0004\u0000\u0012ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0014\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000€X@(\u0000\u0004\u0000\u0013ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0015\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000@f@(\u0000\u0004\u0000\u0014ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0016\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000(½@(\u0000\u0004\u0000\u0015ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000ý\u0000\n", + "\u0000\u0005\u0000\u0000\u0000\u000f\u0000\u0017\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0005\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u00000sû@(\u0000\u0004\u0000\u0016ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000¼\u0004\u0017\u0000\u0005\u0000#\u0000\u0001\u0001\u0000\u001f\n", + "\u0000-\u0000\u0000\u0000\u0000\u0001À\u0015À\u0019\u0010ˆ\u0000½\u0000„\u0000\u0005\u0000\u0002\u0000\u000f\u0000À€ã@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000\n", + "±@\u000f\u0000\u0000@t@\u000f\u0000\u0000¶Æ@\u000f\u0000\u0000ú¡@\u000f\u0000\u0000\u0000*@\u000f\u0000\u0000\u0000$@\u000f\u0000\u0000àa@\u000f\u0000àeä@\u000f\u0000\u0000·Â@\u000f\u0000\u0000~@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000 Ž@\u000f\u0000\u0000à@\u000f\u0000\u0000€M@\u000f\u0000\u0000\u0000ð?\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000\u0000ð?\u000f\u0000\u0000\u0000\u001c@\u000f\u0000\u0000\u0010t@\u0016\u0000ý\u0000\n", + "\u0000\u0006\u0000\u0000\u0000\u000f\u0000\u0018\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0006\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000€wõ@(\u0000\u0005\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0006\u0000\u0002\u00002\u0000àÌã@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000°¥@2\u0000\u0000 g@2\u0000€zÂ@2\u0000\u0000¤¢@2\u0000\u0000\u0000.@2\u0000\u0000\u0000L@2\u0000\u0000\u0000o@2\u0000@¨Ø@2\u0000\u0000c´@2\u0000\u0000X€@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000À€@2\u0000\u0000\u0000y@2\u0000\u0000\u0000H@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000\u0000\u0000\u00002\u0000\u0000\u0000\u0010@2\u0000\u0000\u0000 @2\u0000\u0000pp@\u0016\u0000ý\u0000\n", + "\u0000\u0007\u0000\u0000\u0000\u000f\u0000\u0019\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0007\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000¨=\u001aA(\u0000\u0006\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0007\u0000\u0002\u0000\u000f\u0000À¶\n", + "A\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000€3Ì@\u000f\u0000\u0000´›@\u000f\u0000@Pä@\u000f\u0000€Ð@\u000f\u0000\u0000\u0000P@\u000f\u0000\u0000àt@\u000f\u0000\u0000D¡@\u000f\u0000°‘ö@\u000f\u0000€=Ö@\u000f\u0000\u0000*¶@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000\u0000™@\u000f\u0000\u0000BÂ@\u000f\u0000\u0000\u0000\u001c@\u000f\u0000\u0000@P@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000€D@\u000f\u0000\u0000€K@\u000f\u0000\u0000¼™@\u0016\u0000ý\u0000\n", + "\u0000\u0000\u0000\u000f\u0000\u001a\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000Œ»&A(\u0000\u0007\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0002\u00002\u0000¤)\u0011A2\u0000\u0000\u0000\u0000\u00002\u0000\u0000<á@2\u0000\u0000n©@2\u0000à;ê@2\u0000\u0000 Ô@2\u0000\u0000 l@2\u0000\u0000€z@2\u0000\u0000ί@2\u0000Pc\u000fA2\u0000  î@2\u0000€±À@2\u0000\u0000\u0000ð?2\u0000\u0000\u0011¼@2\u0000\u0000Mº@2\u0000\u0000@b@2\u0000\u0000\u00001@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000\u0000:@2\u0000\u0000\u0000K@2\u0000\u0000¦«@\u0016\u0000ý\u0000\n", + "\u0000\t\u0000\u0000\u0000\u000f\u0000\u001b\u0000\u0000\u0000\u0006\u0000\u001b\u0000\t\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000hu\u001aA(\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\t\u0000\u0002\u00002\u0000\u0010Iü@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000ØÒ@2\u0000\u0000x«@2\u0000 ðá@2\u0000\u0000i¸@2\u0000\u0000\u00002@2\u0000\u0000Àx@2\u0000\u0000(‚@2\u0000€S\u0006A2\u0000`1ê@2\u0000\u0000j¦@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000s²@2\u0000\u0000ö¶@2\u0000\u0000\u0000D@2\u0000\u0000@2\u0000\u0000\u0000ð?2\u0000\u0000\u0000&@2\u0000\u0000\u0000<@2\u0000\u0000€‡@\u0016\u0000ý\u0000\n", + "\u0000\n", + "\u0000\u0000\u0000\u000f\u0000\u001c\u0000\u0000\u0000\u0006\u0000\u001b\u0000\n", + "\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000°å÷@(\u0000\t\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\n", + "\u0000\u0002\u00002\u0000À«Þ@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000Ú¥@2\u0000\u0000àn@2\u0000€…Ä@2\u0000\u0000 ¤@2\u0000\u0000\u0000ð?2\u0000\u0000\u0000=@2\u0000\u0000Àt@2\u0000À°â@2\u0000€\u001fÃ@2\u0000\u0000è@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000°u@2\u0000\u0000„@2\u0000\u0000\u0000\u0010@2\u0000\u0000@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000\u0000\u0000@2\u0000\u0000\u0000\u0018@2\u0000\u0000Pp@\u0016\u0000ý\u0000\n", + "\u0000\u000b\u0000\u0000\u0000\u000f\u0000\u001d\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u000b\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000ì‰\u0013A(\u0000\n", + "\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u000b\u0000\u0002\u00002\u0000È÷@2\u0000\u0000\u0000\u0000\u00002\u0000€rÐ@2\u0000\u0000ú¢@2\u0000\u0000©Ü@2\u0000\u0000ô¶@2\u0000\u0000\u0000 @2\u0000\u0000XŒ@2\u0000\u0000l”@2\u0000 Aú@2\u0000 fæ@2\u0000\u0000t¡@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000\u0002¸@2\u0000\u0000Hª@2\u0000\u0000@[@2\u0000\u0000@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000\u0000*@2\u0000\u0000\u00004@2\u0000\u0000H…@\u0016\u0000ý\u0000\n", + "\u0000\f\u0000\u0000\u0000\u001b\u00005\u0000\u0000\u0000\u0006\u0000\u001b\u0000\f\u0000\u0001\u0000\u0017\u0000\u0000\u0000\u0000€©:\\A(\u0000\u000b\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000\u0006\u0000\u001b\u0000\f\u0000\u0002\u0000\u0017\u0000\u0000\u0000\u0000€×\u0000JA(\u0000\f\u0000\u0001ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000¼\u0004\u0017\u0000\f\u0000\f\u0000\u0002\u0016\u0000\u0015\n", + "\u0000-\u0001\u0000\t\u0000\u0000À\u0000À\u0019\u0010Èó\u0006\u0000\u001b\u0000\f\u0000\u0003\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0000*@(\u0000\f\u0000\u0002ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0004\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0004ý\u0010A(\u0000\f\u0000\u0003ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0005\u0000\u0017\u0000\u0000\u0000\u0000\u0000ÀëÙ@(\u0000\f\u0000\u0004ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0006\u0000\u0017\u0000\u0000\u0000\u0000\u0000X\u0003\u001fA(\u0000\f\u0000\u0005ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0007\u0000\u0017\u0000\u0000\u0000\u0000\u0000 T\u0007A(\u0000\f\u0000\u0006ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000X–@(\u0000\f\u0000\u0007ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\t\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000J§@(\u0000\fÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\n", + "\u0000\u0017\u0000\u0000\u0000\u0000\u0000@òä@(\u0000\f\u0000\tÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u000b\u0000\u0017\u0000\u0000\u0000\u0000\u0000Á_BA(\u0000\f\u0000\n", + "ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\f\u0000\u0017\u0000\u0000\u0000\u0000\u0000À×\u0013A(\u0000\f\u0000\u000bÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\n", + "\u0000\u0017\u0000\u0000\u0000\u0000\u0000`Ûï@(\u0000\f\u0000\fÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u000e\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010@(\u0000\f\u0000\n", + "ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u000f\u0000\u0017\u0000\u0000\u0000\u0000\u0000 _ð@(\u0000\f\u0000\u000eÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0010\u0000\u0017\u0000\u0000\u0000\u0000\u0000À£ä@(\u0000\f\u0000\u000fÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0011\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000ü—@(\u0000\f\u0000\u0010ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0012\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000°y@(\u0000\f\u0000\u0011ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0013\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@(\u0000\f\u0000\u0012ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0014\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000Ð@(\u0000\f\u0000\u0013ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0015\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000¸‡@(\u0000\f\u0000\u0014ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0016\u0000\u0017\u0000\u0000\u0000\u0000\u0000€tÜ@(\u0000\f\u0000\u0015ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000ý\u0000\n", + "\u0000\n", + "\u0000\u0000\u0000\u000f\u0000\u001e\u0000\u0000\u0000\u0006\u0000\u001b\u0000\n", + "\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000„H\u0015A(\u0000\f\u0000\u0016ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\n", + "\u0000\u0002\u0000\u000f\u0000\u00003\u0005A\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000ïÉ@\u000f\u0000\u0000$”@\u000f\u0000\u0000èØ@\u000f\u0000€¡Â@\u000f\u0000\u0000ÀW@\u000f\u0000\u0000\u00007@\u000f\u0000\u0000V¬@\u000f\u0000ðzö@\u000f\u0000\u0000ÓÌ@\u000f\u0000\u0000\u0014®@\u000f\u0000\u0000\u0000ð?\u000f\u0000\u0000\u0002¹@\u000f\u0000\u0000T§@\u000f\u0000\u0000\u0000I@\u000f\u0000\u0000\u00000@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000\u0000\u001c@\u000f\u0000\u0000\u0000=@\u000f\u0000\u0000—@\u0016\u0000ý\u0000\n", + "\u0000\u000e\u0000\u0000\u0000\u000f\u0000\u001f\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u000e\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000A¾;A(\u0000\n", + "\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u000e\u0000\u0002\u0000\u000f\u00000a+A\u000f\u0000\u0000\u0000(@\u000f\u0000àçñ@\u000f\u0000\u0000€Â@\u000f\u0000ðá\u0001A\u000f\u0000`£é@\u000f\u0000\u0000 }@\u000f\u0000\u0000 g@\u000f\u0000€3É@\u000f\u0000˜e\u001eA\u000f\u0000à\u0002ð@\u000f\u0000À/Ö@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000ÁÐ@\u000f\u0000\u0000ŠÍ@\u000f\u0000\u0000(„@\u000f\u0000\u0000@]@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000\u0000Z@\u000f\u0000\u0000Àb@\u000f\u0000\u0000i·@\u0016\u0000ý\u0000\n", + "\u0000\u000f\u0000\u0000\u0000\u000f\u0000 \u0000\u0000\u0000\u0006\u0000\u001b\u0000\u000f\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000“V4A(\u0000\u000e\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u000f\u0000\u0002\u0000\u000f\u0000¶y\"\u0000\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000€(å@\u000f\u0000\u00006¯@\u000f\u0000@nõ@\u000f\u0000@\u0012Þ@\u000f\u0000\u0000€j@\u000f\u0000\u0000\u0010ƒ@\u000f\u0000\u0000‹¶@\u000f\u0000$´\u001eA\u000f\u0000€Hë@\u000f\u0000€8Á@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u00000Ê@\u000f\u0000\u0000˜µ@\u000f\u0000\u0000 u@\u000f\u0000\u0000€V@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000€Q@\u000f\u0000\u0000\u0000Z@\u000f\u0000€$À@\u0016\u0000ý\u0000\n", + "\u0000\u0010\u0000\u0000\u0000\u000f\u0000!\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0010\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000>n!A(\u0000\u000f\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0010\u0000\u0002\u0000\u000f\u0000˜š\u0007A\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000ÀÓ@\u000f\u0000\u0000¨@\u000f\u0000\u0000¸ã@\u000f\u0000€ÊÄ@\u000f\u0000\u0000À\\@\u000f\u0000\u0000¨@\u000f\u0000\u0000ª£@\u000f\u0000ê\n", + "A\u000f\u0000ÀÌæ@\u000f\u0000\u0000¾¯@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000P©@\u000f\u0000\u0000€•@\u000f\u0000\u0000\u0000B@\u000f\u0000\u0000\u00006@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000\u00005@\u000f\u0000\u0000€A@\u000f\u0000\u0000ô—@\u0016\u0000ý\u0000\n", + "\u0000\u0011\u0000\u0000\u0000\u000f\u0000\"\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0011\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000Ú» A(\u0000\u0010\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0011\u0000\u0002\u0000\u000f\u0000\u0010ê\u000fA\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000nÒ@\u000f\u0000\u0000Е@\u000f\u0000 \fâ@\u000f\u0000\u0000\u0010É@\u000f\u0000\u0000€C@\u000f\u0000\u0000ÀZ@\u000f\u0000\u0000\u0006¢@\u000f\u0000pÙ\u0005A\u000f\u0000À×Ø@\u000f\u0000\u0000`­@\u000f\u0000\u0000\u0000ð?\u000f\u0000\u0000ܝ@\u000f\u0000\u0000Ô¡@\u000f\u0000\u0000\u0000<@\u000f\u0000\u0000\u0000?@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000\u00008@\u000f\u0000\u0000€P@\u000f\u0000\u0000Ԝ@\u0016\u0000ý\u0000\n", + "\u0000\u0012\u0000\u0000\u0000\u000f\u0000#\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0012\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000®–5A(\u0000\u0011\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0012\u0000\u0002\u0000\u000f\u0000¬ø%A\u000f\u0000\u0000\u0000ð?\u000f\u0000ÀVí@\u000f\u0000\u0000¿·@\u000f\u0000`¼ó@\u000f\u0000\u0000Éæ@\u000f\u0000\u0000 s@\u000f\u0000\u0000Hˆ@\u000f\u0000\u00003Á@\u000f\u0000ü4\u0019A\u000f\u0000 Þâ@\u000f\u0000€pÆ@\u000f\u0000\u0000\u0000ð?\u000f\u0000€ÝÉ@\u000f\u0000€³Ã@\u000f\u0000\u0000àa@\u000f\u0000\u0000€Q@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000ÀX@\u000f\u0000\u0000 k@\u000f\u0000\u0000î°@\u0016\u0000ý\u0000\n", + "\u0000\u0013\u0000\u0000\u0000\u000f\u0000$\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0013\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000$ä\u001aA(\u0000\u0012\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0013\u0000\u0002\u0000\u000f\u0000(\t\u0002A\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000€»Í@\u000f\u0000\u0000¸Ž@\u000f\u0000@Óß@\u000f\u0000\u0000;@\u000f\u0000\u0000@X@\u000f\u0000\u0000\u0000@@\u000f\u0000\u0000ä˜@\u000f\u0000`\u0007A\u000f\u0000À\u0016á@\u000f\u0000\u0000ž¦@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000è“@\u000f\u0000\u0000´•@\u000f\u0000\u0000€h@\u000f\u0000\u0000\u0000.@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000\u0000(@\u000f\u0000\u0000\u0000D@\u000f\u0000\u0000Œ‘@\u0016\u0000ý\u0000\n", + "\u0000\u0014\u0000\u0000\u0000\u000f\u0000%\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0014\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000\"A(\u0000\u0013\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0014\u0000\u0002\u0000\u000f\u0000Ð\u001d\u0011A\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000@Ó@\u000f\u0000\u0000˜–@\u000f\u0000€uã@\u000f\u0000€wÊ@\u000f\u0000\u0000\u0000O@\u000f\u0000\u0000€M@\u000f\u0000\u0000~¨@\u000f\u0000HN\u0007A\u000f\u0000\u0000§Ú@\u000f\u0000\u0000Š®@\u000f\u0000\u0000\u0000ð?\u000f\u0000\u0000»°@\u000f\u0000\u0000Π@\u000f\u0000\u0000€L@\u000f\u0000\u0000\u0000:@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000ÀU@\u000f\u0000\u0000@S@\u000f\u0000\u0000ð«@\u0016\u0000ý\u0000\n", + "\u0000\u0015\u0000\u0000\u0000\u000f\u0000&\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0015\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000 j\u0014A(\u0000\u0014\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0015\u0000\u0002\u0000\u000f\u00000¶\u0004A\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000„Ë@\u000f\u0000\u00000@\u000f\u0000\u0000MÑ@\u000f\u0000\u00004º@\u000f\u0000\u0000\u0000>@\u000f\u0000\u0000àe@\u000f\u0000\u0000~¡@\u000f\u0000\u0000\u001f÷@\u000f\u0000\u0000èÎ@\u000f\u0000\u0000:­@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000ý·@\u000f\u0000\u0000\f•@\u000f\u0000\u0000\u0000E@\u000f\u0000\u0000\u00008@\u000f\u0000\u0000\u0000\u0000@\u000f\u0000\u0000@U@\u000f\u0000\u0000€D@\u000f\u0000Ž@\u0016\u0000ý\u0000\n", + "\u0000\u0016\u0000\u0000\u0000\u001b\u00006\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0001\u0000\u0017\u0000\u0000\u0000\u0000 öo{A(\u0000\u0015\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0002\u0000\u0017\u0000\u0000\u0000\u0000p!¦qA(\u0000\u0016\u0000\u0001ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000¼\u0004\u0017\u0000\u0016\u0000\u0016\u0000\u0002\u0016\u0000\u0015\n", + "\u0000-\u0001\u0000\u0004\u0000\u0000À\u0000À\u0019\u0010Èó\u0006\u0000\u001b\u0000\u0016\u0000\u0003\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000ÀX@(\u0000\u0016\u0000\u0002ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0004\u0000\u0017\u0000\u0000\u0000\u0000\u0000ž\t,A(\u0000\u0016\u0000\u0003ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0005\u0000\u0017\u0000\u0000\u0000\u0000\u0000è¥\u0001A(\u0000\u0016\u0000\u0004ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0006\u0000\u0017\u0000\u0000\u0000\u0000\u0000~_9A(\u0000\u0016\u0000\u0005ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0007\u0000\u0017\u0000\u0000\u0000\u0000\u0000Tm,A(\u0000\u0016\u0000\u0006ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000Z¡@(\u0000\u0016\u0000\u0007ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\t\u0000\u0017\u0000\u0000\u0000\u0000\u0000Àwî@(\u0000\u0016ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\n", + "\u0000\u0017\u0000\u0000\u0000\u0000\u0000˜\\\u0000A(\u0000\u0016\u0000\tÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u000b\u0000\u0017\u0000\u0000\u0000\u0000@iœRA(\u0000\u0016\u0000\n", + "ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\f\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0016µ%A(\u0000\u0016\u0000\u000bÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\n", + "\u0000\u0017\u0000\u0000\u0000\u0000\u0000@Ú\tA(\u0000\u0016\u0000\fÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u000e\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0000S@(\u0000\u0016\u0000\n", + "ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u000f\u0000\u0017\u0000\u0000\u0000\u0000\u0000À¼\u0011A(\u0000\u0016\u0000\u000eÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0010\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000I\n", + "A(\u0000\u0016\u0000\u000fÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0011\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000J¬@(\u0000\u0016\u0000\u0010ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0012\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000øœ@(\u0000\u0016\u0000\u0011ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0013\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000@Q@(\u0000\u0016\u0000\u0012ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0014\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000ÑÀ@(\u0000\u0016\u0000\u0013ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0015\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000X@(\u0000\u0016\u0000\u0014ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0016\u0000\u0017\u0000\u0000\u0000\u0000\u0000 hô@(\u0000\u0016\u0000\u0015ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000ý\u0000\n", + "\u0000\u0017\u0000\u0000\u0000\u000f\u0000'\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0017\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000\u0005'0A(\u0000\u0016\u0000\u0016ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0017\u0000\u0002\u0000\u000f\u0000Œ\u0006!A\u000f\u0000\u0000\u0000;@\u000f\u0000@Žè@\u000f\u0000\u0000TÆ@\u000f\u0000@mó@\u000f\u0000\u0000iÛ@\u000f\u0000\u0000@[@\u000f\u0000\u0000 …@\u000f\u0000\u0000\u0001±@\u000f\u0000\u0000†\fA\u000f\u0000€\n", + "ç@\u000f\u0000\u0000cÆ@\u000f\u0000\u0000\u0000\u0000@\u000f\u0000\u0000¤É@\u000f\u0000\u0000ÝÍ@\u000f\u0000\u0000€`@\u000f\u0000\u0000\u0000P@\u000f\u0000\u0000\u0000 @\u000f\u0000\u0000 Š@\u000f\u0000\u0000@X@\u000f\u0000\u0000±°@\u0016\u0000ý\u0000\n", + "\u0000\u0018\u0000\u0000\u0000\u000f\u0000(\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0018\u0000\u0001\u00001\u0000\u0000\u0000\u0000€[fVA(\u0000\u0017\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0018\u0000\u0002\u0000\u000f\u0000¾ïÊ\u0000\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000 ï\u000bA\u000f\u0000 Wá@\u000fP\u0018A\u000f\u0000\u0018û\u0002A\u000f\u0000\u0000À]@\u000f\u0000\u0000YÈ@\u000f\u0000\u00001Ø@\u000f\u0000Z·S\u0000\u000f\u0000p}\u0000A\u000f\u0000\u0000Qè@\u000f\u0000\u0000\u0000$@\u000f\u0000€Kò@\u000f\u0000€‰å@\u000f\u0000\u0000ĕ@\u000f\u0000\u0000ȋ@\u000f\u0000\u0000\u00008@\u000f\u0000\u0000̑@\u000f\u0000\u0000Ё@\u000f\u0000€aÇ@\u0016\u0000ý\u0000\n", + "\u0000\u0019\u0000\u0000\u0000\u000f\u0000)\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0019\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000¢½MA(\u0000\u0018\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0019\u0000\u0002\u00002\u0000~á«\u00002\u0000\u0000\u0000\u0000\u00002\u0000Pgø@2\u0000€\u000eÁ@2\u0000Àª\u0004A2\u0000P\u0015\u0002A2\u0000\u0000@V@2\u0000\u0000\u0000‚@2\u0000\u00001Ú@2\u0000äÀ\u001bA2\u0000ÐIõ@2\u0000@$à@2\u0000\u0000\u0000 @2\u0000€ÂÙ@2\u0000€ÕÇ@2\u0000\u0000@j@2\u0000\u0000p{@2\u0000\u0000\u0000ð?2\u0000\u0000\u0000}@2\u0000\u0000`d@2\u0000\u0000¡Ê@\u0016\u0000ý\u0000\n", + "\u0000\u001a\u0000\u0000\u0000\u000f\u0000*\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u001a\u0000\u0001\u00001\u0000\u0000\u0000\u0000°:\u001cqA(\u0000\u0019\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u001a\u0000\u0002\u00002\u0000\u000eªÐ\u00022\u0000\u0000\u0000R@2x A2\u0000°³õ@2\u0000 þ.A2\u0000æ›$\u00002\u0000\u0000À@2\u0000\u0000Åç@2\u0000 \u0010ó@2\u0000Z\u000b¬\u00002\u0000°÷\u001aA2\u0000€­ü@2\u0000\u0000\u0000L@2\u00000\u0005A2\u0000x‹\u0001A2\u0000\u0000x@2\u0000\u0000à|@2\u0000\u0000\u0000B@2\u0000\u0000\u001b¸@2\u0000\u0000`@2\u0000€9ê@\u0016\u0000ý\u0000\n", + "\u0000\u001b\u0000\u0000\u0000\u001b\u00007\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0001\u0000\u0017\u0000\u0000\u0000\u0000 å'fA(\u0000\u001a\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0002\u0000\u0017\u0000\u0000\u0000\u0000ÀÅ­ZA(\u0000\u001b\u0000\u0001ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000¼\u0004\u0017\u0000\u001b\u0000\u001b\u0000\u0002\u0016\u0000\u0015\n", + "\u0000-\u0001\u0000\u0003\u0000\u0000À\u0000À\u0019\u0010Èó\u0006\u0000\u001b\u0000\u001b\u0000\u0003\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0000G@(\u0000\u001b\u0000\u0002ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0004\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0018*\u001dA(\u0000\u001b\u0000\u0003ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0005\u0000\u0017\u0000\u0000\u0000\u0000\u0000€1ý@(\u0000\u001b\u0000\u0004ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0006\u0000\u0017\u0000\u0000\u0000\u0000\u0000Ґ&A(\u0000\u001b\u0000\u0005ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0007\u0000\u0017\u0000\u0000\u0000\u0000\u0000Ä\u001a\u0012A(\u0000\u001b\u0000\u0006ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000̕@(\u0000\u001b\u0000\u0007ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\t\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000¥È@(\u0000\u001bÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\n", + "\u0000\u0017\u0000\u0000\u0000\u0000\u0000`ãà@(\u0000\u001b\u0000\tÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u000b\u0000\u0017\u0000\u0000\u0000\u0000\u0000Z\u0000?A(\u0000\u001b\u0000\n", + "ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\f\u0000\u0017\u0000\u0000\u0000\u0000\u0000lH\u001aA(\u0000\u001b\u0000\u000bÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\n", + "\u0000\u0017\u0000\u0000\u0000\u0000\u0000 :ñ@(\u0000\u001b\u0000\fÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u000e\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000ÀP@(\u0000\u001b\u0000\n", + "ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u000f\u0000\u0017\u0000\u0000\u0000\u0000\u0000è@\u0003A(\u0000\u001b\u0000\u000eÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0010\u0000\u0017\u0000\u0000\u0000\u0000\u0000xA(\u0000\u001b\u0000\u000fÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0011\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0000š@(\u0000\u001b\u0000\u0010ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0012\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0012®@(\u0000\u001b\u0000\u0011ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0013\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0000=@(\u0000\u001b\u0000\u0012ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0014\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000ˆ»@(\u0000\u001b\u0000\u0013ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0015\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0000@(\u0000\u001b\u0000\u0014ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0016\u0000\u0017\u0000\u0000\u0000\u0000\u0000€\\á@(\u0000\u001b\u0000\u0015ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000ý\u0000\n", + "\u0000\u001c\u0000\u0000\u0000\u000f\u0000+\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u001c\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000¡\u000eQA(\u0000\u001b\u0000\u0016ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u001c\u0000\u0002\u0000\u000f\u0000.,£\u0000\u000f\u0000\u0000\u0000*@\u000f\u0000ÐA\u000f\u0000à9ê@\u000f\u0000ì\u001a\u0013A\u000f\u0000À\u001fý@\u000f\u0000\u0000 {@\u000f\u0000\u0000…¼@\u000f\u0000€GÉ@\u000f\u0000$r&A\u000f\u0000€)\u0005A\u000f\u0000\u0000gÛ@\u000f\u0000\u0000\u00004@\u000f\u0000\u0000\u001fí@\u000f\u0000@Îó@\u000f\u0000\u0000à@\u000f\u0000\u0000`h@\u000f\u0000\u0000\u0000 @\u000f\u0000\u0000(”@\u000f\u0000\u0000h@\u000f\u0000\u0000©Ç@\u0016\u0000ý\u0000\n", + "\u0000\u001d\u0000\u0000\u0000\u000f\u0000,\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u001d\u0000\u0001\u00001\u0000\u0000\u0000\u0000€d\u001ePA(\u0000\u001c\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u001d\u0000\u0002\u0000\u000f\u0000f\u0011 \u0000\u000f\u0000\u0000\u0000?@\u000f\u0000\u0018`\u0004A\u000f\u0000 \u0002á@\u000f\u0000pš\u000eA\u000f\u0000\u0000Óú@\u000f\u0000\u0000؂@\u000f\u0000\u0000\\®@\u000f\u0000€sË@\u000f\u0000öê+\u0000\u000f\u0000€Öû@\u000f\u0000ÀÂÛ@\u000f\u0000\u0000€B@\u000f\u0000à3ï@\u000f\u0000ÀVò@\u000f\u0000\u0000`z@\u000f\u0000\u0000†¨@\u000f\u0000\u0000\u0000*@\u000f\u0000\u0000\u001e¯@\u000f\u0000\u0000Pt@\u000f\u0000\u0000uÉ@\u0016\u0000ý\u0000\n", + "\u0000\u001e\u0000\u0000\u0000\u000f\u0000-\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u001e\u0000\u0001\u00001\u0000\u0000\u0000\u0000€‹EFA(\u0000\u001d\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u001e\u0000\u0002\u0000\u000f\u0000Ξg\u0000\u000f\u0000\u0000\u0000\u0000@\u000f\u0000\\û@\u000f\u0000\u0000MÞ@\u000f\u0000\u0000s\u0005A\u000f\u0000Pxð@\u000f\u0000\u0000àu@\u000f\u0000\u0000\\–@\u000f\u0000\u0000¥½@\u000f\u0000.2#\u0000\u000f\u0000\u0018|\u0001A\u000f\u0000€}Ë@\u000f\u0000\u0000\u0000$@\u000f\u0000À°à@\u000f\u0000àå@\u000f\u0000\u0000ð„@\u000f\u0000\u0000\u0018€@\u000f\u0000\u0000\u0000 @\u000f\u0000\u0000¼›@\u000f\u0000\u0000Àa@\u000f\u0000\u0000TÄ@\u0016\u0000ý\u0000\n", + "\u0000\u001f\u0000\u0000\u0000\u001b\u00008\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0001\u0000\u0017\u0000\u0000\u0000\u0000@ÖdRA(\u0000\u001e\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000\u0006\u0000#\u0000\u001f\u0000\u0002\u0000\u0018\u0000\u0000\u0000\u0000€RëBA \u0000\u001f\u0000\u0001ÿ\n", + "\u0000% \u0000#\u0000\u0002À\u0002À\u0019\u0010Èó\u0006\u0000#\u0000\u001f\u0000\u0003\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u00005@ \u0000\u001f\u0000\u0002ÿ\n", + "\u0000% \u0000#\u0000\u0003À\u0003À\u0019\u0010Èó\u0006\u0000\u001b\u0000\u001f\u0000\u0004\u0000\u0018\u0000\u0000\u0000\u0000\u0000 3\u0005A(\u0000\u001f\u0000\u0003ÿ\u0005\u0000\u0001\u001f\u0000\u0004\u0000¼\u0004\u0017\u0000\u001f\u0000\u001f\u0000\u0004\f\u0000\t\n", + "\u0000-\u0001\u0000\u0004\u0000\u0000À\u0000À\u0019\u0010Èó\u0006\u0000\u001b\u0000\u001f\u0000\u0005\u0000\u0018\u0000\u0000\u0000\u0000\u0000@ÿâ@(\u0000\u001f\u0000\u0004ÿ\u0005\u0000\u0001\u001f\u0000\u0004\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0006\u0000\u0018\u0000\u0000\u0000\u0000\u0000LL\u0018A(\u0000\u001f\u0000\u0005ÿ\u0005\u0000\u0001\u001f\u0000\u0004\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0007\u0000\u0018\u0000\u0000\u0000\u0000\u0000ðºý@(\u0000\u001f\u0000\u0006ÿ\u0005\u0000\u0001\u001f\u0000\u0004\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000°w@(\u0000\u001f\u0000\u0007ÿ\u0005\u0000\u0001\u001f\u0000\u0004\u0000\u0006\u0000\u001b\u0000\u001f\u0000\t\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000B¬@(\u0000\u001fÿ\u0005\u0000\u0001\u001f\u0000\u0004\u0000\u0006\u0000\u001b\u0000\u001f\u0000\n", + "\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000¦É@(\u0000\u001f\u0000\tÿ\u0005\u0000\u0001\u001f\u0000\u0004\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u000b\u0000\u0018\u0000\u0000\u0000\u0000\u0000|›0A(\u0000\u001f\u0000\n", + "ÿ\u0005\u0000\u0001\u001f\u0000\u0004\u0000\u0006\u0000\u001b\u0000\u001f\u0000\f\u0000\u0018\u0000\u0000\u0000\u0000\u00004Á\u0011A(\u0000\u001f\u0000\u000bÿ\u0005\u0000\u0001\u001f\u0000\u0004\u0000\u0006\u0000\u001b\u0000\u001f\u0000\n", + "\u0000\u0018\u0000\u0000\u0000\u0000\u0000`›à@(\u0000\u001f\u0000\fÿ\u0005\u0000\u0001\u001f\u0000\n", + "\u0000¼\u0004\u0017\u0000\u001f\u0000\u001f\u0000\n", + "\u0016\u0000\n", + "\n", + "\u0000-\u0001\u0000\u0004\u0000\u0000À\u0000À\u0019\u0010\u0000\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u000e\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010@(\u0000\u001f\u0000\n", + "ÿ\u0005\u0000\u0001\u001f\u0000\n", + "\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u000f\u0000\u0018\u0000\u0000\u0000\u0000\u0000poö@(\u0000\u001f\u0000\u000eÿ\u0005\u0000\u0001\u001f\u0000\n", + "\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0010\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0010Tð@(\u0000\u001f\u0000\u000fÿ\u0005\u0000\u0001\u001f\u0000\n", + "\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0011\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000ä‘@(\u0000\u001f\u0000\u0010ÿ\u0005\u0000\u0001\u001f\u0000\n", + "\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0012\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000Ðu@(\u0000\u001f\u0000\u0011ÿ\u0005\u0000\u0001\u001f\u0000\n", + "\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0013\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000@(\u0000\u001f\u0000\u0012ÿ\u0005\u0000\u0001\u001f\u0000\n", + "\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0014\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u00000ƒ@(\u0000\u001f\u0000\u0013ÿ\u0005\u0000\u0001\u001f\u0000\n", + "\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0015\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000 €@(\u0000\u001f\u0000\u0014ÿ\u0005\u0000\u0001\u001f\u0000\n", + "\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0016\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000UÑ@(\u0000\u001f\u0000\u0015ÿ\u0005\u0000\u0001\u001f\u0000\n", + "\u0000×\u0000B\u0000g%\u0000\u0000X\u0002\u000e\u0000B\u0001û\u0002Û\u0002Ð\u0000µ\u0000µ\u0000µ\u0000µ\u0000µ\u0000µ\u0000Ó\u0002µ\u0000µ\u0000µ\u0000µ\u0000µ\u0000µ\u0000µ\u0000µ\u0000µ\u0000Ó\u0002µ\u0000µ\u0000µ\u0000µ\u0000Ó\u0002µ\u0000µ\u0000µ\u0002\u0010\u0000 \u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000!\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\"\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000#\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000$\u0000\u0000\u0000\u0017\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000%\u0000\u0000\u0000\u0017\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000&\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000'\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000(\u0000\u0000\u0000\u0017\u0000£\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000)\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000*\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000,\u0000\u0000\u0000\u0017\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000-\u0000\u0000\u0000\u0017\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0010ý\u0000\n", + "\u0000 \u0000\u0000\u0000\u0019\u0000.\u0000\u0000\u0000\u0006\u0000\u001b\u0000 \u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000B0A(\u0000\u001f\u0000\u0016ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000 \u0000\u0002\u00002\u00008‡(A2\u0000\u0000\u0000&@2\u0000@ýÐ@2\u0000\u0000\u0000œ@2\u0000@Ní@2\u0000\u0000já@2\u0000\u0000 e@2\u0000\u0000Ðy@2\u0000\u0000‰²@2\u0000iø@2\u0000€ãÁ@2\u0000\u0000ý@2\u0000\u0000\u0000ð?2\u0000\u0000sÍ@2\u0000\u0000|¡@2\u0000\u00008†@2\u0000\u0000ÀU@2\u0000\u0000\u0000ð?2\u0000\u0000{@2\u0000\u0000€]@2\u0000\u0000<¸@\u0016\u0000ý\u0000\n", + "\u0000!\u0000\u0000\u0000\u000f\u0000/\u0000\u0000\u0000\u0006\u0000\u001b\u0000!\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000¼„>A(\u0000 \u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000!\u0000\u0002\u00002\u0000l²-A2\u0000\u0000\u0000\u0000\u00002\u0000À_ò@2\u0000\u0000Ì@2\u0000ðƒ\u0004A2\u0000\u0000Cç@2\u0000\u0000€]@2\u0000\u0000<›@2\u0000\u0000²²@2\u0000ď\u001dA2\u0000\u0010\u0013\u0000A2\u0000\u0000ùÌ@2\u0000\u0000\u0000\u0000\u00002\u0000Àïè@2\u0000\u0000ÐÙ@2\u0000\u0000à`@2\u0000\u0000\u0000c@2\u0000\u0000\u0000\u0000@2\u0000\u0000\u0000J@2\u0000\u0000Àh@2\u0000\u0000¥¶@\u0016\u0000ý\u0000\n", + "\u0000\"\u0000\u0000\u0000\u000f\u00000\u0000\u0000\u0000\u0006\u0000\u001b\u0000\"\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000\u000eÖ,A(\u0000!\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\"\u0000\u0002\u0000\u000f\u0000ìð\u0013A\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000@ôå@\u000f\u0000\u0000òÌ@\u000f\u0000ÐY÷@\u000f\u0000€žÑ@\u000f\u0000\u0000\u0000*@\u000f\u0000\u0000€‚@\u000f\u0000\u0000°œ@\u000f\u0000Ø=\u0012A\u000f\u0000°i÷@\u000f\u0000\u0000†·@\u000f\u0000\u0000\u0000\u0000@\u000f\u0000\u0000úÈ@\u000f\u0000€ŠØ@\u000f\u0000\u0000\u0000a@\u000f\u0000\u0000€A@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000\u00000@\u000f\u0000\u0000@Y@\u000f\u0000\u0000ž©@\u0016\u0000ý\u0000\n", + "\u0000#\u0000\u0000\u0000\u000f\u00001\u0000\u0000\u0000\u0006\u0000\u001b\u0000#\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000.Â(A(\u0000\"\u0000\u0001þ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000#\u0000\u0002\u00002\u0000`ö\u0016A2\u0000\u0000\u0000$@2\u0000 œá@2\u0000\u0000ܽ@2\u0000`(ò@2\u0000@óÓ@2\u0000\u0000ÀS@2\u0000\u0000(‹@2\u0000\u0000”›@2\u0000à\u000b\tA2\u0000 qê@2\u0000\u0000 µ@2\u0000\u0000\u0000ð?2\u0000€OÉ@2\u0000€ŒÉ@2\u0000\u0000`d@2\u0000\u0000ÀR@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000@Z@2\u0000\u0000À\\@2\u0000\u0000H£@\u0016\u0000¾\u00004\u0000$\u0000\u0000\u0000$\u0000$\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000\u0016\u0000¾\u00002\u0000%\u0000\u0001\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u0016\u0000¾\u00002\u0000&\u0000\u0001\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u0016\u0000ý\u0000\n", + "\u0000'\u0000\u0000\u0000\u0017\u0000R\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u0000\u0000/\u00003\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u0001\u0000\u001c\u0000\u0001\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u0002\u0000\u001d\u0000\u0002\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u0003\u0000\u001d\u0000\u000b\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u0004\u0000\u001d\u0000\u0006\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u0005\u0000\u001d\u0000\f\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u0006\u0000\u001d\u0000\u0004\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u0007\u0000\u001d\u0000\u0007\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u001d\u0000\u000f\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\t\u0000\u001d\u0000\u0010\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\n", + "\u0000\u001d\u0000\n", + "\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u000b\u0000\u001d\u0000\u0005\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\f\u0000\u001d\u0000\n", + "\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\n", + "\u0000\u001d\u0000\u0016\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u000e\u0000\u001d\u0000\t\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u000f\u0000\u001d\u0000\u0014\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u0010\u0000\u001d\u0000\u0011\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u0011\u0000\u001d\u0000\u0012\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u0012\u0000\u001d\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u0013\u0000\u001d\u0000\u0015\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u0014\u0000\u001d\u0000\u0003\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u0015\u0000\u001d\u0000\u000e\u0000\u0000\u0000ý\u0000\n", + "\u0000(\u0000\u0016\u0000\u001d\u0000\u0013\u0000\u0000\u0000\u0001\u0002\u0006\u0000)\u0000\u0000\u0000/\u0000½\u0000Š\u0000)\u0000\u0001\u0000\u001e\u0000fÚ\u0012\n", + "\"\u0000æ#®\u0007\"\u0000Š±¨\u0002\"\u0000\u001a·Õ\u0000\"\u0000ª\u0016x\u0000\"\u00006­v\u0000\"\u0000b8A\"\u0000Î`&\u0000\"\u0000f­!\u0000\"\u00004‘\u0018A\"\u0000<Õ\u0014A\"\u0000@‚\fA\"\u0000 -\u0005A\"\u0000 sô@\"\u0000À{Ð@\"\u0000\u0000]À@\"\u0000\u0000›¹@\"\u0000\u0000‰¶@\"\u0000\u0000\u0013±@\"\u0000\u0000`f@\"\u0000\u0000\u0000c@\"\u0000\u0000\u0000Z@\u0016\u0000\u0001\u0002\u0006\u0000*\u0000\u0000\u00000\u0000~\u0002\n", + "\u0000*\u0000\u0001\u00003\u0000\u0000\u0000ð?\u0003\u0002\u000e\u0000*\u0000\u0002\u00004\u0000`®ÒÚz_M@\u0003\u0002\u000e\u0000*\u0000\u0003\u00004\u0000×\n", + "¦º›V4@\u0003\u0002\u000e\u0000*\u0000\u0004\u00004\u0000šiÜpϊ\u0019@\u0003\u0002\u000e\u0000*\u0000\u0005\u00004\u0000]ÐÁËn´\f@\u0003\u0002\u000e\u0000*\u0000\u0006\u00004\u0000ú‹%^\f@\u0003\u0002\u000e\u0000*\u0000\u0007\u00004\u0000þÔtΦP\u0007@\u0003\u0002\u000e\u0000*\u00004\u0000µl¨7ÚXò?\u0003\u0002\u000e\u0000*\u0000\t\u0000&\u0000?ÐÂ\u0000\u0019ð?\u0003\u0002\u000e\u0000*\u0000\n", + "\u0000&\u0000ì”Sç>}ç?\u0003\u0002\u000e\u0000*\u0000\u000b\u0000&\u0000K™¶\u00119ëã?\u0003\u0002\u000e\u0000*\u0000\f\u0000&\u0000Ÿ‡9†\u0004BÛ?\u0003\u0002\u000e\u0000*\u0000\n", + "\u0000&\u00003ÐÝ2¼?Ô?\u0003\u0002\u000e\u0000*\u0000\u000e\u0000&\u0000èlÞ}åÃ?\u0003\u0002\u000e\u0000*\u0000\u000f\u0000&\u0000\u001b»©#1…Ÿ?\u0003\u0002\u000e\u0000*\u0000\u0010\u0000&\u0000€A4ôcJ?\u0003\u0002\u000e\u0000*\u0000\u0011\u0000&\u0000®u‹Ea{ˆ?\u0003\u0002\u000e\u0000*\u0000\u0012\u0000&\u0000\u001bó*8ދ…?\u0003\u0002\u000e\u0000*\u0000\u0013\u0000&\u0000pq5S€?\u0003\u0002\u000e\u0000*\u0000\u0014\u0000&\u0000_÷1êd5?\u0003\u0002\u000e\u0000*\u0000\u0015\u0000&\u0000ïc‡Ý“*2?\u0003\u0002\u000e\u0000*\u0000\u0016\u0000&\u0000‹ôZÃòÛ(?¾\u00004\u0000,\u0000\u0000\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000\u0016\u0000ý\u0000\n", + "\u0000-\u0000\u0000\u0000!\u0000P\u0000\u0000\u0000¾\u00002\u0000-\u0000\u0001\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000\u0016\u0000×\u0000\u001e\u0000\u0000\u0000ð\u0000µ\u0000µ\u0000µ\u0000µ\u00008\u00006\u00006\u0000\u000e\u0000B\u0001˜\u0000’\u00018\u0000>\u0002\u0012\u0000°\u0006\u0000\u0000\u0000\u0000@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0004\u0000\u0003\u0000\u0004\u0000\u001d\u0000\u000f\u0000\u0003\u0013\u0000\u0000\u0000\u0001\u0000\u0013\u0000å\u0000\n", + "\u0000\u0001\u0000(\u0000*\u0000\u0000\u0000\u0000\u0000ï\u0000\u0006\u0000\u0000\u00007\u0000\u0000\u0000\n", + "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000þÿ\u0000\u0000\u0005\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000à…ŸòùOh\u0010«\u0000+'³Ù0\u0000\u0000\u0000Ä\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000H\u0000\u0000\u0000\u0004\u0000\u0000\u0000P\u0000\u0000\u0000\u0000\u0000h\u0000\u0000\u0000\u0012\u0000\u0000\u0000€\u0000\u0000\u0000\u000b\u0000\u0000\u0000˜\u0000\u0000\u0000\f\u0000\u0000\u0000¤\u0000\u0000\u0000\n", + "\u0000\u0000\u0000°\u0000\u0000\u0000\u0013\u0000\u0000\u0000¼\u0000\u0000\u0000\u0002\u0000\u0000\u0000ä\u0004\u0000\u0000\u001e\u0000\u0000\u0000\u0010\u0000\u0000\u0000DENATRAN-CGIE\u0000\u0000\u0000\u001e\u0000\u0000\u0000\u0010\u0000\u0000\u0000Denatran/CGIE\u0000\u0000\u0000\u001e\u0000\u0000\u0000\u0010\u0000\u0000\u0000Microsoft Excel\u0000@\u0000\u0000\u0000€\u0001õ¸L9Æ\u0001@\u0000\u0000\u0000\u0000+»\u0000k3Ä\u0001@\u0000\u0000\u0000\u0000\u0006”\fü É\u0001\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000þÿ\u0000\u0000\u0005\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0002ÕÍ՜.\u001b\u0010“\u0000+,ù®0\u0000\u0000\u0000\u0018\u0001\u0000\u0000\t\u0000\u0000\u0000\u0001\u0000\u0000\u0000P\u0000\u0000\u0000\u000f\u0000\u0000\u0000X\u0000\u0000\u0000\u0017\u0000\u0000\u0000d\u0000\u0000\u0000\u000b\u0000\u0000\u0000l\u0000\u0000\u0000\u0010\u0000\u0000\u0000t\u0000\u0000\u0000\u0013\u0000\u0000\u0000|\u0000\u0000\u0000\u0016\u0000\u0000\u0000„\u0000\u0000\u0000\n", + "\u0000\u0000\u0000Œ\u0000\u0000\u0000\f\u0000\u0000\u0000Ï\u0000\u0000\u0000\u0002\u0000\u0000\u0000ä\u0004\u0000\u0000\u001e\u0000\u0000\u0000\u0004\u0000\u0000\u0000mj\u0000\u0000\u0003\u0000\u0000\u0000\u000f'\u000b\u0000\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u001e\u0010\u0000\u0000\u0003\u0000\u0000\u0000\n", + "\u0000\u0000\u0000Glossário\u0000\t\u0000\u0000\u0000JAN_2009\u0000\u001c\u0000\u0000\u0000Glossário!Area_de_impressao\u0000\f\u0010\u0000\u0000\u0004\u0000\u0000\u0000\u001e\u0000\u0000\u0000\n", + "\u0000\u0000\u0000Planilhas\u0000\u0003\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u001e\u0000\u0000\u0000\u0014\u0000\u0000\u0000Intervalos nomeados\u0000\u0003\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0005\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\n", + "\u0000\u0000\u0000\u000b\u0000\u0000\u0000\f\u0000\u0000\u0000\n", + "\u0000\u0000\u0000\u000e\u0000\u0000\u0000\u000f\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0011\u0000\u0000\u0000\u0012\u0000\u0000\u0000\u0013\u0000\u0000\u0000\u0014\u0000\u0000\u0000\u0015\u0000\u0000\u0000\u0016\u0000\u0000\u0000\u0017\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0019\u0000\u0000\u0000\u001a\u0000\u0000\u0000\u001b\u0000\u0000\u0000\u001c\u0000\u0000\u0000\u001d\u0000\u0000\u0000\u001e\u0000\u0000\u0000\u001f\u0000\u0000\u0000 \u0000\u0000\u0000!\u0000\u0000\u0000\"\u0000\u0000\u0000#\u0000\u0000\u0000$\u0000\u0000\u0000%\u0000\u0000\u0000&\u0000\u0000\u0000'\u0000\u0000\u0000(\u0000\u0000\u0000)\u0000\u0000\u0000*\u0000\u0000\u0000+\u0000\u0000\u0000,\u0000\u0000\u0000-\u0000\u0000\u0000.\u0000\u0000\u0000/\u0000\u0000\u00000\u0000\u0000\u0000þÿÿÿ2\u0000\u0000\u00003\u0000\u0000\u00004\u0000\u0000\u00005\u0000\u0000\u00006\u0000\u0000\u00007\u0000\u0000\u00008\u0000\u0000\u0000þÿÿÿ:\u0000\u0000\u0000;\u0000\u0000\u0000<\u0000\u0000\u0000=\u0000\u0000\u0000>\u0000\u0000\u0000?\u0000\u0000\u0000@\u0000\u0000\u0000þÿÿÿýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿR\u0000o\u0000o\u0000t\u0000 \u0000E\u0000n\u0000t\u0000r\u0000y\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0016\u0000\u0005\u0001ÿÿÿÿÿÿÿÿ\u0002\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000À\u0000\u0000\u0000\u0000\u0000\u0000F\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 žÔü É\u0001þÿÿÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000W\u0000o\u0000r\u0000k\u0000b\u0000o\u0000o\u0000k\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0012\u0000\u0002\u0001ÿÿÿÿÿÿÿÿÿÿÿÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000¯a\u0000\u0000\u0000\u0000\u0000\u0000\u0005\u0000S\u0000u\u0000m\u0000m\u0000a\u0000r\u0000y\u0000I\u0000n\u0000f\u0000o\u0000r\u0000m\u0000a\u0000t\u0000i\u0000o\u0000n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000(\u0000\u0002\u0001\u0001\u0000\u0000\u0000\u0003\u0000\u0000\u0000ÿÿÿÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00001\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0005\u0000D\u0000o\u0000c\u0000u\u0000m\u0000e\u0000n\u0000t\u0000S\u0000u\u0000m\u0000m\u0000a\u0000r\u0000y\u0000I\u0000n\u0000f\u0000o\u0000r\u0000m\u0000a\u0000t\u0000i\u0000o\u0000n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00008\u0000\u0002\u0001ÿÿÿÿÿÿÿÿÿÿÿÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00009\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\n" + ] + } + ], + "source": [ + "with open('Frota RegiΣes Tipo UF JAN2009.xls', 'r', encoding=\"latin-1\") as f:\n", + " lines = f.read()\n", + "print(lines)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "import magic\n", + "\n", + "blob = open('Frota RegiΣes Tipo UF JAN2009.xls', 'rb').read()\n", + "m = magic.open(magic.MAGIC_MIME_ENCODING)\n", + "m.load()\n", + "encoding = m.buffer(blob) # \"utf-8\" \"us-ascii\" etc\n" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "None\n" + ] + } + ], + "source": [ + "print(encoding)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pipelines-RnwfPrZK-py3.10", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.6" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/poetry.lock b/poetry.lock index fc0d1fcf2..0d7b69689 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. [[package]] name = "appnope" @@ -69,6 +69,35 @@ files = [ {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, ] +[[package]] +name = "backports-zoneinfo" +version = "0.2.1" +description = "Backport of the standard library zoneinfo module" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"}, + {file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"}, +] + +[package.extras] +tzdata = ["tzdata"] + [[package]] name = "basedosdados" version = "1.6.9" @@ -162,7 +191,7 @@ files = [ name = "cffi" version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "dev" +category = "main" optional = false python-versions = "*" files = [ @@ -2860,7 +2889,7 @@ pyasn1 = ">=0.4.6,<0.5.0" name = "pycparser" version = "2.21" description = "C parser in Python" -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3099,6 +3128,22 @@ files = [ {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, ] +[[package]] +name = "pytz-deprecation-shim" +version = "0.1.0.post0" +description = "Shims to make deprecation of pytz easier" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl", hash = "sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6"}, + {file = "pytz_deprecation_shim-0.1.0.post0.tar.gz", hash = "sha256:af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d"}, +] + +[package.dependencies] +"backports.zoneinfo" = {version = "*", markers = "python_version >= \"3.6\" and python_version < \"3.9\""} +tzdata = {version = "*", markers = "python_version >= \"3.6\""} + [[package]] name = "pytzdata" version = "2020.1" @@ -3361,6 +3406,34 @@ requests = ">=2.0.0" [package.extras] rsa = ["oauthlib[signedtoken] (>=3.0.0)"] +[[package]] +name = "rpy2" +version = "3.5.11" +description = "Python interface to the R language (embedded R)" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "rpy2-3.5.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c1eb9efecaac95f907172c91178e1898ca2bcf06b56a0a31beb0641f2d5fa395"}, + {file = "rpy2-3.5.11-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:fcc78a7431ef9c75719894706db3a18e47f69e63a651bbe3be93d7a2f1e22c0e"}, + {file = "rpy2-3.5.11-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:c265030b1962f5b889d95843c69526807f3bb9092f8191d6f16f99131482d054"}, + {file = "rpy2-3.5.11.tar.gz", hash = "sha256:0d3e554dac8f4e55a28932f2946341aae3e02894304e1198547222aa86b89e21"}, +] + +[package.dependencies] +cffi = ">=1.10.0" +jinja2 = "*" +packaging = {version = "*", markers = "platform_system == \"Windows\""} +pytz = "*" +tzlocal = "*" + +[package.extras] +all = ["ipython", "numpy", "pandas (>=1.3.5)", "pytest"] +pandas = ["numpy", "pandas (>=1.3.5)"] +test = ["ipython", "numpy", "pandas (>=1.3.5)", "pytest"] +test-minimal = ["coverage", "pytest", "pytest-cov"] +types = ["mypy", "types-pytz", "types-tzlocal"] + [[package]] name = "rsa" version = "4.8" @@ -3789,6 +3862,38 @@ files = [ {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, ] +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +category = "main" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] + +[[package]] +name = "tzlocal" +version = "4.3" +description = "tzinfo object for the local timezone" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tzlocal-4.3-py3-none-any.whl", hash = "sha256:b44c4388f3d34f25862cfbb387578a4d70fec417649da694a132f628a23367e2"}, + {file = "tzlocal-4.3.tar.gz", hash = "sha256:3f21d09e1b2aa9f2dacca12da240ca37de3ba5237a93addfd6d593afe9073355"}, +] + +[package.dependencies] +"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} +pytz-deprecation-shim = "*" +tzdata = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] + [[package]] name = "unidecode" version = "1.3.6" @@ -3968,4 +4073,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "fc4b6b6372ea9f8d243ee5515ed993bef5576343475a6459c4703d50079fff6c" +content-hash = "b71c70a89ed59dde03e0fb6cfbd9128e21edfa21a161f5a52c8fc5b28ed187f5" diff --git a/pyproject.toml b/pyproject.toml index 8e4d6a4b9..7997830df 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -107,6 +107,7 @@ xlrd = "^2.0.1" python-string-utils = "^1.0.0" pytest-cov = "^4.0.0" code2flow = "^2.5.1" +rpy2 = "^3.5.11" [tool.poetry.group.dev.dependencies] From 8dd26b9e862c181c8da36e1b0cfc24a35345592e Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Fri, 12 May 2023 03:21:28 -0300 Subject: [PATCH 132/265] I'm going to hell --- pipelines/datasets/br_denatran_frota/handlers.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 4b547597e..340e58960 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -118,6 +118,11 @@ def crawl(month: int, year: int, temp_dir: str = ""): def treat_uf_tipo(file: str) -> pl.DataFrame: filename = os.path.split(file)[1] + try: + pd.ExcelFile(file) + except UnicodeDecodeError: + #TODO: Aqui você invoca o capeta e chama o R pra ler e salvar isso como df. Isso é ridículo mas funcionou. + print(2) correct_sheet = [ sheet for sheet in pd.ExcelFile(file).sheet_names if sheet != "Glossário" ][0] From bb4f0bee8f7fc0434284d37c2000e57ba03cb9d0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 12 May 2023 18:10:39 +0000 Subject: [PATCH 133/265] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pipelines/datasets/br_denatran_frota/handlers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 340e58960..3357387c2 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -121,7 +121,7 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: try: pd.ExcelFile(file) except UnicodeDecodeError: - #TODO: Aqui você invoca o capeta e chama o R pra ler e salvar isso como df. Isso é ridículo mas funcionou. + # TODO: Aqui você invoca o capeta e chama o R pra ler e salvar isso como df. Isso é ridículo mas funcionou. print(2) correct_sheet = [ sheet for sheet in pd.ExcelFile(file).sheet_names if sheet != "Glossário" From e2ec8596cd9a7c56b9e41f471f5522afd40db0a4 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 14 May 2023 22:47:45 -0300 Subject: [PATCH 134/265] Trying to unleash R inside Python --- .../datasets/br_denatran_frota/teste.xls | Bin 0 -> 34816 bytes .../datasets/br_denatran_frota/trash.ipynb | 206 +++++++++++++----- pipelines/datasets/br_denatran_frota/utils.py | 26 +++ 3 files changed, 180 insertions(+), 52 deletions(-) create mode 100644 pipelines/datasets/br_denatran_frota/teste.xls diff --git a/pipelines/datasets/br_denatran_frota/teste.xls b/pipelines/datasets/br_denatran_frota/teste.xls new file mode 100644 index 0000000000000000000000000000000000000000..250f4945a573648f6cd6b9bd8b2eef77ac2f45ee GIT binary patch literal 34816 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 13\u001b[0m workbook \u001b[39m=\u001b[39m xlrd\u001b[39m.\u001b[39;49mopen_workbook(file_contents\u001b[39m=\u001b[39;49mfile_like_object\u001b[39m.\u001b[39;49mread(), encoding_override\u001b[39m=\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39mlatin-1\u001b[39;49m\u001b[39m'\u001b[39;49m)\n\u001b[1;32m 14\u001b[0m \u001b[39m# ... rest of the code goes here\u001b[39;00m\n", - "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/__init__.py:172\u001b[0m, in \u001b[0;36mopen_workbook\u001b[0;34m(filename, logfile, verbosity, use_mmap, file_contents, encoding_override, formatting_info, on_demand, ragged_rows, ignore_workbook_corruption)\u001b[0m\n\u001b[1;32m 169\u001b[0m \u001b[39mif\u001b[39;00m file_format \u001b[39mand\u001b[39;00m file_format \u001b[39m!=\u001b[39m \u001b[39m'\u001b[39m\u001b[39mxls\u001b[39m\u001b[39m'\u001b[39m:\n\u001b[1;32m 170\u001b[0m \u001b[39mraise\u001b[39;00m XLRDError(FILE_FORMAT_DESCRIPTIONS[file_format]\u001b[39m+\u001b[39m\u001b[39m'\u001b[39m\u001b[39m; not supported\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[0;32m--> 172\u001b[0m bk \u001b[39m=\u001b[39m open_workbook_xls(\n\u001b[1;32m 173\u001b[0m filename\u001b[39m=\u001b[39;49mfilename,\n\u001b[1;32m 174\u001b[0m logfile\u001b[39m=\u001b[39;49mlogfile,\n\u001b[1;32m 175\u001b[0m verbosity\u001b[39m=\u001b[39;49mverbosity,\n\u001b[1;32m 176\u001b[0m use_mmap\u001b[39m=\u001b[39;49muse_mmap,\n\u001b[1;32m 177\u001b[0m file_contents\u001b[39m=\u001b[39;49mfile_contents,\n\u001b[1;32m 178\u001b[0m encoding_override\u001b[39m=\u001b[39;49mencoding_override,\n\u001b[1;32m 179\u001b[0m formatting_info\u001b[39m=\u001b[39;49mformatting_info,\n\u001b[1;32m 180\u001b[0m on_demand\u001b[39m=\u001b[39;49mon_demand,\n\u001b[1;32m 181\u001b[0m ragged_rows\u001b[39m=\u001b[39;49mragged_rows,\n\u001b[1;32m 182\u001b[0m ignore_workbook_corruption\u001b[39m=\u001b[39;49mignore_workbook_corruption,\n\u001b[1;32m 183\u001b[0m )\n\u001b[1;32m 185\u001b[0m \u001b[39mreturn\u001b[39;00m bk\n", - "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/book.py:104\u001b[0m, in \u001b[0;36mopen_workbook_xls\u001b[0;34m(filename, logfile, verbosity, use_mmap, file_contents, encoding_override, formatting_info, on_demand, ragged_rows, ignore_workbook_corruption)\u001b[0m\n\u001b[1;32m 102\u001b[0m bk\u001b[39m.\u001b[39mon_demand \u001b[39m=\u001b[39m on_demand \u001b[39m=\u001b[39m \u001b[39mFalse\u001b[39;00m\n\u001b[1;32m 103\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m--> 104\u001b[0m bk\u001b[39m.\u001b[39;49mparse_globals()\n\u001b[1;32m 105\u001b[0m bk\u001b[39m.\u001b[39m_sheet_list \u001b[39m=\u001b[39m [\u001b[39mNone\u001b[39;00m \u001b[39mfor\u001b[39;00m sh \u001b[39min\u001b[39;00m bk\u001b[39m.\u001b[39m_sheet_names]\n\u001b[1;32m 106\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m on_demand:\n", - "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/book.py:1215\u001b[0m, in \u001b[0;36mBook.parse_globals\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1213\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mhandle_font(data)\n\u001b[1;32m 1214\u001b[0m \u001b[39melif\u001b[39;00m rc \u001b[39m==\u001b[39m XL_FORMAT: \u001b[39m# XL_FORMAT2 is BIFF <= 3.0, can't appear in globals\u001b[39;00m\n\u001b[0;32m-> 1215\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mhandle_format(data)\n\u001b[1;32m 1216\u001b[0m \u001b[39melif\u001b[39;00m rc \u001b[39m==\u001b[39m XL_XF:\n\u001b[1;32m 1217\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mhandle_xf(data)\n", - "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/formatting.py:541\u001b[0m, in \u001b[0;36mhandle_format\u001b[0;34m(self, data, rectype)\u001b[0m\n\u001b[1;32m 539\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mactualfmtcount \u001b[39m+\u001b[39m\u001b[39m=\u001b[39m \u001b[39m1\u001b[39m\n\u001b[1;32m 540\u001b[0m \u001b[39mif\u001b[39;00m bv \u001b[39m>\u001b[39m\u001b[39m=\u001b[39m \u001b[39m80\u001b[39m:\n\u001b[0;32m--> 541\u001b[0m unistrg \u001b[39m=\u001b[39m unpack_unicode(data, \u001b[39m2\u001b[39;49m)\n\u001b[1;32m 542\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 543\u001b[0m unistrg \u001b[39m=\u001b[39m unpack_string(data, strpos, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mencoding, lenlen\u001b[39m=\u001b[39m\u001b[39m1\u001b[39m)\n", - "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/biffh.py:284\u001b[0m, in \u001b[0;36munpack_unicode\u001b[0;34m(data, pos, lenlen)\u001b[0m\n\u001b[1;32m 282\u001b[0m rawstrg \u001b[39m=\u001b[39m data[pos:pos\u001b[39m+\u001b[39m\u001b[39m2\u001b[39m\u001b[39m*\u001b[39mnchars]\n\u001b[1;32m 283\u001b[0m \u001b[39m# if DEBUG: print \"nchars=%d pos=%d rawstrg=%r\" % (nchars, pos, rawstrg)\u001b[39;00m\n\u001b[0;32m--> 284\u001b[0m strg \u001b[39m=\u001b[39m unicode(rawstrg, \u001b[39m'\u001b[39;49m\u001b[39mutf_16_le\u001b[39;49m\u001b[39m'\u001b[39;49m)\n\u001b[1;32m 285\u001b[0m \u001b[39m# pos += 2*nchars\u001b[39;00m\n\u001b[1;32m 286\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 287\u001b[0m \u001b[39m# Note: this is COMPRESSED (not ASCII!) encoding!!!\u001b[39;00m\n\u001b[1;32m 288\u001b[0m \u001b[39m# Merely returning the raw bytes would work OK 99.99% of the time\u001b[39;00m\n\u001b[1;32m 289\u001b[0m \u001b[39m# if the local codepage was cp1252 -- however this would rapidly go pear-shaped\u001b[39;00m\n\u001b[1;32m 290\u001b[0m \u001b[39m# for other codepages so we grit our Anglocentric teeth and return Unicode :-)\u001b[39;00m\n\u001b[1;32m 292\u001b[0m strg \u001b[39m=\u001b[39m unicode(data[pos:pos\u001b[39m+\u001b[39mnchars], \u001b[39m\"\u001b[39m\u001b[39mlatin_1\u001b[39m\u001b[39m\"\u001b[39m)\n", - "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/timemachine.py:31\u001b[0m, in \u001b[0;36m\u001b[0;34m(b, enc)\u001b[0m\n\u001b[1;32m 29\u001b[0m REPR \u001b[39m=\u001b[39m ascii\n\u001b[1;32m 30\u001b[0m xrange \u001b[39m=\u001b[39m \u001b[39mrange\u001b[39m\n\u001b[0;32m---> 31\u001b[0m unicode \u001b[39m=\u001b[39m \u001b[39mlambda\u001b[39;00m b, enc: b\u001b[39m.\u001b[39;49mdecode(enc)\n\u001b[1;32m 32\u001b[0m ensure_unicode \u001b[39m=\u001b[39m \u001b[39mlambda\u001b[39;00m s: s\n\u001b[1;32m 33\u001b[0m unichr \u001b[39m=\u001b[39m \u001b[39mchr\u001b[39m\n", - "File \u001b[0;32m/usr/lib/python3.10/encodings/utf_16_le.py:16\u001b[0m, in \u001b[0;36mdecode\u001b[0;34m(input, errors)\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mdecode\u001b[39m(\u001b[39minput\u001b[39m, errors\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mstrict\u001b[39m\u001b[39m'\u001b[39m):\n\u001b[0;32m---> 16\u001b[0m \u001b[39mreturn\u001b[39;00m codecs\u001b[39m.\u001b[39;49mutf_16_le_decode(\u001b[39minput\u001b[39;49m, errors, \u001b[39mTrue\u001b[39;49;00m)\n", - "\u001b[0;31mUnicodeDecodeError\u001b[0m: 'utf-16-le' codec can't decode bytes in position 24-25: illegal encoding" - ] - } - ], + "outputs": [], "source": [ - "import io\n", - "import xlrd\n", - "\n", - "# Read the Excel file as bytes\n", - "with open('Frota RegiΣes Tipo UF JAN2009.xls', 'rb') as f:\n", - " contents = f.read()\n", - "\n", - "# Create a file-like object in memory\n", - "file_like_object = io.BytesIO(contents)\n", - "\n", - "# Open the Excel file with xlrd\n", - "if file_like_object.getvalue().startswith(xlrd.XLS_SIGNATURE):\n", - " workbook = xlrd.open_workbook(file_contents=file_like_object.read(), encoding_override='latin-1')\n", - " # ... rest of the code goes here\n" + "file_to_read = \"/home/tamir/basedosdados/pipelines/pipelines/datasets/br_denatran_frota/teste.xls\"" ] }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 5, "metadata": {}, "outputs": [ { - "ename": "UnicodeDecodeError", - "evalue": "'utf-16-le' codec can't decode bytes in position 24-25: illegal encoding", + "name": "stderr", + "output_type": "stream", + "text": [ + "R[write to console]: Installing package into ‘/home/tamir/R/x86_64-pc-linux-gnu-library/4.1’\n", + "(as ‘lib’ is unspecified)\n", + "\n", + "R[write to console]: trying URL 'https://cloud.r-project.org/src/contrib/readxl_1.4.2.tar.gz'\n", + "\n", + "R[write to console]: Content type 'application/x-gzip'\n", + "R[write to console]: length 2091835 bytes (2.0 MB)\n", + "\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: =\n", + "R[write to console]: \n", + "\n", + "R[write to console]: downloaded 2.0 MB\n", + "\n", + "\n", + "* installing *source* package ‘readxl’ ...\n", + "** package ‘readxl’ successfully unpacked and MD5 sums checked\n", + "** using staged installation\n", + "** libs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "g++ -std=gnu++14 -I\"/usr/share/R/include\" -DNDEBUG -Iunix -I. -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/cpp11/include' -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/progress/include' -fvisibility=hidden -fpic -g -O2 -ffile-prefix-map=/build/r-base-4A2Reg/r-base-4.1.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c cpp11.cpp -o cpp11.o\n", + "g++ -std=gnu++14 -I\"/usr/share/R/include\" -DNDEBUG -Iunix -I. -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/cpp11/include' -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/progress/include' -fvisibility=hidden -fpic -g -O2 -ffile-prefix-map=/build/r-base-4A2Reg/r-base-4.1.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c XlsWorkBook.cpp -o XlsWorkBook.o\n", + "g++ -std=gnu++14 -I\"/usr/share/R/include\" -DNDEBUG -Iunix -I. -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/cpp11/include' -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/progress/include' -fvisibility=hidden -fpic -g -O2 -ffile-prefix-map=/build/r-base-4A2Reg/r-base-4.1.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c XlsxWorkBook.cpp -o XlsxWorkBook.o\n", + "g++ -std=gnu++14 -I\"/usr/share/R/include\" -DNDEBUG -Iunix -I. -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/cpp11/include' -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/progress/include' -fvisibility=hidden -fpic -g -O2 -ffile-prefix-map=/build/r-base-4A2Reg/r-base-4.1.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c zip.cpp -o zip.o\n", + "g++ -std=gnu++14 -I\"/usr/share/R/include\" -DNDEBUG -Iunix -I. -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/cpp11/include' -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/progress/include' -fvisibility=hidden -fpic -g -O2 -ffile-prefix-map=/build/r-base-4A2Reg/r-base-4.1.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c Read.cpp -o Read.o\n", + "gcc -I\"/usr/share/R/include\" -DNDEBUG -Iunix -I. -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/cpp11/include' -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/progress/include' -fvisibility=hidden -fpic -g -O2 -ffile-prefix-map=/build/r-base-4A2Reg/r-base-4.1.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c cran.c -o cran.o\n", + "gcc -I\"/usr/share/R/include\" -DNDEBUG -Iunix -I. -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/cpp11/include' -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/progress/include' -fvisibility=hidden -fpic -g -O2 -ffile-prefix-map=/build/r-base-4A2Reg/r-base-4.1.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c libxls/xlstool.c -o libxls/xlstool.o\n", + "gcc -I\"/usr/share/R/include\" -DNDEBUG -Iunix -I. -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/cpp11/include' -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/progress/include' -fvisibility=hidden -fpic -g -O2 -ffile-prefix-map=/build/r-base-4A2Reg/r-base-4.1.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c libxls/endian.c -o libxls/endian.o\n", + "gcc -I\"/usr/share/R/include\" -DNDEBUG -Iunix -I. -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/cpp11/include' -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/progress/include' -fvisibility=hidden -fpic -g -O2 -ffile-prefix-map=/build/r-base-4A2Reg/r-base-4.1.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c libxls/ole.c -o libxls/ole.o\n", + "gcc -I\"/usr/share/R/include\" -DNDEBUG -Iunix -I. -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/cpp11/include' -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/progress/include' -fvisibility=hidden -fpic -g -O2 -ffile-prefix-map=/build/r-base-4A2Reg/r-base-4.1.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c libxls/xls.c -o libxls/xls.o\n", + "gcc -I\"/usr/share/R/include\" -DNDEBUG -Iunix -I. -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/cpp11/include' -I'/home/tamir/R/x86_64-pc-linux-gnu-library/4.1/progress/include' -fvisibility=hidden -fpic -g -O2 -ffile-prefix-map=/build/r-base-4A2Reg/r-base-4.1.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c libxls/locale.c -o libxls/locale.o\n", + "g++ -std=gnu++14 -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -flto=auto -Wl,-z,relro -o readxl.so cpp11.o XlsWorkBook.o XlsxWorkBook.o zip.o Read.o cran.o libxls/xlstool.o libxls/endian.o libxls/ole.o libxls/xls.o libxls/locale.o -L/usr/lib/R/lib -lR\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "installing to /home/tamir/R/x86_64-pc-linux-gnu-library/4.1/00LOCK-readxl/00new/readxl/libs\n", + "** R\n", + "** inst\n", + "** byte-compile and prepare package for lazy loading\n", + "** help\n", + "*** installing help indices\n", + "*** copying figures\n", + "** building package indices\n", + "** installing vignettes\n", + "** testing if installed package can be loaded from temporary location\n", + "** checking absolute paths in shared objects and dynamic libraries\n", + "** testing if installed package can be loaded from final location\n", + "** testing if installed package keeps a record of temporary installation path\n", + "* DONE (readxl)\n", + "R[write to console]: \n", + "\n", + "R[write to console]: \n", + "R[write to console]: The downloaded source packages are in\n", + "\t‘/tmp/RtmpTvOyoT/downloaded_packages’\n", + "R[write to console]: \n", + "R[write to console]: \n", + "\n", + "R[write to console]: Error: `path` does not exist: ‘pipelines/datasets/br_denatran_frota/teste.xls’\n", + "\n", + "R[write to console]: In addition: \n", + "R[write to console]: Warning messages:\n", + "\n", + "R[write to console]: 1: \n", + "R[write to console]: In (function (package, help, pos = 2, lib.loc = NULL, character.only = FALSE, :\n", + "R[write to console]: \n", + " \n", + "R[write to console]: libraries ‘/usr/local/lib/R/site-library’, ‘/usr/lib/R/site-library’ contain no packages\n", + "\n", + "R[write to console]: 2: \n", + "R[write to console]: In (function (package, help, pos = 2, lib.loc = NULL, character.only = FALSE, :\n", + "R[write to console]: \n", + " \n", + "R[write to console]: libraries ‘/usr/local/lib/R/site-library’, ‘/usr/lib/R/site-library’ contain no packages\n", + "\n" + ] + }, + { + "ename": "RRuntimeError", + "evalue": "Error: `path` does not exist: ‘pipelines/datasets/br_denatran_frota/teste.xls’\n", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mUnicodeDecodeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[56], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m xlrd\u001b[39m.\u001b[39;49mopen_workbook_xls(\u001b[39m'\u001b[39;49m\u001b[39mFrota RegiΣes Tipo UF JAN2009.xls\u001b[39;49m\u001b[39m'\u001b[39;49m, encoding_override\u001b[39m=\u001b[39;49m \u001b[39m'\u001b[39;49m\u001b[39mlatin-1\u001b[39;49m\u001b[39m'\u001b[39;49m)\n", - "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/book.py:104\u001b[0m, in \u001b[0;36mopen_workbook_xls\u001b[0;34m(filename, logfile, verbosity, use_mmap, file_contents, encoding_override, formatting_info, on_demand, ragged_rows, ignore_workbook_corruption)\u001b[0m\n\u001b[1;32m 102\u001b[0m bk\u001b[39m.\u001b[39mon_demand \u001b[39m=\u001b[39m on_demand \u001b[39m=\u001b[39m \u001b[39mFalse\u001b[39;00m\n\u001b[1;32m 103\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m--> 104\u001b[0m bk\u001b[39m.\u001b[39;49mparse_globals()\n\u001b[1;32m 105\u001b[0m bk\u001b[39m.\u001b[39m_sheet_list \u001b[39m=\u001b[39m [\u001b[39mNone\u001b[39;00m \u001b[39mfor\u001b[39;00m sh \u001b[39min\u001b[39;00m bk\u001b[39m.\u001b[39m_sheet_names]\n\u001b[1;32m 106\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m on_demand:\n", - "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/book.py:1215\u001b[0m, in \u001b[0;36mBook.parse_globals\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1213\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mhandle_font(data)\n\u001b[1;32m 1214\u001b[0m \u001b[39melif\u001b[39;00m rc \u001b[39m==\u001b[39m XL_FORMAT: \u001b[39m# XL_FORMAT2 is BIFF <= 3.0, can't appear in globals\u001b[39;00m\n\u001b[0;32m-> 1215\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mhandle_format(data)\n\u001b[1;32m 1216\u001b[0m \u001b[39melif\u001b[39;00m rc \u001b[39m==\u001b[39m XL_XF:\n\u001b[1;32m 1217\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mhandle_xf(data)\n", - "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/formatting.py:541\u001b[0m, in \u001b[0;36mhandle_format\u001b[0;34m(self, data, rectype)\u001b[0m\n\u001b[1;32m 539\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mactualfmtcount \u001b[39m+\u001b[39m\u001b[39m=\u001b[39m \u001b[39m1\u001b[39m\n\u001b[1;32m 540\u001b[0m \u001b[39mif\u001b[39;00m bv \u001b[39m>\u001b[39m\u001b[39m=\u001b[39m \u001b[39m80\u001b[39m:\n\u001b[0;32m--> 541\u001b[0m unistrg \u001b[39m=\u001b[39m unpack_unicode(data, \u001b[39m2\u001b[39;49m)\n\u001b[1;32m 542\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 543\u001b[0m unistrg \u001b[39m=\u001b[39m unpack_string(data, strpos, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mencoding, lenlen\u001b[39m=\u001b[39m\u001b[39m1\u001b[39m)\n", - "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/biffh.py:284\u001b[0m, in \u001b[0;36munpack_unicode\u001b[0;34m(data, pos, lenlen)\u001b[0m\n\u001b[1;32m 282\u001b[0m rawstrg \u001b[39m=\u001b[39m data[pos:pos\u001b[39m+\u001b[39m\u001b[39m2\u001b[39m\u001b[39m*\u001b[39mnchars]\n\u001b[1;32m 283\u001b[0m \u001b[39m# if DEBUG: print \"nchars=%d pos=%d rawstrg=%r\" % (nchars, pos, rawstrg)\u001b[39;00m\n\u001b[0;32m--> 284\u001b[0m strg \u001b[39m=\u001b[39m unicode(rawstrg, \u001b[39m'\u001b[39;49m\u001b[39mutf_16_le\u001b[39;49m\u001b[39m'\u001b[39;49m)\n\u001b[1;32m 285\u001b[0m \u001b[39m# pos += 2*nchars\u001b[39;00m\n\u001b[1;32m 286\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 287\u001b[0m \u001b[39m# Note: this is COMPRESSED (not ASCII!) encoding!!!\u001b[39;00m\n\u001b[1;32m 288\u001b[0m \u001b[39m# Merely returning the raw bytes would work OK 99.99% of the time\u001b[39;00m\n\u001b[1;32m 289\u001b[0m \u001b[39m# if the local codepage was cp1252 -- however this would rapidly go pear-shaped\u001b[39;00m\n\u001b[1;32m 290\u001b[0m \u001b[39m# for other codepages so we grit our Anglocentric teeth and return Unicode :-)\u001b[39;00m\n\u001b[1;32m 292\u001b[0m strg \u001b[39m=\u001b[39m unicode(data[pos:pos\u001b[39m+\u001b[39mnchars], \u001b[39m\"\u001b[39m\u001b[39mlatin_1\u001b[39m\u001b[39m\"\u001b[39m)\n", - "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-RnwfPrZK-py3.10/lib/python3.10/site-packages/xlrd/timemachine.py:31\u001b[0m, in \u001b[0;36m\u001b[0;34m(b, enc)\u001b[0m\n\u001b[1;32m 29\u001b[0m REPR \u001b[39m=\u001b[39m ascii\n\u001b[1;32m 30\u001b[0m xrange \u001b[39m=\u001b[39m \u001b[39mrange\u001b[39m\n\u001b[0;32m---> 31\u001b[0m unicode \u001b[39m=\u001b[39m \u001b[39mlambda\u001b[39;00m b, enc: b\u001b[39m.\u001b[39;49mdecode(enc)\n\u001b[1;32m 32\u001b[0m ensure_unicode \u001b[39m=\u001b[39m \u001b[39mlambda\u001b[39;00m s: s\n\u001b[1;32m 33\u001b[0m unichr \u001b[39m=\u001b[39m \u001b[39mchr\u001b[39m\n", - "File \u001b[0;32m/usr/lib/python3.10/encodings/utf_16_le.py:16\u001b[0m, in \u001b[0;36mdecode\u001b[0;34m(input, errors)\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mdecode\u001b[39m(\u001b[39minput\u001b[39m, errors\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mstrict\u001b[39m\u001b[39m'\u001b[39m):\n\u001b[0;32m---> 16\u001b[0m \u001b[39mreturn\u001b[39;00m codecs\u001b[39m.\u001b[39;49mutf_16_le_decode(\u001b[39minput\u001b[39;49m, errors, \u001b[39mTrue\u001b[39;49;00m)\n", - "\u001b[0;31mUnicodeDecodeError\u001b[0m: 'utf-16-le' codec can't decode bytes in position 24-25: illegal encoding" + "\u001b[0;31mRRuntimeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[5], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m call_r_to_read_file(file_to_read)\n", + "File \u001b[0;32m~/basedosdados/pipelines/pipelines/datasets/br_denatran_frota/utils.py:408\u001b[0m, in \u001b[0;36mcall_r_to_read_file\u001b[0;34m(file)\u001b[0m\n\u001b[1;32m 405\u001b[0m readxl \u001b[39m=\u001b[39m rpackages\u001b[39m.\u001b[39mimportr(\u001b[39m\"\u001b[39m\u001b[39mreadxl\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[1;32m 407\u001b[0m \u001b[39m# Read the Excel file\u001b[39;00m\n\u001b[0;32m--> 408\u001b[0m robjects\u001b[39m.\u001b[39mr(\n\u001b[1;32m 409\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\"\"\u001b[39m\n\u001b[1;32m 410\u001b[0m \u001b[39m library(readxl)\u001b[39m\n\u001b[1;32m 411\u001b[0m \u001b[39m x <- read_excel(\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00mfile\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m\u001b[39m)\u001b[39m\n\u001b[1;32m 412\u001b[0m \u001b[39m\u001b[39m\u001b[39m\"\"\"\u001b[39m\n\u001b[1;32m 413\u001b[0m )\n\u001b[1;32m 415\u001b[0m \u001b[39m# Convert the R dataframe to a pandas dataframe\u001b[39;00m\n\u001b[1;32m 416\u001b[0m df \u001b[39m=\u001b[39m robjects\u001b[39m.\u001b[39mr[\u001b[39m\"\u001b[39m\u001b[39mx\u001b[39m\u001b[39m\"\u001b[39m]\n", + "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-Fyk5jlG0-py3.10/lib/python3.10/site-packages/rpy2/robjects/__init__.py:459\u001b[0m, in \u001b[0;36mR.__call__\u001b[0;34m(self, string)\u001b[0m\n\u001b[1;32m 457\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__call__\u001b[39m(\u001b[39mself\u001b[39m, string):\n\u001b[1;32m 458\u001b[0m p \u001b[39m=\u001b[39m rinterface\u001b[39m.\u001b[39mparse(string)\n\u001b[0;32m--> 459\u001b[0m res \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49meval(p)\n\u001b[1;32m 460\u001b[0m \u001b[39mreturn\u001b[39;00m conversion\u001b[39m.\u001b[39mget_conversion()\u001b[39m.\u001b[39mrpy2py(res)\n", + "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-Fyk5jlG0-py3.10/lib/python3.10/site-packages/rpy2/robjects/functions.py:208\u001b[0m, in \u001b[0;36mSignatureTranslatedFunction.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 206\u001b[0m v \u001b[39m=\u001b[39m kwargs\u001b[39m.\u001b[39mpop(k)\n\u001b[1;32m 207\u001b[0m kwargs[r_k] \u001b[39m=\u001b[39m v\n\u001b[0;32m--> 208\u001b[0m \u001b[39mreturn\u001b[39;00m (\u001b[39msuper\u001b[39;49m(SignatureTranslatedFunction, \u001b[39mself\u001b[39;49m)\n\u001b[1;32m 209\u001b[0m \u001b[39m.\u001b[39;49m\u001b[39m__call__\u001b[39;49m(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs))\n", + "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-Fyk5jlG0-py3.10/lib/python3.10/site-packages/rpy2/robjects/functions.py:131\u001b[0m, in \u001b[0;36mFunction.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 129\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 130\u001b[0m new_kwargs[k] \u001b[39m=\u001b[39m cv\u001b[39m.\u001b[39mpy2rpy(v)\n\u001b[0;32m--> 131\u001b[0m res \u001b[39m=\u001b[39m \u001b[39msuper\u001b[39;49m(Function, \u001b[39mself\u001b[39;49m)\u001b[39m.\u001b[39;49m\u001b[39m__call__\u001b[39;49m(\u001b[39m*\u001b[39;49mnew_args, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mnew_kwargs)\n\u001b[1;32m 132\u001b[0m res \u001b[39m=\u001b[39m cv\u001b[39m.\u001b[39mrpy2py(res)\n\u001b[1;32m 133\u001b[0m \u001b[39mreturn\u001b[39;00m res\n", + "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-Fyk5jlG0-py3.10/lib/python3.10/site-packages/rpy2/rinterface_lib/conversion.py:45\u001b[0m, in \u001b[0;36m_cdata_res_to_rinterface.._\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 44\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m---> 45\u001b[0m cdata \u001b[39m=\u001b[39m function(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 46\u001b[0m \u001b[39m# TODO: test cdata is of the expected CType\u001b[39;00m\n\u001b[1;32m 47\u001b[0m \u001b[39mreturn\u001b[39;00m _cdata_to_rinterface(cdata)\n", + "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-Fyk5jlG0-py3.10/lib/python3.10/site-packages/rpy2/rinterface.py:817\u001b[0m, in \u001b[0;36mSexpClosure.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 810\u001b[0m res \u001b[39m=\u001b[39m rmemory\u001b[39m.\u001b[39mprotect(\n\u001b[1;32m 811\u001b[0m openrlib\u001b[39m.\u001b[39mrlib\u001b[39m.\u001b[39mR_tryEval(\n\u001b[1;32m 812\u001b[0m call_r,\n\u001b[1;32m 813\u001b[0m call_context\u001b[39m.\u001b[39m__sexp__\u001b[39m.\u001b[39m_cdata,\n\u001b[1;32m 814\u001b[0m error_occured)\n\u001b[1;32m 815\u001b[0m )\n\u001b[1;32m 816\u001b[0m \u001b[39mif\u001b[39;00m error_occured[\u001b[39m0\u001b[39m]:\n\u001b[0;32m--> 817\u001b[0m \u001b[39mraise\u001b[39;00m embedded\u001b[39m.\u001b[39mRRuntimeError(_rinterface\u001b[39m.\u001b[39m_geterrmessage())\n\u001b[1;32m 818\u001b[0m \u001b[39mreturn\u001b[39;00m res\n", + "\u001b[0;31mRRuntimeError\u001b[0m: Error: `path` does not exist: ‘pipelines/datasets/br_denatran_frota/teste.xls’\n" ] } ], "source": [ - "xlrd.open_workbook_xls('Frota RegiΣes Tipo UF JAN2009.xls', encoding_override= 'latin-1')" + "call_r_to_read_file()" ] }, { diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index e3a6565b0..cea570728 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -42,6 +42,10 @@ from pipelines.datasets.br_denatran_frota.constants import constants from bs4 import BeautifulSoup from urllib.request import urlopen +import rpy2.robjects.packages as rpackages +import rpy2.robjects as robjects +from rpy2.robjects.vectors import StrVector + DICT_UFS = constants.DICT_UFS.value SUBSTITUTIONS = constants.SUBSTITUTIONS.value @@ -387,3 +391,25 @@ def make_dir_when_not_exists(dir_name: str): """ if not os.path.exists(dir_name): os.makedirs(dir_name) + + +def call_r_to_read_file(file: str) -> pd.DataFrame: + # Install and load the required R packages + packages = ("readxl",) + r_utils = rpackages.importr("utils", suppress_messages=True) + r_utils.chooseCRANmirror(ind=1) + r_utils.install_packages(StrVector(packages)) + rpackages.importr("readxl", suppress_messages=True) + + # Read the Excel file + robjects.r( + f""" + library(readxl) + x <- read_excel('{file}') + """ + ) + + # Convert the R dataframe to a pandas dataframe + df = robjects.r["x"] + df = pd.DataFrame(dict(zip(df.names, list(df)))) + return df From 8fd4b2a7d3324676846b5e37f04fe28c72b3bc8f Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Mon, 15 May 2023 02:05:11 -0300 Subject: [PATCH 135/265] Treatment working except 2003-2004 --- .../datasets/br_denatran_frota/handlers.py | 17 +++++---- pipelines/datasets/br_denatran_frota/utils.py | 36 ++++++++++++++----- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 3357387c2..df7394734 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -63,6 +63,7 @@ call_downloader, download_file, extraction_pre_2012, + call_r_to_read_file ) import pandas as pd import polars as pl @@ -119,15 +120,14 @@ def crawl(month: int, year: int, temp_dir: str = ""): def treat_uf_tipo(file: str) -> pl.DataFrame: filename = os.path.split(file)[1] try: - pd.ExcelFile(file) + correct_sheet = [ + sheet for sheet in pd.ExcelFile(file).sheet_names if sheet != "Glossário" + ][0] + df = pd.read_excel(file, sheet_name=correct_sheet) except UnicodeDecodeError: # TODO: Aqui você invoca o capeta e chama o R pra ler e salvar isso como df. Isso é ridículo mas funcionou. - print(2) - correct_sheet = [ - sheet for sheet in pd.ExcelFile(file).sheet_names if sheet != "Glossário" - ][0] - - df = pd.read_excel(file, sheet_name=correct_sheet) + df = call_r_to_read_file(file) + new_df = change_df_header(df, guess_header(df)) # This is ad hoc for UF_tipo. new_df.rename( @@ -138,6 +138,9 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: drop=True ) # Now we get all the actual RELEVANT uf data. month, year = get_year_month_from_filename(filename) + # If the df is all strings, try to get numbers where it makes sense. + if all(clean_df.dtypes == 'object'): + clean_df = clean_df.apply(pd.to_numeric, errors = 'ignore') clean_pl_df = pl.from_pandas(clean_df).lazy() verify_total(clean_pl_df.collect()) # Add year and month diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index cea570728..caa0e53ee 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -70,18 +70,18 @@ def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int: int: Index of the row where the header is contained. """ header_guess = 0 - possible_guess_list = [header_guess] + possible_guess_list = [] while header_guess < max_header_guess: if len(df) - 1 < header_guess: break - # Iffy logic, but essentially: if all rows of the column are strings, then this is a good candidate for a header. - if all(df.iloc[header_guess].apply(lambda x: isinstance(x, str))): - possible_guess_list.append(header_guess) + # If this row minus the first column can be converted to int, then + if is_int_row(df.iloc[header_guess]): + possible_guess_list.append(header_guess -1) header_guess += 1 - return max( + return min( possible_guess_list - ) # If nothing is ever found until the max, let's just assume it's the first row as per usual. + ) or 0 # If nothing is ever found until the max, let's just assume it's the first row as per usual. def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame: @@ -99,6 +99,20 @@ def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame: new_df.rename(columns=new_header, inplace=True) return new_df +def is_int_row(row): + # convert all elements of the row to strings + str_row = [str(x) for x in row[1:]] + + # try to convert each element to an int, return False if it fails + for element in str_row: + try: + int(element) + except ValueError: + return False + + # if all elements can be converted to int, return True + return True + def get_year_month_from_filename(filename: str) -> tuple[int, int]: """Helper to extract month and year information from files named indicator_month-year.xls @@ -395,6 +409,8 @@ def make_dir_when_not_exists(dir_name: str): def call_r_to_read_file(file: str) -> pd.DataFrame: # Install and load the required R packages + if not os.path.isfile(file): + raise ValueError('Invalid file') packages = ("readxl",) r_utils = rpackages.importr("utils", suppress_messages=True) r_utils.chooseCRANmirror(ind=1) @@ -405,11 +421,15 @@ def call_r_to_read_file(file: str) -> pd.DataFrame: robjects.r( f""" library(readxl) - x <- read_excel('{file}') + + sheets <- excel_sheets('{file}') + correct_sheet <- sheets[sheets != "Glossário"][1] + df <- read_excel('{file}', sheet = correct_sheet) + """ ) # Convert the R dataframe to a pandas dataframe - df = robjects.r["x"] + df = robjects.r["df"] df = pd.DataFrame(dict(zip(df.names, list(df)))) return df From a3c37fac24fab68e273bb7533ea7652bebebad29 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Mon, 15 May 2023 02:12:30 -0300 Subject: [PATCH 136/265] Adjust parameter for old data --- pipelines/datasets/br_denatran_frota/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index caa0e53ee..5691205b7 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -56,7 +56,7 @@ MUNIC_TIPO_BASIC_FILENAME = constants.MUNIC_TIPO_BASIC_FILENAME.value -def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int: +def guess_header(df: pd.DataFrame, max_header_guess: int = 10) -> int: """Function to deal with problematic dataframes coming from Excel/CSV files. Tries to guess which row is the header by examining the first few rows (max given by max_header_guess). Assumes that the header is the first row where all of the columns are strings. From 4b9b74b4314f6df1dbfc8c4f20b0f6325e24f6fe Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Mon, 15 May 2023 04:31:37 -0300 Subject: [PATCH 137/265] uf tipo is done --- pipelines/datasets/br_denatran_frota/constants.py | 4 ++++ pipelines/datasets/br_denatran_frota/handlers.py | 3 ++- pipelines/datasets/br_denatran_frota/utils.py | 14 +++++++------- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index 24cb62653..9ee143594 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -109,3 +109,7 @@ class constants(Enum): # pylint: disable=c0103 MUNIC_TIPO_BASIC_FILENAME = "frota_por_municipio_e_tipo" MONTHS_SHORT = {month[:3]: number for month, number in MONTHS.items()} + + UF_TIPO_HEADER = ['Grandes Regiões e\nUnidades da Federação', 'TOTAL', 'AUTOMÓVEL', 'BONDE', 'CAMINHÃO', 'CAMINHÃO TRATOR', 'CAMINHONETE', 'CAMIONETA', 'CHASSI PLATAFORMA', 'CICLOMOTOR', 'MICROÔNIBUS', 'MOTOCICLETA', 'MOTONETA', 'ÔNIBUS', 'QUADRICICLO', + 'REBOQUE', 'SEMI-REBOQUE', 'SIDE-CAR', 'OUTROS', 'TRATOR ESTEIRA', 'TRATOR RODAS', 'TRICICLO', 'UTILITÁRIO' + ] \ No newline at end of file diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index df7394734..ceb82aa7d 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -118,6 +118,7 @@ def crawl(month: int, year: int, temp_dir: str = ""): def treat_uf_tipo(file: str) -> pl.DataFrame: + valid_ufs = list(DICT_UFS.keys()) + list(DICT_UFS.values()) filename = os.path.split(file)[1] try: correct_sheet = [ @@ -134,7 +135,7 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: columns={new_df.columns[0]: "sigla_uf"}, inplace=True ) # Rename for ease of use. new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace. - clean_df = new_df[new_df.sigla_uf.isin(DICT_UFS.values())].reset_index( + clean_df = new_df[new_df.sigla_uf.isin(valid_ufs)].reset_index( drop=True ) # Now we get all the actual RELEVANT uf data. month, year = get_year_month_from_filename(filename) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 5691205b7..4b2222ee7 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -54,7 +54,7 @@ UF_TIPO_BASIC_FILENAME = constants.UF_TIPO_BASIC_FILENAME.value MONTHS_SHORT = constants.MONTHS_SHORT.value MUNIC_TIPO_BASIC_FILENAME = constants.MUNIC_TIPO_BASIC_FILENAME.value - +UF_TIPO_HEADER = constants.UF_TIPO_HEADER.value def guess_header(df: pd.DataFrame, max_header_guess: int = 10) -> int: """Function to deal with problematic dataframes coming from Excel/CSV files. @@ -75,13 +75,13 @@ def guess_header(df: pd.DataFrame, max_header_guess: int = 10) -> int: if len(df) - 1 < header_guess: break # If this row minus the first column can be converted to int, then - if is_int_row(df.iloc[header_guess]): - possible_guess_list.append(header_guess -1) - + #if is_int_row(df.iloc[header_guess]): + current_row = df.iloc[header_guess].to_list() + equal_column_names = [(x, y) for x,y in zip(UF_TIPO_HEADER, current_row) if x == y] + if len(equal_column_names)/len(UF_TIPO_HEADER) > 0.7: # If 70% of the columns match, this is the header. + return header_guess header_guess += 1 - return min( - possible_guess_list - ) or 0 # If nothing is ever found until the max, let's just assume it's the first row as per usual. + return 0 # If nothing is ever found until the max, let's just assume it's the first row as per usual. def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame: From 2d0f30a9210c81630026588af2204a25e3554d37 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 15 May 2023 07:34:29 +0000 Subject: [PATCH 138/265] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../datasets/br_denatran_frota/constants.py | 28 +++++++++++++++++-- .../datasets/br_denatran_frota/handlers.py | 8 +++--- pipelines/datasets/br_denatran_frota/utils.py | 20 ++++++++----- 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index 9ee143594..a93cd8c1c 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -110,6 +110,28 @@ class constants(Enum): # pylint: disable=c0103 MONTHS_SHORT = {month[:3]: number for month, number in MONTHS.items()} - UF_TIPO_HEADER = ['Grandes Regiões e\nUnidades da Federação', 'TOTAL', 'AUTOMÓVEL', 'BONDE', 'CAMINHÃO', 'CAMINHÃO TRATOR', 'CAMINHONETE', 'CAMIONETA', 'CHASSI PLATAFORMA', 'CICLOMOTOR', 'MICROÔNIBUS', 'MOTOCICLETA', 'MOTONETA', 'ÔNIBUS', 'QUADRICICLO', - 'REBOQUE', 'SEMI-REBOQUE', 'SIDE-CAR', 'OUTROS', 'TRATOR ESTEIRA', 'TRATOR RODAS', 'TRICICLO', 'UTILITÁRIO' - ] \ No newline at end of file + UF_TIPO_HEADER = [ + "Grandes Regiões e\nUnidades da Federação", + "TOTAL", + "AUTOMÓVEL", + "BONDE", + "CAMINHÃO", + "CAMINHÃO TRATOR", + "CAMINHONETE", + "CAMIONETA", + "CHASSI PLATAFORMA", + "CICLOMOTOR", + "MICROÔNIBUS", + "MOTOCICLETA", + "MOTONETA", + "ÔNIBUS", + "QUADRICICLO", + "REBOQUE", + "SEMI-REBOQUE", + "SIDE-CAR", + "OUTROS", + "TRATOR ESTEIRA", + "TRATOR RODAS", + "TRICICLO", + "UTILITÁRIO", + ] diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index ceb82aa7d..4bff48dc3 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -63,7 +63,7 @@ call_downloader, download_file, extraction_pre_2012, - call_r_to_read_file + call_r_to_read_file, ) import pandas as pd import polars as pl @@ -128,7 +128,7 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: except UnicodeDecodeError: # TODO: Aqui você invoca o capeta e chama o R pra ler e salvar isso como df. Isso é ridículo mas funcionou. df = call_r_to_read_file(file) - + new_df = change_df_header(df, guess_header(df)) # This is ad hoc for UF_tipo. new_df.rename( @@ -140,8 +140,8 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: ) # Now we get all the actual RELEVANT uf data. month, year = get_year_month_from_filename(filename) # If the df is all strings, try to get numbers where it makes sense. - if all(clean_df.dtypes == 'object'): - clean_df = clean_df.apply(pd.to_numeric, errors = 'ignore') + if all(clean_df.dtypes == "object"): + clean_df = clean_df.apply(pd.to_numeric, errors="ignore") clean_pl_df = pl.from_pandas(clean_df).lazy() verify_total(clean_pl_df.collect()) # Add year and month diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 4b2222ee7..d090ed57f 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -56,6 +56,7 @@ MUNIC_TIPO_BASIC_FILENAME = constants.MUNIC_TIPO_BASIC_FILENAME.value UF_TIPO_HEADER = constants.UF_TIPO_HEADER.value + def guess_header(df: pd.DataFrame, max_header_guess: int = 10) -> int: """Function to deal with problematic dataframes coming from Excel/CSV files. Tries to guess which row is the header by examining the first few rows (max given by max_header_guess). @@ -75,13 +76,17 @@ def guess_header(df: pd.DataFrame, max_header_guess: int = 10) -> int: if len(df) - 1 < header_guess: break # If this row minus the first column can be converted to int, then - #if is_int_row(df.iloc[header_guess]): + # if is_int_row(df.iloc[header_guess]): current_row = df.iloc[header_guess].to_list() - equal_column_names = [(x, y) for x,y in zip(UF_TIPO_HEADER, current_row) if x == y] - if len(equal_column_names)/len(UF_TIPO_HEADER) > 0.7: # If 70% of the columns match, this is the header. + equal_column_names = [ + (x, y) for x, y in zip(UF_TIPO_HEADER, current_row) if x == y + ] + if ( + len(equal_column_names) / len(UF_TIPO_HEADER) > 0.7 + ): # If 70% of the columns match, this is the header. return header_guess header_guess += 1 - return 0 # If nothing is ever found until the max, let's just assume it's the first row as per usual. + return 0 # If nothing is ever found until the max, let's just assume it's the first row as per usual. def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame: @@ -99,17 +104,18 @@ def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame: new_df.rename(columns=new_header, inplace=True) return new_df + def is_int_row(row): # convert all elements of the row to strings str_row = [str(x) for x in row[1:]] - + # try to convert each element to an int, return False if it fails for element in str_row: try: int(element) except ValueError: return False - + # if all elements can be converted to int, return True return True @@ -410,7 +416,7 @@ def make_dir_when_not_exists(dir_name: str): def call_r_to_read_file(file: str) -> pd.DataFrame: # Install and load the required R packages if not os.path.isfile(file): - raise ValueError('Invalid file') + raise ValueError("Invalid file") packages = ("readxl",) r_utils = rpackages.importr("utils", suppress_messages=True) r_utils.chooseCRANmirror(ind=1) From 3a8e207b4b56ba9d028c4f57ada4ff090a579d0a Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 16 May 2023 00:50:12 -0300 Subject: [PATCH 139/265] Add task for outputing file to CSV --- pipelines/datasets/br_denatran_frota/handlers.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 4bff48dc3..fc7b6668c 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -159,8 +159,5 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: return clean_pl_df -def output_file_to_csv(df: pl.DataFrame) -> None: - pass - - -# df.write_csv(file=f"{OUTPUT_PATH}/{filename}.csv", has_header=True) +def output_file_to_csv(df: pl.DataFrame, filename: str) -> None: + df.write_csv(file=f"{OUTPUT_PATH}/{filename}.csv", has_header=True) From c4e6a749bc1fc7da581761250e25239696c48958 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 16 May 2023 00:58:39 -0300 Subject: [PATCH 140/265] Small error --- br_denatran_frota/code/frota_municipio_tipo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/br_denatran_frota/code/frota_municipio_tipo.py b/br_denatran_frota/code/frota_municipio_tipo.py index a400a88af..00f387618 100644 --- a/br_denatran_frota/code/frota_municipio_tipo.py +++ b/br_denatran_frota/code/frota_municipio_tipo.py @@ -18,7 +18,7 @@ import basedosdados as bd -def verify_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str): +def verify_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str) -> None: denatran_uf = denatran_df.filter(pl.col("sigla_uf") == uf) ibge_uf = ibge_df.filter(pl.col("sigla_uf") == uf) ibge_uf = ibge_uf.with_columns(pl.col("nome").apply(asciify).str.to_lowercase()) From d65706d6ce2e467c4bbdbe53497f84443a399d50 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 16 May 2023 01:05:17 -0300 Subject: [PATCH 141/265] WIP for treating municipality data --- pipelines/datasets/br_denatran_frota/utils.py | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index d090ed57f..8f2bb3913 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -71,7 +71,6 @@ def guess_header(df: pd.DataFrame, max_header_guess: int = 10) -> int: int: Index of the row where the header is contained. """ header_guess = 0 - possible_guess_list = [] while header_guess < max_header_guess: if len(df) - 1 < header_guess: break @@ -439,3 +438,41 @@ def call_r_to_read_file(file: str) -> pd.DataFrame: df = robjects.r["df"] df = pd.DataFrame(dict(zip(df.names, list(df)))) return df + + +def verify_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str) -> None: + """Function to take the DENATRAN data at municipality level and compare it to the IBGE data. + This will filter by the uf argument and do all comparisons to ensure consistency. + + Args: + denatran_df (pl.DataFrame): Dataframe with the DENATRAN data at municipality level. + ibge_df (pl.DataFrame): Dataframe with the IBGE data of municipalities. + uf (str): Desired municipality to filter the DF for. + + Raises: + ValueError: If there are somehow municipalities in the DENATRAN data that do not exist in the IBGE data. Very unlikely. + ValueError: If there are two municipalities in the DENATRAN data + """ + denatran_uf = denatran_df.filter(pl.col("sigla_uf") == uf) + ibge_uf = ibge_df.filter(pl.col("sigla_uf") == uf) + ibge_uf = ibge_uf.with_columns(pl.col("nome").apply(asciify).str.to_lowercase()) + municipios_na_bd = ibge_uf["nome"].to_list() + x = denatran_uf["nome_denatran"].apply(lambda x: get_city_name_ibge(x, ibge_uf)) + denatran_uf = denatran_uf.with_columns(x.alias("suggested_nome_ibge")) + denatran_uf = denatran_uf.with_columns( + denatran_uf.apply(fix_suggested_nome_ibge)["apply"].alias("suggested_nome_ibge") + ) + municipios_no_denatran = denatran_uf["suggested_nome_ibge"].to_list() + d = set(municipios_no_denatran) - set(municipios_na_bd) + municipios_duplicados = ( + denatran_uf.groupby("suggested_nome_ibge").count().filter(pl.col("count") > 1) + ) + if not municipios_duplicados.is_empty(): + raise ValueError( + f"Existem municípios com mesmo nome do IBGE em {uf}! São eles {municipios_duplicados['suggested_nome_ibge'].to_list()}" + ) + if d: + # This here is probably impossible and shouldn't happen due to the matching coming from the BD data. + # The set difference might occur the other way around, but still, better safe. + raise ValueError(f"Existem municípios em {uf} que não estão na BD.") + match_ibge(denatran_uf, ibge_uf) From a5fc92db9a25c5af02d366f459dcadae48670e7f Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 16 May 2023 22:15:21 -0300 Subject: [PATCH 142/265] Add export task --- pipelines/datasets/br_denatran_frota/handlers.py | 1 + pipelines/datasets/br_denatran_frota/tasks.py | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index fc7b6668c..6052311e8 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -161,3 +161,4 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: def output_file_to_csv(df: pl.DataFrame, filename: str) -> None: df.write_csv(file=f"{OUTPUT_PATH}/{filename}.csv", has_header=True) + return OUTPUT_PATH diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 5ca214f8d..f912e16ac 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -64,7 +64,11 @@ ) import pandas as pd import polars as pl -from pipelines.datasets.br_denatran_frota.handlers import crawl, treat_uf_tipo +from pipelines.datasets.br_denatran_frota.handlers import ( + crawl, + treat_uf_tipo, + output_file_to_csv, +) MONTHS = constants.MONTHS.value DATASET = constants.DATASET.value @@ -83,6 +87,5 @@ def treat_uf_tipo_task(file) -> pl.DataFrame: @task() -def output_file_to_csv(df: pl.DataFrame) -> None: - pass - # df.write_csv(file=f"{OUTPUT_PATH}/{filename}.csv", has_header=True) +def output_file_to_csv_task(df: pl.DataFrame, filename: str) -> None: + output_file_to_csv(df, filename) From 11d9f040e5aab1569cf20cab377311885ffe0994 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 16 May 2023 22:26:19 -0300 Subject: [PATCH 143/265] Change constants to keep things standard --- pipelines/datasets/br_denatran_frota/constants.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index a93cd8c1c..515002d56 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -100,9 +100,9 @@ class constants(Enum): # pylint: disable=c0103 ("TO", "sao valerio da natividade"): "sao valerio", } - DOWNLOAD_PATH = f"pipelines/datasets/{DATASET}/tmp/input" + DOWNLOAD_PATH = f"/tmp/input/{DATASET}" - OUTPUT_PATH = f"pipelines/datasets/{DATASET}/tmp/output" + OUTPUT_PATH = f"/tmp/output/{DATASET}" UF_TIPO_BASIC_FILENAME = "frota_por_uf_e_tipo_de_veiculo" From 242933e9db0a597e3a4451f103e0874aa9cd74e9 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 16 May 2023 22:31:34 -0300 Subject: [PATCH 144/265] Add task for getting the extracted file --- pipelines/datasets/br_denatran_frota/handlers.py | 10 ++++++++++ pipelines/datasets/br_denatran_frota/tasks.py | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 6052311e8..d6647f5af 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -162,3 +162,13 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: def output_file_to_csv(df: pl.DataFrame, filename: str) -> None: df.write_csv(file=f"{OUTPUT_PATH}/{filename}.csv", has_header=True) return OUTPUT_PATH + + +def get_desired_file(year: int, download_directory: str, filetype: str): + directory_to_search = os.path.join(download_directory, "files", f"{year}") + for file in os.listdir(directory_to_search): + if re.search(filetype, file) and file.split(".")[-1] in [ + "xls", + "xlsx", + ]: + return file diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index f912e16ac..6a923ff12 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -68,6 +68,7 @@ crawl, treat_uf_tipo, output_file_to_csv, + get_desired_file, ) MONTHS = constants.MONTHS.value @@ -89,3 +90,8 @@ def treat_uf_tipo_task(file) -> pl.DataFrame: @task() def output_file_to_csv_task(df: pl.DataFrame, filename: str) -> None: output_file_to_csv(df, filename) + + +@task() +def get_desired_file_task(year: int, download_directory: str, filetype: str): + get_desired_file(year, download_directory, filetype) From 048e5e5e607b017486953eec6bd63651f53d83e9 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 16 May 2023 22:38:38 -0300 Subject: [PATCH 145/265] Create first flow --- pipelines/datasets/br_denatran_frota/flows.py | 98 ++++++++++++++----- 1 file changed, 72 insertions(+), 26 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 8fcace90a..5b0d92a06 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -60,7 +60,7 @@ from datetime import datetime, timedelta from prefect.run_configs import KubernetesRun from prefect.storage import GCS -from prefect import Parameter, case, Flow +from prefect import Parameter, case from prefect.tasks.prefect import ( create_flow_run, wait_for_flow_run, @@ -69,49 +69,95 @@ from pipelines.constants import constants as pipelines_constants from pipelines.utils.constants import constants as utils_constants -# from pipelines.utils.decorators import Flow +from pipelines.utils.decorators import Flow from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants from pipelines.utils.tasks import ( create_table_and_upload_to_gcs, rename_current_flow_run_dataset_table, get_current_flow_labels, ) -from pipelines.datasets.br_denatran_frota.tasks import crawl_task, treat_uf_tipo_task +from pipelines.datasets.br_denatran_frota.tasks import ( + crawl_task, + treat_uf_tipo_task, + output_file_to_csv_task, + get_desired_file_task, +) from pipelines.datasets.br_denatran_frota.constants import constants -download_path = constants.DOWNLOAD_PATH.value + # from pipelines.datasets.br_denatran_frota.schedules import every_two_weeks with Flow( name="br_denatran_frota.uf_tipo", - # code_owners=[ - # "Tamir", - # ], + code_owners=[ + "Tamir", + ], ) as br_denatran_frota_uf_tipo: - # dataset_id = Parameter("dataset_id", default="br_denatran_frota") - # table_id = Parameter("table_id", default="uf_tipo") + dataset_id = Parameter("dataset_id", default="br_denatran_frota") + table_id = Parameter("table_id", default="uf_tipo") + + # Materialization mode + materialization_mode = Parameter( + "materialization_mode", default="dev", required=False + ) + + materialize_after_dump = Parameter( + "materialize after dump", default=False, required=False + ) - # # Materialization mode - # materialization_mode = Parameter( - # "materialization_mode", default="dev", required=False - # ) + dbt_alias = Parameter("dbt_alias", default=True, required=False) - # materialize_after_dump = Parameter( - # "materialize after dump", default=False, required=False - # ) + rename_flow_run = rename_current_flow_run_dataset_table( + prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id + ) + # Download the file: + crawled = crawl_task(month=2, year=2021, temp_dir=constants.DOWNLOAD_PATH.value) + # Now get the downloaded file: + uf_tipo_file = get_desired_file_task( + year=2021, + download_directory=constants.DOWNLOAD_PATH.value, + filetype=constants.UF_TIPO_BASIC_FILENAME.value, + upstream_tasks=[crawled], + ) + df = treat_uf_tipo_task(file=uf_tipo_file, upstream_tasks=[uf_tipo_file]) + csv_output = output_file_to_csv_task(df, upstream_tasks=[df]) + wait_upload_table = create_table_and_upload_to_gcs( + data_path=csv_output, + dataset_id=dataset_id, + table_id=table_id, + dump_mode="append", + wait=csv_output, + ) - # dbt_alias = Parameter("dbt_alias", default=True, required=False) + with case(materialize_after_dump, True): + # Trigger DBT flow run + current_flow_labels = get_current_flow_labels() + materialization_flow = create_flow_run( + flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, + project_name=pipelines_constants.PREFECT_DEFAULT_PROJECT.value, + parameters={ + "dataset_id": dataset_id, + "table_id": table_id, + "mode": materialization_mode, + "dbt_alias": dbt_alias, + }, + labels=current_flow_labels, + run_name=f"Materialize {dataset_id}.{table_id}", + ) - # rename_flow_run = rename_current_flow_run_dataset_table( - # prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id - # ) - crawled = crawl_task( - month=2, year=2021, temp_dir=download_path - ) # Download the desired files. - uf_tipo_file = "/home/tamir/basedosdados/pipelines/pipelines/datasets/br_denatran_frota/tmp/input/files/2021/frota_por_uf_e_tipo_de_veículo_2-2021.xls" - df = treat_uf_tipo_task(file=uf_tipo_file, upstream_tasks=[crawled]) + wait_for_materialization = wait_for_flow_run( + materialization_flow, + stream_states=True, + stream_logs=True, + raise_final_state=True, + ) + wait_for_materialization.max_retries = ( + dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value + ) + wait_for_materialization.retry_delay = timedelta( + seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value + ) - print("foi?") br_denatran_frota_uf_tipo.storage = GCS(pipelines_constants.GCS_FLOWS_BUCKET.value) br_denatran_frota_uf_tipo.run_config = KubernetesRun( From f949e0cd8376bb33cfab2eed1a1ba6fd80af25f8 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 16 May 2023 22:41:43 -0300 Subject: [PATCH 146/265] Ignore my local run file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index aa41b1ff4..b8ce2db36 100644 --- a/.gitignore +++ b/.gitignore @@ -142,3 +142,4 @@ notebooks/ /tests/ poetry.lock pipelines/datasets/br_denatran_frota/todo_list.txt +pipelines/datasets/br_denatran_frota/run_local.py From ef7500982e0c852ad6715ea8a9235a0ede439a5f Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 17 May 2023 00:44:10 -0300 Subject: [PATCH 147/265] The flow should work but... --- pipelines/datasets/br_denatran_frota/flows.py | 12 +++++++---- .../datasets/br_denatran_frota/handlers.py | 3 ++- pipelines/datasets/br_denatran_frota/tasks.py | 9 -------- .../datasets/br_denatran_frota/tasks_test.py | 21 ++++++++++++++++++- 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 5b0d92a06..a38ba4e04 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -65,7 +65,7 @@ create_flow_run, wait_for_flow_run, ) - +import os from pipelines.constants import constants as pipelines_constants from pipelines.utils.constants import constants as utils_constants @@ -93,6 +93,7 @@ "Tamir", ], ) as br_denatran_frota_uf_tipo: + year = 2021 dataset_id = Parameter("dataset_id", default="br_denatran_frota") table_id = Parameter("table_id", default="uf_tipo") @@ -111,16 +112,19 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) # Download the file: - crawled = crawl_task(month=2, year=2021, temp_dir=constants.DOWNLOAD_PATH.value) + crawled = crawl_task(month=2, year=year, temp_dir=constants.DOWNLOAD_PATH.value) # Now get the downloaded file: uf_tipo_file = get_desired_file_task( - year=2021, + year=year, download_directory=constants.DOWNLOAD_PATH.value, filetype=constants.UF_TIPO_BASIC_FILENAME.value, upstream_tasks=[crawled], ) + print(uf_tipo_file) df = treat_uf_tipo_task(file=uf_tipo_file, upstream_tasks=[uf_tipo_file]) - csv_output = output_file_to_csv_task(df, upstream_tasks=[df]) + csv_output = output_file_to_csv_task( + df, constants.UF_TIPO_BASIC_FILENAME, upstream_tasks=[df] + ) wait_upload_table = create_table_and_upload_to_gcs( data_path=csv_output, dataset_id=dataset_id, diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index d6647f5af..b9c1ef4bf 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -171,4 +171,5 @@ def get_desired_file(year: int, download_directory: str, filetype: str): "xls", "xlsx", ]: - return file + return os.path.join(directory_to_search, file) + raise ValueError("No files found buckaroo") diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 6a923ff12..411b01fc6 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -53,15 +53,6 @@ import glob import os from pipelines.datasets.br_denatran_frota.constants import constants -from pipelines.datasets.br_denatran_frota.utils import ( - make_dir_when_not_exists, - extract_links_post_2012, - verify_total, - change_df_header, - guess_header, - get_year_month_from_filename, - call_downloader, -) import pandas as pd import polars as pl from pipelines.datasets.br_denatran_frota.handlers import ( diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 021d33808..5ebfd1aea 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -6,7 +6,11 @@ import re from parameterized import parameterized -from pipelines.datasets.br_denatran_frota.handlers import crawl, treat_uf_tipo +from pipelines.datasets.br_denatran_frota.handlers import ( + crawl, + treat_uf_tipo, + get_desired_file, +) from pipelines.datasets.br_denatran_frota.constants import constants DATASET = constants.DATASET.value @@ -64,6 +68,9 @@ def tearDown(self): def test_treat_files_uf_tipo(self, month, year): crawl(month, year, self.temp_dir.name) directory_to_search = os.path.join(self.temp_dir.name, "files", f"{year}") + get_desired_file( + year, + ) for file in os.listdir(directory_to_search): if re.search(UF_TIPO_BASIC_FILENAME, file) and file.split(".")[-1] in [ "xls", @@ -72,6 +79,18 @@ def test_treat_files_uf_tipo(self, month, year): treated_df = treat_uf_tipo(os.path.join(directory_to_search, file)) self.assertEqual(len(treated_df), 21 * 27) + def test_flow(self): + year = 2021 + crawl(month=2, year=year, temp_dir=constants.DOWNLOAD_PATH.value) + # Now get the downloaded file: + uf_tipo_file = get_desired_file( + year=year, + download_directory=constants.DOWNLOAD_PATH.value, + filetype=constants.UF_TIPO_BASIC_FILENAME.value, + ) + print(uf_tipo_file) + treat_uf_tipo(file=uf_tipo_file) + if __name__ == "__main__": unittest.main() From 98c6217f0b0cc5174f503f3e619584b357b60197 Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 17 May 2023 01:51:37 -0300 Subject: [PATCH 148/265] yeah the flow still sucks i'm stupid --- pipelines/datasets/br_denatran_frota/flows.py | 10 +++++++--- pipelines/datasets/br_denatran_frota/tasks.py | 6 ++++++ pipelines/datasets/br_denatran_frota/tasks_test.py | 4 +++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index a38ba4e04..bd2326ea2 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -65,6 +65,9 @@ create_flow_run, wait_for_flow_run, ) +from pipelines.utils.utils import ( + log, +) import os from pipelines.constants import constants as pipelines_constants from pipelines.utils.constants import constants as utils_constants @@ -111,17 +114,18 @@ rename_flow_run = rename_current_flow_run_dataset_table( prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - # Download the file: + log("Downloading file") crawled = crawl_task(month=2, year=year, temp_dir=constants.DOWNLOAD_PATH.value) # Now get the downloaded file: + log("Accessing downloaded file") uf_tipo_file = get_desired_file_task( year=year, download_directory=constants.DOWNLOAD_PATH.value, filetype=constants.UF_TIPO_BASIC_FILENAME.value, upstream_tasks=[crawled], ) - print(uf_tipo_file) - df = treat_uf_tipo_task(file=uf_tipo_file, upstream_tasks=[uf_tipo_file]) + log(uf_tipo_file) + df = treat_uf_tipo_task(file=uf_tipo_file, upstream_tasks=[crawled, uf_tipo_file]) csv_output = output_file_to_csv_task( df, constants.UF_TIPO_BASIC_FILENAME, upstream_tasks=[df] ) diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 411b01fc6..a9769e88e 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -61,6 +61,11 @@ output_file_to_csv, get_desired_file, ) +from pipelines.utils.utils import ( + clean_dataframe, + to_partitions, + log, +) MONTHS = constants.MONTHS.value DATASET = constants.DATASET.value @@ -75,6 +80,7 @@ def crawl_task(month: int, year: int, temp_dir: str = ""): @task() def treat_uf_tipo_task(file) -> pl.DataFrame: + log(file) treat_uf_tipo(file) diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 5ebfd1aea..2ed66f8bb 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -4,6 +4,7 @@ import tempfile import unittest import re +import polars as pl from parameterized import parameterized from pipelines.datasets.br_denatran_frota.handlers import ( @@ -89,7 +90,8 @@ def test_flow(self): filetype=constants.UF_TIPO_BASIC_FILENAME.value, ) print(uf_tipo_file) - treat_uf_tipo(file=uf_tipo_file) + df = treat_uf_tipo(file=uf_tipo_file) + self.assertTrue(type(df), pl.DataFrame) if __name__ == "__main__": From faeda9f41dc5e662bb2d78a7e6a65f6dbc9ca4ef Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 19 May 2023 00:34:30 -0300 Subject: [PATCH 149/265] The first flow gets to Google Cloud --- pipelines/datasets/br_denatran_frota/handlers.py | 8 ++++++++ pipelines/datasets/br_denatran_frota/tasks.py | 9 +++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index b9c1ef4bf..c401599b1 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -68,6 +68,11 @@ import pandas as pd import polars as pl from zipfile import ZipFile +from pipelines.utils.utils import ( + clean_dataframe, + to_partitions, + log, +) MONTHS = constants.MONTHS.value DATASET = constants.DATASET.value @@ -160,16 +165,19 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: def output_file_to_csv(df: pl.DataFrame, filename: str) -> None: + make_dir_when_not_exists(OUTPUT_PATH) df.write_csv(file=f"{OUTPUT_PATH}/{filename}.csv", has_header=True) return OUTPUT_PATH def get_desired_file(year: int, download_directory: str, filetype: str): directory_to_search = os.path.join(download_directory, "files", f"{year}") + log(f"Directory: {directory_to_search}") for file in os.listdir(directory_to_search): if re.search(filetype, file) and file.split(".")[-1] in [ "xls", "xlsx", ]: + log(f"File: {file}") return os.path.join(directory_to_search, file) raise ValueError("No files found buckaroo") diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index a9769e88e..902851246 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -75,20 +75,21 @@ @task() # noqa def crawl_task(month: int, year: int, temp_dir: str = ""): - crawl(month, year, temp_dir) + return crawl(month, year, temp_dir) @task() def treat_uf_tipo_task(file) -> pl.DataFrame: log(file) - treat_uf_tipo(file) + return treat_uf_tipo(file) @task() def output_file_to_csv_task(df: pl.DataFrame, filename: str) -> None: - output_file_to_csv(df, filename) + log(filename) + return output_file_to_csv(df, filename) @task() def get_desired_file_task(year: int, download_directory: str, filetype: str): - get_desired_file(year, download_directory, filetype) + return get_desired_file(year, download_directory, filetype) From 39300de5217149752de67d913e26ad36aaba3aa0 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 19 May 2023 01:10:45 -0300 Subject: [PATCH 150/265] Type hints in handlers.py --- pipelines/datasets/br_denatran_frota/handlers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index c401599b1..e31712d46 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -83,7 +83,7 @@ MUNIC_TIPO_BASIC_FILENAME = constants.MUNIC_TIPO_BASIC_FILENAME.value -def crawl(month: int, year: int, temp_dir: str = ""): +def crawl(month: int, year: int, temp_dir: str = "") -> None: """Função principal para baixar os dados de frota por município e tipo e também por UF e tipo. Args: @@ -170,7 +170,7 @@ def output_file_to_csv(df: pl.DataFrame, filename: str) -> None: return OUTPUT_PATH -def get_desired_file(year: int, download_directory: str, filetype: str): +def get_desired_file(year: int, download_directory: str, filetype: str) -> str: directory_to_search = os.path.join(download_directory, "files", f"{year}") log(f"Directory: {directory_to_search}") for file in os.listdir(directory_to_search): From 9fd41022f5191c1e6f40cd5c88045173f36c878d Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 19 May 2023 01:14:14 -0300 Subject: [PATCH 151/265] Add type hints to task --- pipelines/datasets/br_denatran_frota/tasks.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 902851246..2c8738990 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -62,8 +62,6 @@ get_desired_file, ) from pipelines.utils.utils import ( - clean_dataframe, - to_partitions, log, ) @@ -74,7 +72,7 @@ @task() # noqa -def crawl_task(month: int, year: int, temp_dir: str = ""): +def crawl_task(month: int, year: int, temp_dir: str = "") -> None: return crawl(month, year, temp_dir) @@ -91,5 +89,5 @@ def output_file_to_csv_task(df: pl.DataFrame, filename: str) -> None: @task() -def get_desired_file_task(year: int, download_directory: str, filetype: str): +def get_desired_file_task(year: int, download_directory: str, filetype: str) -> str: return get_desired_file(year, download_directory, filetype) From d3bd53a2707a62a62d2accf4e225b66808a424b3 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 19 May 2023 01:16:45 -0300 Subject: [PATCH 152/265] Cleanup --- .../datasets/br_denatran_frota/handlers.py | 49 +------------------ 1 file changed, 2 insertions(+), 47 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index e31712d46..c2c0c6391 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -1,54 +1,9 @@ # -*- coding: utf-8 -*- """ -Tasks for br_denatran_frota +Handlers for br_denatran_frota +This is merely a way to have functions that are called by tasks but can be tested with unit tests and debugging. """ -############################################################################### -# -# Aqui é onde devem ser definidas as tasks para os flows do projeto. -# Cada task representa um passo da pipeline. Não é estritamente necessário -# tratar todas as exceções que podem ocorrer durante a execução de uma task, -# mas é recomendável, ainda que não vá implicar em uma quebra no sistema. -# Mais informações sobre tasks podem ser encontradas na documentação do -# Prefect: https://docs.prefect.io/core/concepts/tasks.html -# -# De modo a manter consistência na codebase, todo o código escrito passará -# pelo pylint. Todos os warnings e erros devem ser corrigidos. -# -# As tasks devem ser definidas como funções comuns ao Python, com o decorador -# @task acima. É recomendado inserir type hints para as variáveis. -# -# Um exemplo de task é o seguinte: -# -# ----------------------------------------------------------------------------- -# from prefect import task -# -# @task -# def my_task(param1: str, param2: int) -> str: -# """ -# My task description. -# """ -# return f'{param1} {param2}' -# ----------------------------------------------------------------------------- -# -# Você também pode usar pacotes Python arbitrários, como numpy, pandas, etc. -# -# ----------------------------------------------------------------------------- -# from prefect import task -# import numpy as np -# -# @task -# def my_task(a: np.ndarray, b: np.ndarray) -> str: -# """ -# My task description. -# """ -# return np.add(a, b) -# ----------------------------------------------------------------------------- -# -# Abaixo segue um código para exemplificação, que pode ser removido. -# -############################################################################### - from prefect import task import os import re From fa1e04b33cb622e21ef813008452931a417303e9 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 19 May 2023 01:24:19 -0300 Subject: [PATCH 153/265] Guess header refactor --- .../br_denatran_frota/functions_test.py | 45 ------------------- .../datasets/br_denatran_frota/handlers.py | 2 +- pipelines/datasets/br_denatran_frota/utils.py | 14 ++++-- 3 files changed, 12 insertions(+), 49 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/functions_test.py b/pipelines/datasets/br_denatran_frota/functions_test.py index f435c762f..11657cdd2 100644 --- a/pipelines/datasets/br_denatran_frota/functions_test.py +++ b/pipelines/datasets/br_denatran_frota/functions_test.py @@ -71,51 +71,6 @@ def test_download_frota_with_invalid_month(self): crawl(13, 2013) -class TestGuessHeader(unittest.TestCase): - def test_correct_header_guess(self): - # Test case 1: Correct header guess - df = pd.DataFrame( - { - "A": ["Name", "Alice", "Bob"], - "B": ["Age", 30, 40], - "C": ["Country", "USA", "Canada"], - } - ) - self.assertEqual(guess_header(df), 0) # Header is in the first row - - def test_no_header_found(self): - # Test case 2: No header found - df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]}) - self.assertEqual( - guess_header(df), 0 - ) # Header is assumed to be in the first row - - def test_header_found_beyond_max_header_guess(self): - # Test case 3: Header found beyond max_header_guess - df = pd.DataFrame( - {"A": [1, 2, 3], "B": [4, 5, 6], "C": ["Name", "Alice", "Bob"]} - ) - self.assertEqual( - guess_header(df, max_header_guess=2), 0 - ) # Header is assumed to be in the first row - - def test_empty_dataframe(self): - # Test case 4: Empty dataframe - df = pd.DataFrame() - self.assertEqual( - guess_header(df), 0 - ) # Header is assumed to be in the first row - - def test_all_columns_are_strings_not_in_header_row(self): - # Test case 5: All columns are strings but not in header row - df = pd.DataFrame( - {"A": ["1", "2", "3"], "B": ["4", "5", "6"], "C": ["7", "8", "9"]} - ) - self.assertEqual( - guess_header(df), len(df) - 1 - ) # Header is assumed to be in the last row - - class TestFilenameExtraction(unittest.TestCase): def test_correct_file(self): filename = "indicator_2-2022.xlsx" diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index c2c0c6391..a9f78822b 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -89,7 +89,7 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: # TODO: Aqui você invoca o capeta e chama o R pra ler e salvar isso como df. Isso é ridículo mas funcionou. df = call_r_to_read_file(file) - new_df = change_df_header(df, guess_header(df)) + new_df = change_df_header(df, guess_header(df=df, type_of_file="UF")) # This is ad hoc for UF_tipo. new_df.rename( columns={new_df.columns[0]: "sigla_uf"}, inplace=True diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 8f2bb3913..4c0e4db7b 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -57,7 +57,9 @@ UF_TIPO_HEADER = constants.UF_TIPO_HEADER.value -def guess_header(df: pd.DataFrame, max_header_guess: int = 10) -> int: +def guess_header( + df: pd.DataFrame, type_of_file: str, max_header_guess: int = 10 +) -> int: """Function to deal with problematic dataframes coming from Excel/CSV files. Tries to guess which row is the header by examining the first few rows (max given by max_header_guess). Assumes that the header is the first row where all of the columns are strings. @@ -70,6 +72,12 @@ def guess_header(df: pd.DataFrame, max_header_guess: int = 10) -> int: Returns: int: Index of the row where the header is contained. """ + if type_of_file == "UF": + expected_header = UF_TIPO_HEADER + elif type_of_file == "Municipio": + pass + else: + raise ValueError("Unrecognized type of dataframe.") header_guess = 0 while header_guess < max_header_guess: if len(df) - 1 < header_guess: @@ -78,10 +86,10 @@ def guess_header(df: pd.DataFrame, max_header_guess: int = 10) -> int: # if is_int_row(df.iloc[header_guess]): current_row = df.iloc[header_guess].to_list() equal_column_names = [ - (x, y) for x, y in zip(UF_TIPO_HEADER, current_row) if x == y + (x, y) for x, y in zip(expected_header, current_row) if x == y ] if ( - len(equal_column_names) / len(UF_TIPO_HEADER) > 0.7 + len(equal_column_names) / len(expected_header) > 0.7 ): # If 70% of the columns match, this is the header. return header_guess header_guess += 1 From c65d8041b3b033f6a117bace7ce14bb4eda1ef51 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 19 May 2023 01:31:42 -0300 Subject: [PATCH 154/265] Fixed function call --- pipelines/datasets/br_denatran_frota/tasks_test.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 2ed66f8bb..61412da50 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -69,9 +69,7 @@ def tearDown(self): def test_treat_files_uf_tipo(self, month, year): crawl(month, year, self.temp_dir.name) directory_to_search = os.path.join(self.temp_dir.name, "files", f"{year}") - get_desired_file( - year, - ) + get_desired_file(year, self.temp_dir.name, UF_TIPO_BASIC_FILENAME) for file in os.listdir(directory_to_search): if re.search(UF_TIPO_BASIC_FILENAME, file) and file.split(".")[-1] in [ "xls", From ae14b15c54880f3e325cf4fc8bed647553376cce Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 19 May 2023 01:43:18 -0300 Subject: [PATCH 155/265] Create function for UF Tipo and handler --- .../code/frota_municipio_tipo.py | 53 ++++++++++--------- .../datasets/br_denatran_frota/handlers.py | 35 +++++++++++- 2 files changed, 61 insertions(+), 27 deletions(-) diff --git a/br_denatran_frota/code/frota_municipio_tipo.py b/br_denatran_frota/code/frota_municipio_tipo.py index 00f387618..3406559f1 100644 --- a/br_denatran_frota/code/frota_municipio_tipo.py +++ b/br_denatran_frota/code/frota_municipio_tipo.py @@ -12,9 +12,6 @@ verify_total, ) from br_denatran_frota.code.constants import DICT_UFS, SUBSTITUTIONS - -## TODO: Extract everything then run this? Create prefect? where to go now - import basedosdados as bd @@ -44,28 +41,32 @@ def verify_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str) -> None match_ibge(denatran_uf, ibge_uf) -municipios_query = """SELECT nome, id_municipio, sigla_uf FROM `basedosdados.br_bd_diretorios_brasil.municipio` -""" -bd_municipios = bd.read_sql(municipios_query, "tamir-pipelines") -bd_municipios = pl.from_pandas(bd_municipios) +def treat_municipio_tipo(file: str): + municipios_query = """SELECT nome, id_municipio, sigla_uf FROM `basedosdados.br_bd_diretorios_brasil.municipio` + """ + bd_municipios = bd.read_sql( + municipios_query, "tamir-pipelines" + ) # Hardcoded, not good. + bd_municipios = pl.from_pandas(bd_municipios) -file = "br_denatran_frota/files/2022/frota_por_município_e_tipo_2-2022.xls" # Hardcode problem -filename = os.path.split(file)[1] -df = pd.read_excel(file) -new_df = change_df_header(df, guess_header(df)) -new_df.rename( - columns={new_df.columns[0]: "sigla_uf", new_df.columns[1]: "nome_denatran"}, - inplace=True, -) # Rename for ease of use. -new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace. -new_df = pl.from_pandas(new_df) -new_df = new_df.with_columns(pl.col("nome_denatran").apply(asciify).str.to_lowercase()) -new_df = new_df.filter(pl.col("nome_denatran") != "municipio nao informado") -if new_df.shape[0] > bd_municipios.shape[0]: - raise ValueError( - f"Atenção: a base do Denatran tem {new_df.shape[0]} linhas e isso é mais municípios do que a BD com {bd_municipios.shape[0]}" + # filename = os.path.split(file)[1] + df = pd.read_excel(file) + new_df = change_df_header(df, guess_header(df)) + new_df.rename( + columns={new_df.columns[0]: "sigla_uf", new_df.columns[1]: "nome_denatran"}, + inplace=True, + ) # Rename for ease of use. + new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace. + new_df = pl.from_pandas(new_df) + new_df = new_df.with_columns( + pl.col("nome_denatran").apply(asciify).str.to_lowercase() ) - -verify_total(new_df) -for uf in DICT_UFS: - verify_uf(new_df, bd_municipios, uf) + new_df = new_df.filter(pl.col("nome_denatran") != "municipio nao informado") + if new_df.shape[0] > bd_municipios.shape[0]: + raise ValueError( + f"Atenção: a base do Denatran tem {new_df.shape[0]} linhas e isso é mais municípios do que a BD com {bd_municipios.shape[0]}" + ) + verify_total(new_df) + for uf in DICT_UFS: + verify_uf(new_df, bd_municipios, uf) + return new_df diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index a9f78822b..11874b12e 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -4,9 +4,9 @@ This is merely a way to have functions that are called by tasks but can be tested with unit tests and debugging. """ -from prefect import task import os import re +import basedosdados as bd from pipelines.datasets.br_denatran_frota.constants import constants from pipelines.datasets.br_denatran_frota.utils import ( make_dir_when_not_exists, @@ -19,9 +19,11 @@ download_file, extraction_pre_2012, call_r_to_read_file, + verify_uf, ) import pandas as pd import polars as pl +from string_utils import asciify from zipfile import ZipFile from pipelines.utils.utils import ( clean_dataframe, @@ -136,3 +138,34 @@ def get_desired_file(year: int, download_directory: str, filetype: str) -> str: log(f"File: {file}") return os.path.join(directory_to_search, file) raise ValueError("No files found buckaroo") + + +def treat_municipio_tipo(file: str): + municipios_query = """SELECT nome, id_municipio, sigla_uf FROM `basedosdados.br_bd_diretorios_brasil.municipio` + """ + bd_municipios = bd.read_sql( + municipios_query, "tamir-pipelines" + ) # Hardcoded, not good. + bd_municipios = pl.from_pandas(bd_municipios) + + # filename = os.path.split(file)[1] + df = pd.read_excel(file) + new_df = change_df_header(df, guess_header(df)) + new_df.rename( + columns={new_df.columns[0]: "sigla_uf", new_df.columns[1]: "nome_denatran"}, + inplace=True, + ) # Rename for ease of use. + new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace. + new_df = pl.from_pandas(new_df) + new_df = new_df.with_columns( + pl.col("nome_denatran").apply(asciify).str.to_lowercase() + ) + new_df = new_df.filter(pl.col("nome_denatran") != "municipio nao informado") + if new_df.shape[0] > bd_municipios.shape[0]: + raise ValueError( + f"Atenção: a base do Denatran tem {new_df.shape[0]} linhas e isso é mais municípios do que a BD com {bd_municipios.shape[0]}" + ) + verify_total(new_df) + for uf in DICT_UFS: + verify_uf(new_df, bd_municipios, uf) + return new_df From a7c9ae97e84586c29fdd1b1a9a6cb803d881150d Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 21 May 2023 05:02:22 -0300 Subject: [PATCH 156/265] Adds docstring checker for linting --- poetry.lock | 34 ++++++++++++++++++++++++++++++++-- pyproject.toml | 1 + 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index 0d7b69689..d151760db 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. [[package]] name = "appnope" @@ -2914,6 +2914,24 @@ google-auth = "*" google-auth-oauthlib = "*" setuptools = "*" +[[package]] +name = "pydocstyle" +version = "6.3.0" +description = "Python docstring style checker" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019"}, + {file = "pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1"}, +] + +[package.dependencies] +snowballstemmer = ">=2.2.0" + +[package.extras] +toml = ["tomli (>=1.2.3)"] + [[package]] name = "pygments" version = "2.15.1" @@ -3594,6 +3612,18 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] + [[package]] name = "sortedcontainers" version = "2.4.0" @@ -4073,4 +4103,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "b71c70a89ed59dde03e0fb6cfbd9128e21edfa21a161f5a52c8fc5b28ed187f5" +content-hash = "88418bb0e507f91de17af411b1da5cc9e6709f4a993442e23a1828fd1301d95f" diff --git a/pyproject.toml b/pyproject.toml index 7997830df..0e8f3db01 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -118,6 +118,7 @@ typer = "<=0.4.0" pytest = "^7.2.2" parameterized = "^0.9.0" ipykernel = "^6.22.0" +pydocstyle = "^6.3.0" [build-system] From bb8c9ab26801a73e693d10778591525ce49a96ab Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 21 May 2023 05:02:40 -0300 Subject: [PATCH 157/265] General cleanup --- .../datasets/br_denatran_frota/handlers.py | 4 +- pipelines/datasets/br_denatran_frota/utils.py | 41 +++++++++++++++---- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 11874b12e..42e4997c2 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -18,7 +18,7 @@ call_downloader, download_file, extraction_pre_2012, - call_r_to_read_file, + call_r_to_read_excel, verify_uf, ) import pandas as pd @@ -89,7 +89,7 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: df = pd.read_excel(file, sheet_name=correct_sheet) except UnicodeDecodeError: # TODO: Aqui você invoca o capeta e chama o R pra ler e salvar isso como df. Isso é ridículo mas funcionou. - df = call_r_to_read_file(file) + df = call_r_to_read_excel(file) new_df = change_df_header(df, guess_header(df=df, type_of_file="UF")) # This is ad hoc for UF_tipo. diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 4c0e4db7b..e472db098 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -257,6 +257,14 @@ def download_file(url, filename): def generic_extractor(dest_path_file: str): + """_summary_ + + Args: + dest_path_file (str): _description_ + + Raises: + ValueError: _description_ + """ extension = dest_path_file.split(".")[-1] if extension == "rar": extractor_function = RarFile @@ -387,8 +395,15 @@ def extract_links_post_2012(month: int, year: int, directory: str) -> list[dict] def extraction_pre_2012(month: int, year: int, year_dir_name: str, zip_file: str): + """_summary_ + + Args: + month (int): _description_ + year (int): _description_ + year_dir_name (str): _description_ + zip_file (str): _description_ + """ # Aí depois eu preciso andar pelo zip: - print("Bom dia") with ZipFile(zip_file, "r") as g: compressed_files = [file for file in g.infolist() if not file.is_dir()] new_filename = None @@ -407,10 +422,9 @@ def extraction_pre_2012(month: int, year: int, year_dir_name: str, zip_file: str if new_filename: g.extract(file, path=year_dir_name) os.rename(f"{year_dir_name}/{file.filename}", new_filename) - print("Bom dia") -def make_dir_when_not_exists(dir_name: str): +def make_dir_when_not_exists(dir_name: str) -> None: """Auxiliary function to create a subdirectory when it is not present. Args: @@ -418,10 +432,21 @@ def make_dir_when_not_exists(dir_name: str): """ if not os.path.exists(dir_name): os.makedirs(dir_name) + return None + +def call_r_to_read_excel(file: str) -> pd.DataFrame: + """Use rpy2 to call R's readxl for problematic Excel files and then keep reading them as dataframes. -def call_r_to_read_file(file: str) -> pd.DataFrame: - # Install and load the required R packages + Args: + file (str): The full filepath that needs to be opened. + + Raises: + ValueError: If the desired file is not an actual file. + + Returns: + pd.DataFrame: Returns a pandas dataframe with the excel file's content. + """ if not os.path.isfile(file): raise ValueError("Invalid file") packages = ("readxl",) @@ -441,7 +466,6 @@ def call_r_to_read_file(file: str) -> pd.DataFrame: """ ) - # Convert the R dataframe to a pandas dataframe df = robjects.r["df"] df = pd.DataFrame(dict(zip(df.names, list(df)))) @@ -449,7 +473,8 @@ def call_r_to_read_file(file: str) -> pd.DataFrame: def verify_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str) -> None: - """Function to take the DENATRAN data at municipality level and compare it to the IBGE data. + """Take the DENATRAN data at municipality level and compare it to the IBGE data. + This will filter by the uf argument and do all comparisons to ensure consistency. Args: @@ -459,7 +484,7 @@ def verify_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str) -> None Raises: ValueError: If there are somehow municipalities in the DENATRAN data that do not exist in the IBGE data. Very unlikely. - ValueError: If there are two municipalities in the DENATRAN data + ValueError: If there are two municipalities in the DENATRAN data with the same IBGE name in the same state. """ denatran_uf = denatran_df.filter(pl.col("sigla_uf") == uf) ibge_uf = ibge_df.filter(pl.col("sigla_uf") == uf) From c45d0459665e2a940c53417aedddf0f9724e784a Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 21 May 2023 15:22:19 -0300 Subject: [PATCH 158/265] Documentations in progress --- pipelines/datasets/br_denatran_frota/utils.py | 56 ++++++++++++------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index e472db098..6cd6f083f 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -60,17 +60,18 @@ def guess_header( df: pd.DataFrame, type_of_file: str, max_header_guess: int = 10 ) -> int: - """Function to deal with problematic dataframes coming from Excel/CSV files. - Tries to guess which row is the header by examining the first few rows (max given by max_header_guess). - Assumes that the header is the first row where all of the columns are strings. - This will NOT properly work for a strings only dataframe and will always guess the first row for it. + """Search for expected header in dataframe. Args: - df (pd.DataFrame): Dataframe whose header we don't know. - max_header_guess (int, optional): Number of initial rows we want to check. Defaults to 4. + df (pd.DataFrame): Dataframe whose header we don't know + type_of_file (str): _description_ + max_header_guess (int, optional): _description_. Defaults to 10. + + Raises: + ValueError: _description_ Returns: - int: Index of the row where the header is contained. + int: _description_ """ if type_of_file == "UF": expected_header = UF_TIPO_HEADER @@ -82,8 +83,6 @@ def guess_header( while header_guess < max_header_guess: if len(df) - 1 < header_guess: break - # If this row minus the first column can be converted to int, then - # if is_int_row(df.iloc[header_guess]): current_row = df.iloc[header_guess].to_list() equal_column_names = [ (x, y) for x, y in zip(expected_header, current_row) if x == y @@ -128,7 +127,7 @@ def is_int_row(row): def get_year_month_from_filename(filename: str) -> tuple[int, int]: - """Helper to extract month and year information from files named indicator_month-year.xls + """Extract month and year information from files named indicator_month-year.xls. Args: filename (str): Name of the file. @@ -149,7 +148,8 @@ def get_year_month_from_filename(filename: str) -> tuple[int, int]: def verify_total(df: pl.DataFrame) -> None: - """Helper function that is meant to act as a guard to guarantee that we can pivot from wide to long. + """Verify that we can pivot from wide to long. + Essentially, gets a Wide dataframe, excludes all string columns and the TOTAL column and sums it all row wise. Then verifies if the calculated total column is the same as the TOTAL column. If not, raises an error. @@ -174,7 +174,8 @@ def verify_total(df: pl.DataFrame) -> None: def fix_suggested_nome_ibge(row: tuple[str, ...]) -> str: - """Gets a row from a dataframe and applies the SUBSTITUTIONS constant ruleset where applicable. + """Get a row from a dataframe and applies the SUBSTITUTIONS constant ruleset where applicable. + This fixes the dataframe to have the names of municipalities according to IBGE. The fixes are necessary because match_ibge() will fail where the DENATRAN data has typos in city names. @@ -197,7 +198,8 @@ def fix_suggested_nome_ibge(row: tuple[str, ...]) -> str: def match_ibge(denatran_uf: pl.DataFrame, ibge_uf: pl.DataFrame) -> None: - """Takes a dataframe of the Denatran data and an IBGE dataframe of municipalities. + """Take a dataframe of the Denatran data and an IBGE dataframe of municipalities. + Joins them using the IBGE name of both. The IBGE name of denatran_uf is ideally filled via get_city_name(). This verifies if there are any municipalities in denatran_uf that have no corresponding municipality in the IBGE database. These must be manually fixed via the constants file and the fix_suggested_nome function. @@ -224,7 +226,8 @@ def match_ibge(denatran_uf: pl.DataFrame, ibge_uf: pl.DataFrame) -> None: def get_city_name_ibge(denatran_name: str, ibge_uf: pl.DataFrame) -> str: - """Gets the closest match to the denatran name of the municipality in the IBGE dataframe of the same state. + """Get the closest match to the denatran name of the municipality in the IBGE dataframe of the same state. + This ibge_uf dataframe is pulled directly from Base dos Dados to ensure correctness. Returns either the match or an empty string in case no match is found. @@ -244,7 +247,15 @@ def get_city_name_ibge(denatran_name: str, ibge_uf: pl.DataFrame) -> str: return "" # I don't want this to error out directly, because then I can get all municipalities. -def download_file(url, filename): +def download_file(url: str, filename: str) -> None: + """Download a file from a url using a simple open + get request. + + Only necessary because some problematic URLs report a 404 despite the files being there. + + Args: + url (str): URL where the desired file is located. + filename (str): Filename to write the contents of the HTTP request to. + """ # Send a GET request to the URL new_url = url.replace("arquivos-denatran", "arquivos-senatran") @@ -257,13 +268,13 @@ def download_file(url, filename): def generic_extractor(dest_path_file: str): - """_summary_ + """Extract the desired DENATRAN compressed files from .rar or .zip file. Args: - dest_path_file (str): _description_ + dest_path_file (str): Filepath of the compressed file whose contents should be extracted. Raises: - ValueError: _description_ + ValueError: If the passed argument is not a .rar or .zip file. """ extension = dest_path_file.split(".")[-1] if extension == "rar": @@ -291,7 +302,7 @@ def generic_extractor(dest_path_file: str): def make_filename(i: dict, ext: bool = True) -> str: - """Creates the filename using the sent dictionary. + """Create the filename using the sent dictionary. Args: i (dict): Dictionary with all the file's info. @@ -317,6 +328,11 @@ def make_filename(i: dict, ext: bool = True) -> str: def call_downloader(i: dict): + """Call other download functions in the correct order according to filetype. + + Args: + i (dict): Dictionary with the file's information. + """ filename = make_filename(i) if i["filetype"] in ["xlsx", "xls"]: download_file(i["href"], filename) @@ -358,7 +374,7 @@ def make_filename_pre_2012( def extract_links_post_2012(month: int, year: int, directory: str) -> list[dict]: - """Extracts links of the Denatran files post 2012. + """Extract links of the Denatran files post 2012. Args: year (int): A year starting from 2013 onwards. From 9baf53098d8a729cee69b26b3d6915ebff039ffd Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 21 May 2023 15:24:29 -0300 Subject: [PATCH 159/265] More cleanup --- pipelines/datasets/br_denatran_frota/utils.py | 27 ------------------- 1 file changed, 27 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 6cd6f083f..6a5c1a48e 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -3,33 +3,6 @@ General purpose functions for the br_denatran_frota project """ -############################################################################### -# -# Esse é um arquivo onde podem ser declaratas funções que serão usadas -# pelo projeto br_denatran_frota. -# -# Por ser um arquivo opcional, pode ser removido sem prejuízo ao funcionamento -# do projeto, caos não esteja em uso. -# -# Para declarar funções, basta fazer em código Python comum, como abaixo: -# -# ``` -# def foo(): -# """ -# Function foo -# """ -# print("foo") -# ``` -# -# Para usá-las, basta fazer conforme o exemplo abaixo: -# -# ```py -# from pipelines.datasets.br_denatran_frota.utils import foo -# foo() -# ``` -# -############################################################################### -# -*- coding: utf-8 -*- import pandas as pd import polars as pl import difflib From 570ce51dfad9b1def4fc20138743fc357ce98261 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 21 May 2023 15:53:54 -0300 Subject: [PATCH 160/265] Using enums + cleanup --- .../datasets/br_denatran_frota/handlers.py | 11 ++++---- pipelines/datasets/br_denatran_frota/utils.py | 27 ++++++++++++------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 42e4997c2..b1338cfca 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- """ -Handlers for br_denatran_frota +Handlers for br_denatran_frota. + This is merely a way to have functions that are called by tasks but can be tested with unit tests and debugging. """ @@ -20,6 +21,7 @@ extraction_pre_2012, call_r_to_read_excel, verify_uf, + DenatranType, ) import pandas as pd import polars as pl @@ -88,10 +90,9 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: ][0] df = pd.read_excel(file, sheet_name=correct_sheet) except UnicodeDecodeError: - # TODO: Aqui você invoca o capeta e chama o R pra ler e salvar isso como df. Isso é ridículo mas funcionou. df = call_r_to_read_excel(file) - new_df = change_df_header(df, guess_header(df=df, type_of_file="UF")) + new_df = change_df_header(df, guess_header(df=df, type_of_file=DenatranType.UF)) # This is ad hoc for UF_tipo. new_df.rename( columns={new_df.columns[0]: "sigla_uf"}, inplace=True @@ -140,7 +141,7 @@ def get_desired_file(year: int, download_directory: str, filetype: str) -> str: raise ValueError("No files found buckaroo") -def treat_municipio_tipo(file: str): +def treat_municipio_tipo(file: str) -> pl.DataFrame: municipios_query = """SELECT nome, id_municipio, sigla_uf FROM `basedosdados.br_bd_diretorios_brasil.municipio` """ bd_municipios = bd.read_sql( @@ -150,7 +151,7 @@ def treat_municipio_tipo(file: str): # filename = os.path.split(file)[1] df = pd.read_excel(file) - new_df = change_df_header(df, guess_header(df)) + new_df = change_df_header(df, guess_header(df), DenatranType.Municipio) new_df.rename( columns={new_df.columns[0]: "sigla_uf", new_df.columns[1]: "nome_denatran"}, inplace=True, diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 6a5c1a48e..80c0172b7 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -General purpose functions for the br_denatran_frota project +General purpose functions for the br_denatran_frota project. """ import pandas as pd @@ -18,6 +18,7 @@ import rpy2.robjects.packages as rpackages import rpy2.robjects as robjects from rpy2.robjects.vectors import StrVector +from enum import Enum DICT_UFS = constants.DICT_UFS.value @@ -30,8 +31,13 @@ UF_TIPO_HEADER = constants.UF_TIPO_HEADER.value +class DenatranType(Enum): + Municipio = "Municipio" + UF = "UF" + + def guess_header( - df: pd.DataFrame, type_of_file: str, max_header_guess: int = 10 + df: pd.DataFrame, type_of_file: DenatranType, max_header_guess: int = 10 ) -> int: """Search for expected header in dataframe. @@ -46,9 +52,9 @@ def guess_header( Returns: int: _description_ """ - if type_of_file == "UF": + if type_of_file == DenatranType.UF: expected_header = UF_TIPO_HEADER - elif type_of_file == "Municipio": + elif type_of_file == DenatranType.Municipio: pass else: raise ValueError("Unrecognized type of dataframe.") @@ -69,7 +75,8 @@ def guess_header( def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame: - """Changes the dataframe's header to a row inside of it and returns the corrected df. + """Change the dataframe's header to a row inside of it and returns the corrected df. + Ideally, to be used in conjunction with guess_header(). Args: df (pd.DataFrame): Dataframe whose header we want changed. @@ -317,13 +324,13 @@ def call_downloader(i: dict): def make_filename_pre_2012( type_of_file: str, year: int, filename: str, year_dir_name: str, month: int ): - if type_of_file == "Tipo": + if type_of_file == DenatranType.UF: basic_filename = UF_TIPO_BASIC_FILENAME if year > 2005: regex_to_search = r"UF\s+([^\s\d]+\s*)*([12]\d{3})" else: regex_to_search = rf"UF[_\s]?([^\s\d]+\s*)_{str(year)[2:4]}" - elif type_of_file == "Munic": + elif type_of_file == DenatranType.Municipio: basic_filename = MUNIC_TIPO_BASIC_FILENAME if year > 2003: regex_to_search = rf"Munic\.?\s*(.*?)\s*\.?{year}" @@ -333,7 +340,7 @@ def make_filename_pre_2012( raise ValueError match = re.search(regex_to_search, filename) if match: - if (year == 2004 or year == 2005) and type_of_file == "Munic": + if (year == 2004 or year == 2005) and type_of_file == DenatranType.Municipio: month_value = int(match.group(1)) else: month_in_file = match.group(1).lower().replace(".", "") @@ -402,11 +409,11 @@ def extraction_pre_2012(month: int, year: int, year_dir_name: str, zip_file: str r"Tipo[-\s]UF", zip_file.split("/")[-1] ): new_filename = make_filename_pre_2012( - "Tipo", year, filename, year_dir_name, month + DenatranType.UF, year, filename, year_dir_name, month ) elif re.search(r"Mun\w*", filename, re.IGNORECASE): new_filename = make_filename_pre_2012( - "Munic", year, filename, year_dir_name, month + DenatranType.Municipio, year, filename, year_dir_name, month ) if new_filename: g.extract(file, path=year_dir_name) From 4fea4ed65afea338a4517217c4d5210b319d5acf Mon Sep 17 00:00:00 2001 From: Tamir Date: Mon, 22 May 2023 03:57:55 -0300 Subject: [PATCH 161/265] 2023 works for treating municipality --- .../datasets/br_denatran_frota/constants.py | 27 ++++++++++++++++++ .../datasets/br_denatran_frota/handlers.py | 28 +++++++++++-------- .../datasets/br_denatran_frota/tasks_test.py | 19 +++++++++++++ pipelines/datasets/br_denatran_frota/utils.py | 22 +++++++++------ 4 files changed, 76 insertions(+), 20 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index 515002d56..4583c6c72 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -135,3 +135,30 @@ class constants(Enum): # pylint: disable=c0103 "TRICICLO", "UTILITÁRIO", ] + + MUNICIPIO_TIPO_HEADER = [ + "UF", + "MUNICIPIO", + "TOTAL", + "AUTOMÓVEL", + "BONDE", + "CAMINHÃO", + "CAMINHÃO TRATOR", + "CAMINHONETE", + "CAMIONETA", + "CHASSI PLATAFORMA", + "CICLOMOTOR", + "MICROÔNIBUS", + "MOTOCICLETA", + "MOTONETA", + "ÔNIBUS", + "QUADRICICLO", + "REBOQUE", + "SEMI-REBOQUE", + "SIDE-CAR", + "OUTROS", + "TRATOR ESTEIRA", + "TRATOR RODAS", + "TRICICLO", + "UTILITÁRIO", + ] diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index b1338cfca..aaf525856 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -20,7 +20,7 @@ download_file, extraction_pre_2012, call_r_to_read_excel, - verify_uf, + treat_uf, DenatranType, ) import pandas as pd @@ -149,24 +149,28 @@ def treat_municipio_tipo(file: str) -> pl.DataFrame: ) # Hardcoded, not good. bd_municipios = pl.from_pandas(bd_municipios) - # filename = os.path.split(file)[1] + filename = os.path.split(file)[1] + month, year = get_year_month_from_filename(filename) df = pd.read_excel(file) - new_df = change_df_header(df, guess_header(df), DenatranType.Municipio) + new_df = change_df_header(df, guess_header(df, DenatranType.Municipio)) new_df.rename( columns={new_df.columns[0]: "sigla_uf", new_df.columns[1]: "nome_denatran"}, inplace=True, ) # Rename for ease of use. new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace. - new_df = pl.from_pandas(new_df) - new_df = new_df.with_columns( - pl.col("nome_denatran").apply(asciify).str.to_lowercase() + new_pl_df = pl.from_pandas(new_df) + verify_total(new_pl_df) + new_pl_df = new_pl_df.with_columns( + pl.col("nome_denatran").apply(asciify).str.to_lowercase(), + pl.lit(year, dtype=pl.Int64).alias("ano"), + pl.lit(month, dtype=pl.Int64).alias("mes"), ) - new_df = new_df.filter(pl.col("nome_denatran") != "municipio nao informado") - if new_df.shape[0] > bd_municipios.shape[0]: + new_pl_df = new_pl_df.filter(pl.col("nome_denatran") != "municipio nao informado") + if new_pl_df.shape[0] > bd_municipios.shape[0]: raise ValueError( - f"Atenção: a base do Denatran tem {new_df.shape[0]} linhas e isso é mais municípios do que a BD com {bd_municipios.shape[0]}" + f"Atenção: a base do Denatran tem {new_pl_df.shape[0]} linhas e isso é mais municípios do que a BD com {bd_municipios.shape[0]}" ) - verify_total(new_df) + dfs = [] for uf in DICT_UFS: - verify_uf(new_df, bd_municipios, uf) - return new_df + dfs.append(treat_uf(new_pl_df, bd_municipios, uf)) + return pl.concat(dfs) diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 61412da50..613464e68 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -11,6 +11,7 @@ crawl, treat_uf_tipo, get_desired_file, + treat_municipio_tipo, ) from pipelines.datasets.br_denatran_frota.constants import constants @@ -78,6 +79,24 @@ def test_treat_files_uf_tipo(self, month, year): treated_df = treat_uf_tipo(os.path.join(directory_to_search, file)) self.assertEqual(len(treated_df), 21 * 27) + @parameterized.expand( + [(month, year) for year in range(2003, 2024) for month in range(1, 2)], + name_func=custom_name_func, + ) + def test_treat_files_municipio_tipo(self, month, year): + crawl(month, year, self.temp_dir.name) + directory_to_search = os.path.join(self.temp_dir.name, "files", f"{year}") + get_desired_file(year, self.temp_dir.name, MUNIC_TIPO_BASIC_FILENAME) + for file in os.listdir(directory_to_search): + if re.search(MUNIC_TIPO_BASIC_FILENAME, file) and file.split(".")[-1] in [ + "xls", + "xlsx", + ]: + treated_df = treat_municipio_tipo( + os.path.join(directory_to_search, file) + ) + self.assertEqual(len(treated_df), 5570) + def test_flow(self): year = 2021 crawl(month=2, year=year, temp_dir=constants.DOWNLOAD_PATH.value) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 80c0172b7..c0ecfee33 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -29,6 +29,7 @@ MONTHS_SHORT = constants.MONTHS_SHORT.value MUNIC_TIPO_BASIC_FILENAME = constants.MUNIC_TIPO_BASIC_FILENAME.value UF_TIPO_HEADER = constants.UF_TIPO_HEADER.value +MUNICIPIO_TIPO_HEADER = constants.MUNICIPIO_TIPO_HEADER.value class DenatranType(Enum): @@ -55,7 +56,7 @@ def guess_header( if type_of_file == DenatranType.UF: expected_header = UF_TIPO_HEADER elif type_of_file == DenatranType.Municipio: - pass + expected_header = MUNICIPIO_TIPO_HEADER else: raise ValueError("Unrecognized type of dataframe.") header_guess = 0 @@ -67,8 +68,8 @@ def guess_header( (x, y) for x, y in zip(expected_header, current_row) if x == y ] if ( - len(equal_column_names) / len(expected_header) > 0.7 - ): # If 70% of the columns match, this is the header. + len(equal_column_names) / len(expected_header) >= 0.6 + ): # If 60% of the columns match, this is the header. return header_guess header_guess += 1 return 0 # If nothing is ever found until the max, let's just assume it's the first row as per usual. @@ -177,7 +178,7 @@ def fix_suggested_nome_ibge(row: tuple[str, ...]) -> str: return row[-1] -def match_ibge(denatran_uf: pl.DataFrame, ibge_uf: pl.DataFrame) -> None: +def verify_match_ibge(denatran_uf: pl.DataFrame, ibge_uf: pl.DataFrame) -> None: """Take a dataframe of the Denatran data and an IBGE dataframe of municipalities. Joins them using the IBGE name of both. The IBGE name of denatran_uf is ideally filled via get_city_name(). @@ -468,7 +469,7 @@ def call_r_to_read_excel(file: str) -> pd.DataFrame: return df -def verify_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str) -> None: +def treat_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str) -> None: """Take the DENATRAN data at municipality level and compare it to the IBGE data. This will filter by the uf argument and do all comparisons to ensure consistency. @@ -486,8 +487,12 @@ def verify_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str) -> None ibge_uf = ibge_df.filter(pl.col("sigla_uf") == uf) ibge_uf = ibge_uf.with_columns(pl.col("nome").apply(asciify).str.to_lowercase()) municipios_na_bd = ibge_uf["nome"].to_list() - x = denatran_uf["nome_denatran"].apply(lambda x: get_city_name_ibge(x, ibge_uf)) - denatran_uf = denatran_uf.with_columns(x.alias("suggested_nome_ibge")) + suggested_name_ibge = denatran_uf["nome_denatran"].apply( + lambda x: get_city_name_ibge(x, ibge_uf) + ) + denatran_uf = denatran_uf.with_columns( + suggested_name_ibge.alias("suggested_nome_ibge") + ) denatran_uf = denatran_uf.with_columns( denatran_uf.apply(fix_suggested_nome_ibge)["apply"].alias("suggested_nome_ibge") ) @@ -504,4 +509,5 @@ def verify_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str) -> None # This here is probably impossible and shouldn't happen due to the matching coming from the BD data. # The set difference might occur the other way around, but still, better safe. raise ValueError(f"Existem municípios em {uf} que não estão na BD.") - match_ibge(denatran_uf, ibge_uf) + verify_match_ibge(denatran_uf, ibge_uf) + return denatran_uf From 325398ff329a8658dce20abd2af1b224bf4811d7 Mon Sep 17 00:00:00 2001 From: Tamir Date: Mon, 22 May 2023 04:12:53 -0300 Subject: [PATCH 162/265] Working from 2016 onwards --- .../datasets/br_denatran_frota/tasks_test.py | 41 ++++++++++++------- pipelines/datasets/br_denatran_frota/utils.py | 5 ++- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 613464e68..920a5a646 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -28,7 +28,7 @@ def custom_name_func(testcase_func, param_num, param): ) -class TestAllPossibleYears(unittest.TestCase): +class TestExtractingAllPossibleYears(unittest.TestCase): def setUp(self): self.temp_dir = tempfile.TemporaryDirectory( dir=os.path.join(f"{DOWNLOAD_PATH}") @@ -53,7 +53,7 @@ def test_extract_denatran_files(self, month, year): self.assertTrue(expected_files.issubset(files)) -class TestTreatmentPostCrawl(unittest.TestCase): +class TestUFTreatmentPostCrawl(unittest.TestCase): def setUp(self): self.temp_dir = tempfile.TemporaryDirectory( dir=os.path.join(f"{DOWNLOAD_PATH}") @@ -79,6 +79,30 @@ def test_treat_files_uf_tipo(self, month, year): treated_df = treat_uf_tipo(os.path.join(directory_to_search, file)) self.assertEqual(len(treated_df), 21 * 27) + def test_flow(self): + year = 2021 + crawl(month=2, year=year, temp_dir=constants.DOWNLOAD_PATH.value) + # Now get the downloaded file: + uf_tipo_file = get_desired_file( + year=year, + download_directory=constants.DOWNLOAD_PATH.value, + filetype=constants.UF_TIPO_BASIC_FILENAME.value, + ) + print(uf_tipo_file) + df = treat_uf_tipo(file=uf_tipo_file) + self.assertTrue(type(df), pl.DataFrame) + + +class TestMunicipioTreatmentPostCrawl(unittest.TestCase): + def setUp(self): + self.temp_dir = tempfile.TemporaryDirectory( + dir=os.path.join(f"{DOWNLOAD_PATH}") + ) + + def tearDown(self): + print("Deleting temporary directory") + shutil.rmtree(self.temp_dir.name) + @parameterized.expand( [(month, year) for year in range(2003, 2024) for month in range(1, 2)], name_func=custom_name_func, @@ -97,19 +121,6 @@ def test_treat_files_municipio_tipo(self, month, year): ) self.assertEqual(len(treated_df), 5570) - def test_flow(self): - year = 2021 - crawl(month=2, year=year, temp_dir=constants.DOWNLOAD_PATH.value) - # Now get the downloaded file: - uf_tipo_file = get_desired_file( - year=year, - download_directory=constants.DOWNLOAD_PATH.value, - filetype=constants.UF_TIPO_BASIC_FILENAME.value, - ) - print(uf_tipo_file) - df = treat_uf_tipo(file=uf_tipo_file) - self.assertTrue(type(df), pl.DataFrame) - if __name__ == "__main__": unittest.main() diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index c0ecfee33..1ad64bc0d 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -53,6 +53,7 @@ def guess_header( Returns: int: _description_ """ + possible_headers = [] if type_of_file == DenatranType.UF: expected_header = UF_TIPO_HEADER elif type_of_file == DenatranType.Municipio: @@ -70,8 +71,10 @@ def guess_header( if ( len(equal_column_names) / len(expected_header) >= 0.6 ): # If 60% of the columns match, this is the header. - return header_guess + possible_headers.append(header_guess) header_guess += 1 + if possible_headers: + return max(possible_headers) return 0 # If nothing is ever found until the max, let's just assume it's the first row as per usual. From ed3343a45b4044fe9c8e9c56f3547778712f6b25 Mon Sep 17 00:00:00 2001 From: Tamir Date: Mon, 22 May 2023 05:18:13 -0300 Subject: [PATCH 163/265] Working from 2014 onwards --- pipelines/datasets/br_denatran_frota/constants.py | 1 + pipelines/datasets/br_denatran_frota/handlers.py | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index 4583c6c72..15cbef738 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -98,6 +98,7 @@ class constants(Enum): # pylint: disable=c0103 ("PB", "santarem"): "joca claudino", ("SP", "embu"): "embu das artes", ("TO", "sao valerio da natividade"): "sao valerio", + ("PB", "campo de santana"): "tacima", } DOWNLOAD_PATH = f"/tmp/input/{DATASET}" diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index aaf525856..d9e990f72 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -151,7 +151,10 @@ def treat_municipio_tipo(file: str) -> pl.DataFrame: filename = os.path.split(file)[1] month, year = get_year_month_from_filename(filename) - df = pd.read_excel(file) + correct_sheet = [ + sheet for sheet in pd.ExcelFile(file).sheet_names if sheet != "Glossário" + ][0] + df = pd.read_excel(file, sheet_name=correct_sheet) new_df = change_df_header(df, guess_header(df, DenatranType.Municipio)) new_df.rename( columns={new_df.columns[0]: "sigla_uf", new_df.columns[1]: "nome_denatran"}, From 2990dd89707bd1cd306190ec3d4c5d94370dd686 Mon Sep 17 00:00:00 2001 From: Tamir Date: Mon, 22 May 2023 06:25:45 -0300 Subject: [PATCH 164/265] 2010 has a total error? --- pipelines/datasets/br_denatran_frota/handlers.py | 11 ++++++++++- pipelines/datasets/br_denatran_frota/tasks_test.py | 7 ++++++- pipelines/datasets/br_denatran_frota/utils.py | 6 +++--- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index d9e990f72..c84d24374 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -176,4 +176,13 @@ def treat_municipio_tipo(file: str) -> pl.DataFrame: dfs = [] for uf in DICT_UFS: dfs.append(treat_uf(new_pl_df, bd_municipios, uf)) - return pl.concat(dfs) + full_pl_df = pl.concat(dfs) + full_pl_df = full_pl_df.select( + pl.exclude("TOTAL", "suggested_nome_ibge", "nome_denatran") + ) + full_pl_df = full_pl_df.melt( + id_vars=["ano", "mes", "sigla_uf", "id_municipio"], + variable_name="tipo_veiculo", + value_name="quantidade", + ) # Long format. + return full_pl_df diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 920a5a646..56a21e4d9 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -19,6 +19,7 @@ DOWNLOAD_PATH = constants.DOWNLOAD_PATH.value MUNIC_TIPO_BASIC_FILENAME = constants.MUNIC_TIPO_BASIC_FILENAME.value UF_TIPO_BASIC_FILENAME = constants.UF_TIPO_BASIC_FILENAME.value +DICT_UFS = constants.DICT_UFS.value def custom_name_func(testcase_func, param_num, param): @@ -119,7 +120,11 @@ def test_treat_files_municipio_tipo(self, month, year): treated_df = treat_municipio_tipo( os.path.join(directory_to_search, file) ) - self.assertEqual(len(treated_df), 5570) + self.assertTrue(type(treated_df), pl.DataFrame) + self.assertGreaterEqual(len(treated_df), 5500 * 21) + self.assertSetEqual( + set(treated_df["sigla_uf"].unique().to_list()), set(DICT_UFS.keys()) + ) if __name__ == "__main__": diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 1ad64bc0d..096b71aba 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -207,6 +207,7 @@ def verify_match_ibge(denatran_uf: pl.DataFrame, ibge_uf: pl.DataFrame) -> None: for row in mismatched_rows.rows(named=True): error_message += f"{row['nome_denatran']} ({row['sigla_uf']})\n" raise ValueError(error_message) + return joined_df def get_city_name_ibge(denatran_name: str, ibge_uf: pl.DataFrame) -> str: @@ -276,7 +277,7 @@ def generic_extractor(dest_path_file: str): for file in f.infolist(): print(file) if ( - re.search("UF|municipio", file.filename, re.IGNORECASE) + re.search("UF|munic", file.filename, re.IGNORECASE) and not file.is_dir() ): new_extension = file.filename.split(".")[-1] @@ -512,5 +513,4 @@ def treat_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str) -> None: # This here is probably impossible and shouldn't happen due to the matching coming from the BD data. # The set difference might occur the other way around, but still, better safe. raise ValueError(f"Existem municípios em {uf} que não estão na BD.") - verify_match_ibge(denatran_uf, ibge_uf) - return denatran_uf + return verify_match_ibge(denatran_uf, ibge_uf) From 038bdcae5427d8e58fee973342d5d6da1a20a8a9 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 23 May 2023 03:10:54 -0300 Subject: [PATCH 165/265] Historical data is messy, adjust util for that --- pipelines/datasets/br_denatran_frota/utils.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 096b71aba..4c46ba45b 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -135,7 +135,8 @@ def verify_total(df: pl.DataFrame) -> None: """Verify that we can pivot from wide to long. Essentially, gets a Wide dataframe, excludes all string columns and the TOTAL column and sums it all row wise. - Then verifies if the calculated total column is the same as the TOTAL column. + Some historical data from Denatran seems to have a rounding error. + Thus, we need to verify if the calculated total column is greater or equal than the original TOTAL column. If not, raises an error. Args: @@ -150,10 +151,10 @@ def verify_total(df: pl.DataFrame) -> None: acc=pl.lit(0), function=lambda acc, x: acc + x, exprs=pl.col("*") ).alias("calculated_total") )["calculated_total"] - mask = df["TOTAL"] == calculated_total - if pl.sum(~mask) != 0: + mask = df["TOTAL"] > calculated_total + if pl.sum(mask) != 0: raise ValueError( - "A coluna de TOTAL da base original tem inconsistências e não é igual à soma das demais colunas." + "A coluna de TOTAL da base original tem inconsistências e é maior que a soma das demais colunas." ) From 1704472f4203936d3810d8a88352fdf022773a2c Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 23 May 2023 04:49:04 -0300 Subject: [PATCH 166/265] More substitutions rules for a lot of messy data --- pipelines/datasets/br_denatran_frota/constants.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index 15cbef738..034342db8 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -99,6 +99,16 @@ class constants(Enum): # pylint: disable=c0103 ("SP", "embu"): "embu das artes", ("TO", "sao valerio da natividade"): "sao valerio", ("PB", "campo de santana"): "tacima", + ("AP", "amapari"): "pedra branca do amapari", + ("BA", "maracani"): "macarani", + ("BA", "livramento do brumado"): "livramento de nossa senhora", + ("PB", "sao bento de pombal"): "sao bentinho", + ("PB", "serido"): "sao vicente do serido", + ("PR", "vila alta"): "alto paraiso", + ("RN", "espirito santo do oeste"): "parau", + ("RO", "jamari"): "itapua do oeste", + ("SC", "picarras"): "balneario picarras", + ("SC", "barra do sul"): "balneario barra do sul", } DOWNLOAD_PATH = f"/tmp/input/{DATASET}" From e45fec7e59fcc8edc9238d4d0cf308a47aefa69b Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 23 May 2023 04:49:20 -0300 Subject: [PATCH 167/265] Adjustments for historical data --- pipelines/datasets/br_denatran_frota/handlers.py | 4 ++++ pipelines/datasets/br_denatran_frota/utils.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index c84d24374..07b00aadd 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -155,6 +155,10 @@ def treat_municipio_tipo(file: str) -> pl.DataFrame: sheet for sheet in pd.ExcelFile(file).sheet_names if sheet != "Glossário" ][0] df = pd.read_excel(file, sheet_name=correct_sheet) + # Some very janky historical files have an entire first empty column that will break EVERYTHING + # This checks if they exist and drops them + if df[df.columns[0]].isnull().sum() == len(df): + df.drop(columns=df.columns[0], inplace=True) new_df = change_df_header(df, guess_header(df, DenatranType.Municipio)) new_df.rename( columns={new_df.columns[0]: "sigla_uf", new_df.columns[1]: "nome_denatran"}, diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 4c46ba45b..862264b29 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -154,7 +154,7 @@ def verify_total(df: pl.DataFrame) -> None: mask = df["TOTAL"] > calculated_total if pl.sum(mask) != 0: raise ValueError( - "A coluna de TOTAL da base original tem inconsistências e é maior que a soma das demais colunas." + "A coluna de TOTAL da base original tem inconsistências e é maior que soma das demais colunas." ) From 5b9642b557b816bbba586022bc1631e5de2c71ae Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 23 May 2023 04:59:05 -0300 Subject: [PATCH 168/265] Treatment works!!!! --- pipelines/datasets/br_denatran_frota/tasks_test.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 56a21e4d9..8ff6d1838 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -120,11 +120,16 @@ def test_treat_files_municipio_tipo(self, month, year): treated_df = treat_municipio_tipo( os.path.join(directory_to_search, file) ) + # It should be a df, self.assertTrue(type(treated_df), pl.DataFrame) - self.assertGreaterEqual(len(treated_df), 5500 * 21) + # Every state should be there self.assertSetEqual( set(treated_df["sigla_uf"].unique().to_list()), set(DICT_UFS.keys()) ) + # I expect AT LEAST 5450 cities out of 5570. It's normally higher but historical data. + self.assertGreaterEqual( + len(treated_df["id_municipio"].unique().to_list()), 5450 + ) if __name__ == "__main__": From cbe964df3fc4e80dc8930d5a6be8439b6ceabded Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 24 May 2023 01:26:50 -0300 Subject: [PATCH 169/265] Flow is done --- pipelines/datasets/br_denatran_frota/flows.py | 109 ++++++++++++++++-- pipelines/datasets/br_denatran_frota/tasks.py | 6 + .../datasets/br_denatran_frota/tasks_test.py | 13 +++ 3 files changed, 118 insertions(+), 10 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index bd2326ea2..755002185 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -84,6 +84,7 @@ treat_uf_tipo_task, output_file_to_csv_task, get_desired_file_task, + treat_municipio_tipo_task, ) from pipelines.datasets.br_denatran_frota.constants import constants @@ -118,24 +119,112 @@ crawled = crawl_task(month=2, year=year, temp_dir=constants.DOWNLOAD_PATH.value) # Now get the downloaded file: log("Accessing downloaded file") - uf_tipo_file = get_desired_file_task( + municipio_tipo_file = get_desired_file_task( year=year, download_directory=constants.DOWNLOAD_PATH.value, filetype=constants.UF_TIPO_BASIC_FILENAME.value, upstream_tasks=[crawled], ) - log(uf_tipo_file) - df = treat_uf_tipo_task(file=uf_tipo_file, upstream_tasks=[crawled, uf_tipo_file]) + log(municipio_tipo_file) + df = treat_uf_tipo_task( + file=municipio_tipo_file, upstream_tasks=[crawled, municipio_tipo_file] + ) csv_output = output_file_to_csv_task( - df, constants.UF_TIPO_BASIC_FILENAME, upstream_tasks=[df] + df, constants.UF_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] + ) + # wait_upload_table = create_table_and_upload_to_gcs( + # data_path=csv_output, + # dataset_id=dataset_id, + # table_id=table_id, + # dump_mode="append", + # wait=csv_output, + # ) + + with case(materialize_after_dump, True): + # Trigger DBT flow run + current_flow_labels = get_current_flow_labels() + materialization_flow = create_flow_run( + flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, + project_name=pipelines_constants.PREFECT_DEFAULT_PROJECT.value, + parameters={ + "dataset_id": dataset_id, + "table_id": table_id, + "mode": materialization_mode, + "dbt_alias": dbt_alias, + }, + labels=current_flow_labels, + run_name=f"Materialize {dataset_id}.{table_id}", + ) + + wait_for_materialization = wait_for_flow_run( + materialization_flow, + stream_states=True, + stream_logs=True, + raise_final_state=True, + ) + wait_for_materialization.max_retries = ( + dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value + ) + wait_for_materialization.retry_delay = timedelta( + seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value + ) + + +br_denatran_frota_uf_tipo.storage = GCS(pipelines_constants.GCS_FLOWS_BUCKET.value) +br_denatran_frota_uf_tipo.run_config = KubernetesRun( + image=pipelines_constants.DOCKER_IMAGE.value +) +# flow.schedule = every_two_weeks + + +with Flow( + name="br_denatran_frota.municipio_tipo", + code_owners=[ + "Tamir", + ], +) as br_denatran_frota_municipio_tipo: + year = 2021 + dataset_id = Parameter("dataset_id", default="br_denatran_frota") + table_id = Parameter("table_id", default="municipio_tipo") + + # Materialization mode + materialization_mode = Parameter( + "materialization_mode", default="dev", required=False ) - wait_upload_table = create_table_and_upload_to_gcs( - data_path=csv_output, - dataset_id=dataset_id, - table_id=table_id, - dump_mode="append", - wait=csv_output, + + materialize_after_dump = Parameter( + "materialize after dump", default=False, required=False + ) + + dbt_alias = Parameter("dbt_alias", default=True, required=False) + + rename_flow_run = rename_current_flow_run_dataset_table( + prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id + ) + log("Downloading file") + crawled = crawl_task(month=2, year=year, temp_dir=constants.DOWNLOAD_PATH.value) + # Now get the downloaded file: + log("Accessing downloaded file") + municipio_tipo_file = get_desired_file_task( + year=year, + download_directory=constants.DOWNLOAD_PATH.value, + filetype=constants.MUNIC_TIPO_BASIC_FILENAME.value, + upstream_tasks=[crawled], + ) + log(municipio_tipo_file) + df = treat_municipio_tipo_task( + file=municipio_tipo_file, upstream_tasks=[crawled, municipio_tipo_file] + ) + csv_output = output_file_to_csv_task( + df, constants.MUNIC_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] ) + # wait_upload_table = create_table_and_upload_to_gcs( + # data_path=csv_output, + # dataset_id=dataset_id, + # table_id=table_id, + # dump_mode="append", + # wait=csv_output, + # ) with case(materialize_after_dump, True): # Trigger DBT flow run diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 2c8738990..2edcfd86e 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -60,6 +60,7 @@ treat_uf_tipo, output_file_to_csv, get_desired_file, + treat_municipio_tipo, ) from pipelines.utils.utils import ( log, @@ -91,3 +92,8 @@ def output_file_to_csv_task(df: pl.DataFrame, filename: str) -> None: @task() def get_desired_file_task(year: int, download_directory: str, filetype: str) -> str: return get_desired_file(year, download_directory, filetype) + + +@task() +def treat_municipio_tipo_task(file: str) -> pl.DataFrame: + return treat_municipio_tipo(file) diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 8ff6d1838..7dfb75d58 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -131,6 +131,19 @@ def test_treat_files_municipio_tipo(self, month, year): len(treated_df["id_municipio"].unique().to_list()), 5450 ) + def test_flow(self): + year = 2021 + crawl(month=2, year=year, temp_dir=constants.DOWNLOAD_PATH.value) + # Now get the downloaded file: + uf_tipo_file = get_desired_file( + year=year, + download_directory=constants.DOWNLOAD_PATH.value, + filetype=constants.MUNIC_TIPO_BASIC_FILENAME.value, + ) + print(uf_tipo_file) + df = treat_municipio_tipo(file=uf_tipo_file) + self.assertTrue(type(df), pl.DataFrame) + if __name__ == "__main__": unittest.main() From ba325bd43d55077fbd87a6c5edd9704b714dc1db Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 25 May 2023 03:11:45 -0300 Subject: [PATCH 170/265] Fix small error in quadriciclo data --- pipelines/datasets/br_denatran_frota/utils.py | 46 +++++++++++++++---- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 862264b29..2988e1409 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -144,18 +144,44 @@ def verify_total(df: pl.DataFrame) -> None: Raises: ValueError: Errors out if the sum of the columns is actually different than the total. + """ - columns_for_total = df.select(pl.exclude("TOTAL")).select(pl.exclude([pl.Utf8])) - calculated_total = columns_for_total.select( - pl.fold( - acc=pl.lit(0), function=lambda acc, x: acc + x, exprs=pl.col("*") - ).alias("calculated_total") - )["calculated_total"] - mask = df["TOTAL"] > calculated_total + + def calculate_total(df): + columns_for_total = df.select(pl.exclude("TOTAL")).select(pl.exclude([pl.Utf8])) + calculated_total = columns_for_total.select( + pl.fold( + acc=pl.lit(0), function=lambda acc, x: acc + x, exprs=pl.col("*") + ).alias("calculated_total") + )["calculated_total"] + return calculated_total + + calculated_total = calculate_total(df) + mask = df["TOTAL"] != calculated_total + if pl.sum(mask) != 0: - raise ValueError( - "A coluna de TOTAL da base original tem inconsistências e é maior que soma das demais colunas." - ) + # In some cases, the quadriciclo data is multiplied by 10, and this will correct it before you + new_df = clean_quadriciclo_data(df) + new_calculated_total = calculate_total(new_df) + mask = new_df["TOTAL"] != new_calculated_total + if pl.sum(mask) != 0: + raise ValueError( + "A coluna de TOTAL da base original tem inconsistências e é diferente da soma das demais colunas." + ) + + +def clean_quadriciclo_data(df: pl.DataFrame) -> pl.DataFrame: + """Divide the quadriciclo column by 10 when the data is dirty. + + Args: + df (pl.DataFrame): Denatran data to be cleaned + + Returns: + pl.DataFrame: Cleaned Denatran data with the quadriciclo column altered. + """ + old_quadriciclo = df["QUADRICICLO"] + new_quadriciclo = old_quadriciclo / 10 + return df.with_columns(new_quadriciclo.cast(pl.Int32).alias("QUADRICICLO")) def fix_suggested_nome_ibge(row: tuple[str, ...]) -> str: From d339e799d7e70f7fc90d58c24f9eeefe5100667e Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 30 May 2023 01:16:01 -0300 Subject: [PATCH 171/265] Ignore credentials --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b8ce2db36..16abd5890 100644 --- a/.gitignore +++ b/.gitignore @@ -143,3 +143,4 @@ notebooks/ poetry.lock pipelines/datasets/br_denatran_frota/todo_list.txt pipelines/datasets/br_denatran_frota/run_local.py +basedosdados-dev-ff644018223b.json From a3fcb06720a8eb3c98881ca495642d5af7b76427 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 16 Jun 2023 19:04:31 -0300 Subject: [PATCH 172/265] Ajusta flow --- pipelines/datasets/br_denatran_frota/flows.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 755002185..9292c8022 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -256,8 +256,8 @@ ) -br_denatran_frota_uf_tipo.storage = GCS(pipelines_constants.GCS_FLOWS_BUCKET.value) -br_denatran_frota_uf_tipo.run_config = KubernetesRun( +br_denatran_frota_municipio_tipo.storage = GCS(pipelines_constants.GCS_FLOWS_BUCKET.value) +br_denatran_frota_municipio_tipo.run_config = KubernetesRun( image=pipelines_constants.DOCKER_IMAGE.value ) # flow.schedule = every_two_weeks From 450868c6623e108d87d28c89b686497615a5ef17 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 16 Jun 2023 22:04:48 +0000 Subject: [PATCH 173/265] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pipelines/datasets/br_denatran_frota/flows.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 9292c8022..e719d1f29 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -256,7 +256,9 @@ ) -br_denatran_frota_municipio_tipo.storage = GCS(pipelines_constants.GCS_FLOWS_BUCKET.value) +br_denatran_frota_municipio_tipo.storage = GCS( + pipelines_constants.GCS_FLOWS_BUCKET.value +) br_denatran_frota_municipio_tipo.run_config = KubernetesRun( image=pipelines_constants.DOCKER_IMAGE.value ) From 23deaf22b54c10d114c8a3991366d78de8e9f4ce Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 16 Jun 2023 19:14:02 -0300 Subject: [PATCH 174/265] Commit salvador --- .../datasets/br_denatran_frota/teste.xls | Bin 34816 -> 0 bytes .../datasets/br_denatran_frota/trash.ipynb | 543 ------------------ requirements-test.txt | 1 + 3 files changed, 1 insertion(+), 543 deletions(-) delete mode 100644 pipelines/datasets/br_denatran_frota/teste.xls delete mode 100644 pipelines/datasets/br_denatran_frota/trash.ipynb diff --git a/pipelines/datasets/br_denatran_frota/teste.xls b/pipelines/datasets/br_denatran_frota/teste.xls deleted file mode 100644 index 250f4945a573648f6cd6b9bd8b2eef77ac2f45ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34816 zcmeHw34B!5_5Yd4LINR^0Es9<9wA~N0V1HHh)e1(`-<7xSvrE#R!zDvL>d%$zB)kXV8Yf;Lp!fGP>U>rs4Aju` z|4|F%=Aa|9vt)nk;b9NP5zG+TC0^;t+zu%6Jl@sPAtOZ=2HOLjkwE*51&iuxtL`v(+ ztkOx9lO|QInKE~Exf@+QWkTkDus>E>nlIG{TfUs0aIy@OiOC74SEcgq7?Vr<4q za*a$#P2o17o2*Q(m6D`nMg;9WlSoCFkU2$u4E1&kH0jbg+KCU9>*PSYfl8B`mGUMk z=ky3LDa~6W*UP-L+@?5fU6+BDW*XPo{R6c3C~Zjs@M6pAX4pU8-06p|H64~&Py2+5c?S8kO|k*euc z`%TCkAwT70jz|@wdGa%stWm~C%54}JcASWOxt*ez1e#@(Y~?hd;*$%X37Mni4jANA zEYM@*PVuFqfiIGu3uc@YCd#K+ej$Ye3COaS+(m<)o`r>vm2EP5FcN5c%P(cjpfnKo zk-Md6a3ZMV2P(+>N?i8Z6B+dJvR%gRk&Xlt?1ok5G`kF*S>4WYKu zxi(z(Lb!B7=45$JXZ=;dNK2q47>b0EASH4{pf$>rrSc~k4<6N>p-q7ZQY8WlgVBIN z_R(D6d8gmfPXpo>@o>ou{%wc!@p$@L$|o)Tp77*4So;5Dyoat`;xX+BYb0-TQJL0m zT!s#Y_rO=ucKe6J$my4aAeSm?L>mSj#<{lrWS{+Kb+@Huc(j`mn0m3De@XY0KmWbbA-S*5yyP@2w)OO$sFugr5@@7gwET^BJg|S@y92Lvd z&(X1A`YAEd&oQwq{Va-Q=x1>(yML`NpwEDfz5*)(L9Z-o4M(H9BBAgZXs3&&5Sb%K zRxevKv#RQl^Wl>ojK5pViXQGA*Ws)-JCDy;_%#*~rqdLaJ(ol{T}YZtW=1^OaOg#* z;VqW!o*cZe^>=&Z1F0Sv1GWM0{vwO8d(je%TJ^yVp?B~Z9KNzW#F-;%wFImqf-S*F z;N=&>FhY&X8>^R~JF8bVE?@fCs@f&M)hu7OuomsVpn7TDvc>l2i~GY2AYQ<&Q6` zt6A9qM#Peg%qWvF@_`*pq&RwI^}_l(Wid>ozP4uh(JO1AC=Ins>!#UJWNoNhSUYV& zbv?2!U)fl{yaC?25!b41XsoTPuSOmlQNMg)bp!G=+I%76%Er1Sb&cEW>z1Pls+%K0 z3yiAU0v)?7Bt+o&aC;yM+KNDAmxVglhud4;ZVv@43Kfn7LTv$H8^g_k_Rdgy6xiz4 zz=p8qsR?Wh1(0_^5Sfu`X#hR6@r5v1gJ0nFbpZ=)u_730545f8Y7Sd0C=}>=9aD9E zC~TP?wOYc~vT&p`$TAy(kqx1aAZl3~?RY&B>I_>AC_0R#%hC`;wHBe5Ls1I}$e|@@ z9T{k+?|{lSpy(BWuGTOsNdek-!Pcf0)X>$+yyO|M76dv25pab$SQv_SYH3D~S|RD8 zaA;SQeHnldiy{~lVX#YzQE>3<5ji5<-Wfd9f`nl6Duxa;GHNX_+F5BW40Z$}oq@I> zDq<}QG>6dWt(3hn@_c)gb)04`tX)=(eq2^*HGoI3Es&CsIu8N0!mEO>H=~l#8TH7r zs(R_*IclSwfzH>XouTGHa!E59>Y#~epPEP@8e%oI>Ct2O#8B!CvJ<*AgyjUP2mM+A z!6V^m%SrAO*<=K;0$rWqws2=Sf&x%bdjRbb2wU7`jCN>;qKX}XXf&{aJru39n!{~Y zbD#q)z;O#&Bwz(PU$w$)gN`6tIDk~a&CRV{(a@%#6-JKs78DaX*e#YBBjJv&)+qWr z*!n8^4R!o#SI~+Et+p_-MZ@c$>A<&c3`aw5&QBz8b0D%I;D{QDgkOe=AdW(V(Xh2H z0%@$ya3?x2+SL(6Uq`HfHS55tD(k2Xhy0te*f!ex5i8tf1tRDJXduF9-ll((H@#t# z11#(v#I?^Z>bq3ix(bpjiGMEypx$9VfP;02Y1!V`UcIv_A<{*Lr>%c0jxouYY ztjekbt&VVOa060At>*XFK}n)h(2bgVQxH`%O4zn*GmIQdT_0FSRl*!HfaOtbGd3=F zYmlr+$@<=m0HvB?amuTW-fK_iT9jRGBSVJd~nM!N!5m+@9898^2N9IrxQ zgRKFpH3T&^J=_*F(;6m>5X?Naarz<=9a78!{lsJ%NF6N!t(6sM4tKQbhycp~1`B5y zv?PX--EQ+Se@8ZSnK4ZvId)(+gY9S?j3#z*d$4_DmyU?_n9rzT=#;>^U~7;grb5J2 zAj#r}$PXf+-yQKeRfHmeqxPKI7-^&A9pRQBdlDjB%^NXegsjNxs`RL_(-JM=)o!CB zAFRbLPPHk6anJgb+zhr_P%B&uG<~JZz75KZQ4HJG44Fd5Ywxh9HU%TxacH$wn~m3H zbw#0Rp>}81TF>4^yHghQ#&k5gML?75QKPm_DHekTeG(_9fjM8&b z{R&S%`QJNQwi88v>fiZXm6q*4O-nde$*!5>Wm(mZmlKSxhX4^66v}K{1kPJf`_51Y z?G9TTBd{6%LNvIciz7Qg9UcpvvP4p#(R>fngGv44nVRYVb%aCp{v|rl5;#6;=5nuO(dy##2tRLkKW)`KAash^XHu*(bS)JL7xf#WNAGG&H$j@ zNv3=zMSTJ$_kYDCqAp*F&B|O@Q0lq|wyVk8 zlpHxpCj^maytKDojWgFXV=EJJ;>&6cUA)*g!DIHcsY*Fs?xT7z_CC^z`#nCzkxM#` zqbwblF$gYm5M0(Exa>i2!v?|O)Neq!xr5+_4}!yKxCC*rV_qr8 z%w}TjYcoGHC3R>D=08JYpI4x@oET|1oK!CC`wHH9uw$gnwPVzQ3fOr=%Tk_)*)i%u z1?B-m%T^kg(8zO2l=K77KWOSI#QuC2=nDCPx$dlW9=(| zbzQDu|ASXszjUA&dRbbvSH14-g zl?8T;I#ogcMJ3}%ogxeE7c&pKFMfzmiHGe#Y&;K8gNW4bD0Mrn06jXGGtOBd4MUxC$MT{J@p>P3bVxG?8QG(>wWJ#<(NBvJ>OYsr7y9{ zM$s{o#1gA+gin12F2U#?Z_RV*8Spr^g6^cxq(ht(&w>+NmK4thr?TO0dTyB1CB<{# z;C?&TEiV`I@3(W@^uyt`l!5M)Hv-OUTT=c!$hb9$J`#RKGQWH{rpf$#bVk9S?l|jL zfWKsZg>X9ChPma9qNAB4&uBQ6bxHZhz>%y&dWT;ToXEB;H-9nQLPs8FiAo>K+&3{x zREGN%C-xGRwcSfTFne1zj*;|qT#TgSxClwdQMz;-9H#*|PI~F-xJ{LgqbHe;qeV`~ zaZfiL$3;Xsj*EwM92X7gI4;X7zQxCx5y7d4Ywy_7`uwgs^H(?MQm%qufaM8nOFF6{JF>0B+NanJ5yxI&y z^CHF+CYFI1HPFPk{GjfcSQcW=($|ZTFkVN4p$$Wfnr31-h&c;ddfMahI<(=4Q9_e) z1Y*=E6U#%4x@2M_5p$NJ{KD4w#NyM7(anXCld=FY>Ws-(h?uja^kQ6(=h(JsqYqi&d35n|5L(2MarKCu{Ni%gPPfZ2fDJg^X!2X5Q%+-gh49(L}B;2^9bvT)VGHvqG8|P_38L8wfn|#<4W0ahkO4hGSp?WWD zJyOY8spMgH?k(%)C^Q^|RD?i;cWSMrEd@<^LJ`@*qG&Pyfd+hm+4sc0ip$v&IBzG{-@&QB#5*yNu+ zX(`#4N-lJme>twq3sT9W9P*__tma`&_>mAuFyb69ZrkJE*8HiiKA#&jVW%lgn?Z9(&j`$x)tSs25fxF^1M!2@qm z1Nk*ev)=sM^eNzpY~)GwHr&;uGeK1!Dbsk6BymZ~nPKN-eV9{Kn>h{ROq*QQ@*e7f zJrakpA!pg-*emxdSykK3oo$nQE*Pd_scO6AVK&+S++Q@esRof*GcgSDau4GkhmpsBIKXmtG6-`y!CFj}XIp51wvZ}UA9%+;P$33phRkdAm zzEigB#>PsfsA{`ppOd@a|5C}S+9Xr8IhXk`PtvN7L(Ic3 zI^wB{{!0@VQ?-bu&SpXTJ=ko9&N7WBUId*z8($AQ9VE_2@z@J~&Pe1bBX4Ec-$}Uj ze!};!B$TNN%Lw}dfPKLi8NTBl!YwBg8V=UC816fTFt$|jyXPmU=thS3CBC53U##_^ z_h)*N_2G83sZZ={@1Q=Yh*KX5&Hd?_(zoLUKX)~Sdz(GiFl=oAj2(Xu!&m=^P^K$f zqA(2TzwT*#7+3?idpR94Sy+6j78YdVGB*C!N)JMX(w=>+z5T$ynUeO zs6?{R!%RzW9bWCUL~Pa$w!v+e0{U05En}DW5+f@J`?LoZvh8~=e3#UDPZB?MDa0;sLS|Qwpou zmfB8-?P43WUk}(f_ceyC#}&2`#*Qa^KxV1(Y-#g;}Tl7;3`!%Qit`@m)T^rH-Kz7eo{ zw^kr@r&4DU#y1m|p9UCf$cE5s573God#$EXv7$d^_}#6FS*S2ap;k#IYxpq2*jcvF z^b~#AOgBRF$ioQT^AgQJDv>NSUEP@yzwtR`q($yjo$hM~CU(Ys#CKn@hj1)(>x@iWt7TWt3=co#0*aFq_=n$oW4{bb@!uIW}3EzNgG}f_KTe4*AF*D_JLampt4i z``>&~$vVNi&cgY1#*;g6Kb%J-vg%0x%zOT7;f_KTI9C8om|2)wN-X)KA$WTR+ zb%J-vV;pktDN5D}-X#|~!vvBYeYb%k8^g}Z4^4T_%8^@=4>Y(4`9_p3}1XZ zq18ngTSaK7v77nhx=M6%Glyy%mH*L(?~rTtN|>t&Hv-t!C>P#Gk) zfH1C|oBbn%JO03t5Pyn#FKcfmG+yVkmoxl0eJYW|6wX&@gr382Og*T_FSA>ElnOn` z7Mch9M(A61`q)$3&Xt2+SKZhMR22emD&D8q}-CY(iO z_+a+l$Ynjpip4tA@m8T@e`F<&}#VzD?C5wo&oZU8-=n<11r?=U-?G&D|`Y><38o;8h4C^p2cT2#rc43(dO` zKIt7_m=M~3f$H?d-viTFm+JJ_bYRJH7GoA7Ctru~;$=D#e!P?TbCXQoT|LA+(yi&2 z5W*WJG%dZ7VSfYRZpSm_rkjsHsG~yjj)oE1I+puWs6?{RytDz6w>2{%w4DB1va8a8 zxb*i7&;A9W98TC5Bs^L5wd6g9UwMS^P@~f-)`wIr$HAm>|l zOLMPyoE&5e&C4S?6It(uPk_*4EtzsC|Ug_m+bgUjctax z`b#c3;V&I?rHZEhl1p~{rTEwWreyV(T(aXYUA$VfZ1tC1vh6SVLzmSnS^XuK?D$K? zx9_K9^_N_-<1hJla=)Zl)L(MRuD{fvqN%^+k{y33zO7JmtH0!u9e)W&TuN4d$t5TJ zr6X@r=ISrGMV!@p_RNhgthqX*E;)C0>H^$@$q6bsWycIPrh$6^@oh znq7a}TMUPuA;by<&^m+AqdOyK<{?*X_{+pJ8#ApV?P{Hi{-~BSww6@0ju%TgoJ(lz z=dF&J<~}1VuPyXgN9fp>)~|xlsDv{P=`W2{q3?dhpZ@0pR6;rvZ<-qXFqVP7+r5XsxQ00UtZ+O~P~3g}F~n$OGpAW1Em27c$&? zD$@jh<2PG1-0$$|6&ViVy&a+DN55POp;3usq4`5~Gv(x6Hv;m(w!nseVC@#m-wqhR zArq_Z6-8b^@vj0#z7v7R z?hWBMUG%Qqf^h7R*KDD=-!Tr~dN4xcP{!Ed?w9so51~;BM`(7$I0&s~I{xdMj{zCU zNhX?RS`#??))^4oHPbxa(VQq~5k?lWI5`bt$4rl%I$jy8nI>aHcFc6_fDbjdnrWBp znCVBiaDxe(m8r}fGkxDaqm-;>+RdFX(>uPa%+*Z0WXDX)H4i9R&9qB)%=Fq9`jo6@ z+9f;7+GAwCmaS&mB|B!ibuqoBab{WTk{vT`9r|}=u4dXLC(Lwwg_6}wyJW{qzv9nO z=4z&0vSX$Sv+q)} znrWAuFw?R{$!exuvSX%Wt9L0`%{0k0)7%a7;i{@p>3yAXC|Bkmt<_91)B7TmPo`I1 z1!%UPduwxG!TK;leDc?QMk5?A`4D00K7sIzZGf>wG{j|*$)Luj=#qGYnsS-VG$pSC z`X5mf-$%m+Lpd9!qxP$<(gjtPM7Cr<8q zzNTcgfG#<4a#ur#twhuUy5z*k-L(%YSuLPTc24e2yp(QIiKqp1$@#W zcXuzj%8L*3)9*V?QCz>G92}js^t`meN#&|6Jkw0V6>yrdfZJQYC_sg=9OEaa)EG5S znPx25k(n~*ta7?$dXnS+P){-BGPq;@Wv|mgJ62DPtRTZUD+WA=Cqi37>dn4DZ&vR8 zC86;`qYpEDqMmEaIg{b|N|(At{ngl)i8<^}+xSgHUZ2bWq|g%+LT@{rH$qSejuHIR zgWHKJbn8#2snB$+<7?g|yUTX~?*0ZHYgs_QRP16dW%#EQ`o0UsgIX|JnC72M&j%dd zc!l9!y4TXTR`JaWMd6Wz@r{JnY_)}^7GX;RkV2OxgwB7Gt8P>xS?E#-jfs0VCvHBN zh~L)f;Z5#7_kNK(9I-2O7esVsi=76H^jrq`^t@5X)f3WPkTZ49LpV{%`&{P4&gC*k zM5mKjwT8(bTPqCvzesq+^|sJdbDvJ)6dH%)_F{4RJ>?J@mG~&Br7@cbjs)K=)|M_q z?XAmH8J=Z#uPtY*``>yDP~r`Q<>wK8hwa@rA{V)=uf9f1_w9tL9y^rW5dSd@V=oqP@l_D|ZrozwI4r~8exLY{`DP+De;DtR|CwBqKXopSJ2T$vAt_@V z=`-}|nTdJmDjm-l!N%)Ly<%Mk7bJs$tNSL=AL?q2NUfwg;ik0-(7wbM;`yu9aJ zt>f9HdnJ#Dg6@Stp6rYV-I1D?_nhxi@dUuV0$2|2?zKDaS-aQuxEbtT*W)g$dy$aa zm+l2U?hCqC6}jQ&UJvBPhPmd)Zwt~c&cJv-7a33h z=Z+_!us0NM20ZBIO@O@HRw|FIos97MnY*~BDqdSjZ zv(#@e8NfU>{Muh!x@xwK$pq$-(6b%CJ9lpzlLgF|d$<3#{kA+ClMT%K=k51c&Q~1F zFkn7vae3Y)H2KhjCXU2@#4`%F0dJ9!^; zKj_IIe&`u$fuR-{YJs5^7;1r`78q)Qp%xfwfuR-{YJs5^7;1t4!WQ_r^}qLtho87? z`nZCNzK`{P`MAC(VF9$2tgZa0w4iq=3oe)ByLRmK#K6yD6N<4=cg3gB1s@#C^> zLH?$$reQ-2Jwq)p)B-~-Fw_D=EilvqLoG1W0z)k@)B-~-Fw_D=E%1N51-N|WGMDRU zE`<5RD!i;P3@^|0xz^{xm}_vZ*|~l4mXe!hY7m zVeHgcQj4Gd?Uaao9j)@opJLn|aoUY~ge$3 1\u001b[0m call_r_to_read_file(file_to_read)\n", - "File \u001b[0;32m~/basedosdados/pipelines/pipelines/datasets/br_denatran_frota/utils.py:408\u001b[0m, in \u001b[0;36mcall_r_to_read_file\u001b[0;34m(file)\u001b[0m\n\u001b[1;32m 405\u001b[0m readxl \u001b[39m=\u001b[39m rpackages\u001b[39m.\u001b[39mimportr(\u001b[39m\"\u001b[39m\u001b[39mreadxl\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[1;32m 407\u001b[0m \u001b[39m# Read the Excel file\u001b[39;00m\n\u001b[0;32m--> 408\u001b[0m robjects\u001b[39m.\u001b[39mr(\n\u001b[1;32m 409\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\"\"\u001b[39m\n\u001b[1;32m 410\u001b[0m \u001b[39m library(readxl)\u001b[39m\n\u001b[1;32m 411\u001b[0m \u001b[39m x <- read_excel(\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00mfile\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m\u001b[39m)\u001b[39m\n\u001b[1;32m 412\u001b[0m \u001b[39m\u001b[39m\u001b[39m\"\"\"\u001b[39m\n\u001b[1;32m 413\u001b[0m )\n\u001b[1;32m 415\u001b[0m \u001b[39m# Convert the R dataframe to a pandas dataframe\u001b[39;00m\n\u001b[1;32m 416\u001b[0m df \u001b[39m=\u001b[39m robjects\u001b[39m.\u001b[39mr[\u001b[39m\"\u001b[39m\u001b[39mx\u001b[39m\u001b[39m\"\u001b[39m]\n", - "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-Fyk5jlG0-py3.10/lib/python3.10/site-packages/rpy2/robjects/__init__.py:459\u001b[0m, in \u001b[0;36mR.__call__\u001b[0;34m(self, string)\u001b[0m\n\u001b[1;32m 457\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__call__\u001b[39m(\u001b[39mself\u001b[39m, string):\n\u001b[1;32m 458\u001b[0m p \u001b[39m=\u001b[39m rinterface\u001b[39m.\u001b[39mparse(string)\n\u001b[0;32m--> 459\u001b[0m res \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49meval(p)\n\u001b[1;32m 460\u001b[0m \u001b[39mreturn\u001b[39;00m conversion\u001b[39m.\u001b[39mget_conversion()\u001b[39m.\u001b[39mrpy2py(res)\n", - "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-Fyk5jlG0-py3.10/lib/python3.10/site-packages/rpy2/robjects/functions.py:208\u001b[0m, in \u001b[0;36mSignatureTranslatedFunction.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 206\u001b[0m v \u001b[39m=\u001b[39m kwargs\u001b[39m.\u001b[39mpop(k)\n\u001b[1;32m 207\u001b[0m kwargs[r_k] \u001b[39m=\u001b[39m v\n\u001b[0;32m--> 208\u001b[0m \u001b[39mreturn\u001b[39;00m (\u001b[39msuper\u001b[39;49m(SignatureTranslatedFunction, \u001b[39mself\u001b[39;49m)\n\u001b[1;32m 209\u001b[0m \u001b[39m.\u001b[39;49m\u001b[39m__call__\u001b[39;49m(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs))\n", - "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-Fyk5jlG0-py3.10/lib/python3.10/site-packages/rpy2/robjects/functions.py:131\u001b[0m, in \u001b[0;36mFunction.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 129\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 130\u001b[0m new_kwargs[k] \u001b[39m=\u001b[39m cv\u001b[39m.\u001b[39mpy2rpy(v)\n\u001b[0;32m--> 131\u001b[0m res \u001b[39m=\u001b[39m \u001b[39msuper\u001b[39;49m(Function, \u001b[39mself\u001b[39;49m)\u001b[39m.\u001b[39;49m\u001b[39m__call__\u001b[39;49m(\u001b[39m*\u001b[39;49mnew_args, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mnew_kwargs)\n\u001b[1;32m 132\u001b[0m res \u001b[39m=\u001b[39m cv\u001b[39m.\u001b[39mrpy2py(res)\n\u001b[1;32m 133\u001b[0m \u001b[39mreturn\u001b[39;00m res\n", - "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-Fyk5jlG0-py3.10/lib/python3.10/site-packages/rpy2/rinterface_lib/conversion.py:45\u001b[0m, in \u001b[0;36m_cdata_res_to_rinterface.._\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 44\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m---> 45\u001b[0m cdata \u001b[39m=\u001b[39m function(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 46\u001b[0m \u001b[39m# TODO: test cdata is of the expected CType\u001b[39;00m\n\u001b[1;32m 47\u001b[0m \u001b[39mreturn\u001b[39;00m _cdata_to_rinterface(cdata)\n", - "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/pipelines-Fyk5jlG0-py3.10/lib/python3.10/site-packages/rpy2/rinterface.py:817\u001b[0m, in \u001b[0;36mSexpClosure.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 810\u001b[0m res \u001b[39m=\u001b[39m rmemory\u001b[39m.\u001b[39mprotect(\n\u001b[1;32m 811\u001b[0m openrlib\u001b[39m.\u001b[39mrlib\u001b[39m.\u001b[39mR_tryEval(\n\u001b[1;32m 812\u001b[0m call_r,\n\u001b[1;32m 813\u001b[0m call_context\u001b[39m.\u001b[39m__sexp__\u001b[39m.\u001b[39m_cdata,\n\u001b[1;32m 814\u001b[0m error_occured)\n\u001b[1;32m 815\u001b[0m )\n\u001b[1;32m 816\u001b[0m \u001b[39mif\u001b[39;00m error_occured[\u001b[39m0\u001b[39m]:\n\u001b[0;32m--> 817\u001b[0m \u001b[39mraise\u001b[39;00m embedded\u001b[39m.\u001b[39mRRuntimeError(_rinterface\u001b[39m.\u001b[39m_geterrmessage())\n\u001b[1;32m 818\u001b[0m \u001b[39mreturn\u001b[39;00m res\n", - "\u001b[0;31mRRuntimeError\u001b[0m: Error: `path` does not exist: ‘pipelines/datasets/br_denatran_frota/teste.xls’\n" - ] - } - ], - "source": [ - "call_r_to_read_file()" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ÐÏ\u0011ࡱ\u001aá\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000>\u0000\u0003\u0000þÿ\t\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000B\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000þÿÿÿ\u0000\u0000\u0000\u0000þÿÿÿ\u0000\u0000\u0000\u0000A\u0000\u0000\u0000ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\u0010\u0000\u0000\u0006\u0005\u0000' Í\u0007ÉÀ\u0000\u0000\u0006\u0003\u0000\u0000á\u0000\u0002\u0000°\u0004Á\u0000\u0002\u0000\u0000\u0000â\u0000\u0000\u0000\\\u0000p\u0000\n", - "\u0000\u0000Denatran/CGIE B\u0000\u0002\u0000°\u0004a\u0001\u0002\u0000\u0000\u0000À\u0001\u0000\u0000=\u0001\u0004\u0000\u0002\u0000\u0001\u0000œ\u0000\u0002\u0000\u000e\u0000\u0019\u0000\u0002\u0000\u0000\u0000\u0012\u0000\u0002\u0000\u0000\u0000\u0013\u0000\u0002\u0000\u0000\u0000¯\u0001\u0002\u0000\u0000\u0000¼\u0001\u0002\u0000\u0000\u0000=\u0000\u0012\u0000\u0000\u0000‡\u0000X/Ï!8\u0000\u0001\u0000\u0000\u0000\u0001\u0000X\u0002@\u0000\u0002\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\"\u0000\u0002\u0000\u0000\u0000\u000e\u0000\u0002\u0000\u0001\u0000·\u0001\u0002\u0000\u0000\u0000Ú\u0000\u0002\u0000\u0000\u00001\u0000\u001a\u0000È\u0000\u0000\u0000ÿ\u0001\u0000\u0000\u0000\u0000\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001a\u0000È\u0000\u0000\u0000ÿ\u0001\u0000\u0000\u0000\u0000\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001a\u0000È\u0000\u0000\u0000ÿ\u0001\u0000\u0000\u0000\u0000\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001a\u0000È\u0000\u0000\u0000ÿ\u0001\u0000\u0000\u0000\u0000\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001a\u0000È\u0000\u0004\u0000\f\u0000\u0001\u0000\u0000\u0001\u0000\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001a\u0000È\u0000\u0004\u0000$\u0000\u0001\u0000\u0000\u0001\u0000\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001a\u0000È\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001a\u0000È\u0000\u0001\u0000ÿ¼\u0002\u0000\u0000\u0000\u0002\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001a\u0000 \u0000\u0001\u0000ÿ¼\u0002\u0000\u0000\u0000\u0002\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001a\u0000ð\u0000\u0001\u0000ÿ¼\u0002\u0000\u0000\u0000\u0002\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u00001\u0000\u001c\u0000È\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0002\u0000í\u0006\u0001T\u0000a\u0000h\u0000o\u0000m\u0000a\u00001\u0000\u001a\u0000È\u0000\u0000\u0000ÿ\u0001\u0000\u0000\u0000\u0002\u0000í\u0005\u0001A\u0000r\u0000i\u0000a\u0000l\u0000\u001e\u0004 \u0000\u0005\u0000\u001b\u0000\u0000\"R$ \"#,##0_);\\(\"R$ \"#,##0\\)\u001e\u0004%\u0000\u0006\u0000 \u0000\u0000\"R$ \"#,##0_);[Red]\\(\"R$ \"#,##0\\)\u001e\u0004&\u0000\u0007\u0000!\u0000\u0000\"R$ \"#,##0.00_);\\(\"R$ \"#,##0.00\\)\u001e\u0004+\u0000&\u0000\u0000\"R$ \"#,##0.00_);[Red]\\(\"R$ \"#,##0.00\\)\u001e\u0004=\u0000*\u00008\u0000\u0000_(\"R$ \"* #,##0_);_(\"R$ \"* \\(#,##0\\);_(\"R$ \"* \"-\"_);_(@_)\u001e\u0004.\u0000)\u0000)\u0000\u0000_(* #,##0_);_(* \\(#,##0\\);_(* \"-\"_);_(@_)\u001e\u0004E\u0000,\u0000@\u0000\u0000_(\"R$ \"* #,##0.00_);_(\"R$ \"* \\(#,##0.00\\);_(\"R$ \"* \"-\"??_);_(@_)\u001e\u00046\u0000+\u00001\u0000\u0000_(* #,##0.00_);_(* \\(#,##0.00\\);_(* \"-\"??_);_(@_)\u001e\u0004\u001e\u0000¤\u0000\u0019\u0000\u0000\"R$\"#,##0_);\\(\"R$\"#,##0\\)\u001e\u0004#\u0000¥\u0000\u001e\u0000\u0000\"R$\"#,##0_);[Red]\\(\"R$\"#,##0\\)\u001e\u0004$\u0000¦\u0000\u001f\u0000\u0000\"R$\"#,##0.00_);\\(\"R$\"#,##0.00\\)\u001e\u0004)\u0000§\u0000$\u0000\u0000\"R$\"#,##0.00_);[Red]\\(\"R$\"#,##0.00\\)\u001e\u0004:\u0000¨\u00005\u0000\u0000_(\"R$\"* #,##0_);_(\"R$\"* \\(#,##0\\);_(\"R$\"* \"-\"_);_(@_)\u001e\u0004B\u0000©\u0000=\u0000\u0000_(\"R$\"* #,##0.00_);_(\"R$\"* \\(#,##0.00\\);_(\"R$\"* \"-\"??_);_(@_)\u001e\u00040\u0000ª\u0000+\u0000\u0000_(* #,##0_);_(* \\(#,##0\\);_(* \"-\"??_);_(@_)\u001e\u0004\u000e\u0000«\u0000\t\u0000\u0000#,##0\\ \\ \u001e\u0004\f\u0000¬\u0000\u0007\u0000\u0000#,##0.0\u001e\u0004\u000e\u0000­\u0000\t\u0000\u0000#,##0.000\u001e\u0004\u000f\u0000®\u0000\n", - "\u0000\u0000#,##0.0000\u001e\u0004\u0010\u0000¯\u0000\u000b\u0000\u0000#,##0.00000\u001e\u0004\u0011\u0000°\u0000\f\u0000\u0000#,##0.000000\u001e\u0004\t\u0000±\u0000\u0004\u0000\u00000.0%\u001e\u0004\u000b\u0000²\u0000\u0006\u0000\u00000.000%\u001e\u0004\f\u0000³\u0000\u0007\u0000\u00000.0000%\u001e\u0004\n", - "\u0000´\u0000\u00000.00000%\u001e\u0004\u000e\u0000µ\u0000\t\u0000\u00000.000000%\u001e\u0004\u0012\u0000¶\u0000\n", - "\u0000\u0000#,##0.0000000\u001e\u0004\u0013\u0000·\u0000\u000e\u0000\u0000#,##0.00000000\u001e\u0004\u0014\u0000¸\u0000\u000f\u0000\u0000#,##0.000000000\u001e\u0004\u0015\u0000¹\u0000\u0010\u0000\u0000#,##0.0000000000\u001e\u0004\u0016\u0000º\u0000\u0011\u0000\u0000#,##0.00000000000\u001e\u0004\u0017\u0000»\u0000\u0012\u0000\u0000#,##0.000000000000\u001e\u0004\u0018\u0000¼\u0000\u0013\u0000\u0000#,##0.0000000000000\u001e\u0004\u0019\u0000½\u0000\u0014\u0000\u0000#,##0.00000000000000\u001e\u0004\u001a\u0000¾\u0000\u0015\u0000\u0000#,##0.000000000000000\u001e\u0004\u001b\u0000¿\u0000\u0016\u0000\u0000#,##0.0000000000000000\u001e\u0004\u001c\u0000À\u0000\u0017\u0000\u0000#,##0.00000000000000000\u001e\u0004\u001d\u0000Á\u0000\u0018\u0000\u0000#,##0.000000000000000000\u001e\u0004\u001e\u0000Â\u0000\u0019\u0000\u0000#,##0.0000000000000000000\u001e\u0004\u001f\u0000Ã\u0000\u001a\u0000\u0000#,##0.00000000000000000000\u001e\u0004 \u0000Ä\u0000\u001b\u0000\u0000#,##0.000000000000000000000\u001e\u0004\f\u0000Å\u0000\u0007\u0000\u00000.00000\u001e\u0004\u000b\u0000Æ\u0000\u0006\u0000\u00000.0000\u001e\u0004\n", - "\u0000Ç\u0000\u0005\u0000\u00000.000\u001e\u0000È\u0000\u0003\u0000\u00000.0\u001e\u0004\n", - "\u0000É\u0000\u00000.000000\u001e\u0004\u000e\u0000Ê\u0000\t\u0000\u00000.0000000\u001e\u0004\u000f\u0000Ë\u0000\n", - "\u0000\u00000.00000000\u001e\u00044\u0000Ì\u0000/\u0000\u0000_(* #,##0.0_);_(* \\(#,##0.0\\);_(* \"-\"??_);_(@_)\u001e\u0004\u001f\u0000Í\u0000\n", - "\u0000\u00010\u0000.\u00000\u00000\u00000\u00000\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u0000(Ü\u001e\u0004\u001f\u0000Î\u0000\n", - "\u0000\u00010\u0000.\u00000\u00000\u00000\u00000\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u0000TØ\u001e\u0004\u001d\u0000Ï\u0000\f\u0000\u00010\u0000.\u00000\u00000\u00000\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u0000TØ\u001e\u0004\u001b\u0000Ð\u0000\u000b\u0000\u00010\u0000.\u00000\u00000\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u0000TØ\u001e\u0004\u0019\u0000Ñ\u0000\n", - "\u0000\u00010\u0000.\u00000\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u0000TØ\u001e\u0004\u0015\u0000Ò\u0000\u00010\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u0000TØ\u001e\u0004\u001f\u0000Ó\u0000\n", - "\u0000\u00010\u0000.\u00000\u00000\u00000\u00000\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u00004Ü\u001e\u0004\u001d\u0000Ô\u0000\f\u0000\u00010\u0000.\u00000\u00000\u00000\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u00004Ü\u001e\u0004\u001b\u0000Õ\u0000\u000b\u0000\u00010\u0000.\u00000\u00000\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u00004Ü\u001e\u0004\u0019\u0000Ö\u0000\n", - "\u0000\u00010\u0000.\u00000\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u00004Ü\u001e\u0004\u0015\u0000×\u0000\u00010\u0000E\u0000+\u00000\u00000\u0000;\u0000\\\u00004Ü\u001e\u0004\u0015\u0000Ø\u0000\u0010\u0000\u0000#,##0;[Red]#,##0\u001e\u0004\u0015\u0000Ù\u0000\u0010\u0000\u0000#\\ ###\\ ###\\ ##0\u001e\u0004\u0015\u0000Ú\u0000\u0010\u0000\u0000#\\ ###\\ ###\\ ###\u001e\u0004?\u0000Û\u0000:\u0000\u0000_(\"$\"* #,##0.00_);_(\"$\"* \\(#,##0.00\\);_(\"$\"* \"-\"??_);_(@_)\u001e\u00047\u0000Ü\u00002\u0000\u0000_(\"$\"* #,##0_);_(\"$\"* \\(#,##0\\);_(\"$\"* \"-\"_);_(@_)\u001e\u0004\u0016\u0000Ý\u0000\u0011\u0000\u0000\"Sim\";\"Sim\";\"Não\"\u001e\u0004&\u0000Þ\u0000!\u0000\u0000\"Verdadeiro\";\"Verdadeiro\";\"Falso\"\u001e\u0004\"\u0000ß\u0000\u001d\u0000\u0000\"Ativar\";\"Ativar\";\"Desativar\"à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0001\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0001\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0002\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0002\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000õÿ \u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0005\u0000\u0000\u0000ôÿ\u0000\u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0006\u0000\u0000\u0000ôÿ\u0000\u0000\u0000ô\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0001\u0000,\u0000õÿ \u0000\u0000ø\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0001\u0000*\u0000õÿ \u0000\u0000ø\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0001\u0000\t\u0000õÿ \u0000\u0000ø\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0001\u0000+\u0000õÿ \u0000\u0000ø\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0001\u0000)\u0000õÿ \u0000\u0000ø\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0003\u0000\u0001\u0000 \u0000\u0000\f\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000Ú\u0000\u0001\u0000 \u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0003\u0000\u0001\u0000 \u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0001\u0000\"\u0000\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0001\u0000\u0012\u0000\u0000x\u0011\u0011@ @ \u0000\u0004* à\u0000\u0014\u0000\t\u0000\u0000\u0000\u0001\u0000\u001a\u0000\u0000x\u0011\u0011@ @ \u0000\u0004* à\u0000\u0014\u0000ª\u0000Q\u0001 \u0000\u0000,\u0011\u0011@ @ \u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0001\u0000\u001a\u0000\u0000x\u0011\u0011@ @ \u0000\u0004* à\u0000\u0014\u0000\u0003\u0000\u0001\u0000 \u0000\u0000l\u0011\u0011@ @ \u0000\u0004* à\u0000\u0014\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0007\u0000ª\u0000Q\u0001+\u0000\u0000|\u0011\u0011@ @ \u0000 à\u0000\u0014\u0000\u0000\u0000\u0001\u0000\"\u0000\u0000x\u0011\u0011@ @ \u0000\u0004* à\u0000\u0014\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000 \u0000`\u0000\u0000\u0000 \u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0003\u0000\u0001\u0000 \u0000\u0000$\u0000`\u0000\u0000\u0000 \u0000\u0000À à\u0000\u0014\u0000\u0000\u0000Æ\u0000A\u0001#\u0000\u00004\u0011\u0011@ @ \u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000\u0001\u0000\t\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0001\u0000\u0000\u0000\u0001\u0000\u00008\u0011\u0011@ @ \u0000\u0000À à\u0000\u0014\u0000\u000b\u0000\u0000\u0000\u0001\u0000\u00008\u0011\u0011@ @ \u0000\u0000À à\u0000\u0014\u0000\f\u0000\u0000\u0000\u0001\u0000\u00008\u0011\u0011@ @ \u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000x\u0011\u0011@ @ \u0000\u0004* à\u0000\u0014\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0001\u0000\t\u0000\u00008\u0011\u0011@ @ \u0000\u0000À à\u0000\u0014\u0000\n", - "\u0000\u0000\u0000\u0001\u0000\"\u0000\u0000x\u0011\u0011@ @ \u0000\u0004* à\u0000\u0014\u0000\u0000\u0000\u0001\u0000\u001a\u0000\u0000x\u0011\u0011@ @ \u0000\u0004* à\u0000\u0014\u0000\u0000\u0000\u0001\u0000 \u0000\u0000x\u0011\u0011@ @ \u0000\u0004* à\u0000\u0014\u0000\f\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\t\u0000A\u0001\"\u0000\u00000\u0011\u0011@ @ \u0000\u0000À à\u0000\u0014\u0000\u0000\u0000\u0002\u0000A\u0001#\u0000\u00004\u0011\u0011@ @ \u0000\u0000À “\u0002\u0004\u0000\u0010ÿ“\u0002\u0004\u0000\u0011€\tÿ“\u0002\u0004\u0000\u0012€\u0004ÿ“\u0002\u0004\u0000\u0013€\u0007ÿ“\u0002\u0004\u0000\u0000€\u0000ÿ“\u0002\u0004\u0000\u0014€\u0005ÿ“\u0002\u0004\u0000\u0015€\u0003ÿ“\u0002\u0004\u0000\u0016€\u0006ÿ`\u0001\u0002\u0000\u0000\u0000…\u0000\u0011\u0000ž\u001e\u0000\u0000\u0000\u0000\t\u0000Glossário…\u0000\u0010\u0000“)\u0000\u0000\u0000\u0000JAN_2009Œ\u0000\u0004\u00007\u00007\u0000®\u0001\u0004\u0000\u0002\u0000\u0001\u0004\u0017\u0000\u000e\u0000\u0002\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0018\u0000\u001b\u0000 \u0000\u0000\u0001\u000b\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0006;\u0001\u0000\u0000\u0000\u0017\u0000\u0000\u0000\u0002\u0000\u0018\u0000\u001b\u0000 \u0000\u0000\u0001\u000b\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0006=\u0000\u0000\u0000\u0000-\u0000\u0000\u0000\u0016\u0000Á\u0000Á\u0001\u0000\u0000\"¾\u0001\u0000ü\u0000A\n", - "€\u0000\u0000\u0000S\u0000\u0000\u0000'\u0000\u0000Grandes Regiões e\n", - "Unidades da Federação\u0005\u0000\u0000TOTAL\t\u0000\u0000AUTOMÓVEL\u0005\u0000\u0000BOND\u0000\u0000CAMINHÃO\u000f\u0000\u0000CAMINHÃO TRATOR\u000b\u0000\u0000CAMINHONETE\t\u0000\u0000CAMIONETA\u0011\u0000\u0000CHASSI PLATAFORMA\n", - "\u0000\u0000CICLOMOTOR\u000b\u0000\u0000MICROÔNIBUS\u000b\u0000\u0000MOTOCICLET\u0000\u0000MOTONETA\u0006\u0000\u0000ÔNIBUS\u000b\u0000\u0000QUADRICICLO\u0007\u0000\u0000REBOQUE\f\u0000\u0000SEMI-REBOQU\u0000\u0000SIDE-CAR\u0006\u0000\u0000OUTROS\u000e\u0000\u0000TRATOR ESTEIRA\f\u0000\u0000TRATOR RODA\u0000\u0000TRICICLO\n", - "\u0000\u0000UTILITÁRIO\u0005\u0000\u0000Acre \u0006\u0000\u0000Amapá\u0000\u0000Amazonas\u0005\u0000\u0000Pará \t\u0000\u0000Rondônia \u0007\u0000\u0000Roraima\t\u0000\u0000Tocantins\u0007\u0000\u0000Alagoas\u0005\u0000\u0000Bahia\u0005\u0000\u0000Ceará\t\u0000\u0000Maranhão\u0000\u0000Paraíba \u000b\u0000\u0000Pernambuco \u0005\u0000\u0000Piauí\u0014\u0000\u0000Rio Grande do Norte \u0007\u0000\u0000Sergipe\u000e\u0000\u0000Espírito Santo\n", - "\u0000\u0000Minas Gerais \u000e\u0000\u0000Rio de Janeiro\n", - "\u0000\u0000São Paulo \u0006\u0000\u0000Paraná\u0012\u0000\u0000Rio Grande do Sul \u000e\u0000\u0000Santa Catarina\u0010\u0000\u0000Distrito Federal\u0005\u0000\u0000Goiás\u000b\u0000\u0000Mato Grosso\u0012\u0000\u0000Mato Grosso do Sul°\u0000\u0000Fonte: Ministério das Cidades, Departamento Nacional de Trânsito - DENATRAN, Sistema Nacional de Registro de Veículos/RENAVAM, Sistema Nacional de Estatística de Trânsito/SINET\u0006\u0000\u0000Brasil\u0005\u0000\u0000Nort\u0000\u0000Nordeste\u0007\u0000\u0000Sudeste\u0003\u0000\u0000Sul\f\u0000\u0000Centro-Oestet\u0000\u0000veículo automotor destinado ao transporte de passageiros, com capacidade para até oito pessoas, exclusive o condutor7\u0000\u0000veículo de propulsão elétrica que se move sobre trilhosi\u0000\u0000veículo automotor destinado ao transporte de carga, com carroçaria, e peso bruto total superior a 3500 Kg9\u0000\u0000veículo automotor destinado a tracionar ou arrastar outroX\u0000\u0000veículo automotor destinado ao transporte de carga, com peso bruto total de até 3500 Kg.\u0000\u0000veículo inacabado, com equipamento que permita seu deslocamento em vias de rolamento, preparado para receber carroçaria de ônibus¿\u0000\u0000veículo de duas ou três rodas, provido de um motor de combustão interna cuja cilindrada não exceda a 50 cm3(3,05 polegadas cúbicas) e cuja velocidade máxima de fabricação não exceda a 50 Km/hO\u0000\u0000veículo automotor de transporte coletivo com capacidade para até 20 passageirosJ\u0000\u0000veículo auto-motor de duas rodas, dirigido por condutor em posição sentadaµ\u0000\u0000veículo automotor de transporte coletivo com capacidade para mais de 20 passageiros, ainda que, em virtude de adaptações com vista à maior comodidade destes, transporte número menorr\u0000\u0000veículo de estrutura mecânica igual às motocicletas, possuindo eixos dianteiro e traseiro, dotados de quatro rodas>\u0000\u0000veículo destinado a ser engatado atrás de um veículo automotorj\u0000\u0000veículo de um ou mais eixos que se apóia na sua unidade tratora ou é a ela ligado por meio de articulação.G\u0000\u0000carro ou caçamba provido de uma roda acoplada na lateral da motocicleta?\u0000\u0000Argumento que não se enquadra em nenhuma definição estabelecida+\u0000\u0000trator que se movimenta por meio de esteiraK\u0000\u0000trator que se movimenta sobre rodas,podendo ter chassi rígido ou articulado\\\u0000\u0000veículo rodoviário automotor de estrutura mecânica igual à motocicleta dotado de três rodas.U\u0000\u0000veículo misto caracterizado pela versatilidade do seu uso, inclusive fora da estrada.?\u0000\u0000Regiões Norte, Nordeste, Sul, Suldeste e Centro Oeste e Estados\u0013\u0000\u0000Termos e DefiniçõesR\u0000\u0000veículo automotor de duas rodas, com ou sem side-car, dirigido em posição montada.˜\u0000\u0000veículo automotor, misto, com quatro rodas, com carroçaria, destinado ao transporte simultâneo ou alternativo de pessoas e carga no mesmo compartimento.~\u0000\u0000Fonte: Ministério das Cidades, DENATRAN - Departamento Nacional de Trânsito, RENAVAM-Registro Nacional de Veículos Automotoresf\u0000\u0000Frota de veículos, por tipo e com placa, segundo as Grandes Regiões e Unidades da Federação - JAN/2009H\u0000\u0000Tabela 2 - Percentagem de veículos, por tipo segundo o Brasil - JAN/2009ÿ\u0000Z\u0000ê\u0010\u0000\u0000\f\u0000\u0000\u0000g\u0011\u0000\u0000‰\u0000\u0000\u0000Ð\u0011\u0000\u0000ò\u0000\u0000\u00003\u0012\u0000\u0000U\u0001\u0000\u0000ƒ\u0012\u0000\u0000¥\u0001\u0000\u0000ê\u0012\u0000\u0000\f\u0002\u0000\u0000b\u0013\u0000\u0000„\u0002\u0000\u0000d\u0014\u0000\u0000†\u0003\u0000\u0000m\u0017\u0000\u0000\u0006\u0000\u0000s\u001a\u0000\u0000•\t\u0000\u0000î\u001c\u0000\u0000\u0010\f\u0000\u0000\u0015\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0015\u0000\u0000\u0000\u0000\u0000\u0000\u0000¶\n", - "\u0000\u0000\u0000\u0010\u0000\u0000\u0006\u0010\u0000' Í\u0007ÉÀ\u0000\u0000\u0006\u0003\u0000\u0000\u000b\u0002\u0014\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0018\u0000\u0000\u00006$\u0000\u0000\u0006)\u0000\u0000\n", - "\u0000\u0002\u0000\u0001\u0000\f\u0000\u0002\u0000d\u0000\u000f\u0000\u0002\u0000\u0001\u0000\u0011\u0000\u0002\u0000\u0000\u0000\u0010\u0000ü©ñÒMbP?_\u0000\u0002\u0000\u0001\u0000*\u0000\u0002\u0000\u0000\u0000+\u0000\u0002\u0000\u0000\u0000‚\u0000\u0002\u0000\u0001\u0000€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000%\u0002\u0004\u0000\u0000\u0000ÿ\u0000\u0000\u0002\u0000À\u0004\u0014\u0000 \u0000\u001d\u0000\u0000&CFrota - Termos e Definições\u0015\u0000\u0012\u0000\u000f\u0000\u0000&CDENATRAN-CGIEƒ\u0000\u0002\u0000\u0000\u0000„\u0000\u0002\u0000\u0000\u0000&\u0000ffffffÖ?'\u0000¤p=\n", - "×£Ð?(\u0000ffffffæ?)\u0000ÍÌÌÌÌÌä?M\u0000v\u0004\u0000\u0000\\\u0000\\\u0000m\u0000j\u0000-\u00000\u00002\u00009\u00007\u00007\u00002\u0000\\\u0000L\u0000e\u0000x\u0000m\u0000a\u0000r\u0000k\u0000 \u0000T\u00005\u00002\u00000\u0000 \u0000S\u0000B\u0000E\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\fÜ\u0000˜\u0003\u0003÷\u0000\u0004\u0001\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0007\u0000X\u0002\u0001\u0000\u0001\u0000X\u0002\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000⤗¼\u0000\u0001\u0001\u0002ÿ\u0002\u0002\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000Lexmark T520 SBE\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Lexmark T520 SBE\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000*\u0002\u0000\u0000Lexmark T520\u0000 R\u0000\u0000\u0000\u0007\u0000\u0007\u0000\u0000ð\n", - "\u0000\u0000ð\n", - "\u0000\u0010\u0001ÿÿ\u0000\u0000\u0014\u0000\u0001\u0000\f\u0000\u000e\u0000\u0005\u0000\u0006\u0000\u0003\u0000\u0005\u0000\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\t\u0000\u0000\u0000‰\u0001\u0003\u0000\u000fÆ\u0000\u0000çr\u0001\u0000\u0001\u0000\u0015\u0000\u0010\u0000\u000e\u0000'\u0000\u0013\u0000\u0000\u0000A\u0000>\u0001⤗¼\u0002\u0000\u0001\u0000ÿ\u0000°\u0004X\u0002,\u0001\u0000\u0000\u0000\u0000X\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000ñ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n", - "\u0000\u0000\u0000\n", - "\u0000\u0000\u0000\n", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Æ^\u0000\u0000\u0000\u0000\u0000\u0000⤗¼¡\u0000\"\u0000\t\u0000d\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0002\u0000X\u0002X\u0002éÅüý~ß?{\u0014®GázÔ?\u0001\u0000U\u0000\u0002\u0000}\u0000\f\u0000\u0000\u0000\u0000\u0000Û\u0002\u000f\u0000\u0002\u0000\u0002\u0000}\u0000\f\u0000\u0001\u0000\u0001\u0000Û\u0018,\u0000\u0002\u0000\u0002\u0000}\u0000\f\u0000\u0002\u0000\u0002\u0000$E\u000f\u0000\u0002\u0000\u0002\u0000\u0000\u0002\u000e\u0000\u0000\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0000\u0000\n", - "\u0000\u0000\u0002\u0010\u0000\u0000\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0001\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0002\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0003\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0004\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0005\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0006\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0007\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\t\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\n", - "\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u000b\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\f\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\n", - "\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u000e\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u000f\u0000\u0001\u0000\u0003\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0010\u0000\u0001\u0000\n", - "\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0011\u0000\u0001\u0000\n", - "\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0012\u0000\u0001\u0000\n", - "\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0013\u0000\u0001\u0000\n", - "\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0014\u0000\u0001\u0000\n", - "\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0015\u0000\u0001\u0000\n", - "\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0016\u0000\u0001\u0000\n", - "\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0002\u0010\u0000\u0017\u0000\u0001\u0000\n", - "\u0000þ\u0001\u0000\u0000\u0000\u0000@\u0001\u000f\u0000ý\u0000\n", - "\u0000\u0000\u0000\u0001\u0000.\u0000M\u0000\u0000\u0000\u0001\u0002\u0006\u0000\u0000\u0000\u0002\u0000.\u0000ý\u0000\n", - "\u0000\u0001\u0000\u0001\u0000\u001f\u0000\u0000\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0001\u0000\u0002\u0000(\u0000L\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u0001\u0000+\u0000\u0002\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u0002\u0000)\u00009\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0003\u0000\u0001\u0000+\u0000\u0003\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0003\u0000\u0002\u0000)\u0000:\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0004\u0000\u0001\u0000+\u0000\u0004\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0004\u0000\u0002\u0000)\u0000;\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0005\u0000\u0001\u0000+\u0000\u0005\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0005\u0000\u0002\u0000)\u0000<\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0006\u0000\u0001\u0000+\u0000\u0006\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0006\u0000\u0002\u0000)\u0000=\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0007\u0000\u0001\u0000+\u0000\u0007\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0007\u0000\u0002\u0000)\u0000O\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0001\u0000+\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000*\u0000>\u0000\u0000\u0000ý\u0000\n", - "\u0000\t\u0000\u0001\u0000+\u0000\t\u0000\u0000\u0000ý\u0000\n", - "\u0000\t\u0000\u0002\u0000)\u0000?\u0000\u0000\u0000ý\u0000\n", - "\u0000\n", - "\u0000\u0001\u0000+\u0000\n", - "\u0000\u0000\u0000ý\u0000\n", - "\u0000\n", - "\u0000\u0002\u0000)\u0000@\u0000\u0000\u0000ý\u0000\n", - "\u0000\u000b\u0000\u0001\u0000+\u0000\u000b\u0000\u0000\u0000ý\u0000\n", - "\u0000\u000b\u0000\u0002\u0000)\u0000N\u0000\u0000\u0000ý\u0000\n", - "\u0000\f\u0000\u0001\u0000+\u0000\f\u0000\u0000\u0000ý\u0000\n", - "\u0000\f\u0000\u0002\u0000)\u0000A\u0000\u0000\u0000ý\u0000\n", - "\u0000\n", - "\u0000\u0001\u0000+\u0000\n", - "\u0000\u0000\u0000ý\u0000\n", - "\u0000\n", - "\u0000\u0002\u0000)\u0000B\u0000\u0000\u0000ý\u0000\n", - "\u0000\u000e\u0000\u0001\u0000+\u0000\u000e\u0000\u0000\u0000ý\u0000\n", - "\u0000\u000e\u0000\u0002\u0000*\u0000C\u0000\u0000\u0000ý\u0000\n", - "\u0000\u000f\u0000\u0001\u0000+\u0000\u000f\u0000\u0000\u0000ý\u0000\n", - "\u0000\u000f\u0000\u0002\u0000)\u0000D\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0010\u0000\u0001\u0000+\u0000\u0010\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0010\u0000\u0002\u0000)\u0000E\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0011\u0000\u0001\u0000+\u0000\u0011\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0011\u0000\u0002\u0000)\u0000F\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0012\u0000\u0001\u0000+\u0000\u0012\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0012\u0000\u0002\u0000)\u0000G\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0013\u0000\u0001\u0000+\u0000\u0013\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0013\u0000\u0002\u0000)\u0000H\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0014\u0000\u0001\u0000+\u0000\u0014\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0014\u0000\u0002\u0000)\u0000I\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0015\u0000\u0001\u0000+\u0000\u0015\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0015\u0000\u0002\u0000)\u0000J\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0016\u0000\u0001\u0000+\u0000\u0016\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0016\u0000\u0002\u0000)\u0000K\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0017\u0000\u0001\u0000-\u00002\u0000\u0000\u0000¾\u0000\u0016\u0000\u0017\u0000\u0002\u0000-\u0000'\u0000'\u0000'\u0000'\u0000'\u0000'\u0000'\u0000\t\u0000×\u00004\u0000ˆ\u0004\u0000\u0000Ì\u0001\u0018\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000\u001c\u0000>\u0002\u0012\u0000°\u0000\u0000\u0000\u0000\u0000@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0004\u0000\u0003\u0000\u0004\u0000\u001d\u0000\u000f\u0000\u0003\u0001\u0000\u0003\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0003\u0003å\u0000\u0012\u0000\u0002\u0000\u0017\u0000\u0017\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000ï\u0000\u0006\u0000\u0000\u00007\u0000\u0000\u0000\n", - "\u0000\u0000\u0000\u0010\u0000\u0000\u0006\u0010\u0000' Í\u0007ÉÀ\u0000\u0000\u0006\u0003\u0000\u0000\u000b\u0002\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000.\u0000\u0000\u0000™1\u0000\u0000ˆX\u0000\u0000@a\u0000\u0000\n", - "\u0000\u0002\u0000\u0001\u0000\f\u0000\u0002\u0000d\u0000\u000f\u0000\u0002\u0000\u0001\u0000\u0011\u0000\u0002\u0000\u0000\u0000\u0010\u0000ü©ñÒMbP?_\u0000\u0002\u0000\u0001\u0000*\u0000\u0002\u0000\u0000\u0000+\u0000\u0002\u0000\u0000\u0000‚\u0000\u0002\u0000\u0001\u0000€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000%\u0002\u0004\u0000\u0000\u0000ÿ\u0000\u0000\u0002\u0000Á\u0005\u0014\u0000\u0010\u0000\n", - "\u0000\u0000&F&RPágina &P\u0015\u0000\u0000\u0000ƒ\u0000\u0002\u0000\u0000\u0000„\u0000\u0002\u0000\u0000\u0000&\u0000Ház\u0014®GÑ?'\u0000)\\Âõ(Ì?(\u0000=\n", - "×£p=Ú?M\u0000\u000e\u0007\u0000\u0000\\\u0000\\\u0000h\u0000o\u0000b\u0000b\u0000e\u0000s\u0000\\\u0000L\u0000E\u0000X\u0000-\u0000M\u0000O\u0000N\u0000O\u0000-\u0000S\u0000L\u00005\u00002\u00004\u0000-\u00000\u00004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0001Ü\u00000\u0006\u0013×\u0001\u0000\u0002\u0000\t\u0000š\u000b3\u0000\u0001\u0000\u000f\u0000X\u0002\u0001\u0000\u0001\u0000\u0000\u0000\u0003\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000+\u0000\u0000\u0000\u0000L\u0005@\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0010'\u0010'\u0010'\u0000\u0000\u0010'\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000°\u0004°\u0004j\u0000-\u0000X\u0002X\u0002<\u0000-\u0000X\u0002X\u0002<\u0000-\u0000X\u0002X\u0002<\u0000-\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000(\u0000N\u0000o\u0000n\u0000e\u0000)\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000(\u0000N\u0000o\u0000n\u0000e\u0000)\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000(None)\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000(None)\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000¿ó\u000b\u0000\u0000\u0000\u0001\u0000<\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000+\u0000\u0000\u0000¡\u0000\"\u0000\t\u00003\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0000\u0000X\u0002X\u0002Ãõ(\\ÂÅ?éÅüý~ß?\u0001\u0000U\u0000\u0002\u0000}\u0000\f\u0000\u0000\u0000\u0000\u0000$\u0012\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0001\u0000\u0001\u0000I\u000b\u000f\u0000\u0006\u0000\u0000\u0000}\u0000\f\u0000\u0002\u0000\u0002\u0000¶\f\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0003\u0000\u0003\u0000¶\u000b\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0004\u0000\u0004\u0000\u0000\u000b\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0005\u0000\u0005\u0000$\u000b\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0006\u0000\u0006\u0000$\n", - "\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0007\u0000\u0007\u0000I\n", - "\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000’\t\u000f\u0000\u0006\u0000\u0000\u0000}\u0000\f\u0000\t\u0000\t\u0000\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\n", - "\u0000\n", - "\u0000$\t\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u000b\u0000\u000b\u0000m\n", - "\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\f\u0000\f\u0000¶\t\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\n", - "\u0000\n", - "\u0000’\t\u000f\u0000\u0006\u0000\u0000\u0000}\u0000\f\u0000\u000e\u0000\u000e\u0000\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u000f\u0000\u000f\u0000\u000f\u0000\u0006\u0000\u0000\u0000}\u0000\f\u0000\u0010\u0000\u0010\u0000m\n", - "\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0011\u0000\u0011\u0000m\u0007\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0012\u0000\u0012\u0000\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0013\u0000\u0013\u0000\u000f\u0000\u0006\u0000\u0000\u0000}\u0000\f\u0000\u0014\u0000\u0014\u0000I\u0007\u000f\u0000\u0006\u0000\u0000\u0000}\u0000\f\u0000\u0015\u0000\u0015\u0000m\u0005\u000f\u0000\u0002\u0000\u0000\u0000}\u0000\f\u0000\u0016\u0000\u0016\u0000’\t\u000f\u0000\u0006\u0000\u0000\u0000\u0000\u0002\u000e\u0000\u0000\u0000\u0000\u0000.\u0000\u0000\u0000\u0000\u0000\u0017\u0000\u0000\u0002\u0010\u0000\u0000\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0002\u0000\u0000\u0000\u0017\u0000ü\u0003\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0003\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0004\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0005\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0006\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0007\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\t\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\n", - "\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u000b\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\f\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\n", - "\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u000e\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u000f\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0010\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0011\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0012\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0013\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0014\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0015\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0016\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0017\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0018\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u0019\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u001a\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u001b\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u001c\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u001d\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u001e\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\u001f\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0000ý\u0000\n", - "\u0000\u0000\u0000\u0000\u0000\u0017\u0000Q\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u0000\u0000\u001f\u0000\u0000\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u0001\u0000\u001d\u0000\u0001\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u0002\u0000\u001d\u0000\u0002\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u0003\u0000\u001d\u0000\u0003\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u0004\u0000\u001d\u0000\u0004\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u0005\u0000\u001d\u0000\u0005\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u0006\u0000\u001d\u0000\u0006\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u0007\u0000\u001d\u0000\u0007\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u001d\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\t\u0000\u001d\u0000\t\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\n", - "\u0000\u001d\u0000\n", - "\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u000b\u0000\u001d\u0000\u000b\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\f\u0000\u001d\u0000\f\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\n", - "\u0000\u001d\u0000\n", - "\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u000e\u0000\u001d\u0000\u000e\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u000f\u0000\u001d\u0000\u000f\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u0010\u0000\u001d\u0000\u0010\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u0011\u0000\u001d\u0000\u0011\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u0012\u0000\u001d\u0000\u0012\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u0013\u0000\u001d\u0000\u0013\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u0014\u0000\u001d\u0000\u0014\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u0015\u0000\u001d\u0000\u0015\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0002\u0000\u0016\u0000\u001d\u0000\u0016\u0000\u0000\u0000ý\u0000\n", - "\u0000\u0003\u0000\u0000\u0000#\u00003\u0000\u0000\u0000\u0006\u00003\u0000\u0003\u0000\u0001\u0000 \u0000\u0000\u0000\u0000È´%ŠA \u0000\u0018<Šý\u001d\u0000$\u0004\u0000\u0001À$\f\u0000\u0001À$\u0016\u0000\u0001À$\u001b\u0000\u0001À$\u001f\u0000\u0001ÀB\u0005\u0004\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0002\u0000 \u0000\u0000\u0000\u0000¸~A(\u0000\u0003\u0000\u0001ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000¼\u0004'\u0000\u0003\u0000\u0003\u0000\u0002\u0016\u0000\u0015\u001d\u0000,\u0001\u0000\u0000À,\t\u0000\u0000À,\u0013\u0000\u0000À,\u0018\u0000\u0000À,\u001c\u0000\u0000ÀB\u0005\u0004\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0003\u0000 \u0000\u0000\u0000\u0000\u0000\u0000`f@(\u0000\u0003\u0000\u0002ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0004\u0000 \u0000\u0000\u0000\u0000\u0000M«=A(\u0000\u0003\u0000\u0003ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0005\u0000 \u0000\u0000\u0000\u0000\u0000<Õ\u0014A(\u0000\u0003\u0000\u0004ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0006\u0000 \u0000\u0000\u0000\u0000\u0000ã¶JA(\u0000\u0003\u0000\u0005ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0007\u0000 \u0000\u0000\u0000\u0000\u0000b8A(\u0000\u0003\u0000\u0006ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000 \u0000\u0000\u0000\u0000\u0000\u0000‰¶@(\u0000\u0003\u0000\u0007ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\t\u0000 \u0000\u0000\u0000\u0000\u0000 sô@(\u0000\u0003ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\n", - "\u0000 \u0000\u0000\u0000\u0000\u0000@‚\fA(\u0000\u0003\u0000\tÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u000b\u0000 \u0000\u0000\u0000\u0000@ŒEeA(\u0000\u0003\u0000\n", - "ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\f\u0000 \u0000\u0000\u0000\u0000\u0000ª\u0005>A(\u0000\u0003\u0000\u000bÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\n", - "\u0000 \u0000\u0000\u0000\u0000\u00004‘\u0018A(\u0000\u0003\u0000\fÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u000e\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000c@(\u0000\u0003\u0000\n", - "ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u000f\u0000 \u0000\u0000\u0000\u0000\u0000f0#A(\u0000\u0003\u0000\u000eÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0010\u0000 \u0000\u0000\u0000\u0000\u0000²Ö A(\u0000\u0003\u0000\u000fÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0011\u0000 \u0000\u0000\u0000\u0000\u0000\u0000]À@(\u0000\u0003\u0000\u0010ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0012\u0000 \u0000\u0000\u0000\u0000\u0000\u0000›¹@(\u0000\u0003\u0000\u0011ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0013\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000Z@(\u0000\u0003\u0000\u0012ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0014\u0000 \u0000\u0000\u0000\u0000\u0000À{Ð@(\u0000\u0003\u0000\u0013ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0015\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0013±@(\u0000\u0003\u0000\u0014ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0003\u0000\u0016\u0000 \u0000\u0000\u0000\u0000\u0000 -\u0005A(\u0000\u0003\u0000\u0015ÿ\u0005\u0000\u0001\u0003\u0000\u0002\u0000ý\u0000\n", - "\u0000\u0004\u0000\u0000\u0000\u001b\u00004\u0000\u0000\u0000\u0006\u0000#\u0000\u0004\u0000\u0001\u0000\u0018\u0000\u0000\u0000\u0000€\u0005ý@A \u0000\u0003\u0000\u0016ÿ\n", - "\u0000%\u0005\u0000\u000b\u0000\u0001À\u0001À\u0019\u0010Èó\u0006\u0000\u001b\u0000\u0004\u0000\u0002\u0000\u0018\u0000\u0000\u0000\u0000\u0000î.)A(\u0000\u0004\u0000\u0001ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000¼\u0004\u0017\u0000\u0004\u0000\u0004\u0000\u0002\u0016\u0000\u0015\n", - "\u0000-\u0001\u0000\u0007\u0000\u0000À\u0000À\u0019\u0010Èó\u0006\u0000\u001b\u0000\u0004\u0000\u0003\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000(\u0000\u0004\u0000\u0002ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0004\u0000\u0018\u0000\u0000\u0000\u0000\u00000d÷@(\u0000\u0004\u0000\u0003ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0005\u0000\u0018\u0000\u0000\u0000\u0000\u0000€èÆ@(\u0000\u0004\u0000\u0004ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0006\u0000\u0018\u0000\u0000\u0000\u0000\u0000°\u0007A(\u0000\u0004\u0000\u0005ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0007\u0000\u0018\u0000\u0000\u0000\u0000\u0000@Þë@(\u0000\u0004\u0000\u0006ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000€u@(\u0000\u0004\u0000\u0007ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\t\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000Ø @(\u0000\u0004ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\n", - "\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000^Á@(\u0000\u0004\u0000\tÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u000b\u0000\u0018\u0000\u0000\u0000\u0000\u0000ʾ&A(\u0000\u0004\u0000\n", - "ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\f\u0000\u0018\u0000\u0000\u0000\u0000\u00008–\tA(\u0000\u0004\u0000\u000bÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\n", - "\u0000\u0018\u0000\u0000\u0000\u0000\u0000@kÔ@(\u0000\u0004\u0000\fÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u000e\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000ð?(\u0000\u0004\u0000\n", - "ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u000f\u0000\u0018\u0000\u0000\u0000\u0000\u0000@ÿÔ@(\u0000\u0004\u0000\u000eÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0010\u0000\u0018\u0000\u0000\u0000\u0000\u0000ÀBÚ@(\u0000\u0004\u0000\u000fÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0011\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000Ðy@(\u0000\u0004\u0000\u0010ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0012\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000W@(\u0000\u0004\u0000\u0011ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0013\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000ð?(\u0000\u0004\u0000\u0012ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0014\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000€X@(\u0000\u0004\u0000\u0013ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0015\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000@f@(\u0000\u0004\u0000\u0014ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0004\u0000\u0016\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000(½@(\u0000\u0004\u0000\u0015ÿ\u0005\u0000\u0001\u0004\u0000\u0002\u0000ý\u0000\n", - "\u0000\u0005\u0000\u0000\u0000\u000f\u0000\u0017\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0005\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u00000sû@(\u0000\u0004\u0000\u0016ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000¼\u0004\u0017\u0000\u0005\u0000#\u0000\u0001\u0001\u0000\u001f\n", - "\u0000-\u0000\u0000\u0000\u0000\u0001À\u0015À\u0019\u0010ˆ\u0000½\u0000„\u0000\u0005\u0000\u0002\u0000\u000f\u0000À€ã@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000\n", - "±@\u000f\u0000\u0000@t@\u000f\u0000\u0000¶Æ@\u000f\u0000\u0000ú¡@\u000f\u0000\u0000\u0000*@\u000f\u0000\u0000\u0000$@\u000f\u0000\u0000àa@\u000f\u0000àeä@\u000f\u0000\u0000·Â@\u000f\u0000\u0000~@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000 Ž@\u000f\u0000\u0000à@\u000f\u0000\u0000€M@\u000f\u0000\u0000\u0000ð?\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000\u0000ð?\u000f\u0000\u0000\u0000\u001c@\u000f\u0000\u0000\u0010t@\u0016\u0000ý\u0000\n", - "\u0000\u0006\u0000\u0000\u0000\u000f\u0000\u0018\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0006\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000€wõ@(\u0000\u0005\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0006\u0000\u0002\u00002\u0000àÌã@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000°¥@2\u0000\u0000 g@2\u0000€zÂ@2\u0000\u0000¤¢@2\u0000\u0000\u0000.@2\u0000\u0000\u0000L@2\u0000\u0000\u0000o@2\u0000@¨Ø@2\u0000\u0000c´@2\u0000\u0000X€@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000À€@2\u0000\u0000\u0000y@2\u0000\u0000\u0000H@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000\u0000\u0000\u00002\u0000\u0000\u0000\u0010@2\u0000\u0000\u0000 @2\u0000\u0000pp@\u0016\u0000ý\u0000\n", - "\u0000\u0007\u0000\u0000\u0000\u000f\u0000\u0019\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0007\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000¨=\u001aA(\u0000\u0006\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0007\u0000\u0002\u0000\u000f\u0000À¶\n", - "A\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000€3Ì@\u000f\u0000\u0000´›@\u000f\u0000@Pä@\u000f\u0000€Ð@\u000f\u0000\u0000\u0000P@\u000f\u0000\u0000àt@\u000f\u0000\u0000D¡@\u000f\u0000°‘ö@\u000f\u0000€=Ö@\u000f\u0000\u0000*¶@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000\u0000™@\u000f\u0000\u0000BÂ@\u000f\u0000\u0000\u0000\u001c@\u000f\u0000\u0000@P@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000€D@\u000f\u0000\u0000€K@\u000f\u0000\u0000¼™@\u0016\u0000ý\u0000\n", - "\u0000\u0000\u0000\u000f\u0000\u001a\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000Œ»&A(\u0000\u0007\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0002\u00002\u0000¤)\u0011A2\u0000\u0000\u0000\u0000\u00002\u0000\u0000<á@2\u0000\u0000n©@2\u0000à;ê@2\u0000\u0000 Ô@2\u0000\u0000 l@2\u0000\u0000€z@2\u0000\u0000ί@2\u0000Pc\u000fA2\u0000  î@2\u0000€±À@2\u0000\u0000\u0000ð?2\u0000\u0000\u0011¼@2\u0000\u0000Mº@2\u0000\u0000@b@2\u0000\u0000\u00001@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000\u0000:@2\u0000\u0000\u0000K@2\u0000\u0000¦«@\u0016\u0000ý\u0000\n", - "\u0000\t\u0000\u0000\u0000\u000f\u0000\u001b\u0000\u0000\u0000\u0006\u0000\u001b\u0000\t\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000hu\u001aA(\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\t\u0000\u0002\u00002\u0000\u0010Iü@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000ØÒ@2\u0000\u0000x«@2\u0000 ðá@2\u0000\u0000i¸@2\u0000\u0000\u00002@2\u0000\u0000Àx@2\u0000\u0000(‚@2\u0000€S\u0006A2\u0000`1ê@2\u0000\u0000j¦@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000s²@2\u0000\u0000ö¶@2\u0000\u0000\u0000D@2\u0000\u0000@2\u0000\u0000\u0000ð?2\u0000\u0000\u0000&@2\u0000\u0000\u0000<@2\u0000\u0000€‡@\u0016\u0000ý\u0000\n", - "\u0000\n", - "\u0000\u0000\u0000\u000f\u0000\u001c\u0000\u0000\u0000\u0006\u0000\u001b\u0000\n", - "\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000°å÷@(\u0000\t\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\n", - "\u0000\u0002\u00002\u0000À«Þ@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000Ú¥@2\u0000\u0000àn@2\u0000€…Ä@2\u0000\u0000 ¤@2\u0000\u0000\u0000ð?2\u0000\u0000\u0000=@2\u0000\u0000Àt@2\u0000À°â@2\u0000€\u001fÃ@2\u0000\u0000è@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000°u@2\u0000\u0000„@2\u0000\u0000\u0000\u0010@2\u0000\u0000@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000\u0000\u0000@2\u0000\u0000\u0000\u0018@2\u0000\u0000Pp@\u0016\u0000ý\u0000\n", - "\u0000\u000b\u0000\u0000\u0000\u000f\u0000\u001d\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u000b\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000ì‰\u0013A(\u0000\n", - "\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u000b\u0000\u0002\u00002\u0000È÷@2\u0000\u0000\u0000\u0000\u00002\u0000€rÐ@2\u0000\u0000ú¢@2\u0000\u0000©Ü@2\u0000\u0000ô¶@2\u0000\u0000\u0000 @2\u0000\u0000XŒ@2\u0000\u0000l”@2\u0000 Aú@2\u0000 fæ@2\u0000\u0000t¡@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000\u0002¸@2\u0000\u0000Hª@2\u0000\u0000@[@2\u0000\u0000@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000\u0000*@2\u0000\u0000\u00004@2\u0000\u0000H…@\u0016\u0000ý\u0000\n", - "\u0000\f\u0000\u0000\u0000\u001b\u00005\u0000\u0000\u0000\u0006\u0000\u001b\u0000\f\u0000\u0001\u0000\u0017\u0000\u0000\u0000\u0000€©:\\A(\u0000\u000b\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000\u0006\u0000\u001b\u0000\f\u0000\u0002\u0000\u0017\u0000\u0000\u0000\u0000€×\u0000JA(\u0000\f\u0000\u0001ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000¼\u0004\u0017\u0000\f\u0000\f\u0000\u0002\u0016\u0000\u0015\n", - "\u0000-\u0001\u0000\t\u0000\u0000À\u0000À\u0019\u0010Èó\u0006\u0000\u001b\u0000\f\u0000\u0003\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0000*@(\u0000\f\u0000\u0002ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0004\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0004ý\u0010A(\u0000\f\u0000\u0003ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0005\u0000\u0017\u0000\u0000\u0000\u0000\u0000ÀëÙ@(\u0000\f\u0000\u0004ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0006\u0000\u0017\u0000\u0000\u0000\u0000\u0000X\u0003\u001fA(\u0000\f\u0000\u0005ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0007\u0000\u0017\u0000\u0000\u0000\u0000\u0000 T\u0007A(\u0000\f\u0000\u0006ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000X–@(\u0000\f\u0000\u0007ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\t\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000J§@(\u0000\fÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\n", - "\u0000\u0017\u0000\u0000\u0000\u0000\u0000@òä@(\u0000\f\u0000\tÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u000b\u0000\u0017\u0000\u0000\u0000\u0000\u0000Á_BA(\u0000\f\u0000\n", - "ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\f\u0000\u0017\u0000\u0000\u0000\u0000\u0000À×\u0013A(\u0000\f\u0000\u000bÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\n", - "\u0000\u0017\u0000\u0000\u0000\u0000\u0000`Ûï@(\u0000\f\u0000\fÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u000e\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010@(\u0000\f\u0000\n", - "ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u000f\u0000\u0017\u0000\u0000\u0000\u0000\u0000 _ð@(\u0000\f\u0000\u000eÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0010\u0000\u0017\u0000\u0000\u0000\u0000\u0000À£ä@(\u0000\f\u0000\u000fÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0011\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000ü—@(\u0000\f\u0000\u0010ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0012\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000°y@(\u0000\f\u0000\u0011ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0013\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@(\u0000\f\u0000\u0012ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0014\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000Ð@(\u0000\f\u0000\u0013ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0015\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000¸‡@(\u0000\f\u0000\u0014ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000\u0006\u0000\u001b\u0000\f\u0000\u0016\u0000\u0017\u0000\u0000\u0000\u0000\u0000€tÜ@(\u0000\f\u0000\u0015ÿ\u0005\u0000\u0001\f\u0000\u0002\u0000ý\u0000\n", - "\u0000\n", - "\u0000\u0000\u0000\u000f\u0000\u001e\u0000\u0000\u0000\u0006\u0000\u001b\u0000\n", - "\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000„H\u0015A(\u0000\f\u0000\u0016ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\n", - "\u0000\u0002\u0000\u000f\u0000\u00003\u0005A\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000ïÉ@\u000f\u0000\u0000$”@\u000f\u0000\u0000èØ@\u000f\u0000€¡Â@\u000f\u0000\u0000ÀW@\u000f\u0000\u0000\u00007@\u000f\u0000\u0000V¬@\u000f\u0000ðzö@\u000f\u0000\u0000ÓÌ@\u000f\u0000\u0000\u0014®@\u000f\u0000\u0000\u0000ð?\u000f\u0000\u0000\u0002¹@\u000f\u0000\u0000T§@\u000f\u0000\u0000\u0000I@\u000f\u0000\u0000\u00000@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000\u0000\u001c@\u000f\u0000\u0000\u0000=@\u000f\u0000\u0000—@\u0016\u0000ý\u0000\n", - "\u0000\u000e\u0000\u0000\u0000\u000f\u0000\u001f\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u000e\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000A¾;A(\u0000\n", - "\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u000e\u0000\u0002\u0000\u000f\u00000a+A\u000f\u0000\u0000\u0000(@\u000f\u0000àçñ@\u000f\u0000\u0000€Â@\u000f\u0000ðá\u0001A\u000f\u0000`£é@\u000f\u0000\u0000 }@\u000f\u0000\u0000 g@\u000f\u0000€3É@\u000f\u0000˜e\u001eA\u000f\u0000à\u0002ð@\u000f\u0000À/Ö@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000ÁÐ@\u000f\u0000\u0000ŠÍ@\u000f\u0000\u0000(„@\u000f\u0000\u0000@]@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000\u0000Z@\u000f\u0000\u0000Àb@\u000f\u0000\u0000i·@\u0016\u0000ý\u0000\n", - "\u0000\u000f\u0000\u0000\u0000\u000f\u0000 \u0000\u0000\u0000\u0006\u0000\u001b\u0000\u000f\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000“V4A(\u0000\u000e\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u000f\u0000\u0002\u0000\u000f\u0000¶y\"\u0000\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000€(å@\u000f\u0000\u00006¯@\u000f\u0000@nõ@\u000f\u0000@\u0012Þ@\u000f\u0000\u0000€j@\u000f\u0000\u0000\u0010ƒ@\u000f\u0000\u0000‹¶@\u000f\u0000$´\u001eA\u000f\u0000€Hë@\u000f\u0000€8Á@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u00000Ê@\u000f\u0000\u0000˜µ@\u000f\u0000\u0000 u@\u000f\u0000\u0000€V@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000€Q@\u000f\u0000\u0000\u0000Z@\u000f\u0000€$À@\u0016\u0000ý\u0000\n", - "\u0000\u0010\u0000\u0000\u0000\u000f\u0000!\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0010\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000>n!A(\u0000\u000f\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0010\u0000\u0002\u0000\u000f\u0000˜š\u0007A\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000ÀÓ@\u000f\u0000\u0000¨@\u000f\u0000\u0000¸ã@\u000f\u0000€ÊÄ@\u000f\u0000\u0000À\\@\u000f\u0000\u0000¨@\u000f\u0000\u0000ª£@\u000f\u0000ê\n", - "A\u000f\u0000ÀÌæ@\u000f\u0000\u0000¾¯@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000P©@\u000f\u0000\u0000€•@\u000f\u0000\u0000\u0000B@\u000f\u0000\u0000\u00006@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000\u00005@\u000f\u0000\u0000€A@\u000f\u0000\u0000ô—@\u0016\u0000ý\u0000\n", - "\u0000\u0011\u0000\u0000\u0000\u000f\u0000\"\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0011\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000Ú» A(\u0000\u0010\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0011\u0000\u0002\u0000\u000f\u0000\u0010ê\u000fA\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000nÒ@\u000f\u0000\u0000Е@\u000f\u0000 \fâ@\u000f\u0000\u0000\u0010É@\u000f\u0000\u0000€C@\u000f\u0000\u0000ÀZ@\u000f\u0000\u0000\u0006¢@\u000f\u0000pÙ\u0005A\u000f\u0000À×Ø@\u000f\u0000\u0000`­@\u000f\u0000\u0000\u0000ð?\u000f\u0000\u0000ܝ@\u000f\u0000\u0000Ô¡@\u000f\u0000\u0000\u0000<@\u000f\u0000\u0000\u0000?@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000\u00008@\u000f\u0000\u0000€P@\u000f\u0000\u0000Ԝ@\u0016\u0000ý\u0000\n", - "\u0000\u0012\u0000\u0000\u0000\u000f\u0000#\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0012\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000®–5A(\u0000\u0011\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0012\u0000\u0002\u0000\u000f\u0000¬ø%A\u000f\u0000\u0000\u0000ð?\u000f\u0000ÀVí@\u000f\u0000\u0000¿·@\u000f\u0000`¼ó@\u000f\u0000\u0000Éæ@\u000f\u0000\u0000 s@\u000f\u0000\u0000Hˆ@\u000f\u0000\u00003Á@\u000f\u0000ü4\u0019A\u000f\u0000 Þâ@\u000f\u0000€pÆ@\u000f\u0000\u0000\u0000ð?\u000f\u0000€ÝÉ@\u000f\u0000€³Ã@\u000f\u0000\u0000àa@\u000f\u0000\u0000€Q@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000ÀX@\u000f\u0000\u0000 k@\u000f\u0000\u0000î°@\u0016\u0000ý\u0000\n", - "\u0000\u0013\u0000\u0000\u0000\u000f\u0000$\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0013\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000$ä\u001aA(\u0000\u0012\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0013\u0000\u0002\u0000\u000f\u0000(\t\u0002A\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000€»Í@\u000f\u0000\u0000¸Ž@\u000f\u0000@Óß@\u000f\u0000\u0000;@\u000f\u0000\u0000@X@\u000f\u0000\u0000\u0000@@\u000f\u0000\u0000ä˜@\u000f\u0000`\u0007A\u000f\u0000À\u0016á@\u000f\u0000\u0000ž¦@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000è“@\u000f\u0000\u0000´•@\u000f\u0000\u0000€h@\u000f\u0000\u0000\u0000.@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000\u0000(@\u000f\u0000\u0000\u0000D@\u000f\u0000\u0000Œ‘@\u0016\u0000ý\u0000\n", - "\u0000\u0014\u0000\u0000\u0000\u000f\u0000%\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0014\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000\"A(\u0000\u0013\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0014\u0000\u0002\u0000\u000f\u0000Ð\u001d\u0011A\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000@Ó@\u000f\u0000\u0000˜–@\u000f\u0000€uã@\u000f\u0000€wÊ@\u000f\u0000\u0000\u0000O@\u000f\u0000\u0000€M@\u000f\u0000\u0000~¨@\u000f\u0000HN\u0007A\u000f\u0000\u0000§Ú@\u000f\u0000\u0000Š®@\u000f\u0000\u0000\u0000ð?\u000f\u0000\u0000»°@\u000f\u0000\u0000Π@\u000f\u0000\u0000€L@\u000f\u0000\u0000\u0000:@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000ÀU@\u000f\u0000\u0000@S@\u000f\u0000\u0000ð«@\u0016\u0000ý\u0000\n", - "\u0000\u0015\u0000\u0000\u0000\u000f\u0000&\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0015\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000 j\u0014A(\u0000\u0014\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0015\u0000\u0002\u0000\u000f\u00000¶\u0004A\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000„Ë@\u000f\u0000\u00000@\u000f\u0000\u0000MÑ@\u000f\u0000\u00004º@\u000f\u0000\u0000\u0000>@\u000f\u0000\u0000àe@\u000f\u0000\u0000~¡@\u000f\u0000\u0000\u001f÷@\u000f\u0000\u0000èÎ@\u000f\u0000\u0000:­@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000ý·@\u000f\u0000\u0000\f•@\u000f\u0000\u0000\u0000E@\u000f\u0000\u0000\u00008@\u000f\u0000\u0000\u0000\u0000@\u000f\u0000\u0000@U@\u000f\u0000\u0000€D@\u000f\u0000Ž@\u0016\u0000ý\u0000\n", - "\u0000\u0016\u0000\u0000\u0000\u001b\u00006\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0001\u0000\u0017\u0000\u0000\u0000\u0000 öo{A(\u0000\u0015\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0002\u0000\u0017\u0000\u0000\u0000\u0000p!¦qA(\u0000\u0016\u0000\u0001ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000¼\u0004\u0017\u0000\u0016\u0000\u0016\u0000\u0002\u0016\u0000\u0015\n", - "\u0000-\u0001\u0000\u0004\u0000\u0000À\u0000À\u0019\u0010Èó\u0006\u0000\u001b\u0000\u0016\u0000\u0003\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000ÀX@(\u0000\u0016\u0000\u0002ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0004\u0000\u0017\u0000\u0000\u0000\u0000\u0000ž\t,A(\u0000\u0016\u0000\u0003ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0005\u0000\u0017\u0000\u0000\u0000\u0000\u0000è¥\u0001A(\u0000\u0016\u0000\u0004ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0006\u0000\u0017\u0000\u0000\u0000\u0000\u0000~_9A(\u0000\u0016\u0000\u0005ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0007\u0000\u0017\u0000\u0000\u0000\u0000\u0000Tm,A(\u0000\u0016\u0000\u0006ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000Z¡@(\u0000\u0016\u0000\u0007ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\t\u0000\u0017\u0000\u0000\u0000\u0000\u0000Àwî@(\u0000\u0016ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\n", - "\u0000\u0017\u0000\u0000\u0000\u0000\u0000˜\\\u0000A(\u0000\u0016\u0000\tÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u000b\u0000\u0017\u0000\u0000\u0000\u0000@iœRA(\u0000\u0016\u0000\n", - "ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\f\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0016µ%A(\u0000\u0016\u0000\u000bÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\n", - "\u0000\u0017\u0000\u0000\u0000\u0000\u0000@Ú\tA(\u0000\u0016\u0000\fÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u000e\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0000S@(\u0000\u0016\u0000\n", - "ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u000f\u0000\u0017\u0000\u0000\u0000\u0000\u0000À¼\u0011A(\u0000\u0016\u0000\u000eÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0010\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000I\n", - "A(\u0000\u0016\u0000\u000fÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0011\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000J¬@(\u0000\u0016\u0000\u0010ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0012\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000øœ@(\u0000\u0016\u0000\u0011ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0013\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000@Q@(\u0000\u0016\u0000\u0012ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0014\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000ÑÀ@(\u0000\u0016\u0000\u0013ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0015\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000X@(\u0000\u0016\u0000\u0014ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u0016\u0000\u0016\u0000\u0017\u0000\u0000\u0000\u0000\u0000 hô@(\u0000\u0016\u0000\u0015ÿ\u0005\u0000\u0001\u0016\u0000\u0002\u0000ý\u0000\n", - "\u0000\u0017\u0000\u0000\u0000\u000f\u0000'\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0017\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000\u0005'0A(\u0000\u0016\u0000\u0016ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0017\u0000\u0002\u0000\u000f\u0000Œ\u0006!A\u000f\u0000\u0000\u0000;@\u000f\u0000@Žè@\u000f\u0000\u0000TÆ@\u000f\u0000@mó@\u000f\u0000\u0000iÛ@\u000f\u0000\u0000@[@\u000f\u0000\u0000 …@\u000f\u0000\u0000\u0001±@\u000f\u0000\u0000†\fA\u000f\u0000€\n", - "ç@\u000f\u0000\u0000cÆ@\u000f\u0000\u0000\u0000\u0000@\u000f\u0000\u0000¤É@\u000f\u0000\u0000ÝÍ@\u000f\u0000\u0000€`@\u000f\u0000\u0000\u0000P@\u000f\u0000\u0000\u0000 @\u000f\u0000\u0000 Š@\u000f\u0000\u0000@X@\u000f\u0000\u0000±°@\u0016\u0000ý\u0000\n", - "\u0000\u0018\u0000\u0000\u0000\u000f\u0000(\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0018\u0000\u0001\u00001\u0000\u0000\u0000\u0000€[fVA(\u0000\u0017\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0018\u0000\u0002\u0000\u000f\u0000¾ïÊ\u0000\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000 ï\u000bA\u000f\u0000 Wá@\u000fP\u0018A\u000f\u0000\u0018û\u0002A\u000f\u0000\u0000À]@\u000f\u0000\u0000YÈ@\u000f\u0000\u00001Ø@\u000f\u0000Z·S\u0000\u000f\u0000p}\u0000A\u000f\u0000\u0000Qè@\u000f\u0000\u0000\u0000$@\u000f\u0000€Kò@\u000f\u0000€‰å@\u000f\u0000\u0000ĕ@\u000f\u0000\u0000ȋ@\u000f\u0000\u0000\u00008@\u000f\u0000\u0000̑@\u000f\u0000\u0000Ё@\u000f\u0000€aÇ@\u0016\u0000ý\u0000\n", - "\u0000\u0019\u0000\u0000\u0000\u000f\u0000)\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u0019\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000¢½MA(\u0000\u0018\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u0019\u0000\u0002\u00002\u0000~á«\u00002\u0000\u0000\u0000\u0000\u00002\u0000Pgø@2\u0000€\u000eÁ@2\u0000Àª\u0004A2\u0000P\u0015\u0002A2\u0000\u0000@V@2\u0000\u0000\u0000‚@2\u0000\u00001Ú@2\u0000äÀ\u001bA2\u0000ÐIõ@2\u0000@$à@2\u0000\u0000\u0000 @2\u0000€ÂÙ@2\u0000€ÕÇ@2\u0000\u0000@j@2\u0000\u0000p{@2\u0000\u0000\u0000ð?2\u0000\u0000\u0000}@2\u0000\u0000`d@2\u0000\u0000¡Ê@\u0016\u0000ý\u0000\n", - "\u0000\u001a\u0000\u0000\u0000\u000f\u0000*\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u001a\u0000\u0001\u00001\u0000\u0000\u0000\u0000°:\u001cqA(\u0000\u0019\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u001a\u0000\u0002\u00002\u0000\u000eªÐ\u00022\u0000\u0000\u0000R@2x A2\u0000°³õ@2\u0000 þ.A2\u0000æ›$\u00002\u0000\u0000À@2\u0000\u0000Åç@2\u0000 \u0010ó@2\u0000Z\u000b¬\u00002\u0000°÷\u001aA2\u0000€­ü@2\u0000\u0000\u0000L@2\u00000\u0005A2\u0000x‹\u0001A2\u0000\u0000x@2\u0000\u0000à|@2\u0000\u0000\u0000B@2\u0000\u0000\u001b¸@2\u0000\u0000`@2\u0000€9ê@\u0016\u0000ý\u0000\n", - "\u0000\u001b\u0000\u0000\u0000\u001b\u00007\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0001\u0000\u0017\u0000\u0000\u0000\u0000 å'fA(\u0000\u001a\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0002\u0000\u0017\u0000\u0000\u0000\u0000ÀÅ­ZA(\u0000\u001b\u0000\u0001ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000¼\u0004\u0017\u0000\u001b\u0000\u001b\u0000\u0002\u0016\u0000\u0015\n", - "\u0000-\u0001\u0000\u0003\u0000\u0000À\u0000À\u0019\u0010Èó\u0006\u0000\u001b\u0000\u001b\u0000\u0003\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0000G@(\u0000\u001b\u0000\u0002ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0004\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0018*\u001dA(\u0000\u001b\u0000\u0003ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0005\u0000\u0017\u0000\u0000\u0000\u0000\u0000€1ý@(\u0000\u001b\u0000\u0004ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0006\u0000\u0017\u0000\u0000\u0000\u0000\u0000Ґ&A(\u0000\u001b\u0000\u0005ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0007\u0000\u0017\u0000\u0000\u0000\u0000\u0000Ä\u001a\u0012A(\u0000\u001b\u0000\u0006ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000̕@(\u0000\u001b\u0000\u0007ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\t\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000¥È@(\u0000\u001bÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\n", - "\u0000\u0017\u0000\u0000\u0000\u0000\u0000`ãà@(\u0000\u001b\u0000\tÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u000b\u0000\u0017\u0000\u0000\u0000\u0000\u0000Z\u0000?A(\u0000\u001b\u0000\n", - "ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\f\u0000\u0017\u0000\u0000\u0000\u0000\u0000lH\u001aA(\u0000\u001b\u0000\u000bÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\n", - "\u0000\u0017\u0000\u0000\u0000\u0000\u0000 :ñ@(\u0000\u001b\u0000\fÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u000e\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000ÀP@(\u0000\u001b\u0000\n", - "ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u000f\u0000\u0017\u0000\u0000\u0000\u0000\u0000è@\u0003A(\u0000\u001b\u0000\u000eÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0010\u0000\u0017\u0000\u0000\u0000\u0000\u0000xA(\u0000\u001b\u0000\u000fÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0011\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0000š@(\u0000\u001b\u0000\u0010ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0012\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0012®@(\u0000\u001b\u0000\u0011ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0013\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0000=@(\u0000\u001b\u0000\u0012ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0014\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000ˆ»@(\u0000\u001b\u0000\u0013ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0015\u0000\u0017\u0000\u0000\u0000\u0000\u0000\u0000\u0000@(\u0000\u001b\u0000\u0014ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000\u0006\u0000\u001b\u0000\u001b\u0000\u0016\u0000\u0017\u0000\u0000\u0000\u0000\u0000€\\á@(\u0000\u001b\u0000\u0015ÿ\u0005\u0000\u0001\u001b\u0000\u0002\u0000ý\u0000\n", - "\u0000\u001c\u0000\u0000\u0000\u000f\u0000+\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u001c\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000¡\u000eQA(\u0000\u001b\u0000\u0016ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u001c\u0000\u0002\u0000\u000f\u0000.,£\u0000\u000f\u0000\u0000\u0000*@\u000f\u0000ÐA\u000f\u0000à9ê@\u000f\u0000ì\u001a\u0013A\u000f\u0000À\u001fý@\u000f\u0000\u0000 {@\u000f\u0000\u0000…¼@\u000f\u0000€GÉ@\u000f\u0000$r&A\u000f\u0000€)\u0005A\u000f\u0000\u0000gÛ@\u000f\u0000\u0000\u00004@\u000f\u0000\u0000\u001fí@\u000f\u0000@Îó@\u000f\u0000\u0000à@\u000f\u0000\u0000`h@\u000f\u0000\u0000\u0000 @\u000f\u0000\u0000(”@\u000f\u0000\u0000h@\u000f\u0000\u0000©Ç@\u0016\u0000ý\u0000\n", - "\u0000\u001d\u0000\u0000\u0000\u000f\u0000,\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u001d\u0000\u0001\u00001\u0000\u0000\u0000\u0000€d\u001ePA(\u0000\u001c\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u001d\u0000\u0002\u0000\u000f\u0000f\u0011 \u0000\u000f\u0000\u0000\u0000?@\u000f\u0000\u0018`\u0004A\u000f\u0000 \u0002á@\u000f\u0000pš\u000eA\u000f\u0000\u0000Óú@\u000f\u0000\u0000؂@\u000f\u0000\u0000\\®@\u000f\u0000€sË@\u000f\u0000öê+\u0000\u000f\u0000€Öû@\u000f\u0000ÀÂÛ@\u000f\u0000\u0000€B@\u000f\u0000à3ï@\u000f\u0000ÀVò@\u000f\u0000\u0000`z@\u000f\u0000\u0000†¨@\u000f\u0000\u0000\u0000*@\u000f\u0000\u0000\u001e¯@\u000f\u0000\u0000Pt@\u000f\u0000\u0000uÉ@\u0016\u0000ý\u0000\n", - "\u0000\u001e\u0000\u0000\u0000\u000f\u0000-\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u001e\u0000\u0001\u00001\u0000\u0000\u0000\u0000€‹EFA(\u0000\u001d\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\u001e\u0000\u0002\u0000\u000f\u0000Ξg\u0000\u000f\u0000\u0000\u0000\u0000@\u000f\u0000\\û@\u000f\u0000\u0000MÞ@\u000f\u0000\u0000s\u0005A\u000f\u0000Pxð@\u000f\u0000\u0000àu@\u000f\u0000\u0000\\–@\u000f\u0000\u0000¥½@\u000f\u0000.2#\u0000\u000f\u0000\u0018|\u0001A\u000f\u0000€}Ë@\u000f\u0000\u0000\u0000$@\u000f\u0000À°à@\u000f\u0000àå@\u000f\u0000\u0000ð„@\u000f\u0000\u0000\u0018€@\u000f\u0000\u0000\u0000 @\u000f\u0000\u0000¼›@\u000f\u0000\u0000Àa@\u000f\u0000\u0000TÄ@\u0016\u0000ý\u0000\n", - "\u0000\u001f\u0000\u0000\u0000\u001b\u00008\u0000\u0000\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0001\u0000\u0017\u0000\u0000\u0000\u0000@ÖdRA(\u0000\u001e\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000\u0006\u0000#\u0000\u001f\u0000\u0002\u0000\u0018\u0000\u0000\u0000\u0000€RëBA \u0000\u001f\u0000\u0001ÿ\n", - "\u0000% \u0000#\u0000\u0002À\u0002À\u0019\u0010Èó\u0006\u0000#\u0000\u001f\u0000\u0003\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u00005@ \u0000\u001f\u0000\u0002ÿ\n", - "\u0000% \u0000#\u0000\u0003À\u0003À\u0019\u0010Èó\u0006\u0000\u001b\u0000\u001f\u0000\u0004\u0000\u0018\u0000\u0000\u0000\u0000\u0000 3\u0005A(\u0000\u001f\u0000\u0003ÿ\u0005\u0000\u0001\u001f\u0000\u0004\u0000¼\u0004\u0017\u0000\u001f\u0000\u001f\u0000\u0004\f\u0000\t\n", - "\u0000-\u0001\u0000\u0004\u0000\u0000À\u0000À\u0019\u0010Èó\u0006\u0000\u001b\u0000\u001f\u0000\u0005\u0000\u0018\u0000\u0000\u0000\u0000\u0000@ÿâ@(\u0000\u001f\u0000\u0004ÿ\u0005\u0000\u0001\u001f\u0000\u0004\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0006\u0000\u0018\u0000\u0000\u0000\u0000\u0000LL\u0018A(\u0000\u001f\u0000\u0005ÿ\u0005\u0000\u0001\u001f\u0000\u0004\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0007\u0000\u0018\u0000\u0000\u0000\u0000\u0000ðºý@(\u0000\u001f\u0000\u0006ÿ\u0005\u0000\u0001\u001f\u0000\u0004\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000°w@(\u0000\u001f\u0000\u0007ÿ\u0005\u0000\u0001\u001f\u0000\u0004\u0000\u0006\u0000\u001b\u0000\u001f\u0000\t\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000B¬@(\u0000\u001fÿ\u0005\u0000\u0001\u001f\u0000\u0004\u0000\u0006\u0000\u001b\u0000\u001f\u0000\n", - "\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000¦É@(\u0000\u001f\u0000\tÿ\u0005\u0000\u0001\u001f\u0000\u0004\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u000b\u0000\u0018\u0000\u0000\u0000\u0000\u0000|›0A(\u0000\u001f\u0000\n", - "ÿ\u0005\u0000\u0001\u001f\u0000\u0004\u0000\u0006\u0000\u001b\u0000\u001f\u0000\f\u0000\u0018\u0000\u0000\u0000\u0000\u00004Á\u0011A(\u0000\u001f\u0000\u000bÿ\u0005\u0000\u0001\u001f\u0000\u0004\u0000\u0006\u0000\u001b\u0000\u001f\u0000\n", - "\u0000\u0018\u0000\u0000\u0000\u0000\u0000`›à@(\u0000\u001f\u0000\fÿ\u0005\u0000\u0001\u001f\u0000\n", - "\u0000¼\u0004\u0017\u0000\u001f\u0000\u001f\u0000\n", - "\u0016\u0000\n", - "\n", - "\u0000-\u0001\u0000\u0004\u0000\u0000À\u0000À\u0019\u0010\u0000\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u000e\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010@(\u0000\u001f\u0000\n", - "ÿ\u0005\u0000\u0001\u001f\u0000\n", - "\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u000f\u0000\u0018\u0000\u0000\u0000\u0000\u0000poö@(\u0000\u001f\u0000\u000eÿ\u0005\u0000\u0001\u001f\u0000\n", - "\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0010\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0010Tð@(\u0000\u001f\u0000\u000fÿ\u0005\u0000\u0001\u001f\u0000\n", - "\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0011\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000ä‘@(\u0000\u001f\u0000\u0010ÿ\u0005\u0000\u0001\u001f\u0000\n", - "\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0012\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000Ðu@(\u0000\u001f\u0000\u0011ÿ\u0005\u0000\u0001\u001f\u0000\n", - "\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0013\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000@(\u0000\u001f\u0000\u0012ÿ\u0005\u0000\u0001\u001f\u0000\n", - "\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0014\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u00000ƒ@(\u0000\u001f\u0000\u0013ÿ\u0005\u0000\u0001\u001f\u0000\n", - "\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0015\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000 €@(\u0000\u001f\u0000\u0014ÿ\u0005\u0000\u0001\u001f\u0000\n", - "\u0000\u0006\u0000\u001b\u0000\u001f\u0000\u0016\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000UÑ@(\u0000\u001f\u0000\u0015ÿ\u0005\u0000\u0001\u001f\u0000\n", - "\u0000×\u0000B\u0000g%\u0000\u0000X\u0002\u000e\u0000B\u0001û\u0002Û\u0002Ð\u0000µ\u0000µ\u0000µ\u0000µ\u0000µ\u0000µ\u0000Ó\u0002µ\u0000µ\u0000µ\u0000µ\u0000µ\u0000µ\u0000µ\u0000µ\u0000µ\u0000Ó\u0002µ\u0000µ\u0000µ\u0000µ\u0000Ó\u0002µ\u0000µ\u0000µ\u0002\u0010\u0000 \u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000!\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000\"\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000#\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000$\u0000\u0000\u0000\u0017\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000%\u0000\u0000\u0000\u0017\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000&\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000'\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000(\u0000\u0000\u0000\u0017\u0000£\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000)\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000*\u0000\u0000\u0000\u0017\u0000ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000,\u0000\u0000\u0000\u0017\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0002\u0010\u0000-\u0000\u0000\u0000\u0017\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u000f\u0010ý\u0000\n", - "\u0000 \u0000\u0000\u0000\u0019\u0000.\u0000\u0000\u0000\u0006\u0000\u001b\u0000 \u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000B0A(\u0000\u001f\u0000\u0016ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000 \u0000\u0002\u00002\u00008‡(A2\u0000\u0000\u0000&@2\u0000@ýÐ@2\u0000\u0000\u0000œ@2\u0000@Ní@2\u0000\u0000já@2\u0000\u0000 e@2\u0000\u0000Ðy@2\u0000\u0000‰²@2\u0000iø@2\u0000€ãÁ@2\u0000\u0000ý@2\u0000\u0000\u0000ð?2\u0000\u0000sÍ@2\u0000\u0000|¡@2\u0000\u00008†@2\u0000\u0000ÀU@2\u0000\u0000\u0000ð?2\u0000\u0000{@2\u0000\u0000€]@2\u0000\u0000<¸@\u0016\u0000ý\u0000\n", - "\u0000!\u0000\u0000\u0000\u000f\u0000/\u0000\u0000\u0000\u0006\u0000\u001b\u0000!\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000¼„>A(\u0000 \u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000!\u0000\u0002\u00002\u0000l²-A2\u0000\u0000\u0000\u0000\u00002\u0000À_ò@2\u0000\u0000Ì@2\u0000ðƒ\u0004A2\u0000\u0000Cç@2\u0000\u0000€]@2\u0000\u0000<›@2\u0000\u0000²²@2\u0000ď\u001dA2\u0000\u0010\u0013\u0000A2\u0000\u0000ùÌ@2\u0000\u0000\u0000\u0000\u00002\u0000Àïè@2\u0000\u0000ÐÙ@2\u0000\u0000à`@2\u0000\u0000\u0000c@2\u0000\u0000\u0000\u0000@2\u0000\u0000\u0000J@2\u0000\u0000Àh@2\u0000\u0000¥¶@\u0016\u0000ý\u0000\n", - "\u0000\"\u0000\u0000\u0000\u000f\u00000\u0000\u0000\u0000\u0006\u0000\u001b\u0000\"\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000\u000eÖ,A(\u0000!\u0000\u0001ÿ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000\"\u0000\u0002\u0000\u000f\u0000ìð\u0013A\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000@ôå@\u000f\u0000\u0000òÌ@\u000f\u0000ÐY÷@\u000f\u0000€žÑ@\u000f\u0000\u0000\u0000*@\u000f\u0000\u0000€‚@\u000f\u0000\u0000°œ@\u000f\u0000Ø=\u0012A\u000f\u0000°i÷@\u000f\u0000\u0000†·@\u000f\u0000\u0000\u0000\u0000@\u000f\u0000\u0000úÈ@\u000f\u0000€ŠØ@\u000f\u0000\u0000\u0000a@\u000f\u0000\u0000€A@\u000f\u0000\u0000\u0000\u0000\u0000\u000f\u0000\u0000\u00000@\u000f\u0000\u0000@Y@\u000f\u0000\u0000ž©@\u0016\u0000ý\u0000\n", - "\u0000#\u0000\u0000\u0000\u000f\u00001\u0000\u0000\u0000\u0006\u0000\u001b\u0000#\u0000\u0001\u00001\u0000\u0000\u0000\u0000\u0000.Â(A(\u0000\"\u0000\u0001þ\u0005\u0000\u0001\u0005\u0000\u0001\u0000½\u0000„\u0000#\u0000\u0002\u00002\u0000`ö\u0016A2\u0000\u0000\u0000$@2\u0000 œá@2\u0000\u0000ܽ@2\u0000`(ò@2\u0000@óÓ@2\u0000\u0000ÀS@2\u0000\u0000(‹@2\u0000\u0000”›@2\u0000à\u000b\tA2\u0000 qê@2\u0000\u0000 µ@2\u0000\u0000\u0000ð?2\u0000€OÉ@2\u0000€ŒÉ@2\u0000\u0000`d@2\u0000\u0000ÀR@2\u0000\u0000\u0000\u0000\u00002\u0000\u0000@Z@2\u0000\u0000À\\@2\u0000\u0000H£@\u0016\u0000¾\u00004\u0000$\u0000\u0000\u0000$\u0000$\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000%\u0000\u0016\u0000¾\u00002\u0000%\u0000\u0001\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u0016\u0000¾\u00002\u0000&\u0000\u0001\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u001a\u0000\u0016\u0000ý\u0000\n", - "\u0000'\u0000\u0000\u0000\u0017\u0000R\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u0000\u0000/\u00003\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u0001\u0000\u001c\u0000\u0001\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u0002\u0000\u001d\u0000\u0002\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u0003\u0000\u001d\u0000\u000b\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u0004\u0000\u001d\u0000\u0006\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u0005\u0000\u001d\u0000\f\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u0006\u0000\u001d\u0000\u0004\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u0007\u0000\u001d\u0000\u0007\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u001d\u0000\u000f\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\t\u0000\u001d\u0000\u0010\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\n", - "\u0000\u001d\u0000\n", - "\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u000b\u0000\u001d\u0000\u0005\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\f\u0000\u001d\u0000\n", - "\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\n", - "\u0000\u001d\u0000\u0016\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u000e\u0000\u001d\u0000\t\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u000f\u0000\u001d\u0000\u0014\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u0010\u0000\u001d\u0000\u0011\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u0011\u0000\u001d\u0000\u0012\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u0012\u0000\u001d\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u0013\u0000\u001d\u0000\u0015\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u0014\u0000\u001d\u0000\u0003\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u0015\u0000\u001d\u0000\u000e\u0000\u0000\u0000ý\u0000\n", - "\u0000(\u0000\u0016\u0000\u001d\u0000\u0013\u0000\u0000\u0000\u0001\u0002\u0006\u0000)\u0000\u0000\u0000/\u0000½\u0000Š\u0000)\u0000\u0001\u0000\u001e\u0000fÚ\u0012\n", - "\"\u0000æ#®\u0007\"\u0000Š±¨\u0002\"\u0000\u001a·Õ\u0000\"\u0000ª\u0016x\u0000\"\u00006­v\u0000\"\u0000b8A\"\u0000Î`&\u0000\"\u0000f­!\u0000\"\u00004‘\u0018A\"\u0000<Õ\u0014A\"\u0000@‚\fA\"\u0000 -\u0005A\"\u0000 sô@\"\u0000À{Ð@\"\u0000\u0000]À@\"\u0000\u0000›¹@\"\u0000\u0000‰¶@\"\u0000\u0000\u0013±@\"\u0000\u0000`f@\"\u0000\u0000\u0000c@\"\u0000\u0000\u0000Z@\u0016\u0000\u0001\u0002\u0006\u0000*\u0000\u0000\u00000\u0000~\u0002\n", - "\u0000*\u0000\u0001\u00003\u0000\u0000\u0000ð?\u0003\u0002\u000e\u0000*\u0000\u0002\u00004\u0000`®ÒÚz_M@\u0003\u0002\u000e\u0000*\u0000\u0003\u00004\u0000×\n", - "¦º›V4@\u0003\u0002\u000e\u0000*\u0000\u0004\u00004\u0000šiÜpϊ\u0019@\u0003\u0002\u000e\u0000*\u0000\u0005\u00004\u0000]ÐÁËn´\f@\u0003\u0002\u000e\u0000*\u0000\u0006\u00004\u0000ú‹%^\f@\u0003\u0002\u000e\u0000*\u0000\u0007\u00004\u0000þÔtΦP\u0007@\u0003\u0002\u000e\u0000*\u00004\u0000µl¨7ÚXò?\u0003\u0002\u000e\u0000*\u0000\t\u0000&\u0000?ÐÂ\u0000\u0019ð?\u0003\u0002\u000e\u0000*\u0000\n", - "\u0000&\u0000ì”Sç>}ç?\u0003\u0002\u000e\u0000*\u0000\u000b\u0000&\u0000K™¶\u00119ëã?\u0003\u0002\u000e\u0000*\u0000\f\u0000&\u0000Ÿ‡9†\u0004BÛ?\u0003\u0002\u000e\u0000*\u0000\n", - "\u0000&\u00003ÐÝ2¼?Ô?\u0003\u0002\u000e\u0000*\u0000\u000e\u0000&\u0000èlÞ}åÃ?\u0003\u0002\u000e\u0000*\u0000\u000f\u0000&\u0000\u001b»©#1…Ÿ?\u0003\u0002\u000e\u0000*\u0000\u0010\u0000&\u0000€A4ôcJ?\u0003\u0002\u000e\u0000*\u0000\u0011\u0000&\u0000®u‹Ea{ˆ?\u0003\u0002\u000e\u0000*\u0000\u0012\u0000&\u0000\u001bó*8ދ…?\u0003\u0002\u000e\u0000*\u0000\u0013\u0000&\u0000pq5S€?\u0003\u0002\u000e\u0000*\u0000\u0014\u0000&\u0000_÷1êd5?\u0003\u0002\u000e\u0000*\u0000\u0015\u0000&\u0000ïc‡Ý“*2?\u0003\u0002\u000e\u0000*\u0000\u0016\u0000&\u0000‹ôZÃòÛ(?¾\u00004\u0000,\u0000\u0000\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000$\u0000\u0016\u0000ý\u0000\n", - "\u0000-\u0000\u0000\u0000!\u0000P\u0000\u0000\u0000¾\u00002\u0000-\u0000\u0001\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000!\u0000\u0016\u0000×\u0000\u001e\u0000\u0000\u0000ð\u0000µ\u0000µ\u0000µ\u0000µ\u00008\u00006\u00006\u0000\u000e\u0000B\u0001˜\u0000’\u00018\u0000>\u0002\u0012\u0000°\u0006\u0000\u0000\u0000\u0000@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0004\u0000\u0003\u0000\u0004\u0000\u001d\u0000\u000f\u0000\u0003\u0013\u0000\u0000\u0000\u0001\u0000\u0013\u0000å\u0000\n", - "\u0000\u0001\u0000(\u0000*\u0000\u0000\u0000\u0000\u0000ï\u0000\u0006\u0000\u0000\u00007\u0000\u0000\u0000\n", - "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000þÿ\u0000\u0000\u0005\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000à…ŸòùOh\u0010«\u0000+'³Ù0\u0000\u0000\u0000Ä\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000H\u0000\u0000\u0000\u0004\u0000\u0000\u0000P\u0000\u0000\u0000\u0000\u0000h\u0000\u0000\u0000\u0012\u0000\u0000\u0000€\u0000\u0000\u0000\u000b\u0000\u0000\u0000˜\u0000\u0000\u0000\f\u0000\u0000\u0000¤\u0000\u0000\u0000\n", - "\u0000\u0000\u0000°\u0000\u0000\u0000\u0013\u0000\u0000\u0000¼\u0000\u0000\u0000\u0002\u0000\u0000\u0000ä\u0004\u0000\u0000\u001e\u0000\u0000\u0000\u0010\u0000\u0000\u0000DENATRAN-CGIE\u0000\u0000\u0000\u001e\u0000\u0000\u0000\u0010\u0000\u0000\u0000Denatran/CGIE\u0000\u0000\u0000\u001e\u0000\u0000\u0000\u0010\u0000\u0000\u0000Microsoft Excel\u0000@\u0000\u0000\u0000€\u0001õ¸L9Æ\u0001@\u0000\u0000\u0000\u0000+»\u0000k3Ä\u0001@\u0000\u0000\u0000\u0000\u0006”\fü É\u0001\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000þÿ\u0000\u0000\u0005\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0002ÕÍ՜.\u001b\u0010“\u0000+,ù®0\u0000\u0000\u0000\u0018\u0001\u0000\u0000\t\u0000\u0000\u0000\u0001\u0000\u0000\u0000P\u0000\u0000\u0000\u000f\u0000\u0000\u0000X\u0000\u0000\u0000\u0017\u0000\u0000\u0000d\u0000\u0000\u0000\u000b\u0000\u0000\u0000l\u0000\u0000\u0000\u0010\u0000\u0000\u0000t\u0000\u0000\u0000\u0013\u0000\u0000\u0000|\u0000\u0000\u0000\u0016\u0000\u0000\u0000„\u0000\u0000\u0000\n", - "\u0000\u0000\u0000Œ\u0000\u0000\u0000\f\u0000\u0000\u0000Ï\u0000\u0000\u0000\u0002\u0000\u0000\u0000ä\u0004\u0000\u0000\u001e\u0000\u0000\u0000\u0004\u0000\u0000\u0000mj\u0000\u0000\u0003\u0000\u0000\u0000\u000f'\u000b\u0000\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u001e\u0010\u0000\u0000\u0003\u0000\u0000\u0000\n", - "\u0000\u0000\u0000Glossário\u0000\t\u0000\u0000\u0000JAN_2009\u0000\u001c\u0000\u0000\u0000Glossário!Area_de_impressao\u0000\f\u0010\u0000\u0000\u0004\u0000\u0000\u0000\u001e\u0000\u0000\u0000\n", - "\u0000\u0000\u0000Planilhas\u0000\u0003\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u001e\u0000\u0000\u0000\u0014\u0000\u0000\u0000Intervalos nomeados\u0000\u0003\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0005\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\n", - "\u0000\u0000\u0000\u000b\u0000\u0000\u0000\f\u0000\u0000\u0000\n", - "\u0000\u0000\u0000\u000e\u0000\u0000\u0000\u000f\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0011\u0000\u0000\u0000\u0012\u0000\u0000\u0000\u0013\u0000\u0000\u0000\u0014\u0000\u0000\u0000\u0015\u0000\u0000\u0000\u0016\u0000\u0000\u0000\u0017\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0019\u0000\u0000\u0000\u001a\u0000\u0000\u0000\u001b\u0000\u0000\u0000\u001c\u0000\u0000\u0000\u001d\u0000\u0000\u0000\u001e\u0000\u0000\u0000\u001f\u0000\u0000\u0000 \u0000\u0000\u0000!\u0000\u0000\u0000\"\u0000\u0000\u0000#\u0000\u0000\u0000$\u0000\u0000\u0000%\u0000\u0000\u0000&\u0000\u0000\u0000'\u0000\u0000\u0000(\u0000\u0000\u0000)\u0000\u0000\u0000*\u0000\u0000\u0000+\u0000\u0000\u0000,\u0000\u0000\u0000-\u0000\u0000\u0000.\u0000\u0000\u0000/\u0000\u0000\u00000\u0000\u0000\u0000þÿÿÿ2\u0000\u0000\u00003\u0000\u0000\u00004\u0000\u0000\u00005\u0000\u0000\u00006\u0000\u0000\u00007\u0000\u0000\u00008\u0000\u0000\u0000þÿÿÿ:\u0000\u0000\u0000;\u0000\u0000\u0000<\u0000\u0000\u0000=\u0000\u0000\u0000>\u0000\u0000\u0000?\u0000\u0000\u0000@\u0000\u0000\u0000þÿÿÿýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿR\u0000o\u0000o\u0000t\u0000 \u0000E\u0000n\u0000t\u0000r\u0000y\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0016\u0000\u0005\u0001ÿÿÿÿÿÿÿÿ\u0002\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000À\u0000\u0000\u0000\u0000\u0000\u0000F\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 žÔü É\u0001þÿÿÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000W\u0000o\u0000r\u0000k\u0000b\u0000o\u0000o\u0000k\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0012\u0000\u0002\u0001ÿÿÿÿÿÿÿÿÿÿÿÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000¯a\u0000\u0000\u0000\u0000\u0000\u0000\u0005\u0000S\u0000u\u0000m\u0000m\u0000a\u0000r\u0000y\u0000I\u0000n\u0000f\u0000o\u0000r\u0000m\u0000a\u0000t\u0000i\u0000o\u0000n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000(\u0000\u0002\u0001\u0001\u0000\u0000\u0000\u0003\u0000\u0000\u0000ÿÿÿÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00001\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0005\u0000D\u0000o\u0000c\u0000u\u0000m\u0000e\u0000n\u0000t\u0000S\u0000u\u0000m\u0000m\u0000a\u0000r\u0000y\u0000I\u0000n\u0000f\u0000o\u0000r\u0000m\u0000a\u0000t\u0000i\u0000o\u0000n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00008\u0000\u0002\u0001ÿÿÿÿÿÿÿÿÿÿÿÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00009\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\n" - ] - } - ], - "source": [ - "with open('Frota RegiΣes Tipo UF JAN2009.xls', 'r', encoding=\"latin-1\") as f:\n", - " lines = f.read()\n", - "print(lines)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "import magic\n", - "\n", - "blob = open('Frota RegiΣes Tipo UF JAN2009.xls', 'rb').read()\n", - "m = magic.open(magic.MAGIC_MIME_ENCODING)\n", - "m.load()\n", - "encoding = m.buffer(blob) # \"utf-8\" \"us-ascii\" etc\n" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "None\n" - ] - } - ], - "source": [ - "print(encoding)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pipelines-RnwfPrZK-py3.10", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.6" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/requirements-test.txt b/requirements-test.txt index e75ed759b..98dd13969 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -2,3 +2,4 @@ networkx==2.6.3 pytest-cov==3.0.0 pyyaml prefect==0.15.9 +parameterized == 0.9.0 \ No newline at end of file From 9a3d2de40a1f8dc85d18983b2f96bd47eeaea2a3 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 16 Jun 2023 19:23:32 -0300 Subject: [PATCH 175/265] Sobe config certa pra ler da BD --- pipelines/datasets/br_denatran_frota/handlers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 07b00aadd..9394380d2 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -145,7 +145,7 @@ def treat_municipio_tipo(file: str) -> pl.DataFrame: municipios_query = """SELECT nome, id_municipio, sigla_uf FROM `basedosdados.br_bd_diretorios_brasil.municipio` """ bd_municipios = bd.read_sql( - municipios_query, "tamir-pipelines" + municipios_query, "basedosdados-dev" ) # Hardcoded, not good. bd_municipios = pl.from_pandas(bd_municipios) From 9262ee92e0cf976204bf88fcc6dbaa4866c48cd8 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sat, 17 Jun 2023 20:20:01 -0300 Subject: [PATCH 176/265] Reallocate logs --- pipelines/datasets/br_denatran_frota/flows.py | 11 ----------- pipelines/datasets/br_denatran_frota/handlers.py | 2 ++ 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index e719d1f29..ad46e157a 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -65,9 +65,6 @@ create_flow_run, wait_for_flow_run, ) -from pipelines.utils.utils import ( - log, -) import os from pipelines.constants import constants as pipelines_constants from pipelines.utils.constants import constants as utils_constants @@ -111,21 +108,17 @@ ) dbt_alias = Parameter("dbt_alias", default=True, required=False) - rename_flow_run = rename_current_flow_run_dataset_table( prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - log("Downloading file") crawled = crawl_task(month=2, year=year, temp_dir=constants.DOWNLOAD_PATH.value) # Now get the downloaded file: - log("Accessing downloaded file") municipio_tipo_file = get_desired_file_task( year=year, download_directory=constants.DOWNLOAD_PATH.value, filetype=constants.UF_TIPO_BASIC_FILENAME.value, upstream_tasks=[crawled], ) - log(municipio_tipo_file) df = treat_uf_tipo_task( file=municipio_tipo_file, upstream_tasks=[crawled, municipio_tipo_file] ) @@ -155,7 +148,6 @@ labels=current_flow_labels, run_name=f"Materialize {dataset_id}.{table_id}", ) - wait_for_materialization = wait_for_flow_run( materialization_flow, stream_states=True, @@ -201,17 +193,14 @@ rename_flow_run = rename_current_flow_run_dataset_table( prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - log("Downloading file") crawled = crawl_task(month=2, year=year, temp_dir=constants.DOWNLOAD_PATH.value) # Now get the downloaded file: - log("Accessing downloaded file") municipio_tipo_file = get_desired_file_task( year=year, download_directory=constants.DOWNLOAD_PATH.value, filetype=constants.MUNIC_TIPO_BASIC_FILENAME.value, upstream_tasks=[crawled], ) - log(municipio_tipo_file) df = treat_municipio_tipo_task( file=municipio_tipo_file, upstream_tasks=[crawled, municipio_tipo_file] ) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 9394380d2..837f4d4cf 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -54,6 +54,7 @@ def crawl(month: int, year: int, temp_dir: str = "") -> None: """ if month not in MONTHS.values(): raise ValueError("Mês inválido.") + log("Downloading file") files_dir = os.path.join(temp_dir, "files") make_dir_when_not_exists(files_dir) year_dir_name = os.path.join(files_dir, f"{year}") @@ -129,6 +130,7 @@ def output_file_to_csv(df: pl.DataFrame, filename: str) -> None: def get_desired_file(year: int, download_directory: str, filetype: str) -> str: + log("Accessing downloaded file") directory_to_search = os.path.join(download_directory, "files", f"{year}") log(f"Directory: {directory_to_search}") for file in os.listdir(directory_to_search): From da3c6605366f8a25a80b2fba71f9b65f6806fda8 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 20 Jun 2023 00:33:01 -0300 Subject: [PATCH 177/265] Novo teste --- .../datasets/br_denatran_frota/handlers.py | 8 ++-- pipelines/datasets/br_denatran_frota/utils.py | 44 +++++++++++++++++++ 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 837f4d4cf..8f96fd7c9 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -21,6 +21,7 @@ extraction_pre_2012, call_r_to_read_excel, treat_uf, + get_data_from_prod, DenatranType, ) import pandas as pd @@ -144,11 +145,8 @@ def get_desired_file(year: int, download_directory: str, filetype: str) -> str: def treat_municipio_tipo(file: str) -> pl.DataFrame: - municipios_query = """SELECT nome, id_municipio, sigla_uf FROM `basedosdados.br_bd_diretorios_brasil.municipio` - """ - bd_municipios = bd.read_sql( - municipios_query, "basedosdados-dev" - ) # Hardcoded, not good. + bd_municipios = get_data_from_prod(table_id="municipio", + dataset_id="br_bd_diretorios_brasil") bd_municipios = pl.from_pandas(bd_municipios) filename = os.path.split(file)[1] diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 2988e1409..b3387e336 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -18,6 +18,7 @@ import rpy2.robjects.packages as rpackages import rpy2.robjects as robjects from rpy2.robjects.vectors import StrVector +import basedosdados as bd from enum import Enum @@ -541,3 +542,46 @@ def treat_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str) -> None: # The set difference might occur the other way around, but still, better safe. raise ValueError(f"Existem municípios em {uf} que não estão na BD.") return verify_match_ibge(denatran_uf, ibge_uf) + + + +def get_data_from_prod(dataset_id: str, table_id: str) -> list: + """Get data from a table from basedosdados. + + Args: + dataset_id (str): Name of the dataset. + table_id (str): _description_ + columns (list): _description_ + + Returns: + list: _description_ + """ + + storage = bd.Storage(dataset_id=dataset_id, table_id=table_id) + blobs = list( + storage.client["storage_staging"] + .bucket("basedosdados-dev") + .list_blobs(prefix=f"staging/{storage.dataset_id}/{storage.table_id}/") + ) + + dfs = [] + + for blob in blobs: + partitions = re.findall(r"\w+(?==)", blob.name) + if len(set(partitions)) == 0: + df = pd.read_csv( + blob.public_url + ) + dfs.append(df) + else: + columns2add = list(set(partitions)) + df = pd.read_csv( + blob.public_url + ) + for column in columns2add: + df[column] = blob.name.split(column + "=")[1].split("/")[0] + dfs.append(df) + + df = pd.concat(dfs) + + return df \ No newline at end of file From f14f9752c6687e47de983a5bb5ad2c9422ff08c8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 03:33:16 +0000 Subject: [PATCH 178/265] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pipelines/datasets/br_denatran_frota/handlers.py | 5 +++-- pipelines/datasets/br_denatran_frota/utils.py | 11 +++-------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 8f96fd7c9..175f5ed2b 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -145,8 +145,9 @@ def get_desired_file(year: int, download_directory: str, filetype: str) -> str: def treat_municipio_tipo(file: str) -> pl.DataFrame: - bd_municipios = get_data_from_prod(table_id="municipio", - dataset_id="br_bd_diretorios_brasil") + bd_municipios = get_data_from_prod( + table_id="municipio", dataset_id="br_bd_diretorios_brasil" + ) bd_municipios = pl.from_pandas(bd_municipios) filename = os.path.split(file)[1] diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index b3387e336..ca4eba1c9 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -544,7 +544,6 @@ def treat_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str) -> None: return verify_match_ibge(denatran_uf, ibge_uf) - def get_data_from_prod(dataset_id: str, table_id: str) -> list: """Get data from a table from basedosdados. @@ -569,19 +568,15 @@ def get_data_from_prod(dataset_id: str, table_id: str) -> list: for blob in blobs: partitions = re.findall(r"\w+(?==)", blob.name) if len(set(partitions)) == 0: - df = pd.read_csv( - blob.public_url - ) + df = pd.read_csv(blob.public_url) dfs.append(df) else: columns2add = list(set(partitions)) - df = pd.read_csv( - blob.public_url - ) + df = pd.read_csv(blob.public_url) for column in columns2add: df[column] = blob.name.split(column + "=")[1].split("/")[0] dfs.append(df) df = pd.concat(dfs) - return df \ No newline at end of file + return df From 8b9638c855f2c51a4dc08abbf3bf2aaf22e2adc3 Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 22 Jun 2023 19:09:46 -0300 Subject: [PATCH 179/265] Tenta mapping pra um flow --- pipelines/datasets/br_denatran_frota/flows.py | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index ad46e157a..3fa6de794 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -60,7 +60,7 @@ from datetime import datetime, timedelta from prefect.run_configs import KubernetesRun from prefect.storage import GCS -from prefect import Parameter, case +from prefect import Parameter, case, unmapped from prefect.tasks.prefect import ( create_flow_run, wait_for_flow_run, @@ -84,7 +84,13 @@ treat_municipio_tipo_task, ) from pipelines.datasets.br_denatran_frota.constants import constants +from itertools import product +year_range = list(range(2003, 2023)) +month_range = list(range(1, 13)) +date_pairs = list(product(year_range, month_range)) + +date_pairs_param = Parameter("date_pairs", default=date_pairs) # from pipelines.datasets.br_denatran_frota.schedules import every_two_weeks @@ -94,7 +100,6 @@ "Tamir", ], ) as br_denatran_frota_uf_tipo: - year = 2021 dataset_id = Parameter("dataset_id", default="br_denatran_frota") table_id = Parameter("table_id", default="uf_tipo") @@ -111,19 +116,24 @@ rename_flow_run = rename_current_flow_run_dataset_table( prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - crawled = crawl_task(month=2, year=year, temp_dir=constants.DOWNLOAD_PATH.value) + crawled = crawl_task.map( + month=[date[1] for date in date_pairs_param], + year=[date[0] for date in date_pairs_param], + temp_dir=unmapped(constants.DOWNLOAD_PATH.value)) # Now get the downloaded file: - municipio_tipo_file = get_desired_file_task( - year=year, - download_directory=constants.DOWNLOAD_PATH.value, - filetype=constants.UF_TIPO_BASIC_FILENAME.value, + # Now get the downloaded file: + municipio_tipo_file = get_desired_file_task.map( + year=[date[0] for date in date_pairs_param], + month=[date[1] for date in date_pairs_param], + download_directory=unmapped(constants.DOWNLOAD_PATH.value), + filetype=unmapped(constants.UF_TIPO_BASIC_FILENAME.value), upstream_tasks=[crawled], ) - df = treat_uf_tipo_task( + df = treat_uf_tipo_task.map( file=municipio_tipo_file, upstream_tasks=[crawled, municipio_tipo_file] ) - csv_output = output_file_to_csv_task( - df, constants.UF_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] + csv_output = output_file_to_csv_task.map( + df, unmapped(constants.UF_TIPO_BASIC_FILENAME.value), upstream_tasks=[df] ) # wait_upload_table = create_table_and_upload_to_gcs( # data_path=csv_output, From 0836c77bd8e0d77011eed5857df24b422f10be81 Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 22 Jun 2023 19:28:24 -0300 Subject: [PATCH 180/265] Sobrescrever a tabela (deve dar erro) --- pipelines/datasets/br_denatran_frota/flows.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 3fa6de794..1c7b3cdb9 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -135,13 +135,13 @@ csv_output = output_file_to_csv_task.map( df, unmapped(constants.UF_TIPO_BASIC_FILENAME.value), upstream_tasks=[df] ) - # wait_upload_table = create_table_and_upload_to_gcs( - # data_path=csv_output, - # dataset_id=dataset_id, - # table_id=table_id, - # dump_mode="append", - # wait=csv_output, - # ) + wait_upload_table = create_table_and_upload_to_gcs( + data_path=csv_output, + dataset_id=dataset_id, + table_id=table_id, + dump_mode="overwrite", + wait=csv_output, + ) with case(materialize_after_dump, True): # Trigger DBT flow run From 6fc2193a731ceca7f776c559c9610459bfc9c94b Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 22 Jun 2023 19:29:22 -0300 Subject: [PATCH 181/265] Faltou map --- pipelines/datasets/br_denatran_frota/flows.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 1c7b3cdb9..cceef97fe 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -135,11 +135,11 @@ csv_output = output_file_to_csv_task.map( df, unmapped(constants.UF_TIPO_BASIC_FILENAME.value), upstream_tasks=[df] ) - wait_upload_table = create_table_and_upload_to_gcs( + wait_upload_table = create_table_and_upload_to_gcs.map( data_path=csv_output, - dataset_id=dataset_id, - table_id=table_id, - dump_mode="overwrite", + dataset_id=unmapped(dataset_id), + table_id=unmapped(table_id), + dump_mode=unmapped("append"), wait=csv_output, ) From ef71443df5e3dac51d47e38c5112059f865e766c Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Fri, 23 Jun 2023 21:22:10 -0300 Subject: [PATCH 182/265] register flow --- .../datasets/br_denatran_frota/constants.py | 28 ---------- pipelines/datasets/br_denatran_frota/flows.py | 56 +------------------ 2 files changed, 2 insertions(+), 82 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index 034342db8..6f69d6200 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -3,34 +3,6 @@ Constant values for the datasets projects """ - -############################################################################### -# -# Esse é um arquivo onde podem ser declaratas constantes que serão usadas -# pelo projeto br_denatran_frota. -# -# Por ser um arquivo opcional, pode ser removido sem prejuízo ao funcionamento -# do projeto, caos não esteja em uso. -# -# Para declarar constantes, basta fazer conforme o exemplo abaixo: -# -# ``` -# class constants(Enum): -# """ -# Constant values for the br_denatran_frota project -# """ -# FOO = "bar" -# ``` -# -# Para usá-las, basta fazer conforme o exemplo abaixo: -# -# ```py -# from pipelines.datasets.br_denatran_frota.constants import constants -# print(constants.FOO.value) -# ``` -# -############################################################################### - from enum import Enum diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index cceef97fe..d2da7f9c1 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -3,59 +3,6 @@ Flows for br_denatran_frota """ -############################################################################### -# -# Aqui é onde devem ser definidos os flows do projeto. -# Cada flow representa uma sequência de passos que serão executados -# em ordem. -# -# Mais informações sobre flows podem ser encontradas na documentação do -# Prefect: https://docs.prefect.io/core/concepts/flows.html -# -# De modo a manter consistência na codebase, todo o código escrito passará -# pelo pylint. Todos os warnings e erros devem ser corrigidos. -# -# Existem diversas maneiras de declarar flows. No entanto, a maneira mais -# conveniente e recomendada pela documentação é usar a API funcional. -# Em essência, isso implica simplesmente na chamada de funções, passando -# os parâmetros necessários para a execução em cada uma delas. -# -# Também, após a definição de um flow, para o adequado funcionamento, é -# mandatório configurar alguns parâmetros dele, os quais são: -# - storage: onde esse flow está armazenado. No caso, o storage é o -# próprio módulo Python que contém o flow. Sendo assim, deve-se -# configurar o storage como o pipelines.datasets -# - run_config: para o caso de execução em cluster Kubernetes, que é -# provavelmente o caso, é necessário configurar o run_config com a -# imagem Docker que será usada para executar o flow. Assim sendo, -# basta usar constants.DOCKER_IMAGE.value, que é automaticamente -# gerado. -# - schedule (opcional): para o caso de execução em intervalos regulares, -# deve-se utilizar algum dos schedules definidos em schedules.py -# -# Um exemplo de flow, considerando todos os pontos acima, é o seguinte: -# -# ----------------------------------------------------------------------------- -# from prefect import task -# from prefect import Flow -# from prefect.run_configs import KubernetesRun -# from prefect.storage import GCS -# from pipelines.constants import constants -# from my_tasks import my_task, another_task -# from my_schedules import some_schedule -# -# with Flow("my_flow") as flow: -# a = my_task(param1=1, param2=2) -# b = another_task(a, param3=3) -# -# flow.storage = GCS(constants.GCS_FLOWS_BUCKET.value) -# flow.run_config = KubernetesRun(image=constants.DOCKER_IMAGE.value) -# flow.schedule = some_schedule -# ----------------------------------------------------------------------------- -# -# Abaixo segue um código para exemplificação, que pode ser removido. -# -############################################################################### from datetime import datetime, timedelta from prefect.run_configs import KubernetesRun @@ -119,7 +66,8 @@ crawled = crawl_task.map( month=[date[1] for date in date_pairs_param], year=[date[0] for date in date_pairs_param], - temp_dir=unmapped(constants.DOWNLOAD_PATH.value)) + temp_dir=unmapped(constants.DOWNLOAD_PATH.value), + ) # Now get the downloaded file: # Now get the downloaded file: municipio_tipo_file = get_desired_file_task.map( From 90bff918d54c2b6f320eb6f3344f028db7085da9 Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Mon, 10 Apr 2023 12:30:55 -0300 Subject: [PATCH 183/265] test: access datasus ftp using prefect --- pipelines/datasets/br_denatran_frota/flows.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index d2da7f9c1..cf70610fa 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -165,13 +165,13 @@ csv_output = output_file_to_csv_task( df, constants.MUNIC_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] ) - # wait_upload_table = create_table_and_upload_to_gcs( - # data_path=csv_output, - # dataset_id=dataset_id, - # table_id=table_id, - # dump_mode="append", - # wait=csv_output, - # ) + wait_upload_table = create_table_and_upload_to_gcs( + data_path=csv_output, + dataset_id=dataset_id, + table_id=table_id, + dump_mode="append", + wait=csv_output, + ) with case(materialize_after_dump, True): # Trigger DBT flow run From 6fc22412970699be3a39a735e4d95eeb1572718c Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Tue, 4 Jul 2023 07:37:56 -0300 Subject: [PATCH 184/265] re register flow --- pipelines/datasets/br_denatran_frota/flows.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index cf70610fa..ebf4110f3 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -69,7 +69,6 @@ temp_dir=unmapped(constants.DOWNLOAD_PATH.value), ) # Now get the downloaded file: - # Now get the downloaded file: municipio_tipo_file = get_desired_file_task.map( year=[date[0] for date in date_pairs_param], month=[date[1] for date in date_pairs_param], From eaeacfe10d1c912c9544bc9f5d1912d79ee91b7c Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Thu, 6 Jul 2023 20:10:22 -0300 Subject: [PATCH 185/265] re register --- .../datasets/br_denatran_frota/schedules.py | 66 ------------------- 1 file changed, 66 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/schedules.py b/pipelines/datasets/br_denatran_frota/schedules.py index 8967b8c93..792760590 100644 --- a/pipelines/datasets/br_denatran_frota/schedules.py +++ b/pipelines/datasets/br_denatran_frota/schedules.py @@ -3,72 +3,6 @@ Schedules for br_denatran_frota """ -############################################################################### -# -# Aqui é onde devem ser definidos os schedules para os flows do projeto. -# Cada schedule indica o intervalo de tempo entre as execuções. -# Um schedule pode ser definido para um ou mais flows. -# Mais informações sobre schedules podem ser encontradas na documentação do -# Prefect: https://docs.prefect.io/core/concepts/schedules.html -# -# De modo a manter consistência na codebase, todo o código escrito passará -# pelo pylint. Todos os warnings e erros devem ser corrigidos. -# -# Os schedules devem ser definidos de acordo com a sintaxe do Prefect, como, -# por exemplo, o seguinte (para executar a cada 1 minuto): -# -# ----------------------------------------------------------------------------- -# from datetime import timedelta, datetime -# from prefect.schedules import Schedule -# from prefect.schedules.clocks import IntervalClock -# from pipelines.constants import constants -# -# minute_schedule = Schedule( -# clocks=[ -# IntervalClock( -# interval=timedelta(minutes=1), -# start_date=datetime(2021, 1, 1), -# labels=[ -# constants.DATASETS_AGENT_LABEL.value, -# ] -# ), -# ] -# ) -# ----------------------------------------------------------------------------- -# -# Vale notar que o parâmetro `labels` é obrigatório e deve ser uma lista com -# apenas um elemento, correspondendo ao label do agente que será executado. -# O label do agente é definido em `constants.py` e deve ter o formato -# `DATASETS_AGENT_LABEL`. -# -# Outro exemplo, para executar todos os dias à meia noite, segue abaixo: -# -# ----------------------------------------------------------------------------- -# from prefect import task -# from datetime import timedelta -# import pendulum -# from prefect.schedules import Schedule -# from prefect.schedules.clocks import IntervalClock -# from pipelines.constants import constants -# -# every_day_at_midnight = Schedule( -# clocks=[ -# IntervalClock( -# interval=timedelta(days=1), -# start_date=pendulum.datetime( -# 2021, 1, 1, 0, 0, 0, tz="America/Sao_Paulo"), -# labels=[ -# constants.K8S_AGENT_LABEL.value, -# ] -# ) -# ] -# ) -# ----------------------------------------------------------------------------- -# -# Abaixo segue um código para exemplificação, que pode ser removido. -# -############################################################################### - from datetime import timedelta, datetime from prefect.schedules import Schedule From 0e96d9deb13c52c1562b3e1e1f5cbeea1dff453e Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 9 Jul 2023 20:55:18 -0300 Subject: [PATCH 186/265] =?UTF-8?q?Sei=20l=C3=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pipelines/datasets/br_denatran_frota/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 2edcfd86e..ca8c23ff0 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -73,7 +73,7 @@ @task() # noqa -def crawl_task(month: int, year: int, temp_dir: str = "") -> None: +def crawl_task(month: int, year: int, temp_dir: str = "") -> tuple: return crawl(month, year, temp_dir) From 99229625c4ee05becc212c4a74c31ad358bcc94f Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 9 Jul 2023 21:09:40 -0300 Subject: [PATCH 187/265] uh --- pipelines/datasets/br_denatran_frota/flows.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index ebf4110f3..051914bc4 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -37,7 +37,7 @@ month_range = list(range(1, 13)) date_pairs = list(product(year_range, month_range)) -date_pairs_param = Parameter("date_pairs", default=date_pairs) +date_pairs_param: list[tuple] = Parameter("date_pairs", default=date_pairs) # from pipelines.datasets.br_denatran_frota.schedules import every_two_weeks From 6e38a4f9fd62a977b02e550feddebabe2f613549 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 10 Jul 2023 01:15:00 +0000 Subject: [PATCH 188/265] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pipelines/datasets/br_denatran_frota/flows.py | 2 +- pipelines/datasets/br_denatran_frota/handlers.py | 6 ++++-- pipelines/datasets/br_denatran_frota/tasks.py | 3 ++- pipelines/datasets/br_denatran_frota/tasks_test.py | 5 +++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 841f75712..141694f05 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -79,7 +79,7 @@ file=municipio_tipo_file, upstream_tasks=[crawled, municipio_tipo_file] ) csv_output = output_file_to_csv_task( - df,constants.UF_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] + df, constants.UF_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] ) wait_upload_table = create_table_and_upload_to_gcs( data_path=csv_output, diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 6a8a54cac..46d99af4f 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -146,12 +146,14 @@ def get_desired_file(year: int, download_directory: str, filetype: str) -> str: def get_latest_data(table_name: str): denatran_data = get_data_from_prod( - table_id=table_name, dataset_id="br_denatran_frota") + table_id=table_name, dataset_id="br_denatran_frota" + ) denatran_data: pl.DataFrame = pl.from_pandas(denatran_data) year = denatran_data.select(pl.max("ano")) log(year) return year - + + def treat_municipio_tipo(file: str) -> pl.DataFrame: bd_municipios = get_data_from_prod( table_id="municipio", dataset_id="br_bd_diretorios_brasil" diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 9853623dd..2dc8793c5 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -61,7 +61,7 @@ output_file_to_csv, get_desired_file, treat_municipio_tipo, - get_latest_data + get_latest_data, ) from pipelines.utils.utils import ( log, @@ -99,6 +99,7 @@ def get_desired_file_task(year: int, download_directory: str, filetype: str) -> def treat_municipio_tipo_task(file: str) -> pl.DataFrame: return treat_municipio_tipo(file) + @task() def get_latest_data_task(table_name: str): return get_latest_data(table_name) diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index dc80a4362..a434ed96d 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -12,7 +12,7 @@ treat_uf_tipo, get_desired_file, treat_municipio_tipo, - get_latest_data + get_latest_data, ) from pipelines.datasets.br_denatran_frota.constants import constants @@ -97,7 +97,8 @@ def test_flow(self): class TestGetLatestData(unittest.TestCase): def test_year(self): - self.assertEqual(2021, get_latest_data('municipio')) + self.assertEqual(2021, get_latest_data("municipio")) + class TestMunicipioTreatmentPostCrawl(unittest.TestCase): def setUp(self): From 944d93103ff0137761de64dac5c67702d4ae7445 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 9 Jul 2023 22:15:14 -0300 Subject: [PATCH 189/265] Teste pra task nova --- pipelines/datasets/br_denatran_frota/flows.py | 31 +++++++++---------- .../datasets/br_denatran_frota/handlers.py | 8 +++++ pipelines/datasets/br_denatran_frota/tasks.py | 5 +++ .../datasets/br_denatran_frota/tasks_test.py | 5 +++ 4 files changed, 33 insertions(+), 16 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 051914bc4..841f75712 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -63,30 +63,29 @@ rename_flow_run = rename_current_flow_run_dataset_table( prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - crawled = crawl_task.map( - month=[date[1] for date in date_pairs_param], - year=[date[0] for date in date_pairs_param], - temp_dir=unmapped(constants.DOWNLOAD_PATH.value), + crawled = crawl_task( + month=1, + year=2003, + temp_dir=constants.DOWNLOAD_PATH.value, ) # Now get the downloaded file: - municipio_tipo_file = get_desired_file_task.map( - year=[date[0] for date in date_pairs_param], - month=[date[1] for date in date_pairs_param], - download_directory=unmapped(constants.DOWNLOAD_PATH.value), - filetype=unmapped(constants.UF_TIPO_BASIC_FILENAME.value), + municipio_tipo_file = get_desired_file_task( + year=2003, + download_directory=constants.DOWNLOAD_PATH.value, + filetype=constants.UF_TIPO_BASIC_FILENAME.value, upstream_tasks=[crawled], ) - df = treat_uf_tipo_task.map( + df = treat_uf_tipo_task( file=municipio_tipo_file, upstream_tasks=[crawled, municipio_tipo_file] ) - csv_output = output_file_to_csv_task.map( - df, unmapped(constants.UF_TIPO_BASIC_FILENAME.value), upstream_tasks=[df] + csv_output = output_file_to_csv_task( + df,constants.UF_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] ) - wait_upload_table = create_table_and_upload_to_gcs.map( + wait_upload_table = create_table_and_upload_to_gcs( data_path=csv_output, - dataset_id=unmapped(dataset_id), - table_id=unmapped(table_id), - dump_mode=unmapped("append"), + dataset_id=dataset_id, + table_id=table_id, + dump_mode="append", wait=csv_output, ) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 175f5ed2b..6a8a54cac 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -144,6 +144,14 @@ def get_desired_file(year: int, download_directory: str, filetype: str) -> str: raise ValueError("No files found buckaroo") +def get_latest_data(table_name: str): + denatran_data = get_data_from_prod( + table_id=table_name, dataset_id="br_denatran_frota") + denatran_data: pl.DataFrame = pl.from_pandas(denatran_data) + year = denatran_data.select(pl.max("ano")) + log(year) + return year + def treat_municipio_tipo(file: str) -> pl.DataFrame: bd_municipios = get_data_from_prod( table_id="municipio", dataset_id="br_bd_diretorios_brasil" diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index ca8c23ff0..9853623dd 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -61,6 +61,7 @@ output_file_to_csv, get_desired_file, treat_municipio_tipo, + get_latest_data ) from pipelines.utils.utils import ( log, @@ -97,3 +98,7 @@ def get_desired_file_task(year: int, download_directory: str, filetype: str) -> @task() def treat_municipio_tipo_task(file: str) -> pl.DataFrame: return treat_municipio_tipo(file) + +@task() +def get_latest_data_task(table_name: str): + return get_latest_data(table_name) diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index 7dfb75d58..dc80a4362 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -12,6 +12,7 @@ treat_uf_tipo, get_desired_file, treat_municipio_tipo, + get_latest_data ) from pipelines.datasets.br_denatran_frota.constants import constants @@ -94,6 +95,10 @@ def test_flow(self): self.assertTrue(type(df), pl.DataFrame) +class TestGetLatestData(unittest.TestCase): + def test_year(self): + self.assertEqual(2021, get_latest_data('municipio')) + class TestMunicipioTreatmentPostCrawl(unittest.TestCase): def setUp(self): self.temp_dir = tempfile.TemporaryDirectory( From e5f50b978fe8b333d12d811f52665bff010830a2 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 9 Jul 2023 22:17:11 -0300 Subject: [PATCH 190/265] Modifica flow de acodo --- pipelines/datasets/br_denatran_frota/flows.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 841f75712..9474b2c5e 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -29,6 +29,7 @@ output_file_to_csv_task, get_desired_file_task, treat_municipio_tipo_task, + get_latest_data_task ) from pipelines.datasets.br_denatran_frota.constants import constants from itertools import product @@ -63,10 +64,13 @@ rename_flow_run = rename_current_flow_run_dataset_table( prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) + + year_to_fetch = get_latest_data_task('uf_tipo') crawled = crawl_task( month=1, - year=2003, + year=year_to_fetch, temp_dir=constants.DOWNLOAD_PATH.value, + upstream_tasks=[year_to_fetch] ) # Now get the downloaded file: municipio_tipo_file = get_desired_file_task( From 99617f9d101edda4d25521b284f6a5cb35afdd53 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 10 Jul 2023 01:18:53 +0000 Subject: [PATCH 191/265] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pipelines/datasets/br_denatran_frota/flows.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 894533e1d..a773438e5 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -29,7 +29,7 @@ output_file_to_csv_task, get_desired_file_task, treat_municipio_tipo_task, - get_latest_data_task + get_latest_data_task, ) from pipelines.datasets.br_denatran_frota.constants import constants from itertools import product @@ -65,12 +65,12 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - year_to_fetch = get_latest_data_task('uf_tipo') + year_to_fetch = get_latest_data_task("uf_tipo") crawled = crawl_task( month=1, year=year_to_fetch, temp_dir=constants.DOWNLOAD_PATH.value, - upstream_tasks=[year_to_fetch] + upstream_tasks=[year_to_fetch], ) # Now get the downloaded file: municipio_tipo_file = get_desired_file_task( From 15e34a759f26e0697d9df571d9b49f3552c6fa3e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 10 Jul 2023 01:34:51 +0000 Subject: [PATCH 192/265] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pipelines/datasets/br_denatran_frota/utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 980a5cdad..5ed81e289 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -580,4 +580,3 @@ def get_data_from_prod(dataset_id: str, table_id: str) -> list: df = pd.concat(dfs) return df - From e1780b30166f6490be6e6c0bf458cb61e295f409 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 9 Jul 2023 22:34:54 -0300 Subject: [PATCH 193/265] Error handling --- pipelines/datasets/br_denatran_frota/handlers.py | 12 ++++++++---- pipelines/datasets/br_denatran_frota/utils.py | 5 +++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 46d99af4f..9bdd0dd79 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -148,10 +148,14 @@ def get_latest_data(table_name: str): denatran_data = get_data_from_prod( table_id=table_name, dataset_id="br_denatran_frota" ) - denatran_data: pl.DataFrame = pl.from_pandas(denatran_data) - year = denatran_data.select(pl.max("ano")) - log(year) - return year + if denatran_data: + denatran_data: pl.DataFrame = pl.from_pandas(denatran_data) + year = denatran_data.select(pl.max("ano")) + log(year) + return year + else: + log("Não achei ano não mané") + return 2003 def treat_municipio_tipo(file: str) -> pl.DataFrame: diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index ca4eba1c9..980a5cdad 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -576,7 +576,8 @@ def get_data_from_prod(dataset_id: str, table_id: str) -> list: for column in columns2add: df[column] = blob.name.split(column + "=")[1].split("/")[0] dfs.append(df) + if dfs: + df = pd.concat(dfs) - df = pd.concat(dfs) + return df - return df From 38428abdf71fc0afd5a3299a8bfabd31260c905d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 10 Jul 2023 01:46:31 +0000 Subject: [PATCH 194/265] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pipelines/datasets/br_denatran_frota/handlers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 1f87b6d9a..f9b12fbfb 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -151,12 +151,12 @@ def get_latest_data(table_name: str): if denatran_data: denatran_data: pl.DataFrame = pl.from_pandas(denatran_data) year = denatran_data.select(pl.max("ano")) - month = denatran_data.filter(pl.col('ano') == year).select(pl.max('mes')) + month = denatran_data.filter(pl.col("ano") == year).select(pl.max("mes")) if month == 12: year += 1 month = 1 log(f"Ano: {year}, mês: {month+1}") - return year, month+1 + return year, month + 1 else: log("Não achei ano não mané") return 2003, 1 From a67db8a20707323f2908d3825ba197a96c0c115d Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 9 Jul 2023 22:46:35 -0300 Subject: [PATCH 195/265] Tenta usar ano e mes de prod --- pipelines/datasets/br_denatran_frota/flows.py | 6 +++--- pipelines/datasets/br_denatran_frota/handlers.py | 10 +++++++--- pipelines/datasets/br_denatran_frota/tasks.py | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index a773438e5..07c0ae14a 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -67,14 +67,14 @@ year_to_fetch = get_latest_data_task("uf_tipo") crawled = crawl_task( - month=1, - year=year_to_fetch, + month=year_to_fetch[1], + year=year_to_fetch[0], temp_dir=constants.DOWNLOAD_PATH.value, upstream_tasks=[year_to_fetch], ) # Now get the downloaded file: municipio_tipo_file = get_desired_file_task( - year=2003, + year=year_to_fetch[0], download_directory=constants.DOWNLOAD_PATH.value, filetype=constants.UF_TIPO_BASIC_FILENAME.value, upstream_tasks=[crawled], diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 9bdd0dd79..1f87b6d9a 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -151,11 +151,15 @@ def get_latest_data(table_name: str): if denatran_data: denatran_data: pl.DataFrame = pl.from_pandas(denatran_data) year = denatran_data.select(pl.max("ano")) - log(year) - return year + month = denatran_data.filter(pl.col('ano') == year).select(pl.max('mes')) + if month == 12: + year += 1 + month = 1 + log(f"Ano: {year}, mês: {month+1}") + return year, month+1 else: log("Não achei ano não mané") - return 2003 + return 2003, 1 def treat_municipio_tipo(file: str) -> pl.DataFrame: diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 2dc8793c5..98f2a8d5b 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -101,5 +101,5 @@ def treat_municipio_tipo_task(file: str) -> pl.DataFrame: @task() -def get_latest_data_task(table_name: str): +def get_latest_data_task(table_name: str) -> tuple[int, int]: return get_latest_data(table_name) From a2ca3881ddec1f23ce00e3187aa4a0b2fc0df7c3 Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 9 Jul 2023 22:55:34 -0300 Subject: [PATCH 196/265] Ops --- pipelines/datasets/br_denatran_frota/handlers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 1f87b6d9a..39f086e88 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -148,7 +148,7 @@ def get_latest_data(table_name: str): denatran_data = get_data_from_prod( table_id=table_name, dataset_id="br_denatran_frota" ) - if denatran_data: + if not denatran_data.is_empty(): denatran_data: pl.DataFrame = pl.from_pandas(denatran_data) year = denatran_data.select(pl.max("ano")) month = denatran_data.filter(pl.col('ano') == year).select(pl.max('mes')) From 0cf432c2151be5138d7fc082b35b491668d2d3bc Mon Sep 17 00:00:00 2001 From: Tamir Date: Sun, 9 Jul 2023 23:56:12 -0300 Subject: [PATCH 197/265] ah ok --- pipelines/datasets/br_denatran_frota/handlers.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 7ee841370..199076e9e 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -145,11 +145,11 @@ def get_desired_file(year: int, download_directory: str, filetype: str) -> str: def get_latest_data(table_name: str): - denatran_data = get_data_from_prod( + denatran_data_pandas: pd.DataFrame = get_data_from_prod( table_id=table_name, dataset_id="br_denatran_frota" ) - if not denatran_data.is_empty(): - denatran_data: pl.DataFrame = pl.from_pandas(denatran_data) + if not denatran_data_pandas.empty: + denatran_data: pl.DataFrame = pl.from_pandas(denatran_data_pandas) year = denatran_data.select(pl.max("ano")) month = denatran_data.filter(pl.col("ano") == year).select(pl.max("mes")) if month == 12: From 63b8e8f2096f7e235fb873e1476891c8d25968e2 Mon Sep 17 00:00:00 2001 From: Tamir Date: Tue, 11 Jul 2023 02:37:12 -0300 Subject: [PATCH 198/265] logs --- pipelines/datasets/br_denatran_frota/handlers.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 199076e9e..665395045 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -152,6 +152,8 @@ def get_latest_data(table_name: str): denatran_data: pl.DataFrame = pl.from_pandas(denatran_data_pandas) year = denatran_data.select(pl.max("ano")) month = denatran_data.filter(pl.col("ano") == year).select(pl.max("mes")) + log(year) + log(month) if month == 12: year += 1 month = 1 From b7ae3bd29ae1295135039fae69976504c0a11dfb Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 12 Jul 2023 03:02:05 -0300 Subject: [PATCH 199/265] mais simples --- pipelines/datasets/br_denatran_frota/handlers.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 665395045..20fb62f00 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -145,13 +145,12 @@ def get_desired_file(year: int, download_directory: str, filetype: str) -> str: def get_latest_data(table_name: str): - denatran_data_pandas: pd.DataFrame = get_data_from_prod( + denatran_data: pd.DataFrame = get_data_from_prod( table_id=table_name, dataset_id="br_denatran_frota" ) - if not denatran_data_pandas.empty: - denatran_data: pl.DataFrame = pl.from_pandas(denatran_data_pandas) - year = denatran_data.select(pl.max("ano")) - month = denatran_data.filter(pl.col("ano") == year).select(pl.max("mes")) + if not denatran_data.empty: + year = denatran_data['ano'].max() + month = denatran_data.loc[denatran_data['ano'] == year]["mes"].max() log(year) log(month) if month == 12: From c1658350feb310c3cf0e900bce04ed7414bba046 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 12 Jul 2023 06:04:36 +0000 Subject: [PATCH 200/265] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pipelines/datasets/br_denatran_frota/handlers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 20fb62f00..cdd50a34e 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -149,8 +149,8 @@ def get_latest_data(table_name: str): table_id=table_name, dataset_id="br_denatran_frota" ) if not denatran_data.empty: - year = denatran_data['ano'].max() - month = denatran_data.loc[denatran_data['ano'] == year]["mes"].max() + year = denatran_data["ano"].max() + month = denatran_data.loc[denatran_data["ano"] == year]["mes"].max() log(year) log(month) if month == 12: From 7a8e33caf55b3bb28f2e1672022ee54b52cc581f Mon Sep 17 00:00:00 2001 From: Tamir Date: Wed, 12 Jul 2023 03:19:24 -0300 Subject: [PATCH 201/265] Flows flows flows --- pipelines/datasets/br_denatran_frota/flows.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 07c0ae14a..01fa11d4d 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -135,7 +135,7 @@ "Tamir", ], ) as br_denatran_frota_municipio_tipo: - year = 2021 + dataset_id = Parameter("dataset_id", default="br_denatran_frota") table_id = Parameter("table_id", default="municipio_tipo") @@ -153,10 +153,16 @@ rename_flow_run = rename_current_flow_run_dataset_table( prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - crawled = crawl_task(month=2, year=year, temp_dir=constants.DOWNLOAD_PATH.value) + year_to_fetch = get_latest_data_task("municipio_tipo") + crawled = crawl_task( + month=year_to_fetch[1], + year=year_to_fetch[0], + temp_dir=constants.DOWNLOAD_PATH.value, + upstream_tasks=[year_to_fetch], + ) # Now get the downloaded file: municipio_tipo_file = get_desired_file_task( - year=year, + year=year_to_fetch[0], download_directory=constants.DOWNLOAD_PATH.value, filetype=constants.MUNIC_TIPO_BASIC_FILENAME.value, upstream_tasks=[crawled], From 99f1b6a7d27e4245be0c3705b69bd3ae2c885d70 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 12 Jul 2023 06:19:41 +0000 Subject: [PATCH 202/265] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pipelines/datasets/br_denatran_frota/flows.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 01fa11d4d..d23f80558 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -135,7 +135,6 @@ "Tamir", ], ) as br_denatran_frota_municipio_tipo: - dataset_id = Parameter("dataset_id", default="br_denatran_frota") table_id = Parameter("table_id", default="municipio_tipo") From f940d885aa4b97b8923ba0922093d507018de589 Mon Sep 17 00:00:00 2001 From: Tamir Date: Thu, 17 Aug 2023 02:08:21 -0300 Subject: [PATCH 203/265] Adiciona particionamento --- pipelines/datasets/br_denatran_frota/handlers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index cdd50a34e..67ee3ee8f 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -126,7 +126,8 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: def output_file_to_csv(df: pl.DataFrame, filename: str) -> None: make_dir_when_not_exists(OUTPUT_PATH) - df.write_csv(file=f"{OUTPUT_PATH}/{filename}.csv", has_header=True) + pd_df = df.to_pandas() + to_partitions(pd_df, partition_columns=["ano", "mes", "sigla_uf"], savepath=OUTPUT_PATH) return OUTPUT_PATH From c4296e3ca40ed5a170c90b15fcabd93c244fb8f5 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 25 Aug 2023 13:28:32 -0300 Subject: [PATCH 204/265] Guard pra caso falhe o fetch de prod --- pipelines/datasets/br_denatran_frota/handlers.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 67ee3ee8f..21c0f8ef5 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -146,9 +146,12 @@ def get_desired_file(year: int, download_directory: str, filetype: str) -> str: def get_latest_data(table_name: str): - denatran_data: pd.DataFrame = get_data_from_prod( - table_id=table_name, dataset_id="br_denatran_frota" - ) + try: + denatran_data: pd.DataFrame = get_data_from_prod( + table_id=table_name, dataset_id="br_denatran_frota" + ) + except: + return 2003, 1 if not denatran_data.empty: year = denatran_data["ano"].max() month = denatran_data.loc[denatran_data["ano"] == year]["mes"].max() From b9752250857aeae47a1c219fec47ccbbd5262277 Mon Sep 17 00:00:00 2001 From: Tamir Date: Fri, 25 Aug 2023 13:32:23 -0300 Subject: [PATCH 205/265] deploya pls --- pipelines/datasets/br_denatran_frota/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 98f2a8d5b..fb0c94dfb 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -86,7 +86,6 @@ def treat_uf_tipo_task(file) -> pl.DataFrame: @task() def output_file_to_csv_task(df: pl.DataFrame, filename: str) -> None: - log(filename) return output_file_to_csv(df, filename) @@ -103,3 +102,4 @@ def treat_municipio_tipo_task(file: str) -> pl.DataFrame: @task() def get_latest_data_task(table_name: str) -> tuple[int, int]: return get_latest_data(table_name) + From 8abb9b40a591fab29dedc9972500d2ee5cd389e7 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Tue, 29 Aug 2023 00:37:25 -0300 Subject: [PATCH 206/265] =?UTF-8?q?Remove=20pasta=20desnecess=C3=A1ria,=20?= =?UTF-8?q?deploya=20por=20favor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- br_denatran_frota/README.md | 20 - br_denatran_frota/code/__init__.py | 0 br_denatran_frota/code/constants.py | 60 - br_denatran_frota/code/download_frota.R | 123 - br_denatran_frota/code/download_frota.py | 52 - br_denatran_frota/code/download_frota_old.R | 106 - br_denatran_frota/code/frota_municipio_tipo.R | 137 - .../code/frota_municipio_tipo.py | 72 - br_denatran_frota/code/frota_uf_tipo.R | 97 - br_denatran_frota/code/frota_uf_tipo.py | 70 - br_denatran_frota/code/setup.py | 12 - .../test/download_frota_integration_test.py | 50 - br_denatran_frota/code/test_drive.ipynb | 312 -- br_denatran_frota/code/utils.R | 207 -- br_denatran_frota/code/utils.py | 276 -- br_denatran_frota/dataset_config.yaml | 69 - br_denatran_frota/municipio_tipo/publish.sql | 50 - .../municipio_tipo/schema-prod.json | 1 - .../municipio_tipo/schema-staging.json | 1 - .../municipio_tipo/table_config.yaml | 268 -- .../municipio_tipo/table_description.txt | 67 - br_denatran_frota/uf_tipo/publish.sql | 49 - br_denatran_frota/uf_tipo/schema-prod.json | 1 - br_denatran_frota/uf_tipo/table_config.yaml | 263 -- .../uf_tipo/table_description.txt | 67 - pipelines/datasets/br_denatran_frota/tasks.py | 49 - poetry.lock | 2597 +++++++++++++---- 27 files changed, 1986 insertions(+), 3090 deletions(-) delete mode 100644 br_denatran_frota/README.md delete mode 100644 br_denatran_frota/code/__init__.py delete mode 100644 br_denatran_frota/code/constants.py delete mode 100644 br_denatran_frota/code/download_frota.R delete mode 100644 br_denatran_frota/code/download_frota.py delete mode 100644 br_denatran_frota/code/download_frota_old.R delete mode 100644 br_denatran_frota/code/frota_municipio_tipo.R delete mode 100644 br_denatran_frota/code/frota_municipio_tipo.py delete mode 100644 br_denatran_frota/code/frota_uf_tipo.R delete mode 100644 br_denatran_frota/code/frota_uf_tipo.py delete mode 100644 br_denatran_frota/code/setup.py delete mode 100644 br_denatran_frota/code/test/download_frota_integration_test.py delete mode 100644 br_denatran_frota/code/test_drive.ipynb delete mode 100644 br_denatran_frota/code/utils.R delete mode 100644 br_denatran_frota/code/utils.py delete mode 100644 br_denatran_frota/dataset_config.yaml delete mode 100644 br_denatran_frota/municipio_tipo/publish.sql delete mode 100644 br_denatran_frota/municipio_tipo/schema-prod.json delete mode 100644 br_denatran_frota/municipio_tipo/schema-staging.json delete mode 100644 br_denatran_frota/municipio_tipo/table_config.yaml delete mode 100644 br_denatran_frota/municipio_tipo/table_description.txt delete mode 100644 br_denatran_frota/uf_tipo/publish.sql delete mode 100644 br_denatran_frota/uf_tipo/schema-prod.json delete mode 100644 br_denatran_frota/uf_tipo/table_config.yaml delete mode 100644 br_denatran_frota/uf_tipo/table_description.txt diff --git a/br_denatran_frota/README.md b/br_denatran_frota/README.md deleted file mode 100644 index d8415e1fd..000000000 --- a/br_denatran_frota/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Frota de Veículos - -Como capturar os dados de br_denatran_frota? - -1. Para capturar esses dados, basta verificar o link dos dados originais indicado em `dataset_config.yaml` no item `website`. - -2. Caso tenha sido utilizado algum código de captura ou tratamento, estes estarão contidos em `code/`. Se o dado publicado for em sua versão bruta, não existirá a pasta `code/`. - -Os dados publicados estão disponíveis em: https://basedosdados.org/dataset/br-denatran-frota - -## Download e Leitura - -Dependências: - -- [unrar](https://www.rarlab.com/rar_add.htm) para extrair os arquivos `.rar` via cli. - -Ubuntu e Debian: -```sh -sudo apt-get install unrar -``` \ No newline at end of file diff --git a/br_denatran_frota/code/__init__.py b/br_denatran_frota/code/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/br_denatran_frota/code/constants.py b/br_denatran_frota/code/constants.py deleted file mode 100644 index ce21f239e..000000000 --- a/br_denatran_frota/code/constants.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- - -MONTHS = { - "janeiro": 1, - "fevereiro": 2, - "marco": 3, - "abril": 4, - "maio": 5, - "junho": 6, - "julho": 7, - "agosto": 8, - "setembro": 9, - "outubro": 10, - "novembro": 11, - "dezembro": 12, -} - -DATASET = "br_denatran_frota" - -HEADERS = { - "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36" -} - -DICT_UFS = { - "AC": "Acre", - "AL": "Alagoas", - "AP": "Amapá", - "AM": "Amazonas", - "BA": "Bahia", - "CE": "Ceará", - "DF": "Distrito Federal", - "ES": "Espírito Santo", - "GO": "Goiás", - "MA": "Maranhão", - "MT": "Mato Grosso", - "MS": "Mato Grosso do Sul", - "MG": "Minas Gerais", - "PA": "Pará", - "PB": "Paraíba", - "PR": "Paraná", - "PE": "Pernambuco", - "PI": "Piauí", - "RJ": "Rio de Janeiro", - "RN": "Rio Grande do Norte", - "RS": "Rio Grande do Sul", - "RO": "Rondônia", - "RR": "Roraima", - "SC": "Santa Catarina", - "SP": "São Paulo", - "SE": "Sergipe", - "TO": "Tocantins", -} - -SUBSTITUTIONS = { - ("RN", "assu"): "acu", - ("PB", "sao domingos de pombal"): "sao domingos", - ("PB", "santarem"): "joca claudino", - ("SP", "embu"): "embu das artes", - ("TO", "sao valerio da natividade"): "sao valerio", -} diff --git a/br_denatran_frota/code/download_frota.R b/br_denatran_frota/code/download_frota.R deleted file mode 100644 index e797298ae..000000000 --- a/br_denatran_frota/code/download_frota.R +++ /dev/null @@ -1,123 +0,0 @@ -library(rvest) -library(httr) -library(archive) # -library(magrittr) -library(stringr) -library(tibble) -library(dplyr) -library(purrr) - -download_frota <- function(key = NULL, prefix = NULL, month, year, tempdir = tempdir(), dir = getwd()) { - - months <- c( - "janeiro" = 1, - "fevereiro" = 2, - "marco" = 3, - "abril" = 4, - "maio" = 5, - "junho" = 6, - "julho" = 7, - "agosto" = 8, - "setembro" = 9, - "outubro" = 10, - "novembro" = 11, - "dezembro" = 12 - ) - - if (year > 2012) { - url <- paste0("https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-denatran/frota-de-veiculos-", year) - } else { - # Antes de 2013 os dados vem em um arquivo unico zip - stop("Utilize a função download_frota_old()") - } - - if (!dir.exists(tempdir)) dir.create(tempdir, recursive = T) - if (!dir.exists(dir)) dir.create(dir, recursive = T) - - download_file <- function(i) { - if (i$filetype %in% c("rar", "zip")) handle_compact(i) - if (i$filetype %in% c("xlsx", "xls")) handle_xl(i) - } - - make_filename <- function(i, ext = TRUE) { - stringi::stri_trans_general(i$txt, id = "Latin-ASCII; lower") %>% - stringr::str_replace_all("\\s+", "_") %>% - paste0(., "_", i$mes, "-", i$ano, ifelse(ext, paste0(".", i$filetype), as.character(""))) - } - - handle_xl <- function(i) { - dest_path_file <- paste0(dir, "/", prefix, "_", i$mes, "-", i$ano, paste0(".", i$filetype)) - if (!file.exists(dest_path_file)) { - utils::download.file( - url = i$href, - destfile = dest_path_file - ) - } - } - - handle_compact <- function(i) { - path_file_zip <- paste0(tempdir, "/", make_filename(i)) - dir_file <- paste0(tempdir, "/", make_filename(i, ext = F)) - - if (!file.exists(path_file_zip)) { - utils::download.file(url = i$href, destfile = path_file_zip) - } - - # archive package has a bug - if (i$filetype == "rar") { - if (!dir.exists(dir_file)) dir.create(dir_file) - system(paste0("unrar -o+ -inul x ", path_file_zip, " ", dir_file)) - } else { - archive::archive_extract(path_file_zip, dir = dir_file) - } - - # Remove rar, zip files. Keep only xls or xlsx - list.files(dir_file, full.names = T, pattern = "rar|zip") %>% purrr::walk(~file.remove(.x)) - - file <- list.files(dir_file) %>% .[!is.na(.)] - - if (length(file) == 0) { - stop(paste0("File not found on dir")) - } - - file_ext <- stringr::str_extract(file, ".(xlsx|xls)") - - # String multibyte is invalid - # file.rename( - # from = paste0(dir_file, "/", file), - # to = paste0(dir_file, "/", prefix, "_", month, "-", year, file_ext) - # ) - - if (!dir.exists(dir)) dir.create(dir) - - file.copy( - overwrite = TRUE, - from = paste0(dir_file, "/", file), - to = paste0(dir, "/", prefix, "_", i$mes, "-", i$ano, file_ext) - ) - - } - - get_html <- xml2::read_html(httr::GET(url, httr::user_agent("httr"))) - nodes <- get_html %>% rvest::html_nodes("p > a") - - tibble::tibble( - txt = nodes %>% rvest::html_text(), - href = nodes %>% rvest::html_attr("href") - ) %>% - dplyr::filter(stringr::str_ends(href, "xls|xlsx|rar|zip")) %>% - dplyr::mutate( - mes_name = stringr::str_match(href, regex(stringr::str_c(names(months), collapse = "|"))) %>% as.vector(), - ano = stringr::str_match(href, "\\d{4}") %>% as.vector() %>% as.numeric(), - mes = months[mes_name], - filetype = stringr::str_match(href, "[a-z]+$") %>% as.vector() - ) %>% - dplyr::filter( - stringr::str_detect(txt, regex(key, ignore_case = TRUE)), - mes %in% month - ) %>% - purrr::transpose() %>% - purrr::walk(~download_file(.x)) -} - -download_frota(year = 2013, month = 1, tempdir = 'p') diff --git a/br_denatran_frota/code/download_frota.py b/br_denatran_frota/code/download_frota.py deleted file mode 100644 index ff4b771f3..000000000 --- a/br_denatran_frota/code/download_frota.py +++ /dev/null @@ -1,52 +0,0 @@ -# -*- coding: utf-8 -*- -import os -import glob -from urllib.request import urlopen, urlretrieve -from zipfile import ZipFile -from br_denatran_frota.code.constants import MONTHS, DATASET -from br_denatran_frota.code.utils import make_dir_when_not_exists, download_post_2012 - - -def download_frota(month: int, year: int, temp_dir: str = ""): - """Função principal para baixar os dados de frota por município e tipo e também por UF e tipo. - - Args: - month (int): Mês desejado. - year (int): Ano desejado. - - Raises: - ValueError: Errors if the month is not a valid one. - """ - if month not in MONTHS.values(): - raise ValueError("Mês inválido.") - - dir_list = glob.glob(f"**/{DATASET}", recursive=True) - # Get the directory where this Python file is located - initial_dir = os.path.dirname(os.path.abspath(__file__)) - if temp_dir: - os.chdir(temp_dir) - # Construct the path to the "files" directory relative to this directory - files_dir = os.path.join(os.getcwd(), "files") - if dir_list: - # I always want to be in the actual folder for this dataset, because I might start in the pipelines full repo: - os.chdir(dir_list[0]) - - # I always need a files directory inside my dataset folder. - make_dir_when_not_exists(files_dir) - # I should always switch to the files dir now and save stuff inside it. - os.chdir(files_dir) - year_dir_name = f"{year}" - - # Create dir for that specific year should it be necessary. - make_dir_when_not_exists(year_dir_name) - os.chdir(year_dir_name) - if year > 2012: - download_post_2012(month, year) - else: - url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-senatran/estatisticas/renavam/{year}/frota{'_' if year > 2008 else ''}{year}.zip" - - generic_zip_filename = f"geral_{year}.zip" - urlretrieve(url, generic_zip_filename) - with ZipFile(generic_zip_filename) as zip_file: - zip_file.extractall() - os.chdir(initial_dir) diff --git a/br_denatran_frota/code/download_frota_old.R b/br_denatran_frota/code/download_frota_old.R deleted file mode 100644 index fa3b4b45f..000000000 --- a/br_denatran_frota/code/download_frota_old.R +++ /dev/null @@ -1,106 +0,0 @@ -library(archive) # -library(stringr) -library(stringi) - -download_frota_old <- function(key = NULL, prefix = NULL, year, tempdir = tempdir(), dir = getwd()) { - - if (year > 2012) { - stop("Utilize download_frota()") - } - - mi_url <- paste0( - "https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-denatran/estatisticas/renavam/", - year, - "/frota", - ifelse(year > 2008, "_", ""), - year, - ".zip" - ) - - if (!dir.exists(tempdir)) dir.create(tempdir, recursive = T) - if (!dir.exists(dir)) dir.create(dir, recursive = T) - - dir_temp <- paste0(tempdir, "/", "frota__", year) - path_file <- paste0(dir_temp, ".zip") - - if (!file.exists(path_file)) { - tryCatch( - utils::download.file( - url = mi_url, - destfile = path_file - ), - error = function(e) { - if (file.exists(path_file)) { - file.remove(path_file) - } - } - ) - - utils::unzip( - path_file, - exdir = paste0(tempdir, "/", "frota__", year) - ) - } - - months <- c( - "jan" = 1, - "fev" = 2, - "mar" = 3, - "abr" = 4, - "mai" = 5, - "jun" = 6, - "jul" = 7, - "ago" = 8, - "set" = 9, - "out" = 10, - "nov" = 11, - "dez" = 12 - ) - - list.files(path = dir_temp, full.names = T, recursive = T) %>% - purrr::walk(function(i) { - if (stringr::str_ends(i, ".zip")) { - utils::unzip(i, exdir = paste0(dirname(i), "/")) - } - }) - - list.files(path = dir_temp, full.names = T, recursive = T) %>% - purrr::walk(function(i) { - - get_by <- list( - regiao = "(frota tipo uf)|(frota uf)|(frota regiao uf)|(frota regiao tipo uf)", - municipio = "(frota munic)|(frota mun)" - ) - - new_name <- basename(i) %>% - stringi::stri_trans_general(id = "Latin-ASCII; lower") %>% - stringr::str_replace("regi�es", "regiao") %>% - stringr::str_replace_all("\\s+", "_") %>% - stringr::str_replace_all("_|-", " ") %>% - stringr::str_replace("^(\\d\\_|\\d)+", "") %>% - stringr::str_replace_all("internet|^\\s", "") - - # Match jan|fev|... or number of month (two digits) - get_month <- stringr::str_match( - new_name, - regex(paste0(stringr::str_c(names(months), collapse = "|"), "|\\d{2}(?=\\d{4})"), ignore_case = T) - ) - - month_i <- ifelse( - stringr::str_count(get_month) == 2, - as.numeric(get_month), - months[get_month] - ) - - file_ext <- stringr::str_extract(new_name, ".[a-zA-Z0-9]+$") - - if (stringr::str_detect(new_name, regex(get_by[[key]], ignore_case = T)) & - stringr::str_ends(new_name, "(xls|xlsx)$")) { - # print(paste0(paste0(dir, "/", prefix, "-", month_i, "-", year, file_ext), "--", i)) - file.copy( - from = i, - to = paste0(dir, "/", prefix, "_", month_i, "-", year, file_ext) - ) - } - }) -} \ No newline at end of file diff --git a/br_denatran_frota/code/frota_municipio_tipo.R b/br_denatran_frota/code/frota_municipio_tipo.R deleted file mode 100644 index 837c9a22e..000000000 --- a/br_denatran_frota/code/frota_municipio_tipo.R +++ /dev/null @@ -1,137 +0,0 @@ -library(janitor) -library(lubridate) -library(xlsx) # -library(readxl) -library(dplyr) -library(tidyr) -library(magrittr) -library(purrr) -library(readr) -library(stringr) -library(stringdist) - -source("code/download_frota.R") -source("code/download_frota_old.R") -source("code/utils.R") - -PATH_TEMP <- paste0(getwd(), "/tmp") -PATH_DOWNLOAD_MUN <- paste0(getwd(), "/input/frota_municipio_tipo") -PREFIX_FROTA_MUN <- "frota_mun_tipo" - -# Download da frota de 2004 a 2012 por municipio -2003:2012 %>% purrr::walk( - ~download_frota_old( - key = "municipio", - prefix = PREFIX_FROTA_MUN, - year = .x, - tempdir = PATH_TEMP, - dir = PATH_DOWNLOAD_MUN - ) -) - -2014:2020 %>% purrr::walk( - ~download_frota( - key = "Frota por Munic", - prefix = PREFIX_FROTA_MUN, - month = 1:12, - year = .x, - tempdir = PATH_TEMP, - dir = PATH_DOWNLOAD_MUN - ) -) - -2021 %>% purrr::walk( - ~download_frota( - key = "Frota por Munic", - prefix = PREFIX_FROTA_MUN, - month = 1:3, - year = .x, - tempdir = PATH_TEMP, - dir = PATH_DOWNLOAD_MUN - ) -) - -list.files(PATH_DOWNLOAD_MUN, full.names = T) %>% - purrr::map( - ~read_xl(.x, type = "uf") %>% - dplyr::select(!total) %>% - dplyr::rename(sigla_uf = uf, municipio_original = municipio) %>% - dplyr::filter(sigla_uf %in% names(siglas_uf)) %>% - dplyr::mutate( - dplyr::across(!c(sigla_uf, municipio_original), as.numeric), - id_municipio = purrr::map2_chr(sigla_uf, municipio_original, ~get_ibge_info(.x, .y)) - ) %>% - dplyr::relocate(c(id_municipio, ano, mes), .after = municipio_original) - ) -> frota_municipios - - -# Cada tibble deve ter 28 colunas -frota_municipios %>% purrr::map_lgl(~ncol(.x) == 26) %>% all(T) - -# Unnest a lista de tibbles, padroniza as colunas, soma e salva como csv e rds -frota_municipios %>% - purrr::map_dfr(~tidyr::unnest(.)) %>% - dplyr::mutate( - chassiplataforma = na.omit( - dplyr::c_across(dplyr::any_of(c("chassiplataforma", "chassiplatafaforma", "chassiplataf"))) - )[1], - tratoresteira = na.omit( - dplyr::c_across(dplyr::any_of(c("tratoresteira", "tratorestei"))) - )[1] - ) %>% - dplyr::select(-dplyr::any_of(c("chassiplatafaforma", "chassiplataf", "tratorestei"))) %>% - dplyr::mutate( - total = rowSums(dplyr::across(automovel:chassiplataforma)) - ) -> df_municipios - -# Filter municipios que não foram encontrados na tabela do IBGE -df_municipios %>% - filter(is.na(id_municipio)) %>% - group_by(municipio_original, sigla_uf) %>% - summarise() - -## Fix nome dos municipios -# ASSU, RN -> AÇU, 2400208 -# BOA SAUDE, RN -> Januário Cicco, 2405306 -# BOM JESUS, GO -> Bom Jesus de Goiás, 5203500 -# EMBU, SP -> Embu das Artes, "3515004" -# ITABIRINHA DE MANTENA, MG -> Itabirinha, 3131802 -# ITAMARACA, PE -> Ilha de Itamaracá, "2607604" -# JAMARI, RO -> Candeias do Jamari, "1100809" -# LIVRAMENTO DO BRUMADO, BA -> Livramento de Nossa Senhora, "2919504" -# SANTA ROSA, AC -> Santa Rosa do Purus, "1200435" -# SAO BENTO DE POMBAL, PB -> São Bentinho, "2513927" -# VILA ALTA, PR -> Alto Paraíso, "4128625" -# VILA NOVA DO MAMORE, RO -> Nova Mamoré, "1100338" - -df_municipios %>% - dplyr::mutate( - id_municipio = - dplyr::case_when( - municipio_original == "ASSU" & sigla_uf == "RN" ~ "2400208", - municipio_original == "BOA SAUDE" & sigla_uf == "RN" ~ "2405306", - municipio_original == "BOM JESUS" & sigla_uf == "GO" ~ "5203500", - municipio_original == "EMBU" & sigla_uf == "SP" ~ "3515004", - municipio_original == "ITABIRINHA DE MANTENA" & sigla_uf == "MG" ~ "3131802", - municipio_original == "ITAMARACA" & sigla_uf == "PE" ~ "2607604", - municipio_original == "JAMARI" & sigla_uf == "RO" ~ "1100809", - municipio_original == "LIVRAMENTO DO BRUMADO" & sigla_uf == "BA" ~ "2919504", - municipio_original == "SANTA ROSA" & sigla_uf == "AC" ~ "1200435", - municipio_original == "SAO BENTO DE POMBAL" & sigla_uf == "PB" ~ "2513927", - municipio_original == "VILA ALTA" & sigla_uf == "PR" ~ "4128625", - municipio_original == "VILA NOVA DO MAMORE" & sigla_uf == "RO" ~ "1100338", - TRUE ~ id_municipio - ) - ) -> frota_municipios_dist - - -frota_municipios_dist %>% - filter(is.na(id_municipio)) %>% - group_by(municipio_original, sigla_uf) %>% - summarise() - -frota_municipios_dist %>% - dplyr::filter(!is.na(id_municipio)) %>% - dplyr::select(!municipio_original) %>% - readr::write_rds(file = "output/municipio_tipo.rds") %T>% - readr::write_csv(file = "output/municipio_tipo.csv") \ No newline at end of file diff --git a/br_denatran_frota/code/frota_municipio_tipo.py b/br_denatran_frota/code/frota_municipio_tipo.py deleted file mode 100644 index 3406559f1..000000000 --- a/br_denatran_frota/code/frota_municipio_tipo.py +++ /dev/null @@ -1,72 +0,0 @@ -# -*- coding: utf-8 -*- -import polars as pl -import pandas as pd -from string_utils import asciify -import os -from br_denatran_frota.code.utils import ( - change_df_header, - fix_suggested_nome_ibge, - guess_header, - get_city_name_ibge, - match_ibge, - verify_total, -) -from br_denatran_frota.code.constants import DICT_UFS, SUBSTITUTIONS -import basedosdados as bd - - -def verify_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str) -> None: - denatran_uf = denatran_df.filter(pl.col("sigla_uf") == uf) - ibge_uf = ibge_df.filter(pl.col("sigla_uf") == uf) - ibge_uf = ibge_uf.with_columns(pl.col("nome").apply(asciify).str.to_lowercase()) - municipios_na_bd = ibge_uf["nome"].to_list() - x = denatran_uf["nome_denatran"].apply(lambda x: get_city_name_ibge(x, ibge_uf)) - denatran_uf = denatran_uf.with_columns(x.alias("suggested_nome_ibge")) - denatran_uf = denatran_uf.with_columns( - denatran_uf.apply(fix_suggested_nome_ibge)["apply"].alias("suggested_nome_ibge") - ) - municipios_no_denatran = denatran_uf["suggested_nome_ibge"].to_list() - d = set(municipios_no_denatran) - set(municipios_na_bd) - municipios_duplicados = ( - denatran_uf.groupby("suggested_nome_ibge").count().filter(pl.col("count") > 1) - ) - if not municipios_duplicados.is_empty(): - raise ValueError( - f"Existem municípios com mesmo nome do IBGE em {uf}! São eles {municipios_duplicados['suggested_nome_ibge'].to_list()}" - ) - if d: - # This here is probably impossible and shouldn't happen due to the matching coming from the BD data. - # The set difference might occur the other way around, but still, better safe. - raise ValueError(f"Existem municípios em {uf} que não estão na BD.") - match_ibge(denatran_uf, ibge_uf) - - -def treat_municipio_tipo(file: str): - municipios_query = """SELECT nome, id_municipio, sigla_uf FROM `basedosdados.br_bd_diretorios_brasil.municipio` - """ - bd_municipios = bd.read_sql( - municipios_query, "tamir-pipelines" - ) # Hardcoded, not good. - bd_municipios = pl.from_pandas(bd_municipios) - - # filename = os.path.split(file)[1] - df = pd.read_excel(file) - new_df = change_df_header(df, guess_header(df)) - new_df.rename( - columns={new_df.columns[0]: "sigla_uf", new_df.columns[1]: "nome_denatran"}, - inplace=True, - ) # Rename for ease of use. - new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace. - new_df = pl.from_pandas(new_df) - new_df = new_df.with_columns( - pl.col("nome_denatran").apply(asciify).str.to_lowercase() - ) - new_df = new_df.filter(pl.col("nome_denatran") != "municipio nao informado") - if new_df.shape[0] > bd_municipios.shape[0]: - raise ValueError( - f"Atenção: a base do Denatran tem {new_df.shape[0]} linhas e isso é mais municípios do que a BD com {bd_municipios.shape[0]}" - ) - verify_total(new_df) - for uf in DICT_UFS: - verify_uf(new_df, bd_municipios, uf) - return new_df diff --git a/br_denatran_frota/code/frota_uf_tipo.R b/br_denatran_frota/code/frota_uf_tipo.R deleted file mode 100644 index d46624c48..000000000 --- a/br_denatran_frota/code/frota_uf_tipo.R +++ /dev/null @@ -1,97 +0,0 @@ -library(janitor) -library(lubridate) -library(xlsx) # -library(readxl) -library(dplyr) -library(tidyr) -library(stringr) -library(magrittr) -library(purrr) -library(readr) -library(stringdist) - -source("code/download_frota.R") -source("code/download_frota_old.R") -source("code/utils.R") - -PATH_TEMP <- paste0(getwd(), "/tmp") -PATH_DOWNLOAD_REG <- paste0(getwd(), "/input/frota_regiao_tipo") - -PREFIX_FROTA_REG <- "frota_regiao_tipo" - -# Download da frota por regiao de 2003 a 2012 -2003:2012 %>% purrr::walk( - ~download_frota_old( - key = "regiao", - prefix = PREFIX_FROTA_REG, - year = .x, - tempdir = PATH_TEMP, - dir = PATH_DOWNLOAD_REG - ) -) - -# Download da frota por regiao e tipo em 2013 -## Demais meses de agosto a key é "Frota por Tipo" -2013 %>% - purrr::walk(~download_frota( - key = "Frota por tipo", - prefix = PREFIX_FROTA_REG, - month = c(1:7, 10:12), - year = .x, - tempdir = PATH_TEMP, - dir = PATH_DOWNLOAD_REG - )) - -## Agosto e setembro de 2013 a key é "Frota por Região" -2013 %>% - purrr::walk(~download_frota( - key = "Frota por Região", - prefix = PREFIX_FROTA_REG, - month = 8:9, - year = .x, - tempdir = PATH_TEMP, - dir = PATH_DOWNLOAD_REG - )) - - -# Download da frota de 2014 a 2020 por região e tipo veículo -2014:2020 %>% purrr::walk(~download_frota( - key = "Frota por UF e Tipo", - prefix = PREFIX_FROTA_REG, - month = 1:12, - year = .x, - tempdir = PATH_TEMP, - dir = PATH_DOWNLOAD_REG -)) - - -2021 %>% purrr::walk(~download_frota( - key = "Frota por UF e Tipo", - prefix = PREFIX_FROTA_REG, - month = 1:12, - year = .x, - tempdir = PATH_TEMP, - dir = PATH_DOWNLOAD_REG -)) - -list.files(PATH_DOWNLOAD_REG, full.names = T) %>% - purrr::map( - ~read_xl(.x, type = "grandes reg|uf") %>% - dplyr::rename("sigla_uf" = 1) %>% - dplyr::filter(sigla_uf %in% unname(siglas_uf)) %>% - dplyr::select(sigla_uf, ano, mes, automovel:utilitario) %>% - dplyr::rowwise() %>% - dplyr::mutate( - dplyr::across(!c(sigla_uf), as.numeric), - sigla_uf = sigla_uf %>% stringr::str_trim() %>% get_sigla_uf(), - total = rowSums(across(automovel:utilitario)) - ) - ) -> frota_regiao - -# Cada tibble deve ter 25 colunas e 27 linhas -frota_regiao %>% purrr::map_lgl(~ncol(.x) == 25 & nrow(.x) == 27) %>% all(T) - -frota_regiao %>% - purrr::map_dfr(~tidyr::unnest(.)) %>% - readr::write_csv(file = "output/uf_tipo.csv") %T>% - readr::write_rds(file = "output/uf_tipo.rds") \ No newline at end of file diff --git a/br_denatran_frota/code/frota_uf_tipo.py b/br_denatran_frota/code/frota_uf_tipo.py deleted file mode 100644 index 05d3aacf2..000000000 --- a/br_denatran_frota/code/frota_uf_tipo.py +++ /dev/null @@ -1,70 +0,0 @@ -# -*- coding: utf-8 -*- -import polars as pl -import pandas as pd -import os -from br_denatran_frota.code.utils import ( - guess_header, - change_df_header, - get_year_month_from_filename, - verify_total, -) - - -DICT_UFS = { - "AC": "Acre", - "AL": "Alagoas", - "AP": "Amapá", - "AM": "Amazonas", - "BA": "Bahia", - "CE": "Ceará", - "DF": "Distrito Federal", - "ES": "Espírito Santo", - "GO": "Goiás", - "MA": "Maranhão", - "MT": "Mato Grosso", - "MS": "Mato Grosso do Sul", - "MG": "Minas Gerais", - "PA": "Pará", - "PB": "Paraíba", - "PR": "Paraná", - "PE": "Pernambuco", - "PI": "Piauí", - "RJ": "Rio de Janeiro", - "RN": "Rio Grande do Norte", - "RS": "Rio Grande do Sul", - "RO": "Rondônia", - "RR": "Roraima", - "SC": "Santa Catarina", - "SP": "São Paulo", - "SE": "Sergipe", - "TO": "Tocantins", -} - - -def treat_uf_tipo(file) -> pl.DataFrame: - filename = os.path.split(file)[1] - df = pd.read_excel(file) - new_df = change_df_header(df, guess_header(df)) - # This is ad hoc for UF_tipo. - new_df.rename( - columns={new_df.columns[0]: "sigla_uf"}, inplace=True - ) # Rename for ease of use. - new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace. - clean_df = new_df[new_df.sigla_uf.isin(DICT_UFS.values())].reset_index( - drop=True - ) # Now we get all the actual RELEVANT uf data. - month, year = get_year_month_from_filename(filename) - clean_pl_df = pl.from_pandas(clean_df).lazy() - verify_total(clean_pl_df.collect()) - # Add year and month - clean_pl_df = clean_pl_df.with_columns( - pl.lit(year, dtype=pl.Int64).alias("ano"), - pl.lit(month, dtype=pl.Int64).alias("mes"), - ) - clean_pl_df = clean_pl_df.select(pl.exclude("TOTAL")) - clean_pl_df = clean_pl_df.melt( - id_vars=["ano", "mes", "sigla_uf"], - variable_name="tipo_veiculo", - value_name="quantidade", - ) # Long format. - return clean_pl_df.collect() diff --git a/br_denatran_frota/code/setup.py b/br_denatran_frota/code/setup.py deleted file mode 100644 index 6cd60597a..000000000 --- a/br_denatran_frota/code/setup.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -from setuptools import setup - -setup( - name="download_frota", - version="1.0", - py_modules=["download_frota"], - install_requires=[ - "beautifulsoup4", - "rarfile", - ], -) diff --git a/br_denatran_frota/code/test/download_frota_integration_test.py b/br_denatran_frota/code/test/download_frota_integration_test.py deleted file mode 100644 index 844cd2cc0..000000000 --- a/br_denatran_frota/code/test/download_frota_integration_test.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -import os -import shutil -import tempfile -import unittest -import glob -import contextlib -from parameterized import parameterized -from br_denatran_frota.code.download_frota import ( - DATASET, - MONTHS, - download_frota, -) - - -def custom_name_func(testcase_func, param_num, param): - return "%s_%s" % ( - testcase_func.__name__, - parameterized.to_safe_name("_".join(str(x) for x in param.args)), - ) - - -class TestAllPossibleYears(unittest.TestCase): - def setUp(self): - file_dir = os.path.dirname(os.path.abspath(__file__)) - os.chdir(file_dir) - dataset_dir = os.path.join(file_dir, "..", "..") - self.temp_dir = tempfile.TemporaryDirectory(dir=dataset_dir) - - def tearDown(self): - print("Deleting temporary directory") - shutil.rmtree(self.temp_dir.name) - - @parameterized.expand( - [(month, year) for year in range(2021, 2022) for month in range(1, 3)], - name_func=custom_name_func, - ) - def test_download_post_2012(self, month, year): - download_frota(month, year, self.temp_dir.name) - expected_files = { - f"frota_por_uf_e_tipo_de_veículo_{month}-{year}", - f"frota_por_município_e_tipo_{month}-{year}", - } - list_of_files = os.listdir(os.path.join(self.temp_dir.name, "files", f"{year}")) - files = set(os.path.splitext(file)[0] for file in list_of_files) - self.assertEqual(files, expected_files) - - -if __name__ == "__main__": - unittest.main() diff --git a/br_denatran_frota/code/test_drive.ipynb b/br_denatran_frota/code/test_drive.ipynb deleted file mode 100644 index 6a367de1b..000000000 --- a/br_denatran_frota/code/test_drive.ipynb +++ /dev/null @@ -1,312 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "import polars as pl\n", - "import pandas as pd \n", - "import os\n", - "import re\n", - "import glob\n", - "from urllib.request import urlopen, urlretrieve\n", - "from zipfile import ZipFile\n", - "from rarfile import RarFile\n", - "from bs4 import BeautifulSoup\n", - "import difflib\n", - "from br_denatran_frota.code.utils import *\n", - "from br_denatran_frota.code.constants import DICT_UFS, SUBSTITUTIONS" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "#treat_uf_tipo('../files/2022/frota_por_uf_e_tipo_de_veículo_2-2022.xls')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from download_frota import download_frota" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Download of frota_por_uf_e_tipo_de_veículo_2-2022.xls complete\n", - "Download of frota_por_município_e_tipo_2-2022.xls complete\n" - ] - } - ], - "source": [ - "download_frota(2, 2022)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/tamir/.cache/pypoetry/virtualenvs/pipelines-Fyk5jlG0-py3.10/lib/python3.10/site-packages/requests/__init__.py:102: RequestsDependencyWarning: urllib3 (1.26.7) or chardet (5.1.0)/charset_normalizer (2.0.8) doesn't match a supported version!\n", - " warnings.warn(\"urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported \"\n", - "Downloading: 100%|██████████| 5570/5570 [00:00<00:00, 8581.01rows/s]\n" - ] - } - ], - "source": [ - "import basedosdados as bd \n", - "municipios_query = \"\"\"SELECT nome, id_municipio, sigla_uf FROM `basedosdados.br_bd_diretorios_brasil.municipio`\n", - "\"\"\"\n", - "bd_municipios = bd.read_sql(municipios_query, 'tamir-pipelines')\n", - "bd_municipios = pl.from_pandas(bd_municipios)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "file = '../files/2022/frota_por_município_e_tipo_2-2022.xls'\n", - "filename = os.path.split(file)[1]\n", - "df = pd.read_excel(file)\n", - "new_df = change_df_header(df, guess_header(df))\n", - "new_df.rename(columns={ new_df.columns[0]: \"sigla_uf\" , new_df.columns[1]: 'nome_denatran'}, inplace= True) # Rename for ease of use.\n", - "new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace.\n", - "new_df = pl.from_pandas(new_df)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "new_df = new_df.with_columns(new_df.apply(fix_suggested_nome_ibge)['apply'].alias('suggested_nome_ibge'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# for uf in DICT_UFS:\n", - "denatran_uf = new_df.filter(pl.col('sigla_uf') == uf)\n", - "ibge_uf = bd_municipios.filter(pl.col('sigla_uf') == uf)\n", - "ibge_uf = ibge_uf.with_columns(pl.col('nome').str.to_lowercase())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "x = denatran_uf['nome_denatran'].apply(get_city_name_ibge)\n", - "denatran_uf = denatran_uf.with_columns(x.alias('suggested_nome_ibge'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'denatran_uf' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[4], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m match_ibge(denatran_uf, ibge_uf)\n", - "\u001b[0;31mNameError\u001b[0m: name 'denatran_uf' is not defined" - ] - } - ], - "source": [ - "match_ibge(denatran_uf, ibge_uf)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nomes = ibge_uf['nome'].to_list()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "joined_df = denatran_uf.join(ibge_uf, left_on=['suggested_nome_ibge', 'sigla_uf'], right_on=['nome', 'sigla_uf'], how='left')\n", - "\n", - "mismatched = joined_df.filter(pl.col('id_municipio').is_null())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "

\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
sigla_ufnome_denatranTOTALAUTOMOVELBONDECAMINHAOCAMINHAO TRATORCAMINHONETECAMIONETACHASSI PLATAF...QUADRICICLOREBOQUESEMI-REBOQUESIDE-CAROUTROSTRATOR ESTEITRATOR RODASTRICICLOUTILITARIOsuggested_nome_ibge
11RNASSU26667840009605716683220...0219970970012186açu
\n", - "

1 rows × 25 columns

\n", - "
" - ], - "text/plain": [ - " sigla_uf nome_denatran TOTAL AUTOMOVEL BONDE CAMINHAO CAMINHAO TRATOR \\\n", - "11 RN ASSU 26667 8400 0 960 57 \n", - "\n", - " CAMINHONETE CAMIONETA CHASSI PLATAF ... QUADRICICLO REBOQUE \\\n", - "11 1668 322 0 ... 0 219 \n", - "\n", - " SEMI-REBOQUE SIDE-CAR OUTROS TRATOR ESTEI TRATOR RODAS TRICICLO \\\n", - "11 97 0 97 0 0 12 \n", - "\n", - " UTILITARIO suggested_nome_ibge \n", - "11 186 açu \n", - "\n", - "[1 rows x 25 columns]" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "zdf.loc[zdf['nome_denatran'] == 'ASSU']" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pipelines-Fyk5jlG0-py3.10", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.6" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/br_denatran_frota/code/utils.R b/br_denatran_frota/code/utils.R deleted file mode 100644 index e26c381ec..000000000 --- a/br_denatran_frota/code/utils.R +++ /dev/null @@ -1,207 +0,0 @@ -find_sheet <- function(x, date) { - read_sheet <- tryCatch( - readxl::excel_sheets(x), - error = function(e) { - xlsx::getSheets(xlsx::loadWorkbook(x)) %>% names() - } - ) - - sheet_names <- read_sheet %>% - stringr::str_subset(., "^(?!.*Glossário).*$") - - if (length(sheet_names) == 1) { - sheet_names[[1]] - } else { - month_name <- lubridate::month(date, label = T) - - query_sheet <- stringr::str_subset( - sheet_names, - regex(paste0("\\d{2}(?=\\d{4}$)", "|", month_name), ignore_case = T) - ) - - if (length(query_sheet) == 0) { - return(sheet_names[[1]]) - } - - if (length(query_sheet) > 1) { - # Exceções - if (date == "01-04-2010") { - return(query_sheet[[1]]) - } - stop(paste(date, ", more than one sheet found")) - } - query_sheet - } -} - -row_of_header <- function(x, key_of_header) { - # Return number of row than is the header of tibble - # x is vector of first colunm - # key_of_header is string - match <- stringr::str_subset(x, stringr::regex(key_of_header, ignore_case = T)) - result <- which(x == match) - - if (length(result) == 0) { - return(0) - } - - if (length(result) > 1) { - result[2] - } else { - result - } -} - -set_header <- function(x, key_of_header) { - number_of_header <- row_of_header(x[[1]], key_of_header) - if (number_of_header == 0) { - return(x) - } - janitor::row_to_names(x, row_number = number_of_header) -} - -# Some xls file can't be read by readxl package using read_xls() function, see this issue -read_old_xls <- function(x, date) { - sheet_name <- find_sheet(x, date) - start_row <- 1 - - while (start_row <= 5) { - result <- try( - xlsx::read.xlsx2( - x, - sheetName = sheet_name, - startRow = start_row, - endRow = 10 - ), - silent = T - ) - # Number of column can be more than 23 - if (!is.null(result) && ncol(result) >= 23 && class(result) != "try-error") { - break - } - start_row <- start_row + 1 - } - xlsx::read.xlsx2(x, sheetName = sheet_name, startRow = start_row) %>% - tibble::as_tibble() -} - -read_xl <- function(x, type) { - date <- stringr::str_match(x, "\\d{1,2}-\\d{4}") %>% - paste0("01-", .) %>% - lubridate::dmy() - - read <- function(pl) { - tryCatch( - readxl::read_excel(pl, sheet = find_sheet(pl, date)), - error = function(e) read_old_xls(x, date) - ) - } - - read(x) %>% - set_header(., key_of_header = type) %>% - janitor::clean_names() %>% - dplyr::rename_with(.fn = function(x) stringr::str_replace(x, pattern = "_|\\.|-", replacement = "")) %>% - dplyr::select(!starts_with("na")) %>% - dplyr::mutate( - ano = lubridate::year(date), - mes = lubridate::month(date) - ) -} - -# Tabela com os id dos estados e municipios -download_utils_files <- function() { - if (!dir.exists("input")) dir.create("input/ibge_cods", recursive = T) - utils::download.file( - url = "ftp://geoftp.ibge.gov.br/organizacao_do_territorio/estrutura_territorial/divisao_territorial/2018/DTB_2018.zip", - destfile = paste0("input/ibge_cods/ibge_cods.zip") - ) - utils::unzip("input/ibge_cods/ibge_cods.zip", exdir = paste0("input/ibge_cods/")) -} - -download_utils_files() - -ibge_ids <- readxl::read_excel("input/ibge_cods/RELATORIO_DTB_BRASIL_DISTRITO.xls") %>% - janitor::clean_names() - -ufs <- ibge_ids %>% - dplyr::group_by(nome_uf, uf) %>% - dplyr::summarise() %>% - dplyr::ungroup() %>% - dplyr::mutate(uf = as.numeric(uf)) %>% - dplyr::rename(id_uf = uf) - -municipios <- ibge_ids %>% - dplyr::group_by( - uf, - nome_uf, - codigo_municipio_completo, - nome_municipio - ) %>% - dplyr::summarise() %>% - dplyr::mutate( - name_upper = stringi::stri_trans_general(nome_municipio, id = "Latin-ASCII; upper"), - codigo_municipio_completo = as.numeric(codigo_municipio_completo), - uf = as.numeric(uf) - ) %>% - dplyr::ungroup() %>% - dplyr::rename( - id_uf = uf, - uf = nome_uf, - id_municipio = codigo_municipio_completo, - municipio = nome_municipio - ) - -siglas_uf <- c( - "AC" = "Acre", - "AL" = "Alagoas", - "AP" = "Amapá", - "AM" = "Amazonas", - "BA" = "Bahia", - "CE" = "Ceará", - "DF" = "Distrito Federal", - "ES" = "Espírito Santo", - "GO" = "Goiás", - "MA" = "Maranhão", - "MT" = "Mato Grosso", - "MS" = "Mato Grosso do Sul", - "MG" = "Minas Gerais", - "PA" = "Pará", - "PB" = "Paraíba", - "PR" = "Paraná", - "PE" = "Pernambuco", - "PI" = "Piauí", - "RJ" = "Rio de Janeiro", - "RN" = "Rio Grande do Norte", - "RS" = "Rio Grande do Sul", - "RO" = "Rondônia", - "RR" = "Roraima", - "SC" = "Santa Catarina", - "SP" = "São Paulo", - "SE" = "Sergipe", - "TO" = "Tocantins" -) - -get_ibge_info <- function(uf, name, tolerance = 0.60) { - state <- siglas_uf[uf] - result <- municipios %>% - dplyr::filter(uf == state) %>% - dplyr::mutate(dist = stringdist::stringsim(name_upper, name)) %>% - dplyr::arrange(dplyr::desc(dist)) %>% - dplyr::slice(1L) %>% - as.list() - - if (length(result[[1]]) == 0 || result$dist < tolerance) { - return(NA) - } - as.character(result$id_municipio) -} - -get_uf_name <- function(x) { - if (nchar(x) != 2) return(x) - unname(siglas_uf[x]) -} - -get_sigla_uf <- function(uf_name) { - purrr::keep(siglas_uf, ~.x == uf_name) %>% - names() -} diff --git a/br_denatran_frota/code/utils.py b/br_denatran_frota/code/utils.py deleted file mode 100644 index 9c961c375..000000000 --- a/br_denatran_frota/code/utils.py +++ /dev/null @@ -1,276 +0,0 @@ -# -*- coding: utf-8 -*- -import pandas as pd -import polars as pl -import difflib -import re -import os -from zipfile import ZipFile -from br_denatran_frota.code.constants import ( - DICT_UFS, - SUBSTITUTIONS, - HEADERS, - DATASET, - MONTHS, -) -import requests -from urllib.request import urlopen, urlretrieve -from bs4 import BeautifulSoup - - -def guess_header(df: pd.DataFrame, max_header_guess: int = 4) -> int: - """Function to deal with problematic dataframes coming from Excel/CSV files. - Tries to guess which row is the header by examining the first few rows (max given by max_header_guess). - Assumes that the header is the first row where all of the columns are strings. - This will NOT properly work for a strings only dataframe and will always guess the first row for it. - - Args: - df (pd.DataFrame): Dataframe whose header we don't know. - max_header_guess (int, optional): Number of initial rows we want to check. Defaults to 4. - - Returns: - int: Index of the row where the header is contained. - """ - header_guess = 0 - while header_guess < max_header_guess: - if len(df) - 1 < header_guess: - break - # Iffy logic, but essentially: if all rows of the column are strings, then this is a good candidate for a header. - if all(df.iloc[header_guess].apply(lambda x: isinstance(x, str))): - return header_guess - - header_guess += 1 - return 0 # If nothing is ever found until the max, let's just assume it's the first row as per usual. - - -def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame: - """Changes the dataframe's header to a row inside of it and returns the corrected df. - Ideally, to be used in conjunction with guess_header(). - Args: - df (pd.DataFrame): Dataframe whose header we want changed. - header_row (int): Index of the row where the header is located. - - Returns: - pd.DataFrame: Returns the same dataframe but with the corrected header - """ - new_header = df.iloc[header_row] - new_df = df[(header_row + 1) :].reset_index(drop=True) - new_df.rename(columns=new_header, inplace=True) - return new_df - - -def get_year_month_from_filename(filename: str) -> tuple[int, int]: - """Helper to extract month and year information from files named indicator_month-year.xls - - Args: - filename (str): Name of the file. - - Raises: - ValueError: Errors out if nothing is found, which likely means the filename is not the correct format. - - Returns: - tuple[int, int]: Month, year. - """ - match = re.search(r"(\w+)_(\d{1,2})-(\d{4})\.(xls|xlsx)$", filename) - if match: - month = match.group(2) - year = match.group(3) - return month, year - else: - raise ValueError("No match found") - - -def verify_total(df: pl.DataFrame) -> None: - """Helper function that is meant to act as a guard to guarantee that we can pivot from wide to long. - Essentially, gets a Wide dataframe, excludes all string columns and the TOTAL column and sums it all row wise. - Then verifies if the calculated total column is the same as the TOTAL column. - If not, raises an error. - - Args: - df (pl.DataFrame): Wide format dataframe to verify. - - Raises: - ValueError: Errors out if the sum of the columns is actually different than the total. - """ - columns_for_total = df.select(pl.exclude("TOTAL")).select(pl.exclude([pl.Utf8])) - calculated_total = columns_for_total.select( - pl.fold( - acc=pl.lit(0), function=lambda acc, x: acc + x, exprs=pl.col("*") - ).alias("calculated_total") - )["calculated_total"] - mask = df["TOTAL"] == calculated_total - if pl.sum(~mask) != 0: - raise ValueError( - "A coluna de TOTAL da base original tem inconsistências e não é igual à soma das demais colunas." - ) - - -def fix_suggested_nome_ibge(row: tuple[str, ...]) -> str: - """Gets a row from a dataframe and applies the SUBSTITUTIONS constant ruleset where applicable. - This fixes the dataframe to have the names of municipalities according to IBGE. - The fixes are necessary because match_ibge() will fail where the DENATRAN data has typos in city names. - - Args: - row (tuple[str, ...]): Row from the full DENATRAN dataframe we want to apply the IBGE substitutions to. - - Raises: - ValueError: Errors out if the desired parts of the row do not conform to the expected format. - - Returns: - str: Returns the suggested IBGE name, either the pre existing or the one in the ruleset for substitutions. - """ - key = (row[0], row[1]) - if (not isinstance(row[0], str)) or (not isinstance(row[1], str)): - raise ValueError("This is not a valid key to be checked.") - if key in SUBSTITUTIONS: - return SUBSTITUTIONS[key] - else: - return row[-1] - - -def match_ibge(denatran_uf: pl.DataFrame, ibge_uf: pl.DataFrame) -> None: - """Takes a dataframe of the Denatran data and an IBGE dataframe of municipalities. - Joins them using the IBGE name of both. The IBGE name of denatran_uf is ideally filled via get_city_name(). - This verifies if there are any municipalities in denatran_uf that have no corresponding municipality in the IBGE database. - These must be manually fixed via the constants file and the fix_suggested_nome function. - Will error out if there are municipalities that have no correspondence whatsover. - Args: - denatran_uf (pl.DataFrame): Dataframe with the DENATRAN data, filtered by state (UF). - ibge_uf (pl.DataFrame): Dataframe with the IBGE municipalities data, filtered by state (UF). - - Raises: - ValueError: Errors if there are municipalities that have not match and outputs them all with the state to enable manual fix. - """ - joined_df = denatran_uf.join( - ibge_uf, - left_on=["suggested_nome_ibge", "sigla_uf"], - right_on=["nome", "sigla_uf"], - how="left", - ) - mismatched_rows = joined_df.filter(pl.col("id_municipio").is_null()) - if len(mismatched_rows) > 0: - error_message = "Os seguintes municípios falharam: \n" - for row in mismatched_rows.rows(named=True): - error_message += f"{row['nome_denatran']} ({row['sigla_uf']})\n" - raise ValueError(error_message) - - -def get_city_name_ibge(denatran_name: str, ibge_uf: pl.DataFrame) -> str: - """Gets the closest match to the denatran name of the municipality in the IBGE dataframe of the same state. - This ibge_uf dataframe is pulled directly from Base dos Dados to ensure correctness. - Returns either the match or an empty string in case no match is found. - - - Args: - denatran_name (str): The name of the municipality according to DENATRAN data. - ibge_uf (pl.DataFrame): Dataframe with the information from municipalities for a certain state (UF). - Returns: - str: Closest match to the denatran name or an empty string if no such match is found. - """ - matches = difflib.get_close_matches( - denatran_name.lower(), ibge_uf["nome"].str.to_lowercase(), n=1 - ) - if matches: - return matches[0] - else: - return "" # I don't want this to error out directly, because then I can get all municipalities. - - -def download_file(url, filename): - # Send a GET request to the URL - - new_url = url.replace("arquivos-denatran", "arquivos-senatran") - response = requests.get(new_url, headers=HEADERS) - # Save the contents of the response to a file - with open(filename, "wb") as f: - f.write(response.content) - - print(f"Download of {filename} complete") - - -def extract_zip(dest_path_file): - with ZipFile(dest_path_file, "r") as z: - z.extractall() - - -def handle_xl(i: dict) -> None: - """Actually downloads and deals with Excel files. - - Args: - i (dict): Dictionary with all the desired downloadable file's info. - """ - dest_path_file = make_filename(i) - download_file(i["href"], dest_path_file) - - -def make_filename(i: dict, ext: bool = True) -> str: - """Creates the filename using the sent dictionary. - - Args: - i (dict): Dictionary with all the file's info. - ext (bool, optional): Specifies if the generated file name needs the filetype at the end. Defaults to True. - - Returns: - str: The full filename. - """ - txt = i["txt"] - mes = i["mes"] - ano = i["ano"] - filetype = i["filetype"] - filename = re.sub("\\s+", "_", txt, flags=re.UNICODE).lower() - filename = f"{filename}_{mes}-{ano}" - if ext: - filename += f".{filetype}" - return filename - - -def call_downloader(i): - filename = make_filename(i) - if i["filetype"] in ["xlsx", "xls"]: - download_file(i["href"], filename) - elif i["filetype"] == "zip": - download_file(i["href"], filename) - extract_zip(filename) - - -def download_post_2012(month: int, year: int): - """_summary_ - - Args: - year (int): _description_ - month (int): _description_ - """ - url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-Senatran/frota-de-veiculos-{year}" - soup = BeautifulSoup(urlopen(url), "html.parser") - # Só queremos os dados de frota nacional. - nodes = soup.select("p:contains('rota por ') > a") - for node in nodes: - txt = node.text - href = node.get("href") - # Pega a parte relevante do arquivo em questão. - match = re.search( - r"(?i)\/([\w-]+)\/(\d{4})\/(\w+)\/([\w-]+)\.(?:xls|xlsx|rar|zip)$", href - ) - if match: - matched_month = match.group(3) - matched_year = match.group(2) - if MONTHS.get(matched_month) == month and matched_year == str(year): - filetype = match.group(0).split(".")[-1].lower() - info = { - "txt": txt, - "href": href, - "mes_name": matched_month, - "mes": month, - "ano": year, - "filetype": filetype, - } - call_downloader(info) - - -def make_dir_when_not_exists(dir_name: str): - """Auxiliary function to create a subdirectory when it is not present. - - Args: - dir_name (str): Name of the subdirectory to be created. - """ - if not os.path.exists(dir_name): - os.mkdir(dir_name) diff --git a/br_denatran_frota/dataset_config.yaml b/br_denatran_frota/dataset_config.yaml deleted file mode 100644 index 9a43e3b43..000000000 --- a/br_denatran_frota/dataset_config.yaml +++ /dev/null @@ -1,69 +0,0 @@ -dataset_id: br_denatran_frota # AUTO GENERATED - -url_ckan: https://basedosdados.org/dataset/br-denatran-frota -url_github: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota - -# Descreva a base. -# Ela é sobre o que? -# Quais as principais fontes de dados? -# Há links para FAQs e explicações? -description: | # REQUIRED - Frota de Veículos por tipo, estado e município - -# Qual organização disponibiliza os dados originais? -# Opções: escolher dessa lista -> https://basedosdados.org/api/3/action/organization_list -organization: Departamento Nacional de Trânsito # REQUIRED - -# Qual departamento/grupo/pessoa mantém os dados originais? -author: - name: Departamento Nacional de Trânsito - email: - -# Onde encontrar os dados originais e mais informações? -website: - - https://www.gov.br/infraestrutura/pt-br/assuntos/transito/conteudo-denatran/estatisticas-frota-de-veiculos-denatran - -# Quais grupos caracterizam a base? -# Opções: escolher dessa lista -> https://basedosdados.org/api/3/action/group_list -groups: - - infra-transp - -# Quais etiquetas caracterizam a base? -# Opções: escolher dessa lista -> https://basedosdados.org/api/3/action/tag_list -# Caso crie etiquetas novas, as regras são: -# - letras minúsculas -# - sem acentos -# - não repita nomes de grupos (ex. educacao, saude, meio ambiente, economia, etc.) -tags: - - veiculo - - trafego - -# Em quais línguas a base (ou a fonte original) está disponível? -# Regras: minúsculo, sem acentos. -# Opções: portugues, ingles, espanhol, frances, chines, russo, hindi, alemao, etc. -languages: - - portugues - -# Os dados originais estão disponíveis de graça? -free: sim - -# Are microdata available for download? -microdata: sim - -# Existe uma API na fonte original? -API: não - -# É necessário registrar um usuário para baixar os dados originais? -registration: não - -# Como os dados originais estão disponibilizados? -availability: online - -# A fonte original requer IP brasileiro para acesso? -brazilian_IP: não - -# Essa base está sob qual licença? -# A licença MIT se aplica a bases públicas. -# Caso não seja pública, ver opções aqui: https://help.data.world/hc/en-us/articles/115006114287-Common-license-types-for-datasets -license: - name: MIT # REQUIRED diff --git a/br_denatran_frota/municipio_tipo/publish.sql b/br_denatran_frota/municipio_tipo/publish.sql deleted file mode 100644 index 4b7acaffd..000000000 --- a/br_denatran_frota/municipio_tipo/publish.sql +++ /dev/null @@ -1,50 +0,0 @@ -/* - -Query para publicar a tabela. - -Esse é o lugar para: - - modificar nomes, ordem e tipos de colunas - - dar join com outras tabelas - - criar colunas extras (e.g. logs, proporções, etc.) - -Qualquer coluna definida aqui deve também existir em `table_config.yaml`. - -# Além disso, sinta-se à vontade para alterar alguns nomes obscuros -# para algo um pouco mais explícito. - -TIPOS: - - Para modificar tipos de colunas, basta substituir STRING por outro tipo válido. - - Exemplo: `SAFE_CAST(column_name AS NUMERIC) column_name` - - Mais detalhes: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types - -*/ - -CREATE VIEW basedosdados-312117.br_denatran_frota.municipio_tipo AS -SELECT -SAFE_CAST(sigla_uf AS STRING) sigla_uf, -SAFE_CAST(id_municipio AS STRING) id_municipio, -SAFE_CAST(ano AS INT64) ano, -SAFE_CAST(mes AS INT64) mes, -SAFE_CAST(automovel AS INT64) automovel, -SAFE_CAST(bonde AS INT64) bonde, -SAFE_CAST(caminhao AS INT64) caminhao, -SAFE_CAST(caminhaotrator AS INT64) caminhaotrator, -SAFE_CAST(caminhonete AS INT64) caminhonete, -SAFE_CAST(camioneta AS INT64) camioneta, -SAFE_CAST(ciclomotor AS INT64) ciclomotor, -SAFE_CAST(microonibus AS INT64) microonibus, -SAFE_CAST(motocicleta AS INT64) motocicleta, -SAFE_CAST(motoneta AS INT64) motoneta, -SAFE_CAST(onibus AS INT64) onibus, -SAFE_CAST(quadriciclo AS INT64) quadriciclo, -SAFE_CAST(reboque AS INT64) reboque, -SAFE_CAST(semireboque AS INT64) semireboque, -SAFE_CAST(sidecar AS INT64) sidecar, -SAFE_CAST(outros AS INT64) outros, -SAFE_CAST(tratoresteira AS INT64) tratoresteira, -SAFE_CAST(tratorrodas AS INT64) tratorrodas, -SAFE_CAST(triciclo AS INT64) triciclo, -SAFE_CAST(utilitario AS INT64) utilitario, -SAFE_CAST(chassiplataforma AS INT64) chassiplataforma, -SAFE_CAST(total AS INT64) total -from basedosdados-312117.br_denatran_frota_staging.municipio_tipo as t \ No newline at end of file diff --git a/br_denatran_frota/municipio_tipo/schema-prod.json b/br_denatran_frota/municipio_tipo/schema-prod.json deleted file mode 100644 index ecd58455f..000000000 --- a/br_denatran_frota/municipio_tipo/schema-prod.json +++ /dev/null @@ -1 +0,0 @@ -[{"name": "sigla_uf", "description": "Sigla da Unidade da Federa\u00e7\u00e3o original da base", "is_in_staging": true, "is_partition": false, "type": "STRING", "mode": "NULLABLE"}, {"name": "id_municipio", "description": "ID Munic\u00edpio - IBGE 7 D\u00edgitos", "is_in_staging": true, "is_partition": false, "type": "STRING", "mode": "NULLABLE"}, {"name": "ano", "description": "Ano", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "mes", "description": "M\u00eas", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "automovel", "description": "Autom\u00f3vel", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "bonde", "description": "Bonde", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "caminhao", "description": "Caminh\u00e3o", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "caminhaotrator", "description": "Caminh\u00e3o Trator", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "caminhonete", "description": "Caminhonete", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "camioneta", "description": "Camioneta", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "chassiplataforma", "description": "Chassi Plataforma", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "ciclomotor", "description": "Ciclo Motor", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "microonibus", "description": "Micro\u00f4nibus", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "motocicleta", "description": "Motocicleta", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "motoneta", "description": "Motoneta", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "onibus", "description": "\u00d4nibus", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "quadriciclo", "description": "Quadriciclo", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "reboque", "description": "Reboque", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "semireboque", "description": "Semi-reboque", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "sidecar", "description": "Side-car", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "outros", "description": "Argumento que n\u00e3o se enquadra em nenhuma defini\u00e7\u00e3o estabelecida", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "tratoresteira", "description": "Trator esteira", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "tratorrodas", "description": "Trator rodas", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "triciclo", "description": "Triciclo", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "utilitario", "description": "Utilit\u00e1rio", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "total", "description": "Total", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}] \ No newline at end of file diff --git a/br_denatran_frota/municipio_tipo/schema-staging.json b/br_denatran_frota/municipio_tipo/schema-staging.json deleted file mode 100644 index 43cc3a6ef..000000000 --- a/br_denatran_frota/municipio_tipo/schema-staging.json +++ /dev/null @@ -1 +0,0 @@ -[{"name": "sigla_uf", "description": "Sigla da Unidade da Federa\u00e7\u00e3o", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "ano", "description": "Ano", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "mes", "description": "M\u00eas", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "automovel", "description": "Autom\u00f3vel", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "bonde", "description": "Bonde", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "caminhao", "description": "Caminh\u00e3o", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "caminhaotrator", "description": "Caminh\u00e3o Trator", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "caminhonete", "description": "Caminhonete", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "camioneta", "description": "Camioneta", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "chassiplataforma", "description": "Chassi Plataforma", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "ciclomotor", "description": "Ciclo Motor", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "microonibus", "description": "Micro\u00f4nibus", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "motocicleta", "description": "Motocicleta", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "motoneta", "description": "Motoneta", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "onibus", "description": "\u00d4nibus", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "quadriciclo", "description": "Quadriciclo", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "reboque", "description": "Reboque", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "semireboque", "description": "Semi-reboque", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "sidecar", "description": "Side-car", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "outros", "description": "Argumento que n\u00e3o se enquadra em nenhuma defini\u00e7\u00e3o estabelecida", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "tratoresteira", "description": "Trator esteira", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "tratorrodas", "description": "Trator rodas", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "triciclo", "description": "Triciclo", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "utilitario", "description": "Utilit\u00e1rio", "is_in_staging": true, "is_partition": false, "type": "STRING"}, {"name": "total", "description": "Total", "is_in_staging": true, "is_partition": false, "type": "STRING"}] \ No newline at end of file diff --git a/br_denatran_frota/municipio_tipo/table_config.yaml b/br_denatran_frota/municipio_tipo/table_config.yaml deleted file mode 100644 index 28af5cb70..000000000 --- a/br_denatran_frota/municipio_tipo/table_config.yaml +++ /dev/null @@ -1,268 +0,0 @@ -source_bucket_name: basedosdadosdev -project_id_staging: basedosdados-312117 -project_id_prod: basedosdados-312117 -table_id: municipio_tipo # AUTO GENERATED -dataset_id: br_denatran_frota # AUTO GENERATED - -url_ckan: https://basedosdados.org/dataset/br-denatran-frota # AUTO GENERATED -url_github: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota # AUTO GENERATED - -version: v1.3 # REQUIRED - -last_updated: 2021-05-28 # AUTO GENERATED - -# Descreva a tabela. Essas são as primeiras frases que um usuário vai ver. -# Você não precisa ser muito conciso. Sinta-se a vontade para dar exemplos de -# como usar os dados. -# Se souber, liste também aplicações: pesquisa, apps, etc. que usem os dados. -description: | # REQUIRED - Frota de veículos por município e tipo - -# Quem está completando esse arquivo config? -published_by: - name: Pedro Castro # REQUIRED - code_url: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota/code # REQUIRED - website: https://github.com/pedrocastroo - email: pdesacastro@gmail.com - -# Qual organização/departamento/pessoa tratou os dados? -# As vezes há um ponto intermediário entre os dados originais e subir na Base dos Dados. -# Se essa pessoa é você, preencha abaixo com suas informações. -treated_by: - name: Pedro Castro - code_url: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota/code - website: https://basedosdados.org/ - email: pdesacastro@gmail.com - -# Se houve passos de tratamento, limpeza e manipulação de dados, descreva-os aqui. -treatment_description: | - Padronização das colunas. Nova coluna, id_municipio. Remoção das linhas "MUNICIPIO NAO INFORMADO". - -# Com qual frequência a base é atualizada? -# Opções: hora | dia | semana | mes | 1 ano | 2 anos | 5 anos | 10 anos | unico | recorrente -data_update_frequency: mes # REQUIRED - -# Nível da observação (qual é a granularidade de cada linha na tabela) -# Escolha todas as opções necessárias. -# Regras: -# - minúsculo, sem acento, singular. -# - em portugues (ou seja, não use os nomes de colunas abaixo) -# Exemplos: pais, estado, municipio, cidade, hora, dia, semana, mes, ano, etc. -observation_level: #REQUIRED - - municipio - - mes - -# Quais colunas identificam uma linha unicamente? -# Preencha com os nomes de colunas. Ex: id_municipio, ano. -# Pode ser vazio pois certas tabelas não possuem identificadores. -primary_keys: - - id_municipio - - ano - - mes - -# Qual é a cobertura espacial da tabela? -# Regras: -# - minúsculo, sem acento, singular -# - descer até o menor nível administrativo cuja cobertura abaixo seja 'todos' -# Exemplo 1: tabela que cubra todos os municípios nos estados de SP e GO -# - brasil -# - SP, GO -# Exemplo 2: tabela que cubra países inteiros na América Latina -# - brasil, argentina, peru, equador -coverage_geo: - - brasil - -# Qual é a cobertura temporal (em anos) da tabela? -# Opções: ..., 1990, 1991, ..., 1999, 2000, 2001, ..., 2019, 2020, ... -coverage_time: - - 2003 - - 2004 - - 2005 - - 2006 - - 2007 - - 2008 - - 2009 - - 2010 - - 2011 - - 2012 - - 2013 - - 2014 - - 2015 - - 2016 - - 2017 - - 2018 - - 2019 - - 2020 - - 2021 - -# Liste as colunas da tabela que representam partições. -# Não esqueça de deletar essas colunas nas tabelas .csv na hora de subir para o BigQuery. -# Isso poupará muito tempo e dinheiro às pessoas utilizando essa tabela. -# Se não houver partições, não modifique abaixo. -partitions: # REQUIRED - -# Quais são as colunas? Certifique-se de escrever uma boa descrição, as pessoas vão gostar -# para saber sobre o que é a coluna. -# Adicionar todas as colunas manualmente pode ser bastante cansativo, por isso, quando -# inicializando este arquivo de configuração, você pode apontar a função para uma amostra de dados que -# preencherá automaticamente as colunas. -# Algumas colunas existirão apenas na tabela final, você as construirá em `publish.sql`. -# Para esses, defina is_in_staging como False. -# Além disso, você deve adicionar as colunas de partição aqui e definir is_partition como True. -columns: # REQUIRED - - - - name: sigla_uf - description: Sigla da Unidade da Federação original da base - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: id_municipio - description: ID Município - IBGE 7 Dígitos - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: ano - description: Ano - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: mes - description: Mês - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: automovel - description: Automóvel - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: bonde - description: Bonde - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: caminhao - description: Caminhão - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: caminhaotrator - description: Caminhão Trator - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: caminhonete - description: Caminhonete - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: camioneta - description: Camioneta - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: chassiplataforma - description: Chassi Plataforma - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: ciclomotor - description: Ciclo Motor - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: microonibus - description: Microônibus - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: motocicleta - description: Motocicleta - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: motoneta - description: Motoneta - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: onibus - description: Ônibus - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: quadriciclo - description: Quadriciclo - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: reboque - description: Reboque - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: semireboque - description: Semi-reboque - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: sidecar - description: Side-car - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: outros - description: Argumento que não se enquadra em nenhuma definição estabelecida - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: tratoresteira - description: Trator esteira - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: tratorrodas - description: Trator rodas - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: triciclo - description: Triciclo - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: utilitario - description: Utilitário - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: total - description: Total - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. \ No newline at end of file diff --git a/br_denatran_frota/municipio_tipo/table_description.txt b/br_denatran_frota/municipio_tipo/table_description.txt deleted file mode 100644 index 7ca0fad1e..000000000 --- a/br_denatran_frota/municipio_tipo/table_description.txt +++ /dev/null @@ -1,67 +0,0 @@ -Frota de veículos por município e tipo - - -Para saber mais acesse: -Website: https://basedosdados.org/dataset/br-denatran-frota -Github: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota - -Ajude a manter o projeto :) -Apoia-se: https://apoia.se/basedosdados - -Publicado por -------------- -Nome: Pedro Castro -Código: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota/code -Website: https://github.com/pedrocastroo -Email: pdesacastro@gmail.comTratado por ------------ -Nome: Pedro Castro -Código: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota/code -Website: https://basedosdados.org/ -Email: pdesacastro@gmail.com - -Nível da Observação (i.e. a granularidade da linha) -------------------- -- municipio -- mes - -Colunas identificando linhas unicamente -------------------- -- id_municipio -- ano -- mes - -Cobertura Temporal ------------------- -- 2003 -- 2004 -- 2005 -- 2006 -- 2007 -- 2008 -- 2009 -- 2010 -- 2011 -- 2012 -- 2013 -- 2014 -- 2015 -- 2016 -- 2017 -- 2018 -- 2019 -- 2020 -- 2021 - -Cobertura Espacial ------------------- -- brasil - -Tratamento ----------- -Padronização das colunas. Nova coluna, id_municipio. Remoção das linhas "MUNICIPIO NAO INFORMADO". - -Frequencia de Atualização -------------------------- -mes - diff --git a/br_denatran_frota/uf_tipo/publish.sql b/br_denatran_frota/uf_tipo/publish.sql deleted file mode 100644 index 0725b27d8..000000000 --- a/br_denatran_frota/uf_tipo/publish.sql +++ /dev/null @@ -1,49 +0,0 @@ -/* - -Query para publicar a tabela. - -Esse é o lugar para: - - modificar nomes, ordem e tipos de colunas - - dar join com outras tabelas - - criar colunas extras (e.g. logs, proporções, etc.) - -Qualquer coluna definida aqui deve também existir em `table_config.yaml`. - -# Além disso, sinta-se à vontade para alterar alguns nomes obscuros -# para algo um pouco mais explícito. - -TIPOS: - - Para modificar tipos de colunas, basta substituir STRING por outro tipo válido. - - Exemplo: `SAFE_CAST(column_name AS NUMERIC) column_name` - - Mais detalhes: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types - -*/ - -CREATE VIEW basedosdados-312117.br_denatran_frota.uf_tipo AS -SELECT -SAFE_CAST(sigla_uf AS STRING) sigla_uf, -SAFE_CAST(ano AS INT64) ano, -SAFE_CAST(mes AS INT64) mes, -SAFE_CAST(automovel AS INT64) automovel, -SAFE_CAST(bonde AS INT64) bonde, -SAFE_CAST(caminhao AS INT64) caminhao, -SAFE_CAST(caminhaotrator AS INT64) caminhaotrator, -SAFE_CAST(caminhonete AS INT64) caminhonete, -SAFE_CAST(camioneta AS INT64) camioneta, -SAFE_CAST(chassiplataforma AS INT64) chassiplataforma, -SAFE_CAST(ciclomotor AS INT64) ciclomotor, -SAFE_CAST(microonibus AS INT64) microonibus, -SAFE_CAST(motocicleta AS INT64) motocicleta, -SAFE_CAST(motoneta AS INT64) motoneta, -SAFE_CAST(onibus AS INT64) onibus, -SAFE_CAST(quadriciclo AS INT64) quadriciclo, -SAFE_CAST(reboque AS INT64) reboque, -SAFE_CAST(semireboque AS INT64) semireboque, -SAFE_CAST(sidecar AS INT64) sidecar, -SAFE_CAST(outros AS INT64) outros, -SAFE_CAST(tratoresteira AS INT64) tratoresteira, -SAFE_CAST(tratorrodas AS INT64) tratorrodas, -SAFE_CAST(triciclo AS INT64) triciclo, -SAFE_CAST(utilitario AS INT64) utilitario, -SAFE_CAST(total AS INT64) total -from basedosdados-312117.br_denatran_frota_staging.uf_tipo as t diff --git a/br_denatran_frota/uf_tipo/schema-prod.json b/br_denatran_frota/uf_tipo/schema-prod.json deleted file mode 100644 index 9179eec10..000000000 --- a/br_denatran_frota/uf_tipo/schema-prod.json +++ /dev/null @@ -1 +0,0 @@ -[{"name": "sigla_uf", "description": "Sigla da Unidade da Federa\u00e7\u00e3o", "is_in_staging": true, "is_partition": false, "type": "STRING", "mode": "NULLABLE"}, {"name": "ano", "description": "Ano", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "mes", "description": "M\u00eas", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "automovel", "description": "Autom\u00f3vel", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "bonde", "description": "Bonde", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "caminhao", "description": "Caminh\u00e3o", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "caminhaotrator", "description": "Caminh\u00e3o Trator", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "caminhonete", "description": "Caminhonete", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "camioneta", "description": "Camioneta", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "chassiplataforma", "description": "Chassi Plataforma", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "ciclomotor", "description": "Ciclo Motor", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "microonibus", "description": "Micro\u00f4nibus", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "motocicleta", "description": "Motocicleta", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "motoneta", "description": "Motoneta", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "onibus", "description": "\u00d4nibus", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "quadriciclo", "description": "Quadriciclo", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "reboque", "description": "Reboque", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "semireboque", "description": "Semi-reboque", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "sidecar", "description": "Side-car", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "outros", "description": "Argumento que n\u00e3o se enquadra em nenhuma defini\u00e7\u00e3o estabelecida", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "tratoresteira", "description": "Trator esteira", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "tratorrodas", "description": "Trator rodas", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "triciclo", "description": "Triciclo", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "utilitario", "description": "Utilit\u00e1rio", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}, {"name": "total", "description": "Total", "is_in_staging": true, "is_partition": false, "type": "INTEGER", "mode": "NULLABLE"}] \ No newline at end of file diff --git a/br_denatran_frota/uf_tipo/table_config.yaml b/br_denatran_frota/uf_tipo/table_config.yaml deleted file mode 100644 index 66cb8f5bc..000000000 --- a/br_denatran_frota/uf_tipo/table_config.yaml +++ /dev/null @@ -1,263 +0,0 @@ -source_bucket_name: basedosdadosdev -project_id_staging: basedosdados-312117 -project_id_prod: basedosdados-312117 -table_id: uf_tipo # AUTO GENERATED -dataset_id: br_denatran_frota # AUTO GENERATED - - -url_ckan: https://basedosdados.org/dataset/br-denatran-frota # AUTO GENERATED -url_github: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota # AUTO GENERATED - -version: v1.2 # REQUIRED - -last_updated: 2021-05-28 # AUTO GENERATED - -# Descreva a tabela. Essas são as primeiras frases que um usuário vai ver. -# Você não precisa ser muito conciso. Sinta-se a vontade para dar exemplos de -# como usar os dados. -# Se souber, liste também aplicações: pesquisa, apps, etc. que usem os dados. -description: | # REQUIRED - Frota veículos por estado e tipo - -# Quem está completando esse arquivo config? -published_by: - name: Pedro Castro # REQUIRED - code_url: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota/code # REQUIRED - website: https://github.com/pedrocastroo - email: pdesacastro@gmail.com - -# Qual organização/departamento/pessoa tratou os dados? -# As vezes há um ponto intermediário entre os dados originais e subir na Base dos Dados. -# Se essa pessoa é você, preencha abaixo com suas informações. -treated_by: - name: Pedro Castro - code_url: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota/code - website: https://basedosdados.org/ - email: pdesacastro@gmail.com - -# Se houve passos de tratamento, limpeza e manipulação de dados, descreva-os aqui. -treatment_description: | - Padronização dos nomes das colunas. Remoção das linhas do total dos estados. - -# Com qual frequência a base é atualizada? -# Opções: hora | dia | semana | mes | 1 ano | 2 anos | 5 anos | 10 anos | unico | recorrente -data_update_frequency: mes # REQUIRED - -# Nível da observação (qual é a granularidade de cada linha na tabela) -# Escolha todas as opções necessárias. -# Regras: - # - minúsculo, sem acento, singular. -# - em portugues (ou seja, não use os nomes de colunas abaixo) -# Exemplos: pais, estado, municipio, cidade, hora, dia, semana, mes, ano, etc. -observation_level: #REQUIRED - - unidade da federação - - mes - -# Quais colunas identificam uma linha unicamente? -# Preencha com os nomes de colunas. Ex: id_municipio, ano. -# Pode ser vazio pois certas tabelas não possuem identificadores. -primary_keys: - - ano - - mes - - sigla_uf - -# Qual é a cobertura espacial da tabela? -# Regras: - # - minúsculo, sem acento, singular -# - descer até o menor nível administrativo cuja cobertura abaixo seja 'todos' -# Exemplo 1: tabela que cubra todos os municípios nos estados de SP e GO -# - brasil -# - SP, GO -# Exemplo 2: tabela que cubra países inteiros na América Latina -# - brasil, argentina, peru, equador -coverage_geo: - - brasil - -# Qual é a cobertura temporal (em anos) da tabela? -# Opções: ..., 1990, 1991, ..., 1999, 2000, 2001, ..., 2019, 2020, ... -coverage_time: - - 2003 - - 2004 - - 2005 - - 2006 - - 2007 - - 2008 - - 2009 - - 2010 - - 2011 - - 2012 - - 2013 - - 2014 - - 2015 - - 2016 - - 2017 - - 2018 - - 2019 - - 2020 - - 2021 - -# Liste as colunas da tabela que representam partições. -# Não esqueça de deletar essas colunas nas tabelas .csv na hora de subir para o BigQuery. -# Isso poupará muito tempo e dinheiro às pessoas utilizando essa tabela. -# Se não houver partições, não modifique abaixo. -partitions: # REQUIRED - -# Quais são as colunas? Certifique-se de escrever uma boa descrição, as pessoas vão gostar -# para saber sobre o que é a coluna. -# Adicionar todas as colunas manualmente pode ser bastante cansativo, por isso, quando -# inicializando este arquivo de configuração, você pode apontar a função para uma amostra de dados que -# preencherá automaticamente as colunas. -# Algumas colunas existirão apenas na tabela final, você as construirá em `publish.sql`. -# Para esses, defina is_in_staging como False. -# Além disso, você deve adicionar as colunas de partição aqui e definir is_partition como True. -columns: # REQUIRED - - - - name: sigla_uf - description: Sigla da Unidade da Federação - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: ano - description: Ano - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: mes - description: Mês - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: automovel - description: Automóvel - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: bonde - description: Bonde - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: caminhao - description: Caminhão - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: caminhaotrator - description: Caminhão Trator - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: caminhonete - description: Caminhonete - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: camioneta - description: Camioneta - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: chassiplataforma - description: Chassi Plataforma - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: ciclomotor - description: Ciclo Motor - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: microonibus - description: Microônibus - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: motocicleta - description: Motocicleta - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: motoneta - description: Motoneta - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: onibus - description: Ônibus - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: quadriciclo - description: Quadriciclo - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: reboque - description: Reboque - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: semireboque - description: Semi-reboque - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: sidecar - description: Side-car - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: outros - description: Argumento que não se enquadra em nenhuma definição estabelecida - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: tratoresteira - description: Trator esteira - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: tratorrodas - description: Trator rodas - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: triciclo - description: Triciclo - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: utilitario - description: Utilitário - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partition. - - - - name: total - description: Total - is_in_staging: True # Bool [True, False], whether the column is in the staging table - is_partition: False # Bool [True, False], whether the column is a partitio \ No newline at end of file diff --git a/br_denatran_frota/uf_tipo/table_description.txt b/br_denatran_frota/uf_tipo/table_description.txt deleted file mode 100644 index 982522203..000000000 --- a/br_denatran_frota/uf_tipo/table_description.txt +++ /dev/null @@ -1,67 +0,0 @@ -Frota veículos por estado e tipo - - -Para saber mais acesse: -Website: https://basedosdados.org/dataset/br-denatran-frota -Github: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota - -Ajude a manter o projeto :) -Apoia-se: https://apoia.se/basedosdados - -Publicado por -------------- -Nome: Pedro Castro -Código: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota/code -Website: https://github.com/pedrocastroo -Email: pdesacastro@gmail.comTratado por ------------ -Nome: Pedro Castro -Código: https://github.com/basedosdados/mais/tree/master/bases/br_denatran_frota/code -Website: https://basedosdados.org/ -Email: pdesacastro@gmail.com - -Nível da Observação (i.e. a granularidade da linha) -------------------- -- unidade da federação -- mes - -Colunas identificando linhas unicamente -------------------- -- ano -- mes -- sigla_uf - -Cobertura Temporal ------------------- -- 2003 -- 2004 -- 2005 -- 2006 -- 2007 -- 2008 -- 2009 -- 2010 -- 2011 -- 2012 -- 2013 -- 2014 -- 2015 -- 2016 -- 2017 -- 2018 -- 2019 -- 2020 -- 2021 - -Cobertura Espacial ------------------- -- brasil - -Tratamento ----------- -Padronização dos nomes das colunas. Remoção das linhas do total dos estados. - -Frequencia de Atualização -------------------------- -mes - diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index fb0c94dfb..1f27c5bae 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -1,53 +1,4 @@ # -*- coding: utf-8 -*- -""" -Tasks for br_denatran_frota -""" - -############################################################################### -# -# Aqui é onde devem ser definidas as tasks para os flows do projeto. -# Cada task representa um passo da pipeline. Não é estritamente necessário -# tratar todas as exceções que podem ocorrer durante a execução de uma task, -# mas é recomendável, ainda que não vá implicar em uma quebra no sistema. -# Mais informações sobre tasks podem ser encontradas na documentação do -# Prefect: https://docs.prefect.io/core/concepts/tasks.html -# -# De modo a manter consistência na codebase, todo o código escrito passará -# pelo pylint. Todos os warnings e erros devem ser corrigidos. -# -# As tasks devem ser definidas como funções comuns ao Python, com o decorador -# @task acima. É recomendado inserir type hints para as variáveis. -# -# Um exemplo de task é o seguinte: -# -# ----------------------------------------------------------------------------- -# from prefect import task -# -# @task -# def my_task(param1: str, param2: int) -> str: -# """ -# My task description. -# """ -# return f'{param1} {param2}' -# ----------------------------------------------------------------------------- -# -# Você também pode usar pacotes Python arbitrários, como numpy, pandas, etc. -# -# ----------------------------------------------------------------------------- -# from prefect import task -# import numpy as np -# -# @task -# def my_task(a: np.ndarray, b: np.ndarray) -> str: -# """ -# My task description. -# """ -# return np.add(a, b) -# ----------------------------------------------------------------------------- -# -# Abaixo segue um código para exemplificação, que pode ser removido. -# -############################################################################### from prefect import task import glob diff --git a/poetry.lock b/poetry.lock index 5d927f5e0..bc53c1a8e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,11 +1,9 @@ - -# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "appnope" version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" -category = "dev" optional = false python-versions = "*" files = [ @@ -17,7 +15,6 @@ files = [ name = "arrow" version = "1.2.3" description = "Better dates & times for Python" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -28,12 +25,10 @@ files = [ [package.dependencies] python-dateutil = ">=2.7.0" - [[package]] name = "asttokens" version = "2.2.1" description = "Annotate AST trees with source code positions" -category = "dev" optional = false python-versions = "*" files = [ @@ -49,17 +44,19 @@ test = ["astroid", "pytest"] [[package]] name = "async-timeout" -version = "4.0.2" +version = "4.0.3" description = "Timeout context manager for asyncio programs" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] [[package]] name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" -category = "dev" optional = false python-versions = "*" files = [ @@ -71,7 +68,6 @@ files = [ name = "backports-zoneinfo" version = "0.2.1" description = "Backport of the standard library zoneinfo module" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -100,9 +96,12 @@ tzdata = ["tzdata"] name = "basedosdados" version = "1.6.9" description = "Organizar e facilitar o acesso a dados brasileiros através de tabelas públicas no BigQuery." -category = "main" optional = false python-versions = ">=3.7.1,<3.11" +files = [ + {file = "basedosdados-1.6.9-py3-none-any.whl", hash = "sha256:9a73ad8a3667cca327d81c5d41ec809ed0675825dfc5d93d1efcf45f9bd1e867"}, + {file = "basedosdados-1.6.9.tar.gz", hash = "sha256:51783ea130944295dbc6b7dcbad8676ca0ff0234cdf2b4d212177bcd12db7921"}, +] [package.dependencies] ckanapi = "4.6" @@ -127,9 +126,12 @@ tqdm = "4.50.2" name = "beautifulsoup4" version = "4.11.1" description = "Screen-scraping library" -category = "main" optional = false python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, + {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, +] [package.dependencies] soupsieve = ">1.2" @@ -138,12 +140,10 @@ soupsieve = ">1.2" html5lib = ["html5lib"] lxml = ["lxml"] - [[package]] name = "binaryornot" version = "0.4.4" description = "Ultra-lightweight pure Python package to check if a file is binary or text." -category = "dev" optional = false python-versions = "*" files = [ @@ -154,28 +154,32 @@ files = [ [package.dependencies] chardet = ">=3.0.2" - [[package]] name = "cachetools" version = "4.2.4" description = "Extensible memoizing collections and decorators" -category = "main" optional = false python-versions = "~=3.5" +files = [ + {file = "cachetools-4.2.4-py3-none-any.whl", hash = "sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1"}, + {file = "cachetools-4.2.4.tar.gz", hash = "sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693"}, +] [[package]] name = "certifi" version = "2021.10.8" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = "*" +files = [ + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, +] [[package]] name = "cffi" version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false python-versions = "*" files = [ @@ -250,44 +254,67 @@ pycparser = "*" [[package]] name = "cfgv" -version = "3.3.1" +version = "3.4.0" description = "Validate configuration and produce human readable error messages." -category = "main" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] + +[[package]] +name = "chardet" +version = "5.2.0" +description = "Universal encoding detector for Python 3" +optional = false +python-versions = ">=3.7" +files = [ + {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, + {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, +] [[package]] name = "charset-normalizer" version = "2.0.8" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.5.0" +files = [ + {file = "charset-normalizer-2.0.8.tar.gz", hash = "sha256:735e240d9a8506778cd7a453d97e817e536bb1fc29f4f6961ce297b9c7a917b0"}, + {file = "charset_normalizer-2.0.8-py3-none-any.whl", hash = "sha256:83fcdeb225499d6344c8f7f34684c2981270beacc32ede2e669e94f7fa544405"}, +] [package.extras] -unicode_backport = ["unicodedata2"] +unicode-backport = ["unicodedata2"] [[package]] name = "ckanapi" version = "4.6" description = "A command line interface and Python module for accessing the CKAN Action API" -category = "main" optional = false python-versions = "*" +files = [ + {file = "ckanapi-4.6.tar.gz", hash = "sha256:35361965bfb38c8e146d7229f2d7c3aaf1c0f2ef547de4239b4d38931bf081d2"}, +] [package.dependencies] docopt = "*" python-slugify = ">=1.0" requests = "*" +setuptools = "*" six = ">=1.9,<2.0" [[package]] name = "click" version = "8.0.3" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, + {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -296,15 +323,17 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "cloudpickle" version = "2.0.0" description = "Extended pickling support for Python objects" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "cloudpickle-2.0.0-py3-none-any.whl", hash = "sha256:6b2df9741d06f43839a3275c4e6632f7df6487a1f181f5f46a052d3c917c3d11"}, + {file = "cloudpickle-2.0.0.tar.gz", hash = "sha256:5cd02f3b417a783ba84a4ec3e290ff7929009fe51f6405423cfccfadd43ba4a4"}, +] [[package]] name = "code2flow" version = "2.5.1" description = "Visualize your source code as DOT flowcharts" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -315,24 +344,26 @@ files = [ name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "comm" -version = "0.1.3" +version = "0.1.4" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "comm-0.1.3-py3-none-any.whl", hash = "sha256:16613c6211e20223f215fc6d3b266a247b6e2641bf4e0a3ad34cb1aff2aa3f37"}, - {file = "comm-0.1.3.tar.gz", hash = "sha256:a61efa9daffcfbe66fd643ba966f846a624e4e6d6767eda9cf6e993aadaab93e"}, + {file = "comm-0.1.4-py3-none-any.whl", hash = "sha256:6d52794cba11b36ed9860999cd10fd02d6b2eac177068fdd585e1e2f8a96e67a"}, + {file = "comm-0.1.4.tar.gz", hash = "sha256:354e40a59c9dd6db50c5cc6b4acc887d82e9603787f83b68c01a80a923984d15"}, ] [package.dependencies] -traitlets = ">=5.3" +traitlets = ">=4" [package.extras] lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] @@ -343,85 +374,142 @@ typing = ["mypy (>=0.990)"] name = "contourpy" version = "1.1.0" description = "Python library for calculating contours of 2D quadrilateral grids" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "contourpy-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:89f06eff3ce2f4b3eb24c1055a26981bffe4e7264acd86f15b97e40530b794bc"}, + {file = "contourpy-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dffcc2ddec1782dd2f2ce1ef16f070861af4fb78c69862ce0aab801495dda6a3"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25ae46595e22f93592d39a7eac3d638cda552c3e1160255258b695f7b58e5655"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17cfaf5ec9862bc93af1ec1f302457371c34e688fbd381f4035a06cd47324f48"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"}, + {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"}, + {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"}, + {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"}, + {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052cc634bf903c604ef1a00a5aa093c54f81a2612faedaa43295809ffdde885e"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9382a1c0bc46230fb881c36229bfa23d8c303b889b788b939365578d762b5c18"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"}, + {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"}, + {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"}, + {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"}, + {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62013a2cf68abc80dadfd2307299bfa8f5aa0dcaec5b2954caeb5fa094171103"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b6616375d7de55797d7a66ee7d087efe27f03d336c27cf1f32c02b8c1a5ac70"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"}, + {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"}, + {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"}, + {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"}, + {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f2931ed4741f98f74b410b16e5213f71dcccee67518970c42f64153ea9313b9"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30f511c05fab7f12e0b1b7730ebdc2ec8deedcfb505bc27eb570ff47c51a8f15"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"}, + {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"}, + {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a67259c2b493b00e5a4d0f7bfae51fb4b3371395e47d079a4446e9b0f4d70e76"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2b836d22bd2c7bb2700348e4521b25e077255ebb6ab68e351ab5aa91ca27e027"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084eaa568400cfaf7179b847ac871582199b1b44d5699198e9602ecbbb5f6104"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:911ff4fd53e26b019f898f32db0d4956c9d227d51338fb3b03ec72ff0084ee5f"}, + {file = "contourpy-1.1.0.tar.gz", hash = "sha256:e53046c3863828d21d531cc3b53786e6580eb1ba02477e8681009b6aa0870b21"}, +] [package.dependencies] numpy = ">=1.16" [package.extras] -docs = ["furo", "sphinx-copybutton"] bokeh = ["bokeh", "selenium"] -mypy = ["contourpy", "docutils-stubs", "mypy (==1.2.0)", "types-pillow"] -test = ["contourpy", "matplotlib", "pillow"] +docs = ["furo", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.2.0)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] test-no-images = ["pytest", "pytest-cov", "wurlitzer"] [[package]] -name = "coverage" +name = "cookiecutter" +version = "1.7.3" +description = "A command-line utility that creates projects from project templates, e.g. creating a Python package project from a Python package project template." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "cookiecutter-1.7.3-py2.py3-none-any.whl", hash = "sha256:f8671531fa96ab14339d0c59b4f662a4f12a2ecacd94a0f70a3500843da588e2"}, + {file = "cookiecutter-1.7.3.tar.gz", hash = "sha256:6b9a4d72882e243be077a7397d0f1f76fe66cf3df91f3115dbb5330e214fa457"}, +] -version = "7.2.5" +[package.dependencies] +binaryornot = ">=0.4.4" +click = ">=7.0" +Jinja2 = ">=2.7,<4.0.0" +jinja2-time = ">=0.2.0" +poyo = ">=0.5.0" +python-slugify = ">=4.0.0" +requests = ">=2.23.0" +six = ">=1.10" +[[package]] +name = "coverage" +version = "7.3.0" description = "Code coverage measurement for Python" -category = "main" optional = false -python-versions = ">=3.7" - +python-versions = ">=3.8" files = [ - {file = "coverage-7.2.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:883123d0bbe1c136f76b56276074b0c79b5817dd4238097ffa64ac67257f4b6c"}, - {file = "coverage-7.2.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d2fbc2a127e857d2f8898aaabcc34c37771bf78a4d5e17d3e1f5c30cd0cbc62a"}, - {file = "coverage-7.2.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f3671662dc4b422b15776cdca89c041a6349b4864a43aa2350b6b0b03bbcc7f"}, - {file = "coverage-7.2.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780551e47d62095e088f251f5db428473c26db7829884323e56d9c0c3118791a"}, - {file = "coverage-7.2.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:066b44897c493e0dcbc9e6a6d9f8bbb6607ef82367cf6810d387c09f0cd4fe9a"}, - {file = "coverage-7.2.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b9a4ee55174b04f6af539218f9f8083140f61a46eabcaa4234f3c2a452c4ed11"}, - {file = "coverage-7.2.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:706ec567267c96717ab9363904d846ec009a48d5f832140b6ad08aad3791b1f5"}, - {file = "coverage-7.2.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ae453f655640157d76209f42c62c64c4d4f2c7f97256d3567e3b439bd5c9b06c"}, - {file = "coverage-7.2.5-cp310-cp310-win32.whl", hash = "sha256:f81c9b4bd8aa747d417407a7f6f0b1469a43b36a85748145e144ac4e8d303cb5"}, - {file = "coverage-7.2.5-cp310-cp310-win_amd64.whl", hash = "sha256:dc945064a8783b86fcce9a0a705abd7db2117d95e340df8a4333f00be5efb64c"}, - {file = "coverage-7.2.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40cc0f91c6cde033da493227797be2826cbf8f388eaa36a0271a97a332bfd7ce"}, - {file = "coverage-7.2.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a66e055254a26c82aead7ff420d9fa8dc2da10c82679ea850d8feebf11074d88"}, - {file = "coverage-7.2.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c10fbc8a64aa0f3ed136b0b086b6b577bc64d67d5581acd7cc129af52654384e"}, - {file = "coverage-7.2.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a22cbb5ede6fade0482111fa7f01115ff04039795d7092ed0db43522431b4f2"}, - {file = "coverage-7.2.5-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:292300f76440651529b8ceec283a9370532f4ecba9ad67d120617021bb5ef139"}, - {file = "coverage-7.2.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7ff8f3fb38233035028dbc93715551d81eadc110199e14bbbfa01c5c4a43f8d8"}, - {file = "coverage-7.2.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a08c7401d0b24e8c2982f4e307124b671c6736d40d1c39e09d7a8687bddf83ed"}, - {file = "coverage-7.2.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef9659d1cda9ce9ac9585c045aaa1e59223b143f2407db0eaee0b61a4f266fb6"}, - {file = "coverage-7.2.5-cp311-cp311-win32.whl", hash = "sha256:30dcaf05adfa69c2a7b9f7dfd9f60bc8e36b282d7ed25c308ef9e114de7fc23b"}, - {file = "coverage-7.2.5-cp311-cp311-win_amd64.whl", hash = "sha256:97072cc90f1009386c8a5b7de9d4fc1a9f91ba5ef2146c55c1f005e7b5c5e068"}, - {file = "coverage-7.2.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bebea5f5ed41f618797ce3ffb4606c64a5de92e9c3f26d26c2e0aae292f015c1"}, - {file = "coverage-7.2.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828189fcdda99aae0d6bf718ea766b2e715eabc1868670a0a07bf8404bf58c33"}, - {file = "coverage-7.2.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e8a95f243d01ba572341c52f89f3acb98a3b6d1d5d830efba86033dd3687ade"}, - {file = "coverage-7.2.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8834e5f17d89e05697c3c043d3e58a8b19682bf365048837383abfe39adaed5"}, - {file = "coverage-7.2.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d1f25ee9de21a39b3a8516f2c5feb8de248f17da7eead089c2e04aa097936b47"}, - {file = "coverage-7.2.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1637253b11a18f453e34013c665d8bf15904c9e3c44fbda34c643fbdc9d452cd"}, - {file = "coverage-7.2.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8e575a59315a91ccd00c7757127f6b2488c2f914096077c745c2f1ba5b8c0969"}, - {file = "coverage-7.2.5-cp37-cp37m-win32.whl", hash = "sha256:509ecd8334c380000d259dc66feb191dd0a93b21f2453faa75f7f9cdcefc0718"}, - {file = "coverage-7.2.5-cp37-cp37m-win_amd64.whl", hash = "sha256:12580845917b1e59f8a1c2ffa6af6d0908cb39220f3019e36c110c943dc875b0"}, - {file = "coverage-7.2.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b5016e331b75310610c2cf955d9f58a9749943ed5f7b8cfc0bb89c6134ab0a84"}, - {file = "coverage-7.2.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:373ea34dca98f2fdb3e5cb33d83b6d801007a8074f992b80311fc589d3e6b790"}, - {file = "coverage-7.2.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a063aad9f7b4c9f9da7b2550eae0a582ffc7623dca1c925e50c3fbde7a579771"}, - {file = "coverage-7.2.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38c0a497a000d50491055805313ed83ddba069353d102ece8aef5d11b5faf045"}, - {file = "coverage-7.2.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b3b05e22a77bb0ae1a3125126a4e08535961c946b62f30985535ed40e26614"}, - {file = "coverage-7.2.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0342a28617e63ad15d96dca0f7ae9479a37b7d8a295f749c14f3436ea59fdcb3"}, - {file = "coverage-7.2.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf97ed82ca986e5c637ea286ba2793c85325b30f869bf64d3009ccc1a31ae3fd"}, - {file = "coverage-7.2.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c2c41c1b1866b670573657d584de413df701f482574bad7e28214a2362cb1fd1"}, - {file = "coverage-7.2.5-cp38-cp38-win32.whl", hash = "sha256:10b15394c13544fce02382360cab54e51a9e0fd1bd61ae9ce012c0d1e103c813"}, - {file = "coverage-7.2.5-cp38-cp38-win_amd64.whl", hash = "sha256:a0b273fe6dc655b110e8dc89b8ec7f1a778d78c9fd9b4bda7c384c8906072212"}, - {file = "coverage-7.2.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c587f52c81211d4530fa6857884d37f514bcf9453bdeee0ff93eaaf906a5c1b"}, - {file = "coverage-7.2.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4436cc9ba5414c2c998eaedee5343f49c02ca93b21769c5fdfa4f9d799e84200"}, - {file = "coverage-7.2.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6599bf92f33ab041e36e06d25890afbdf12078aacfe1f1d08c713906e49a3fe5"}, - {file = "coverage-7.2.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:857abe2fa6a4973f8663e039ead8d22215d31db613ace76e4a98f52ec919068e"}, - {file = "coverage-7.2.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f5cab2d7f0c12f8187a376cc6582c477d2df91d63f75341307fcdcb5d60303"}, - {file = "coverage-7.2.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aa387bd7489f3e1787ff82068b295bcaafbf6f79c3dad3cbc82ef88ce3f48ad3"}, - {file = "coverage-7.2.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:156192e5fd3dbbcb11cd777cc469cf010a294f4c736a2b2c891c77618cb1379a"}, - {file = "coverage-7.2.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bd3b4b8175c1db502adf209d06136c000df4d245105c8839e9d0be71c94aefe1"}, - {file = "coverage-7.2.5-cp39-cp39-win32.whl", hash = "sha256:ddc5a54edb653e9e215f75de377354e2455376f416c4378e1d43b08ec50acc31"}, - {file = "coverage-7.2.5-cp39-cp39-win_amd64.whl", hash = "sha256:338aa9d9883aaaad53695cb14ccdeb36d4060485bb9388446330bef9c361c252"}, - {file = "coverage-7.2.5-pp37.pp38.pp39-none-any.whl", hash = "sha256:8877d9b437b35a85c18e3c6499b23674684bf690f5d96c1006a1ef61f9fdf0f3"}, - {file = "coverage-7.2.5.tar.gz", hash = "sha256:f99ef080288f09ffc687423b8d60978cf3a465d3f404a18d1a05474bd8575a47"}, + {file = "coverage-7.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db76a1bcb51f02b2007adacbed4c88b6dee75342c37b05d1822815eed19edee5"}, + {file = "coverage-7.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c02cfa6c36144ab334d556989406837336c1d05215a9bdf44c0bc1d1ac1cb637"}, + {file = "coverage-7.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477c9430ad5d1b80b07f3c12f7120eef40bfbf849e9e7859e53b9c93b922d2af"}, + {file = "coverage-7.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce2ee86ca75f9f96072295c5ebb4ef2a43cecf2870b0ca5e7a1cbdd929cf67e1"}, + {file = "coverage-7.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68d8a0426b49c053013e631c0cdc09b952d857efa8f68121746b339912d27a12"}, + {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b3eb0c93e2ea6445b2173da48cb548364f8f65bf68f3d090404080d338e3a689"}, + {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:90b6e2f0f66750c5a1178ffa9370dec6c508a8ca5265c42fbad3ccac210a7977"}, + {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:96d7d761aea65b291a98c84e1250cd57b5b51726821a6f2f8df65db89363be51"}, + {file = "coverage-7.3.0-cp310-cp310-win32.whl", hash = "sha256:63c5b8ecbc3b3d5eb3a9d873dec60afc0cd5ff9d9f1c75981d8c31cfe4df8527"}, + {file = "coverage-7.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:97c44f4ee13bce914272589b6b41165bbb650e48fdb7bd5493a38bde8de730a1"}, + {file = "coverage-7.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74c160285f2dfe0acf0f72d425f3e970b21b6de04157fc65adc9fd07ee44177f"}, + {file = "coverage-7.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b543302a3707245d454fc49b8ecd2c2d5982b50eb63f3535244fd79a4be0c99d"}, + {file = "coverage-7.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad0f87826c4ebd3ef484502e79b39614e9c03a5d1510cfb623f4a4a051edc6fd"}, + {file = "coverage-7.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13c6cbbd5f31211d8fdb477f0f7b03438591bdd077054076eec362cf2207b4a7"}, + {file = "coverage-7.3.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fac440c43e9b479d1241fe9d768645e7ccec3fb65dc3a5f6e90675e75c3f3e3a"}, + {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3c9834d5e3df9d2aba0275c9f67989c590e05732439b3318fa37a725dff51e74"}, + {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4c8e31cf29b60859876474034a83f59a14381af50cbe8a9dbaadbf70adc4b214"}, + {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7a9baf8e230f9621f8e1d00c580394a0aa328fdac0df2b3f8384387c44083c0f"}, + {file = "coverage-7.3.0-cp311-cp311-win32.whl", hash = "sha256:ccc51713b5581e12f93ccb9c5e39e8b5d4b16776d584c0f5e9e4e63381356482"}, + {file = "coverage-7.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:887665f00ea4e488501ba755a0e3c2cfd6278e846ada3185f42d391ef95e7e70"}, + {file = "coverage-7.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d000a739f9feed900381605a12a61f7aaced6beae832719ae0d15058a1e81c1b"}, + {file = "coverage-7.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59777652e245bb1e300e620ce2bef0d341945842e4eb888c23a7f1d9e143c446"}, + {file = "coverage-7.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9737bc49a9255d78da085fa04f628a310c2332b187cd49b958b0e494c125071"}, + {file = "coverage-7.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5247bab12f84a1d608213b96b8af0cbb30d090d705b6663ad794c2f2a5e5b9fe"}, + {file = "coverage-7.3.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2ac9a1de294773b9fa77447ab7e529cf4fe3910f6a0832816e5f3d538cfea9a"}, + {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:85b7335c22455ec12444cec0d600533a238d6439d8d709d545158c1208483873"}, + {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:36ce5d43a072a036f287029a55b5c6a0e9bd73db58961a273b6dc11a2c6eb9c2"}, + {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:211a4576e984f96d9fce61766ffaed0115d5dab1419e4f63d6992b480c2bd60b"}, + {file = "coverage-7.3.0-cp312-cp312-win32.whl", hash = "sha256:56afbf41fa4a7b27f6635bc4289050ac3ab7951b8a821bca46f5b024500e6321"}, + {file = "coverage-7.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f297e0c1ae55300ff688568b04ff26b01c13dfbf4c9d2b7d0cb688ac60df479"}, + {file = "coverage-7.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac0dec90e7de0087d3d95fa0533e1d2d722dcc008bc7b60e1143402a04c117c1"}, + {file = "coverage-7.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:438856d3f8f1e27f8e79b5410ae56650732a0dcfa94e756df88c7e2d24851fcd"}, + {file = "coverage-7.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1084393c6bda8875c05e04fce5cfe1301a425f758eb012f010eab586f1f3905e"}, + {file = "coverage-7.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49ab200acf891e3dde19e5aa4b0f35d12d8b4bd805dc0be8792270c71bd56c54"}, + {file = "coverage-7.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67e6bbe756ed458646e1ef2b0778591ed4d1fcd4b146fc3ba2feb1a7afd4254"}, + {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f39c49faf5344af36042b293ce05c0d9004270d811c7080610b3e713251c9b0"}, + {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7df91fb24c2edaabec4e0eee512ff3bc6ec20eb8dccac2e77001c1fe516c0c84"}, + {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:34f9f0763d5fa3035a315b69b428fe9c34d4fc2f615262d6be3d3bf3882fb985"}, + {file = "coverage-7.3.0-cp38-cp38-win32.whl", hash = "sha256:bac329371d4c0d456e8d5f38a9b0816b446581b5f278474e416ea0c68c47dcd9"}, + {file = "coverage-7.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:b859128a093f135b556b4765658d5d2e758e1fae3e7cc2f8c10f26fe7005e543"}, + {file = "coverage-7.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed8d310afe013db1eedd37176d0839dc66c96bcfcce8f6607a73ffea2d6ba"}, + {file = "coverage-7.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61260ec93f99f2c2d93d264b564ba912bec502f679793c56f678ba5251f0393"}, + {file = "coverage-7.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97af9554a799bd7c58c0179cc8dbf14aa7ab50e1fd5fa73f90b9b7215874ba28"}, + {file = "coverage-7.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3558e5b574d62f9c46b76120a5c7c16c4612dc2644c3d48a9f4064a705eaee95"}, + {file = "coverage-7.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37d5576d35fcb765fca05654f66aa71e2808d4237d026e64ac8b397ffa66a56a"}, + {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:07ea61bcb179f8f05ffd804d2732b09d23a1238642bf7e51dad62082b5019b34"}, + {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:80501d1b2270d7e8daf1b64b895745c3e234289e00d5f0e30923e706f110334e"}, + {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4eddd3153d02204f22aef0825409091a91bf2a20bce06fe0f638f5c19a85de54"}, + {file = "coverage-7.3.0-cp39-cp39-win32.whl", hash = "sha256:2d22172f938455c156e9af2612650f26cceea47dc86ca048fa4e0b2d21646ad3"}, + {file = "coverage-7.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:60f64e2007c9144375dd0f480a54d6070f00bb1a28f65c408370544091c9bc9e"}, + {file = "coverage-7.3.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:5492a6ce3bdb15c6ad66cb68a0244854d9917478877a25671d70378bdc8562d0"}, + {file = "coverage-7.3.0.tar.gz", hash = "sha256:49dbb19cdcafc130f597d9e04a29d0a032ceedf729e41b181f51cd170e6ee865"}, ] - [package.dependencies] tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} @@ -432,9 +520,12 @@ toml = ["tomli"] name = "croniter" version = "1.0.15" description = "croniter provides iteration for datetime object with cron like format" -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "croniter-1.0.15-py2.py3-none-any.whl", hash = "sha256:0f97b361fe343301a8f66f852e7d84e4fb7f21379948f71e1bbfe10f5d015fbd"}, + {file = "croniter-1.0.15.tar.gz", hash = "sha256:a70dfc9d52de9fc1a886128b9148c89dd9e76b67d55f46516ca94d2d73d58219"}, +] [package.dependencies] python-dateutil = "*" @@ -443,17 +534,23 @@ python-dateutil = "*" name = "cycler" version = "0.11.0" description = "Composable style cycles" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, + {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, +] [[package]] name = "dask" version = "2021.11.2" description = "Parallel PyData with Task Scheduling" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "dask-2021.11.2-py3-none-any.whl", hash = "sha256:2b0ad7beba8950add4fdc7c5cb94fa9444915ddb00c711d5743e2c4bb0a95ef5"}, + {file = "dask-2021.11.2.tar.gz", hash = "sha256:e12bfe272928d62fa99623d98d0e0b0c045b33a47509ef31a22175aa5fd10917"}, +] [package.dependencies] cloudpickle = ">=1.1.1" @@ -469,15 +566,18 @@ complete = ["bokeh (>=1.0.0,!=2.0.0)", "distributed (==2021.11.2)", "jinja2", "n dataframe = ["numpy (>=1.18)", "pandas (>=1.0)"] diagnostics = ["bokeh (>=1.0.0,!=2.0.0)", "jinja2"] distributed = ["distributed (==2021.11.2)"] -test = ["pytest", "pytest-rerunfailures", "pytest-xdist", "pre-commit"] +test = ["pre-commit", "pytest", "pytest-rerunfailures", "pytest-xdist"] [[package]] name = "db-dtypes" version = "1.1.1" description = "Pandas Data Types for SQL systems (BigQuery, Spanner)" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "db-dtypes-1.1.1.tar.gz", hash = "sha256:ab485c85fef2454f3182427def0b0a3ab179b2871542787d33ba519d62078883"}, + {file = "db_dtypes-1.1.1-py2.py3-none-any.whl", hash = "sha256:23be34ea2bc91065447ecea4d5f107e46d1de223d152e69fa73673a62d5bd27d"}, +] [package.dependencies] numpy = ">=1.16.6" @@ -489,46 +589,47 @@ pyarrow = ">=3.0.0" name = "dbt-client" version = "0.1.3" description = "A simple client for DBT RPC instances" -category = "main" optional = false python-versions = ">=3.8,<4.0" +files = [ + {file = "dbt-client-0.1.3.tar.gz", hash = "sha256:192fff51a51d6d002d4048dd494e601592599e004c0f31f1ea5156aa6d516cf5"}, + {file = "dbt_client-0.1.3-py3-none-any.whl", hash = "sha256:31a0db4844c1559c95c643a6f57d1e39d4e9c3b4d9a8c867f7b3e6ed75cedca0"}, +] [package.dependencies] requests = ">=2.26.0,<3.0.0" [[package]] name = "debugpy" -version = "1.6.7" +version = "1.6.7.post1" description = "An implementation of the Debug Adapter Protocol for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "debugpy-1.6.7-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b3e7ac809b991006ad7f857f016fa92014445085711ef111fdc3f74f66144096"}, - {file = "debugpy-1.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3876611d114a18aafef6383695dfc3f1217c98a9168c1aaf1a02b01ec7d8d1e"}, - {file = "debugpy-1.6.7-cp310-cp310-win32.whl", hash = "sha256:33edb4afa85c098c24cc361d72ba7c21bb92f501104514d4ffec1fb36e09c01a"}, - {file = "debugpy-1.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:ed6d5413474e209ba50b1a75b2d9eecf64d41e6e4501977991cdc755dc83ab0f"}, - {file = "debugpy-1.6.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:38ed626353e7c63f4b11efad659be04c23de2b0d15efff77b60e4740ea685d07"}, - {file = "debugpy-1.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279d64c408c60431c8ee832dfd9ace7c396984fd7341fa3116aee414e7dcd88d"}, - {file = "debugpy-1.6.7-cp37-cp37m-win32.whl", hash = "sha256:dbe04e7568aa69361a5b4c47b4493d5680bfa3a911d1e105fbea1b1f23f3eb45"}, - {file = "debugpy-1.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f90a2d4ad9a035cee7331c06a4cf2245e38bd7c89554fe3b616d90ab8aab89cc"}, - {file = "debugpy-1.6.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5224eabbbeddcf1943d4e2821876f3e5d7d383f27390b82da5d9558fd4eb30a9"}, - {file = "debugpy-1.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae1123dff5bfe548ba1683eb972329ba6d646c3a80e6b4c06cd1b1dd0205e9b"}, - {file = "debugpy-1.6.7-cp38-cp38-win32.whl", hash = "sha256:9cd10cf338e0907fdcf9eac9087faa30f150ef5445af5a545d307055141dd7a4"}, - {file = "debugpy-1.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:aaf6da50377ff4056c8ed470da24632b42e4087bc826845daad7af211e00faad"}, - {file = "debugpy-1.6.7-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0679b7e1e3523bd7d7869447ec67b59728675aadfc038550a63a362b63029d2c"}, - {file = "debugpy-1.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de86029696e1b3b4d0d49076b9eba606c226e33ae312a57a46dca14ff370894d"}, - {file = "debugpy-1.6.7-cp39-cp39-win32.whl", hash = "sha256:d71b31117779d9a90b745720c0eab54ae1da76d5b38c8026c654f4a066b0130a"}, - {file = "debugpy-1.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:c0ff93ae90a03b06d85b2c529eca51ab15457868a377c4cc40a23ab0e4e552a3"}, - {file = "debugpy-1.6.7-py2.py3-none-any.whl", hash = "sha256:53f7a456bc50706a0eaabecf2d3ce44c4d5010e46dfc65b6b81a518b42866267"}, - {file = "debugpy-1.6.7.zip", hash = "sha256:c4c2f0810fa25323abfdfa36cbbbb24e5c3b1a42cb762782de64439c575d67f2"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:903bd61d5eb433b6c25b48eae5e23821d4c1a19e25c9610205f5aeaccae64e32"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16882030860081e7dd5aa619f30dec3c2f9a421e69861125f83cc372c94e57d"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-win32.whl", hash = "sha256:eea8d8cfb9965ac41b99a61f8e755a8f50e9a20330938ad8271530210f54e09c"}, + {file = "debugpy-1.6.7.post1-cp310-cp310-win_amd64.whl", hash = "sha256:85969d864c45f70c3996067cfa76a319bae749b04171f2cdeceebe4add316155"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:890f7ab9a683886a0f185786ffbda3b46495c4b929dab083b8c79d6825832a52"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4ac7a4dba28801d184b7fc0e024da2635ca87d8b0a825c6087bb5168e3c0d28"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-win32.whl", hash = "sha256:3370ef1b9951d15799ef7af41f8174194f3482ee689988379763ef61a5456426"}, + {file = "debugpy-1.6.7.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:65b28435a17cba4c09e739621173ff90c515f7b9e8ea469b92e3c28ef8e5cdfb"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:92b6dae8bfbd497c90596bbb69089acf7954164aea3228a99d7e43e5267f5b36"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72f5d2ecead8125cf669e62784ef1e6300f4067b0f14d9f95ee00ae06fc7c4f7"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-win32.whl", hash = "sha256:f0851403030f3975d6e2eaa4abf73232ab90b98f041e3c09ba33be2beda43fcf"}, + {file = "debugpy-1.6.7.post1-cp38-cp38-win_amd64.whl", hash = "sha256:3de5d0f97c425dc49bce4293df6a04494309eedadd2b52c22e58d95107e178d9"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:38651c3639a4e8bbf0ca7e52d799f6abd07d622a193c406be375da4d510d968d"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:038c51268367c9c935905a90b1c2d2dbfe304037c27ba9d19fe7409f8cdc710c"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-win32.whl", hash = "sha256:4b9eba71c290852f959d2cf8a03af28afd3ca639ad374d393d53d367f7f685b2"}, + {file = "debugpy-1.6.7.post1-cp39-cp39-win_amd64.whl", hash = "sha256:973a97ed3b434eab0f792719a484566c35328196540676685c975651266fccf9"}, + {file = "debugpy-1.6.7.post1-py2.py3-none-any.whl", hash = "sha256:1093a5c541af079c13ac8c70ab8b24d1d35c8cacb676306cf11e57f699c02926"}, + {file = "debugpy-1.6.7.post1.zip", hash = "sha256:fe87ec0182ef624855d05e6ed7e0b7cb1359d2ffa2a925f8ec2d22e98b75d0ca"}, ] [[package]] name = "decorator" version = "5.1.1" description = "Decorators for Humans" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -538,30 +639,39 @@ files = [ [[package]] name = "dill" -version = "0.3.6" -description = "serialize all of python" -category = "main" +version = "0.3.7" +description = "serialize all of Python" optional = false python-versions = ">=3.7" +files = [ + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, +] [package.extras] graph = ["objgraph (>=1.7.2)"] [[package]] name = "distlib" -version = "0.3.6" +version = "0.3.7" description = "Distribution utilities" -category = "main" optional = false python-versions = "*" +files = [ + {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, + {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, +] [[package]] name = "distributed" version = "2021.11.2" description = "Distributed scheduler for Dask" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "distributed-2021.11.2-py3-none-any.whl", hash = "sha256:af1f7b98d85d43886fefe2354379c848c7a5aa6ae4d2313a7aca9ab9081a7e56"}, + {file = "distributed-2021.11.2.tar.gz", hash = "sha256:f86a01a2e1e678865d2e42300c47552b5012cd81a2d354e47827a1fd074cc302"}, +] [package.dependencies] click = ">=6.6" @@ -571,6 +681,7 @@ jinja2 = "*" msgpack = ">=0.6.0" psutil = ">=5.0" pyyaml = "*" +setuptools = "*" sortedcontainers = "<2.0.0 || >2.0.0,<2.0.1 || >2.0.1" tblib = ">=1.6.0" toolz = ">=0.8.2" @@ -581,9 +692,12 @@ zict = ">=0.1.3" name = "docker" version = "5.0.3" description = "A Python library for the Docker Engine API." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "docker-5.0.3-py2.py3-none-any.whl", hash = "sha256:7a79bb439e3df59d0a72621775d600bc8bc8b422d285824cb37103eab91d1ce0"}, + {file = "docker-5.0.3.tar.gz", hash = "sha256:d916a26b62970e7c2f554110ed6af04c7ccff8e9f81ad17d0d40c75637e227fb"}, +] [package.dependencies] pywin32 = {version = "227", markers = "sys_platform == \"win32\""} @@ -592,29 +706,22 @@ websocket-client = ">=0.32.0" [package.extras] ssh = ["paramiko (>=2.4.2)"] -tls = ["pyOpenSSL (>=17.5.0)", "cryptography (>=3.4.7)", "idna (>=2.0.0)"] +tls = ["cryptography (>=3.4.7)", "idna (>=2.0.0)", "pyOpenSSL (>=17.5.0)"] [[package]] name = "docopt" version = "0.6.2" description = "Pythonic argument parser, that will make you smile" -category = "main" optional = false python-versions = "*" - -[[package]] -name = "et-xmlfile" -version = "1.1.0" -description = "An implementation of lxml.xmlfile for the standard library" -category = "main" -optional = false -python-versions = ">=3.6" +files = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] [[package]] name = "entrypoints" version = "0.4" description = "Discover and load entry points from installed packages." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -626,7 +733,6 @@ files = [ name = "et-xmlfile" version = "1.1.0" description = "An implementation of lxml.xmlfile for the standard library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -636,21 +742,22 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.1.1" +version = "1.1.3" description = "Backport of PEP 654 (exception groups)" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, +] [package.extras] test = ["pytest (>=6)"] [[package]] - name = "executing" version = "1.2.0" description = "Get the currently executing AST node of a frame, and other information" -category = "dev" optional = false python-versions = "*" files = [ @@ -661,55 +768,117 @@ files = [ [package.extras] tests = ["asttokens", "littleutils", "pytest", "rich"] +[[package]] name = "fake-useragent" -version = "1.1.3" +version = "1.2.1" description = "Up-to-date simple useragent faker with real world database" -category = "main" optional = false python-versions = "*" +files = [ + {file = "fake-useragent-1.2.1.tar.gz", hash = "sha256:b411f903331f695e3840ccadcf011f745a405764e97c588f2b8fde9e400a5446"}, + {file = "fake_useragent-1.2.1-py3-none-any.whl", hash = "sha256:ad2b5414d19493d0789572f04200d4f656f84d20b205cc805233212957fe385d"}, +] [package.dependencies] importlib-resources = {version = ">=5.0", markers = "python_version < \"3.10\""} - [[package]] name = "fastavro" version = "1.5.4" description = "Fast read/write of AVRO files" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "fastavro-1.5.4-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:d316cc476b2b24ef06402b8bfa047f8f72a9d6df2de777bb30d9ededda7e3a02"}, + {file = "fastavro-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8459faec46e34f2dfeb9b70ee8c36e935e626cff8608d675724718987a5f9ce5"}, + {file = "fastavro-1.5.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd44636d7ff8365a57b88707b747371fffb676c8c1f68c0d423ec36623888668"}, + {file = "fastavro-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:2402428b26d3c08a58acfa723833e19fb75077872bcb2475a4c81195cdae6a5d"}, + {file = "fastavro-1.5.4-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:5afc14398f4191d1a807aa59d2fba5ed869b31343679ec43dbc289db0a8e35c5"}, + {file = "fastavro-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5217e9713a3ea03205532394fba4d743749155b04b10b12a12fc26d225b89792"}, + {file = "fastavro-1.5.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e93a5eecb28cc35d670c9c4df70223fa9bcd6d9ca21b38b1b7ae13ece60c7fb"}, + {file = "fastavro-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:1a2f2465efd0e7de557c4034e8d4d88a132750cfa51e1582362a1b3a1a9fa911"}, + {file = "fastavro-1.5.4-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f7d5bc76c03c692d9acea0e5d5baceec19e1c059b26cb8ae9f4481e842be95a5"}, + {file = "fastavro-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80fe920229ab1f40eccb1b4918481cdd8a20e5e7dce19308ab38b23732da8a70"}, + {file = "fastavro-1.5.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3d190aee86ab73caa1aa550eba850be2ca5dd29d814b38720f4e300184e01d5"}, + {file = "fastavro-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:b6c30299a49b11f42251cb81c8e15db67750642eac7ba5c194a5ee95c83ebb11"}, + {file = "fastavro-1.5.4-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:1f7685f3a3c38352abab432bad2f9f2229a0e5f5f8548831e887c30f8396f2e9"}, + {file = "fastavro-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd021ec850fd30020b7c4fa868466fb7f95450f1f06eac92bd2204cbd8e45fb8"}, + {file = "fastavro-1.5.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06a7b5602dfa032c92f20ca90b8bde88251573773e501bedf5e8b76b9feb14a3"}, + {file = "fastavro-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:18250aa2ab0f7a095b1865565cf9976ea4605c201129636e6defe24ec3ef112c"}, + {file = "fastavro-1.5.4.tar.gz", hash = "sha256:d86f72c966713fb699570a18f7960cf4110b069c70681d7538be8d671c9db7c8"}, +] [package.extras] -codecs = ["python-snappy", "zstandard", "lz4"] +codecs = ["lz4", "python-snappy", "zstandard"] lz4 = ["lz4"] snappy = ["python-snappy"] zstandard = ["zstandard"] [[package]] name = "filelock" -version = "3.12.2" +version = "3.12.3" description = "A platform independent file lock." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "filelock-3.12.3-py3-none-any.whl", hash = "sha256:f067e40ccc40f2b48395a80fcbd4728262fab54e232e090a4063ab804179efeb"}, + {file = "filelock-3.12.3.tar.gz", hash = "sha256:0ecc1dd2ec4672a10c8550a8182f1bd0c0a5088470ecd5a125e45f49472fac3d"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.11\""} [package.extras] -docs = ["furo (>=2023.5.20)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)", "sphinx (>=7.0.1)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)", "pytest (>=7.3.1)"] +docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] [[package]] name = "fonttools" -version = "4.40.0" +version = "4.42.1" description = "Tools to manipulate font files" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "fonttools-4.42.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ed1a13a27f59d1fc1920394a7f596792e9d546c9ca5a044419dca70c37815d7c"}, + {file = "fonttools-4.42.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9b1ce7a45978b821a06d375b83763b27a3a5e8a2e4570b3065abad240a18760"}, + {file = "fonttools-4.42.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f720fa82a11c0f9042376fd509b5ed88dab7e3cd602eee63a1af08883b37342b"}, + {file = "fonttools-4.42.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db55cbaea02a20b49fefbd8e9d62bd481aaabe1f2301dabc575acc6b358874fa"}, + {file = "fonttools-4.42.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a35981d90feebeaef05e46e33e6b9e5b5e618504672ca9cd0ff96b171e4bfff"}, + {file = "fonttools-4.42.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:68a02bbe020dc22ee0540e040117535f06df9358106d3775e8817d826047f3fd"}, + {file = "fonttools-4.42.1-cp310-cp310-win32.whl", hash = "sha256:12a7c247d1b946829bfa2f331107a629ea77dc5391dfd34fdcd78efa61f354ca"}, + {file = "fonttools-4.42.1-cp310-cp310-win_amd64.whl", hash = "sha256:a398bdadb055f8de69f62b0fc70625f7cbdab436bbb31eef5816e28cab083ee8"}, + {file = "fonttools-4.42.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:689508b918332fb40ce117131633647731d098b1b10d092234aa959b4251add5"}, + {file = "fonttools-4.42.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e36344e48af3e3bde867a1ca54f97c308735dd8697005c2d24a86054a114a71"}, + {file = "fonttools-4.42.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19b7db825c8adee96fac0692e6e1ecd858cae9affb3b4812cdb9d934a898b29e"}, + {file = "fonttools-4.42.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:113337c2d29665839b7d90b39f99b3cac731f72a0eda9306165a305c7c31d341"}, + {file = "fonttools-4.42.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:37983b6bdab42c501202500a2be3a572f50d4efe3237e0686ee9d5f794d76b35"}, + {file = "fonttools-4.42.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6ed2662a3d9c832afa36405f8748c250be94ae5dfc5283d668308391f2102861"}, + {file = "fonttools-4.42.1-cp311-cp311-win32.whl", hash = "sha256:179737095eb98332a2744e8f12037b2977f22948cf23ff96656928923ddf560a"}, + {file = "fonttools-4.42.1-cp311-cp311-win_amd64.whl", hash = "sha256:f2b82f46917d8722e6b5eafeefb4fb585d23babd15d8246c664cd88a5bddd19c"}, + {file = "fonttools-4.42.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:62f481ac772fd68901573956231aea3e4b1ad87b9b1089a61613a91e2b50bb9b"}, + {file = "fonttools-4.42.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2f806990160d1ce42d287aa419df3ffc42dfefe60d473695fb048355fe0c6a0"}, + {file = "fonttools-4.42.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db372213d39fa33af667c2aa586a0c1235e88e9c850f5dd5c8e1f17515861868"}, + {file = "fonttools-4.42.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d18fc642fd0ac29236ff88ecfccff229ec0386090a839dd3f1162e9a7944a40"}, + {file = "fonttools-4.42.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8708b98c278012ad267ee8a7433baeb809948855e81922878118464b274c909d"}, + {file = "fonttools-4.42.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c95b0724a6deea2c8c5d3222191783ced0a2f09bd6d33f93e563f6f1a4b3b3a4"}, + {file = "fonttools-4.42.1-cp38-cp38-win32.whl", hash = "sha256:4aa79366e442dbca6e2c8595645a3a605d9eeabdb7a094d745ed6106816bef5d"}, + {file = "fonttools-4.42.1-cp38-cp38-win_amd64.whl", hash = "sha256:acb47f6f8680de24c1ab65ebde39dd035768e2a9b571a07c7b8da95f6c8815fd"}, + {file = "fonttools-4.42.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5fb289b7a815638a7613d46bcf324c9106804725b2bb8ad913c12b6958ffc4ec"}, + {file = "fonttools-4.42.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:53eb5091ddc8b1199330bb7b4a8a2e7995ad5d43376cadce84523d8223ef3136"}, + {file = "fonttools-4.42.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46a0ec8adbc6ff13494eb0c9c2e643b6f009ce7320cf640de106fb614e4d4360"}, + {file = "fonttools-4.42.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cc7d685b8eeca7ae69dc6416833fbfea61660684b7089bca666067cb2937dcf"}, + {file = "fonttools-4.42.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:be24fcb80493b2c94eae21df70017351851652a37de514de553435b256b2f249"}, + {file = "fonttools-4.42.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:515607ec756d7865f23070682622c49d922901943697871fc292277cf1e71967"}, + {file = "fonttools-4.42.1-cp39-cp39-win32.whl", hash = "sha256:0eb79a2da5eb6457a6f8ab904838454accc7d4cccdaff1fd2bd3a0679ea33d64"}, + {file = "fonttools-4.42.1-cp39-cp39-win_amd64.whl", hash = "sha256:7286aed4ea271df9eab8d7a9b29e507094b51397812f7ce051ecd77915a6e26b"}, + {file = "fonttools-4.42.1-py3-none-any.whl", hash = "sha256:9398f244e28e0596e2ee6024f808b06060109e33ed38dcc9bded452fd9bbb853"}, + {file = "fonttools-4.42.1.tar.gz", hash = "sha256:c391cd5af88aacaf41dd7cfb96eeedfad297b5899a39e12f4c2c3706d0a3329d"}, +] [package.extras] -all = ["fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "zopfli (>=0.1.4)", "lz4 (>=1.7.4.2)", "matplotlib", "sympy", "skia-pathops (>=0.5.0)", "uharfbuzz (>=0.23.0)", "brotlicffi (>=0.8.0)", "scipy", "brotli (>=1.0.1)", "munkres", "unicodedata2 (>=15.0.0)", "xattr"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["scipy", "munkres"] +interpolatable = ["munkres", "scipy"] lxml = ["lxml (>=4.0,<5)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] @@ -718,22 +887,25 @@ symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] unicode = ["unicodedata2 (>=15.0.0)"] -woff = ["zopfli (>=0.1.4)", "brotlicffi (>=0.8.0)", "brotli (>=1.0.1)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "fsspec" version = "2021.11.1" description = "File-system specification" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "fsspec-2021.11.1-py3-none-any.whl", hash = "sha256:bcb136caa37e1470dd8314a7d3917cb9b25dd9da44c10d36df556ab4ef038185"}, + {file = "fsspec-2021.11.1.tar.gz", hash = "sha256:03683e606651d5e4bd9180525d57477bd5430e5dc68d2e459835dc14cecc3dd4"}, +] [package.extras] abfs = ["adlfs"] adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] -dropbox = ["dropboxdrivefs", "requests", "dropbox"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] entrypoints = ["importlib-metadata"] fuse = ["fusepy"] gcs = ["gcsfs"] @@ -742,7 +914,7 @@ github = ["requests"] gs = ["gcsfs"] gui = ["panel"] hdfs = ["pyarrow (>=1)"] -http = ["requests", "aiohttp"] +http = ["aiohttp", "requests"] libarchive = ["libarchive-c"] oci = ["ocifs"] s3 = ["s3fs"] @@ -754,12 +926,15 @@ ssh = ["paramiko"] name = "google-analytics-data" version = "0.12.1" description = "" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "google-analytics-data-0.12.1.tar.gz", hash = "sha256:8d5436797338683ff80988d6303e1bbeca01a1d7ece73c248fe2315aa2ae70dc"}, + {file = "google_analytics_data-0.12.1-py2.py3-none-any.whl", hash = "sha256:320a16df6624606abbceef85c6b0a67727eff48f27da347630929b3ee28cd5ff"}, +] [package.dependencies] -google-api-core = {version = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} +google-api-core = {version = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} proto-plus = ">=1.15.0,<2.0.0dev" protobuf = ">=3.19.0,<4.0.0dev" @@ -767,9 +942,12 @@ protobuf = ">=3.19.0,<4.0.0dev" name = "google-api-core" version = "1.31.5" description = "Google API client core library" -category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +files = [ + {file = "google-api-core-1.31.5.tar.gz", hash = "sha256:85d2074f2c8f9c07e614d7f978767d71ceb7d40647814ef4236d3a0ef671ee75"}, + {file = "google_api_core-1.31.5-py2.py3-none-any.whl", hash = "sha256:6815207a8b422e9da42c200681603f304b25f98c98b675a9db9fdc3717e44280"}, +] [package.dependencies] google-auth = ">=1.25.0,<2.0dev" @@ -779,6 +957,7 @@ packaging = ">=14.3" protobuf = {version = ">=3.12.0", markers = "python_version > \"3\""} pytz = "*" requests = ">=2.18.0,<3.0.0dev" +setuptools = ">=40.3.0" six = ">=1.13.0" [package.extras] @@ -788,14 +967,17 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2)"] [[package]] name = "google-api-python-client" -version = "2.91.0" +version = "2.97.0" description = "Google API Client Library for Python" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "google-api-python-client-2.97.0.tar.gz", hash = "sha256:48277291894876a1ca7ed4127e055e81f81e6343ced1b544a7200ae2c119dcd7"}, + {file = "google_api_python_client-2.97.0-py2.py3-none-any.whl", hash = "sha256:5215f4cd577753fc4192ccfbe0bb8b55d4bb5fd68fa6268ac5cf271b6305de31"}, +] [package.dependencies] -google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0.dev0" +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0.dev0" google-auth = ">=1.19.0,<3.0.0.dev0" google-auth-httplib2 = ">=0.1.0" httplib2 = ">=0.15.0,<1.dev0" @@ -805,18 +987,22 @@ uritemplate = ">=3.0.1,<5" name = "google-auth" version = "1.35.0" description = "Google Authentication Library" -category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +files = [ + {file = "google-auth-1.35.0.tar.gz", hash = "sha256:b7033be9028c188ee30200b204ea00ed82ea1162e8ac1df4aa6ded19a191d88e"}, + {file = "google_auth-1.35.0-py2.py3-none-any.whl", hash = "sha256:997516b42ecb5b63e8d80f5632c1a61dddf41d2a4c2748057837e06e00014258"}, +] [package.dependencies] cachetools = ">=2.0.0,<5.0" pyasn1-modules = ">=0.2.1" rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} +setuptools = ">=40.3.0" six = ">=1.9.0" [package.extras] -aiohttp = ["requests (>=2.20.0,<3.0.0dev)", "aiohttp (>=3.6.2,<4.0.0dev)"] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] pyopenssl = ["pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] @@ -824,9 +1010,12 @@ reauth = ["pyu2f (>=0.1.5)"] name = "google-auth-httplib2" version = "0.1.0" description = "Google Authentication Library: httplib2 transport" -category = "main" optional = false python-versions = "*" +files = [ + {file = "google-auth-httplib2-0.1.0.tar.gz", hash = "sha256:a07c39fd632becacd3f07718dfd6021bf396978f03ad3ce4321d060015cc30ac"}, + {file = "google_auth_httplib2-0.1.0-py2.py3-none-any.whl", hash = "sha256:31e49c36c6b5643b57e82617cb3e021e3e1d2df9da63af67252c02fa9c1f4a10"}, +] [package.dependencies] google-auth = "*" @@ -837,9 +1026,12 @@ six = "*" name = "google-auth-oauthlib" version = "0.4.6" description = "Google Authentication Library" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "google-auth-oauthlib-0.4.6.tar.gz", hash = "sha256:a90a072f6993f2c327067bf65270046384cda5a8ecb20b94ea9a687f1f233a7a"}, + {file = "google_auth_oauthlib-0.4.6-py2.py3-none-any.whl", hash = "sha256:3f2a6e802eebbb6fb736a370fbf3b055edcb6b52878bf2f26330b5e041316c73"}, +] [package.dependencies] google-auth = ">=1.0.0" @@ -852,9 +1044,12 @@ tool = ["click (>=6.0.0)"] name = "google-cloud-bigquery" version = "2.30.1" description = "Google BigQuery API client library" -category = "main" optional = false python-versions = ">=3.6, <3.11" +files = [ + {file = "google-cloud-bigquery-2.30.1.tar.gz", hash = "sha256:4e3b5e3dcc475d5a601d84872ac0b63e059540be2251b1c4165c51106d572855"}, + {file = "google_cloud_bigquery-2.30.1-py2.py3-none-any.whl", hash = "sha256:c62d601aa0f62388e1909d11de40db7597b02fb8602ccb7f21a3ac2a0997495b"}, +] [package.dependencies] google-api-core = {version = ">=1.29.0,<3.0.0dev", extras = ["grpc"]} @@ -868,11 +1063,11 @@ python-dateutil = ">=2.7.2,<3.0dev" requests = ">=2.18.0,<3.0.0dev" [package.extras] -all = ["google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.38.1,<2.0dev)", "pyarrow (>=3.0.0,<7.0dev)", "geopandas (>=0.9.0,<1.0dev)", "Shapely (>=1.6.0,<2.0dev)", "pandas (>=0.24.2)", "tqdm (>=4.7.4,<5.0.0dev)", "opentelemetry-api (>=0.11b0)", "opentelemetry-sdk (>=0.11b0)", "opentelemetry-instrumentation (>=0.11b0)"] -bignumeric_type = ["pyarrow (>=3.0.0,<7.0dev)"] +all = ["Shapely (>=1.6.0,<2.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.38.1,<2.0dev)", "opentelemetry-api (>=0.11b0)", "opentelemetry-instrumentation (>=0.11b0)", "opentelemetry-sdk (>=0.11b0)", "pandas (>=0.24.2)", "pyarrow (>=3.0.0,<7.0dev)", "tqdm (>=4.7.4,<5.0.0dev)"] +bignumeric-type = ["pyarrow (>=3.0.0,<7.0dev)"] bqstorage = ["google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.38.1,<2.0dev)", "pyarrow (>=3.0.0,<7.0dev)"] -geopandas = ["geopandas (>=0.9.0,<1.0dev)", "Shapely (>=1.6.0,<2.0dev)"] -opentelemetry = ["opentelemetry-api (>=0.11b0)", "opentelemetry-sdk (>=0.11b0)", "opentelemetry-instrumentation (>=0.11b0)"] +geopandas = ["Shapely (>=1.6.0,<2.0dev)", "geopandas (>=0.9.0,<1.0dev)"] +opentelemetry = ["opentelemetry-api (>=0.11b0)", "opentelemetry-instrumentation (>=0.11b0)", "opentelemetry-sdk (>=0.11b0)"] pandas = ["pandas (>=0.24.2)", "pyarrow (>=3.0.0,<7.0dev)"] tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] @@ -880,9 +1075,12 @@ tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] name = "google-cloud-bigquery-storage" version = "1.1.0" description = "BigQuery Storage API API client library" -category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +files = [ + {file = "google-cloud-bigquery-storage-1.1.0.tar.gz", hash = "sha256:c92533cedbb672f1a35555c112d4d5cccb9f8f6d0e98a604fbf98223773adad3"}, + {file = "google_cloud_bigquery_storage-1.1.0-py2.py3-none-any.whl", hash = "sha256:fc543e9d2343d34c043ad48984333ba84de10be31b7af8435548aaf8555507c4"}, +] [package.dependencies] google-api-core = {version = ">=1.14.0,<2.0.0dev", extras = ["grpc"]} @@ -896,9 +1094,12 @@ pyarrow = ["pyarrow (>=0.15.0)"] name = "google-cloud-core" version = "2.2.1" description = "Google Cloud API client core library" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "google-cloud-core-2.2.1.tar.gz", hash = "sha256:476d1f71ab78089e0638e0aaf34bfdc99bab4fce8f4170ba6321a5243d13c5c7"}, + {file = "google_cloud_core-2.2.1-py2.py3-none-any.whl", hash = "sha256:ab6cee07791afe4e210807ceeab749da6a076ab16d496ac734bf7e6ffea27486"}, +] [package.dependencies] google-api-core = ">=1.21.0,<3.0.0dev" @@ -911,9 +1112,12 @@ grpc = ["grpcio (>=1.8.2,<2.0dev)"] name = "google-cloud-storage" version = "1.42.3" description = "Google Cloud Storage API client library" -category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +files = [ + {file = "google-cloud-storage-1.42.3.tar.gz", hash = "sha256:7754d4dcaa45975514b404ece0da2bb4292acbc67ca559a69e12a19d54fcdb06"}, + {file = "google_cloud_storage-1.42.3-py2.py3-none-any.whl", hash = "sha256:71ee3a0dcf2c139f034a054181cd7658f1ec8f12837d2769c450a8a00fcd4c6d"}, +] [package.dependencies] google-api-core = {version = ">=1.29.0,<3.0dev", markers = "python_version >= \"3.6\""} @@ -928,9 +1132,53 @@ six = "*" name = "google-crc32c" version = "1.3.0" description = "A python wrapper of the C library 'Google CRC32C'" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "google-crc32c-1.3.0.tar.gz", hash = "sha256:276de6273eb074a35bc598f8efbc00c7869c5cf2e29c90748fccc8c898c244df"}, + {file = "google_crc32c-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cb6994fff247987c66a8a4e550ef374671c2b82e3c0d2115e689d21e511a652d"}, + {file = "google_crc32c-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9da0a39b53d2fab3e5467329ed50e951eb91386e9d0d5b12daf593973c3b168"}, + {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:eb0b14523758e37802f27b7f8cd973f5f3d33be7613952c0df904b68c4842f0e"}, + {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:95c68a4b9b7828ba0428f8f7e3109c5d476ca44996ed9a5f8aac6269296e2d59"}, + {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c3cf890c3c0ecfe1510a452a165431b5831e24160c5fcf2071f0f85ca5a47cd"}, + {file = "google_crc32c-1.3.0-cp310-cp310-win32.whl", hash = "sha256:3bbce1be3687bbfebe29abdb7631b83e6b25da3f4e1856a1611eb21854b689ea"}, + {file = "google_crc32c-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:c124b8c8779bf2d35d9b721e52d4adb41c9bfbde45e6a3f25f0820caa9aba73f"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:42ae4781333e331a1743445931b08ebdad73e188fd554259e772556fc4937c48"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ff71073ebf0e42258a42a0b34f2c09ec384977e7f6808999102eedd5b49920e3"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fe31de3002e7b08eb20823b3735b97c86c5926dd0581c7710a680b418a8709d4"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd7760a88a8d3d705ff562aa93f8445ead54f58fd482e4f9e2bafb7e177375d4"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0b9e622c3b2b8d0ce32f77eba617ab0d6768b82836391e4f8f9e2074582bf02"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-win32.whl", hash = "sha256:779cbf1ce375b96111db98fca913c1f5ec11b1d870e529b1dc7354b2681a8c3a"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:04e7c220798a72fd0f08242bc8d7a05986b2a08a0573396187fd32c1dcdd58b3"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e7a539b9be7b9c00f11ef16b55486141bc2cdb0c54762f84e3c6fc091917436d"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ca60076c388728d3b6ac3846842474f4250c91efbfe5afa872d3ffd69dd4b318"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05340b60bf05b574159e9bd940152a47d38af3fb43803ffe71f11d704b7696a6"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:318f73f5484b5671f0c7f5f63741ab020a599504ed81d209b5c7129ee4667407"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f58099ad7affc0754ae42e6d87443299f15d739b0ce03c76f515153a5cda06c"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-win32.whl", hash = "sha256:f52a4ad2568314ee713715b1e2d79ab55fab11e8b304fd1462ff5cccf4264b3e"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bab4aebd525218bab4ee615786c4581952eadc16b1ff031813a2fd51f0cc7b08"}, + {file = "google_crc32c-1.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dda4d8a3bb0b50f540f6ff4b6033f3a74e8bf0bd5320b70fab2c03e512a62812"}, + {file = "google_crc32c-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fec221a051150eeddfdfcff162e6db92c65ecf46cb0f7bb1bf812a1520ec026b"}, + {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:226f2f9b8e128a6ca6a9af9b9e8384f7b53a801907425c9a292553a3a7218ce0"}, + {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a7f9cbea4245ee36190f85fe1814e2d7b1e5f2186381b082f5d59f99b7f11328"}, + {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a4db36f9721fdf391646685ecffa404eb986cbe007a3289499020daf72e88a2"}, + {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:12674a4c3b56b706153a358eaa1018c4137a5a04635b92b4652440d3d7386206"}, + {file = "google_crc32c-1.3.0-cp38-cp38-win32.whl", hash = "sha256:650e2917660e696041ab3dcd7abac160b4121cd9a484c08406f24c5964099829"}, + {file = "google_crc32c-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:58be56ae0529c664cc04a9c76e68bb92b091e0194d6e3c50bea7e0f266f73713"}, + {file = "google_crc32c-1.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:96a8918a78d5d64e07c8ea4ed2bc44354e3f93f46a4866a40e8db934e4c0d74b"}, + {file = "google_crc32c-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:13af315c3a0eec8bb8b8d80b8b128cb3fcd17d7e4edafc39647846345a3f003a"}, + {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6311853aa2bba4064d0c28ca54e7b50c4d48e3de04f6770f6c60ebda1e975267"}, + {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ed447680ff21c14aaceb6a9f99a5f639f583ccfe4ce1a5e1d48eb41c3d6b3217"}, + {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1c1d6236feab51200272d79b3d3e0f12cf2cbb12b208c835b175a21efdb0a73"}, + {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e0f1ff55dde0ebcfbef027edc21f71c205845585fffe30d4ec4979416613e9b3"}, + {file = "google_crc32c-1.3.0-cp39-cp39-win32.whl", hash = "sha256:fbd60c6aaa07c31d7754edbc2334aef50601b7f1ada67a96eb1eb57c7c72378f"}, + {file = "google_crc32c-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:127f9cc3ac41b6a859bd9dc4321097b1a4f6aa7fdf71b4f9227b9e3ebffb4422"}, + {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fc28e0db232c62ca0c3600884933178f0825c99be4474cdd645e378a10588125"}, + {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1926fd8de0acb9d15ee757175ce7242e235482a783cd4ec711cc999fc103c24e"}, + {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5da2c81575cc3ccf05d9830f9e8d3c70954819ca9a63828210498c0774fda1a3"}, + {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:891f712ce54e0d631370e1f4997b3f182f3368179198efc30d477c75d1f44942"}, + {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:7f6fe42536d9dcd3e2ffb9d3053f5d05221ae3bbcefbe472bdf2c71c793e3183"}, +] [package.extras] testing = ["pytest"] @@ -939,9 +1187,12 @@ testing = ["pytest"] name = "google-resumable-media" version = "2.1.0" description = "Utilities for Google Media Downloads and Resumable Uploads" -category = "main" optional = false python-versions = ">= 3.6" +files = [ + {file = "google-resumable-media-2.1.0.tar.gz", hash = "sha256:725b989e0dd387ef2703d1cc8e86217474217f4549593c477fd94f4024a0f911"}, + {file = "google_resumable_media-2.1.0-py2.py3-none-any.whl", hash = "sha256:cdc75ea0361e39704dc7df7da59fbd419e73c8bc92eac94d8a020d36baa9944b"}, +] [package.dependencies] google-crc32c = ">=1.0,<2.0dev" @@ -954,9 +1205,12 @@ requests = ["requests (>=2.18.0,<3.0.0dev)"] name = "googleapis-common-protos" version = "1.53.0" description = "Common protobufs used in Google APIs" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "googleapis-common-protos-1.53.0.tar.gz", hash = "sha256:a88ee8903aa0a81f6c3cec2d5cf62d3c8aa67c06439b0496b49048fb1854ebf4"}, + {file = "googleapis_common_protos-1.53.0-py2.py3-none-any.whl", hash = "sha256:f6d561ab8fb16b30020b940e2dd01cd80082f4762fa9f3ee670f4419b4b8dbd0"}, +] [package.dependencies] protobuf = ">=3.12.0" @@ -968,9 +1222,54 @@ grpc = ["grpcio (>=1.0.0)"] name = "grpcio" version = "1.42.0" description = "HTTP/2-based RPC framework" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "grpcio-1.42.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:6e5eec67909795f7b1ff2bd941bd6c2661ca5217ea9c35003d73314100786f60"}, + {file = "grpcio-1.42.0-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:8e8cd9909fdd232ecffb954936fd90c935ebe0b5fce36c88813f8247ce54019c"}, + {file = "grpcio-1.42.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:b4d7115ee08a36f3f50a6233bd78280e40847e078d2a5bb39c0ab0db4490d58f"}, + {file = "grpcio-1.42.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b781f412546830be55644f7c48251d30860f4725981862d4a1ea322f80d9cd34"}, + {file = "grpcio-1.42.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e62140c46d8125927c673c72c960cb387c02b2a1a3c6985a8b0a3914d27c0018"}, + {file = "grpcio-1.42.0-cp310-cp310-win32.whl", hash = "sha256:6b69726d7bbb633133c1b0d780b1357aa9b7a7f714fead6470bab1feb8012806"}, + {file = "grpcio-1.42.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6c0b159b38fcc3bbc3331105197c1f58ac0d294eb83910d136a325a85def88f"}, + {file = "grpcio-1.42.0-cp36-cp36m-linux_armv7l.whl", hash = "sha256:53e10d07e541073eb9a84d49ecffb831c3cbb970bcd8cd8de8431e935bf66c2e"}, + {file = "grpcio-1.42.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:7a3c9b8e13365529f9426d4754085e8a9c2ad718a41a46a97e4e30e87bb45eae"}, + {file = "grpcio-1.42.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:66f910b6324ae69625e63db2eb29d833c307cfa36736fe13d2f841656c5f658f"}, + {file = "grpcio-1.42.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:59163b8d2e0d85f0ecbee52b348f867eec7e0f909177564fb3956363f7e616e5"}, + {file = "grpcio-1.42.0-cp36-cp36m-manylinux_2_17_aarch64.whl", hash = "sha256:d92c1721c7981812d0f42dfc8248b15d3b6a2ea79eb8870776364423de2aa245"}, + {file = "grpcio-1.42.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65720d2bf05e2b78c4bffe372f13c41845bae5658fd3f5dd300c374dd240e5cb"}, + {file = "grpcio-1.42.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f385e40846ff81d1c6dce98dcc192c7988a46540758804c4a2e6da5a0e3e3e05"}, + {file = "grpcio-1.42.0-cp36-cp36m-win32.whl", hash = "sha256:ea3560ffbfe08327024380508190103937fef25e355d2259f8b5c003a0732f55"}, + {file = "grpcio-1.42.0-cp36-cp36m-win_amd64.whl", hash = "sha256:29fc36c99161ff307c8ca438346b2e36f81dac5ecdbabc983d0b255d7913fb19"}, + {file = "grpcio-1.42.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:76b5fa4c6d88f804456e763461cf7a1db38b200669f1ba00c579014ab5aa7965"}, + {file = "grpcio-1.42.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:d1451a8c0c01c5b5fdfeb8f777820cb277fb5d797d972f57a41bb82483c44a79"}, + {file = "grpcio-1.42.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6655df5f31664bac4cd6c9b52f389fd92cd10025504ad83685038f47e11e29d8"}, + {file = "grpcio-1.42.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:5b9f0c4822e3a52a1663a315752c6bbdbed0ec15a660d3e64137335acbb5b7ce"}, + {file = "grpcio-1.42.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:7742606ac2bc03ed10360f4f630e0cc01dce864fe63557254e9adea21bb51416"}, + {file = "grpcio-1.42.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:603d71de14ab1f1fd1254b69ceda73545943461b1f51f82fda9477503330b6ea"}, + {file = "grpcio-1.42.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d08ce780bbd8d1a442d855bd681ed0f7483c65d2c8ed83701a9ea4f13678411f"}, + {file = "grpcio-1.42.0-cp37-cp37m-win32.whl", hash = "sha256:2aba7f93671ec971c5c70db81633b49a2f974aa09a2d811aede344a32bad1896"}, + {file = "grpcio-1.42.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2956da789d74fc35d2c869b3aa45dbf41c5d862c056ca8b5e35a688347ede809"}, + {file = "grpcio-1.42.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:21aa4a111b3381d3dd982a3df62348713b29f651aa9f6dfbc9415adbfe28d2ba"}, + {file = "grpcio-1.42.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a6f9ed5320b93c029615b75f6c8caf2c76aa6545d8845f3813908892cfc5f84e"}, + {file = "grpcio-1.42.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:3a13953e12dc40ee247b5fe6ef22b5fac8f040a76b814a11bf9f423e82402f28"}, + {file = "grpcio-1.42.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:f721b42a20d886c03d9b1f461b228cdaf02ccf6c4550e263f7fd3ce3ff19a8f1"}, + {file = "grpcio-1.42.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:e2d9c6690d4c88cd51ee395d7ba5bd1d26d7c37e94cb59e7fd62ff21ecaf891d"}, + {file = "grpcio-1.42.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7f66eb220898787d7821a7931e35ae2512ed74f79f75adcd7ea2fb3119ca87d"}, + {file = "grpcio-1.42.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2e3f250e5398bf474c6e140df1b67494bf1e31c5277b5bf93841a564cbc22d0"}, + {file = "grpcio-1.42.0-cp38-cp38-win32.whl", hash = "sha256:06d5364e85e0fa50ee68bffd9c93a6aff869a91c68f1fd7ba1b944e063a0ff9f"}, + {file = "grpcio-1.42.0-cp38-cp38-win_amd64.whl", hash = "sha256:d58b3774ee2084c31aad140586a42e18328d9823959ca006a0b85ad7937fe405"}, + {file = "grpcio-1.42.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:b74bbac7e039cf23ed0c8edd820c31e90a52a22e28a03d45274a0956addde8d2"}, + {file = "grpcio-1.42.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2b264cf303a22c46f8d455f42425c546ad6ce22f183debb8d64226ddf1e039f4"}, + {file = "grpcio-1.42.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:64f2b3e6474e2ad865478b64f0850d15842acbb2623de5f78a60ceabe00c63e0"}, + {file = "grpcio-1.42.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:bf916ee93ea2fd52b5286ed4e19cbbde5e82754914379ea91dc5748550df3b4e"}, + {file = "grpcio-1.42.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:6ef72f0abdb89fb7c366a99e04823ecae5cda9f762f2234f42fc280447277cd6"}, + {file = "grpcio-1.42.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47ab65be9ba7a0beee94bbe2fb1dd03cb7832db9df4d1f8fae215a16b3edeb5e"}, + {file = "grpcio-1.42.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0209f30741de1875413f40e89bec9c647e7afad4a3549a6a1682c1ee23da68ca"}, + {file = "grpcio-1.42.0-cp39-cp39-win32.whl", hash = "sha256:5441d343602ce10ba48fcb36bb5de197a15a01dc9ee0f71c2a73cd5cd3d7f5ac"}, + {file = "grpcio-1.42.0-cp39-cp39-win_amd64.whl", hash = "sha256:17433f7eb01737240581b33fbc2eae7b7fa6d3429571782580bceaf05ec56cb8"}, + {file = "grpcio-1.42.0.tar.gz", hash = "sha256:4a8f2c7490fe3696e0cdd566e2f099fb91b51bc75446125175c55581c2f7bc11"}, +] [package.dependencies] six = ">=1.5.2" @@ -982,17 +1281,23 @@ protobuf = ["grpcio-tools (>=1.42.0)"] name = "heapdict" version = "1.0.1" description = "a heap with decrease-key and increase-key operations" -category = "main" optional = false python-versions = "*" +files = [ + {file = "HeapDict-1.0.1-py3-none-any.whl", hash = "sha256:6065f90933ab1bb7e50db403b90cab653c853690c5992e69294c2de2b253fc92"}, + {file = "HeapDict-1.0.1.tar.gz", hash = "sha256:8495f57b3e03d8e46d5f1b2cc62ca881aca392fd5cc048dc0aa2e1a6d23ecdb6"}, +] [[package]] name = "httplib2" version = "0.22.0" description = "A comprehensive HTTP client library." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, + {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, +] [package.dependencies] pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""} @@ -1001,9 +1306,12 @@ pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0 name = "hvac" version = "0.11.2" description = "HashiCorp Vault API client" -category = "main" optional = false python-versions = ">=2.7" +files = [ + {file = "hvac-0.11.2-py2.py3-none-any.whl", hash = "sha256:3e8a34804b1e20954a2b4991cc13ed9c09b32e50dadd9d3438224481150f6568"}, + {file = "hvac-0.11.2.tar.gz", hash = "sha256:f905c59d32d88d3f67571fe5a8a78de4659e04798ad809de439f667247d13626"}, +] [package.dependencies] requests = ">=2.21.0" @@ -1014,18 +1322,15 @@ parser = ["pyhcl (>=0.3.10)"] [[package]] name = "identify" -version = "2.5.24" +version = "2.5.27" description = "File identification library for Python" -category = "main" optional = false -python-versions = ">=3.7" - +python-versions = ">=3.8" files = [ - {file = "identify-2.5.24-py2.py3-none-any.whl", hash = "sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d"}, - {file = "identify-2.5.24.tar.gz", hash = "sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4"}, + {file = "identify-2.5.27-py2.py3-none-any.whl", hash = "sha256:fdb527b2dfe24602809b2201e033c2a113d7bdf716db3ca8e3243f735dcecaba"}, + {file = "identify-2.5.27.tar.gz", hash = "sha256:287b75b04a0e22d727bc9a41f0d4f3c1bcada97490fa6eabb5b28f0e9097e733"}, ] - [package.extras] license = ["ukkonen"] @@ -1033,56 +1338,71 @@ license = ["ukkonen"] name = "idna" version = "3.3" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, +] [[package]] name = "importlib-metadata" version = "4.13.0" description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-4.13.0-py3-none-any.whl", hash = "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116"}, + {file = "importlib_metadata-4.13.0.tar.gz", hash = "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d"}, +] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "jaraco.tidelift (>=1.4)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] [[package]] name = "importlib-resources" -version = "5.12.0" +version = "6.0.1" description = "Read resources from Python packages" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"}, + {file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"}, +] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [[package]] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] [[package]] name = "ipeadatapy" version = "0.1.9" description = "An API wrapper for Ipeadata" -category = "main" optional = false python-versions = "*" +files = [ + {file = "ipeadatapy-0.1.9-py3-none-any.whl", hash = "sha256:0bfd5a180599f77106421477d3cc505e4478ac0f4e3d5eb688dd8696fce906e3"}, + {file = "ipeadatapy-0.1.9.tar.gz", hash = "sha256:396c3f7d723a70667fd5a64714d7252f7f234c34c9f63e77751b02123691d8ad"}, +] [package.dependencies] pandas = "*" @@ -1090,14 +1410,13 @@ requests = "*" [[package]] name = "ipykernel" -version = "6.22.0" +version = "6.25.1" description = "IPython Kernel for Jupyter" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.22.0-py3-none-any.whl", hash = "sha256:1ae6047c1277508933078163721bbb479c3e7292778a04b4bacf0874550977d6"}, - {file = "ipykernel-6.22.0.tar.gz", hash = "sha256:302558b81f1bc22dc259fb2a0c5c7cf2f4c0bdb21b50484348f7bafe7fb71421"}, + {file = "ipykernel-6.25.1-py3-none-any.whl", hash = "sha256:c8a2430b357073b37c76c21c52184db42f6b4b0e438e1eb7df3c4440d120497c"}, + {file = "ipykernel-6.25.1.tar.gz", hash = "sha256:050391364c0977e768e354bdb60cbbfbee7cbb943b1af1618382021136ffd42f"}, ] [package.dependencies] @@ -1106,7 +1425,7 @@ comm = ">=0.1.1" debugpy = ">=1.6.5" ipython = ">=7.23.1" jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" @@ -1126,7 +1445,6 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio" name = "ipython" version = "8.12.2" description = "IPython: Productive Interactive Computing" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1164,31 +1482,33 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pa [[package]] name = "jedi" -version = "0.18.2" +version = "0.19.0" description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, - {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, + {file = "jedi-0.19.0-py2.py3-none-any.whl", hash = "sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e"}, + {file = "jedi-0.19.0.tar.gz", hash = "sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4"}, ] [package.dependencies] -parso = ">=0.8.0,<0.9.0" +parso = ">=0.8.3,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" version = "3.0.3" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, + {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -1197,11 +1517,9 @@ MarkupSafe = ">=2.0" i18n = ["Babel (>=2.7)"] [[package]] - name = "jinja2-time" version = "0.2.0" description = "Jinja2 Extension for Dates and Times" -category = "dev" optional = false python-versions = "*" files = [ @@ -1217,7 +1535,6 @@ jinja2 = "*" name = "jupyter-client" version = "7.3.4" description = "Jupyter protocol implementation and client libraries" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1242,7 +1559,6 @@ test = ["codecov", "coverage", "ipykernel (>=6.5)", "ipython", "mypy", "pre-comm name = "jupyter-core" version = "5.2.0" description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1260,21 +1576,228 @@ docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", " test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] - name = "kiwisolver" -version = "1.4.4" +version = "1.4.5" description = "A fast implementation of the Cassowary constraint solver" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, +] [[package]] name = "levenshtein" version = "0.21.1" description = "Python extension for computing string edit distances and similarities." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "Levenshtein-0.21.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:59e5054c9dea821840af4623a4059c8f0ae56548a5eae8b9c7aaa0b3f1e33340"}, + {file = "Levenshtein-0.21.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:11694c6f7119d68cc199ff3b1407560c0efb0cc49f288169f28b2e032ee03cda"}, + {file = "Levenshtein-0.21.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f5f7ce639bea0f5e95a1f71963624b85521a39928a2a1bb0e66f6180facf5969"}, + {file = "Levenshtein-0.21.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39e8a1866325b6d54de4e7d1bffffaf4b4c8cbf0988f47f0f2e929edfbeb870d"}, + {file = "Levenshtein-0.21.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed73d619e203aad54e2e6119a2b58b7568a36bd50a547817d13618ea0acf4412"}, + {file = "Levenshtein-0.21.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50fbe01be99554f644657c32a9e3085369d23e8ccc540d855c683947d3b48b67"}, + {file = "Levenshtein-0.21.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675ba3afaa9e8ec393eb1eeee651697036e8391be54e6c28eae4bfdff4d5e64e"}, + {file = "Levenshtein-0.21.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c89a5ac319a80c131ca8d499ae0f7a91d4dd1dc3b2e9d8b095e991597b79c8f9"}, + {file = "Levenshtein-0.21.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f9e3a5f4386c8f1811153f309a0ba3dc47d17e81a6dd29aa22d3e10212a2fd73"}, + {file = "Levenshtein-0.21.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ea042ba262ea2a95d93c4d2d5879df956cf6c85ce22c037e3f0d4491182f10c5"}, + {file = "Levenshtein-0.21.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:622bc670b906c4bf219755625e9fa704ff07c561a90f1aa35f3f2d8ecd3ec088"}, + {file = "Levenshtein-0.21.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:f0e51ff6d5665884b0e39b4ae0ef4e2d2d0174147147db7a870ddc4123882212"}, + {file = "Levenshtein-0.21.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cc8eb12c48598b20b4b99128bc2bd62974dfb65204ceb37807480788b1e66e64"}, + {file = "Levenshtein-0.21.1-cp310-cp310-win32.whl", hash = "sha256:04d338c9153ddf70a32f324cf9f902fe94a6da82122b8037ccde969d4cc0a94b"}, + {file = "Levenshtein-0.21.1-cp310-cp310-win_amd64.whl", hash = "sha256:5a10fc3be2bfb05b03b868d462941e4099b680b7f358a90b8c6d7d5946e9e97c"}, + {file = "Levenshtein-0.21.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:938581ba87b306675bc41e21c2b2822a9eb83fb1a0e4a4903b7398d7845b22e3"}, + {file = "Levenshtein-0.21.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06da6c47aa459c725ee90dab467cd2f66956c5f9a43ddb51a0fe2496960f1d3e"}, + {file = "Levenshtein-0.21.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eea308d98c64dbea48ac351011c4adf66acd936c4de2bf9955826ba8435197e2"}, + {file = "Levenshtein-0.21.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a51974fcb8a94284325cb88b474b76227532a25b035938a46167bebd1646718e"}, + {file = "Levenshtein-0.21.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87edb05fc6e4eb14008433f02e89815a756fe4ecc32d7180bb757f26e4161e06"}, + {file = "Levenshtein-0.21.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aee4f570652ad77961e5ab871d11fd42752e7d2117b08324a0c8801a7ee0a7c5"}, + {file = "Levenshtein-0.21.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43a06b0b492e0d936deff751ad4757786ba7cb5eee510d53b6dfe92c924ff733"}, + {file = "Levenshtein-0.21.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:952e72f173a65f271dfee102b5571004b6594d4f199864ddead77115a2c147fd"}, + {file = "Levenshtein-0.21.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3f855669e1399597f7a2670310cf20fc04a35c6c446dd70320398e9aa481b3d"}, + {file = "Levenshtein-0.21.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ca992783feaf1d6e25403340157fb584cf71371b094a575134393bba10b974fa"}, + {file = "Levenshtein-0.21.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:20361f42f6e7efa5853f69a41a272e9ecb90da284bec4312e42b58fa42b9a752"}, + {file = "Levenshtein-0.21.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:9bcb3abbe97975cc6a97baf24a3b6e0491472ecedbc0247a41eb2c8d73ecde5d"}, + {file = "Levenshtein-0.21.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:72b0b84adc52f4cf970a1bb276e76e115b30d693d6dbcd25fca0bcee85ca7cc7"}, + {file = "Levenshtein-0.21.1-cp311-cp311-win32.whl", hash = "sha256:4217ae380f42f825862eb8e2f9beca627fe9ab613f36e206842c003bb1affafc"}, + {file = "Levenshtein-0.21.1-cp311-cp311-win_amd64.whl", hash = "sha256:12bb3540e021c73c5d8796ecf8148afd441c4471731924a112bc31bc25abeabf"}, + {file = "Levenshtein-0.21.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a0fa251b3b4c561d2f650d9a61fb8980815492bb088a0a521236995a1872e171"}, + {file = "Levenshtein-0.21.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4bf11b89d8d7a7707ae5cac1ef86ac4ff78491482df037289470db8f0378043"}, + {file = "Levenshtein-0.21.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91dca7085aa358da71fa50682fc8ff7e21365c99ef17dc1962a7bbf488003528"}, + {file = "Levenshtein-0.21.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4f187f0929a35b6ddabc1324161e8c73ddbd4a7747249f10ec9ceaa793e904f"}, + {file = "Levenshtein-0.21.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d997da10fdf1a82e208fd1b05aba40705ca3f053919c84d2e952141d33e3ab3"}, + {file = "Levenshtein-0.21.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed8f99e4e4ba8a43bb4fe0255606724f22069405fa1e3be679a2d90f74770e5"}, + {file = "Levenshtein-0.21.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:5acb7e84ccd619dcff6e04928fa8d8cc24f55bb2c9cdfe96620ed85b0a82a7c7"}, + {file = "Levenshtein-0.21.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:62dca15301bdba4ec7fcf53c39dd8d9c198194990cf035def3f47b7cb9c3213e"}, + {file = "Levenshtein-0.21.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:832951ad7b5ee0df8152f239a9fc602322da055264459dcf4d50d3ed68e68045"}, + {file = "Levenshtein-0.21.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:e8ab4d5acdd3ac17161539d9f2ea764497dc269dcd8dc722ae4a394c7b64ae7f"}, + {file = "Levenshtein-0.21.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:3c13450450d537ec7ede3781be72d72db37cb131943148c8ada58b34e143fc6f"}, + {file = "Levenshtein-0.21.1-cp36-cp36m-win32.whl", hash = "sha256:267ad98befffeed90e73b8c644a297027adb81f61044843aeade7b4a44ccc7d7"}, + {file = "Levenshtein-0.21.1-cp36-cp36m-win_amd64.whl", hash = "sha256:d66d8f3ebde14840a310a557c8f69eed3e153f2477747365355d058208eea515"}, + {file = "Levenshtein-0.21.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:78d0fb5faef0413864c1b593e5261a840eaa47842b0fa4af7be4c09d90b24a14"}, + {file = "Levenshtein-0.21.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dda976c1dae2a0b41a109facc48d1d242c7acb30ab4c04d8421496da6e153aa"}, + {file = "Levenshtein-0.21.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1dc54aeb02f38a36f16bca6b0f9d07462686d92716424d9a4a3fdd11f3624528"}, + {file = "Levenshtein-0.21.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:463fd7558f25c477c7e4a59af35c661e133473f62bb02ed2c07c9c95e1c2dc66"}, + {file = "Levenshtein-0.21.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f00495a80c5850466f0a57ea874761f78079702e28b63a1b6573ad254f828e44"}, + {file = "Levenshtein-0.21.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31aa08e8ddac402edd530aaf708ab085fea7299c499404989eabfde143377911"}, + {file = "Levenshtein-0.21.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9e96217a7c6a7d43071c830b1353a3ee669757ae477673f0fd3e3a97def6d410"}, + {file = "Levenshtein-0.21.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d83b8c0ce41e410af143bd3abef94e480d143fdb83e60a01bab9069bf565dada"}, + {file = "Levenshtein-0.21.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:309f134f3d42fa7df7efbbd7975f2331de8c36da3ebdb3fad59abae84268abba"}, + {file = "Levenshtein-0.21.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:267bc6725506571fd3c03afcc871fa5cbf3d2cb6e4bd11043790fa60cbb0f8a4"}, + {file = "Levenshtein-0.21.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4a6cd85ac5f7800e8127b3194fa02c59be735b6bdfe55b8516d094652235e038"}, + {file = "Levenshtein-0.21.1-cp37-cp37m-win32.whl", hash = "sha256:13e87517ce788d71deaa73e37332a67c4085c13e58ea3a0218092d555d1872ce"}, + {file = "Levenshtein-0.21.1-cp37-cp37m-win_amd64.whl", hash = "sha256:918f2e0f590cacb30edb88e7eccbf71b340d5f080c9e69009f1f00dc24810a67"}, + {file = "Levenshtein-0.21.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d17c2ee8aa380c012b3ba015b87502934662c51b7609ef17366c76863e9551d6"}, + {file = "Levenshtein-0.21.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ee847d3e49870e914074fd31c069a1aaba6f71bee650d41de48e7e4b11671bf0"}, + {file = "Levenshtein-0.21.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8d01425bd54c482ccbbc6d953633450a2bdbb7d12450d9eeba6073a6d0f06a3c"}, + {file = "Levenshtein-0.21.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bff4f236d1b6c556a77975812a4d51071181721f3a29c08b42e5c4aa11730957"}, + {file = "Levenshtein-0.21.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35a603d952e9f286fe8053332862c8cff426f5d8a85ee962c3a0f597f4c463c4"}, + {file = "Levenshtein-0.21.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9546ded45fb3cf8773ade9c91de164c6cb2cb4927516289abd422a262e81906c"}, + {file = "Levenshtein-0.21.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79259b10f105f78853210d8769cf77ca55dac8c368dca33b4c10ffa8965e2543"}, + {file = "Levenshtein-0.21.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41e0e539638a27b5e90a5d46679375f93a1cb65cf06efe7c413cf76f71d3d467"}, + {file = "Levenshtein-0.21.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ccd0b89300a25decdb34d7c4efe2a971438015f552eeb416b8da12918cb3edc0"}, + {file = "Levenshtein-0.21.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ef365ec78938597623d4fb96c8b0db423ab484fcfc00fae44c34b738b1eb1924"}, + {file = "Levenshtein-0.21.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:e701b9dfb121faf71b0c5757485fc49e1b511b7b8a80034aa1f580488f8f872e"}, + {file = "Levenshtein-0.21.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e4c2fe1f49f1d8476fe44e243569d775c5454dca70a13be568430d2d2d760ea2"}, + {file = "Levenshtein-0.21.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:40a5e38d0c3e488d1dca5dc9c2691c000764813d4006c243f2ebd39e0b331e95"}, + {file = "Levenshtein-0.21.1-cp38-cp38-win32.whl", hash = "sha256:6c08879d0cf761cd750e976fda67bcc23cf1e485eaa030942e6628b876f4c6d8"}, + {file = "Levenshtein-0.21.1-cp38-cp38-win_amd64.whl", hash = "sha256:248348e94dee05c787b44f16533a366ec5bf8ba949c604ad0db69d0c872f3539"}, + {file = "Levenshtein-0.21.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3824e9f75ec9f373fc8b4df23eae668918953487f5ff06db282ddcb3f9c802d2"}, + {file = "Levenshtein-0.21.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e2ed817fa682243ef2e8a2728fcd0f9352d4e5edd104db44862d0bb55c75a7e"}, + {file = "Levenshtein-0.21.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:94a6ffd7257d12c64de34bc9f801a211e2daa624ec276305f8c67963a9896efa"}, + {file = "Levenshtein-0.21.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6833f8cefb96b8ccac457ad421866a74f4de973e7001699fcbbbe9ccb59a5c66"}, + {file = "Levenshtein-0.21.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8126d2b51621483823c6e31d16bc1f5a964ae976aab4f241bbe74ed19d93770"}, + {file = "Levenshtein-0.21.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58eaab403b77e62e096cbcbaf61728c8736f9f7a3e36a58fb663461e5d70144f"}, + {file = "Levenshtein-0.21.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e6d66fe0110fd8e6efb1939d686099170c27b3ca838eab0c215f0781f05f06"}, + {file = "Levenshtein-0.21.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5a1f28b34a15dd2d67bcc324f6661df8cfe66d6ec7ee7a64e921af8ae4c39b7"}, + {file = "Levenshtein-0.21.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c37609f4e460e570810ec5176c5cdf91c494a9979638f7fef5fd345597245d17"}, + {file = "Levenshtein-0.21.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:656c70814280c4002af89112f1457b6ad24c42dfba58dcb2047a249ae8ccdd04"}, + {file = "Levenshtein-0.21.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:863d507cba67de2fa66d5501ed1bc5029363d2b393662ac7d740dd0330c66aba"}, + {file = "Levenshtein-0.21.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:9437c2342937decf3cf5ac79d0b9497734897c0a09dc813378c97f2916b7aa76"}, + {file = "Levenshtein-0.21.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a1cd48db3d03adb88bf71b45de77b9720f96d3b9d5ab7a32304352baec482689"}, + {file = "Levenshtein-0.21.1-cp39-cp39-win32.whl", hash = "sha256:023dffdde576639e48cab3cc835bfaf9c441df7a8e2829bf20104868db6e4f72"}, + {file = "Levenshtein-0.21.1-cp39-cp39-win_amd64.whl", hash = "sha256:dcc712696d4332962ecab6e4df40d5126d7379c6612e6058ee2e9d3f924387e3"}, + {file = "Levenshtein-0.21.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9a8d60084e1c9e87ae247c601e331708de09ed23219b5e39af7c8e9115ab8152"}, + {file = "Levenshtein-0.21.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffa6762f8ef1e7dfba101babe43de6edc541cbe64d33d816314ac67cd76c3979"}, + {file = "Levenshtein-0.21.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eec8a1eaaeadc217c15bc77d01bb29e146acdae73a0b2e9df1ad162263c9752e"}, + {file = "Levenshtein-0.21.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5da0e2dbddb98da890fb779823df991ad50f184b3d986b8c68784eecbb087f01"}, + {file = "Levenshtein-0.21.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:edac6490f84e8a0456cb40f6729d4199311ce50ca0ea4958572e1b7ea99f546c"}, + {file = "Levenshtein-0.21.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b33e2cbaca6f7d01092a28711605568dbc08a3bb7b796d8986bf5d0d651a0b09"}, + {file = "Levenshtein-0.21.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69a430ab564d286f309c19f7abed34fce9c144f39f984c609ee690dd175cc421"}, + {file = "Levenshtein-0.21.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f30474b2906301594c8fb64cb7492c6978290c466a717c4b5316887a18b77af5"}, + {file = "Levenshtein-0.21.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9817dca597abde9fc9571d56a7eca8bd667e9dfc0867b190f1e8b43ce4fde761"}, + {file = "Levenshtein-0.21.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7d7e00e8cb45981386df9d3f99073ba7de59bdb739069766b32906421bb1026b"}, + {file = "Levenshtein-0.21.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9a072cb0f6e90092c4323cd7731eb539a79ac360045dbe3cc49a123ba381fc5"}, + {file = "Levenshtein-0.21.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d880a87aca186342bc2fe16b064c3ed434d2a0c170c419f23b4e00261a5340a"}, + {file = "Levenshtein-0.21.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f282711a220d1bdf245da508e1fefdf7680d1f7482a094e37465674a7e6985ae"}, + {file = "Levenshtein-0.21.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cdba9f8a7a98b0c4c0bc004b811fb31a96521cd264aeb5375898478e7703de4d"}, + {file = "Levenshtein-0.21.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b2410469cc8fd0f42aa00e63063c42f8aff501996cd5424a5c904739bdaaf4fe"}, + {file = "Levenshtein-0.21.1.tar.gz", hash = "sha256:2e4fc4522f9bf73c6ab4cedec834783999b247312ec9e3d1435a5424ad5bc908"}, +] [package.dependencies] rapidfuzz = ">=2.3.0,<4.0.0" @@ -1283,84 +1806,286 @@ rapidfuzz = ">=2.3.0,<4.0.0" name = "locket" version = "0.2.1" description = "File-based locks for Python for Linux and Windows" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "locket-0.2.1-py2.py3-none-any.whl", hash = "sha256:12b6ada59d1f50710bca9704dbadd3f447dbf8dac6664575c1281cadab8e6449"}, + {file = "locket-0.2.1.tar.gz", hash = "sha256:3e1faba403619fe201552f083f1ecbf23f550941bc51985ac6ed4d02d25056dd"}, +] [[package]] name = "loguru" version = "0.6.0" description = "Python logging made (stupidly) simple" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "loguru-0.6.0-py3-none-any.whl", hash = "sha256:4e2414d534a2ab57573365b3e6d0234dfb1d84b68b7f3b948e6fb743860a77c3"}, + {file = "loguru-0.6.0.tar.gz", hash = "sha256:066bd06758d0a513e9836fd9c6b5a75bfb3fd36841f4b996bc60b547a309d41c"}, +] [package.dependencies] colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} [package.extras] -dev = ["colorama (>=0.3.4)", "docutils (==0.16)", "flake8 (>=3.7.7)", "tox (>=3.9.0)", "pytest (>=4.6.2)", "pytest-cov (>=2.7.1)", "black (>=19.10b0)", "isort (>=5.1.1)", "Sphinx (>=4.1.1)", "sphinx-autobuild (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)"] +dev = ["Sphinx (>=4.1.1)", "black (>=19.10b0)", "colorama (>=0.3.4)", "docutils (==0.16)", "flake8 (>=3.7.7)", "isort (>=5.1.1)", "pytest (>=4.6.2)", "pytest-cov (>=2.7.1)", "sphinx-autobuild (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "tox (>=3.9.0)"] [[package]] name = "lxml" version = "4.9.2" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" +files = [ + {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, + {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, + {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, + {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, + {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, + {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, + {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, + {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, + {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, + {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, + {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, + {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, + {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, + {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, + {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, + {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, + {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, + {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, + {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, + {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, + {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, + {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, + {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, +] [package.extras] cssselect = ["cssselect (>=0.7)"] html5 = ["html5lib"] -htmlsoup = ["beautifulsoup4"] +htmlsoup = ["BeautifulSoup4"] source = ["Cython (>=0.29.7)"] [[package]] name = "markupsafe" version = "2.0.1" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, +] [[package]] name = "marshmallow" version = "3.14.1" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "marshmallow-3.14.1-py3-none-any.whl", hash = "sha256:04438610bc6dadbdddb22a4a55bcc7f6f8099e69580b2e67f5a681933a1f4400"}, + {file = "marshmallow-3.14.1.tar.gz", hash = "sha256:4c05c1684e0e97fe779c62b91878f173b937fe097b356cd82f793464f5bc6138"}, +] [package.extras] -dev = ["pytest", "pytz", "simplejson", "mypy (==0.910)", "flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "pre-commit (>=2.4,<3.0)", "tox"] -docs = ["sphinx (==4.3.0)", "sphinx-issues (==1.2.0)", "alabaster (==0.7.12)", "sphinx-version-warning (==1.1.2)", "autodocsumm (==0.2.7)"] -lint = ["mypy (==0.910)", "flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "pre-commit (>=2.4,<3.0)"] +dev = ["flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.7)", "sphinx (==4.3.0)", "sphinx-issues (==1.2.0)", "sphinx-version-warning (==1.1.2)"] +lint = ["flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)"] tests = ["pytest", "pytz", "simplejson"] [[package]] name = "marshmallow-oneofschema" version = "3.0.1" description = "marshmallow multiplexing schema" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "marshmallow-oneofschema-3.0.1.tar.gz", hash = "sha256:62cd2099b29188c92493c2940ee79d1bf2f2619a71721664e5a98ec2faa58237"}, + {file = "marshmallow_oneofschema-3.0.1-py2.py3-none-any.whl", hash = "sha256:bd29410a9f2f7457a2b428286e2a80ef76b8ddc3701527dc1f935a88914b02f2"}, +] [package.dependencies] marshmallow = ">=3.0.0,<4.0.0" [package.extras] -dev = ["pytest", "mock", "flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.7,<3.0)", "tox"] +dev = ["flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "mock", "pre-commit (>=2.7,<3.0)", "pytest", "tox"] lint = ["flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.7,<3.0)"] -tests = ["pytest", "mock"] +tests = ["mock", "pytest"] [[package]] name = "matplotlib" -version = "3.7.1" +version = "3.7.2" description = "Python plotting package" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "matplotlib-3.7.2-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:2699f7e73a76d4c110f4f25be9d2496d6ab4f17345307738557d345f099e07de"}, + {file = "matplotlib-3.7.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a8035ba590658bae7562786c9cc6ea1a84aa49d3afab157e414c9e2ea74f496d"}, + {file = "matplotlib-3.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f8e4a49493add46ad4a8c92f63e19d548b2b6ebbed75c6b4c7f46f57d36cdd1"}, + {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71667eb2ccca4c3537d9414b1bc00554cb7f91527c17ee4ec38027201f8f1603"}, + {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:152ee0b569a37630d8628534c628456b28686e085d51394da6b71ef84c4da201"}, + {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:070f8dddd1f5939e60aacb8fa08f19551f4b0140fab16a3669d5cd6e9cb28fc8"}, + {file = "matplotlib-3.7.2-cp310-cp310-win32.whl", hash = "sha256:fdbb46fad4fb47443b5b8ac76904b2e7a66556844f33370861b4788db0f8816a"}, + {file = "matplotlib-3.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:23fb1750934e5f0128f9423db27c474aa32534cec21f7b2153262b066a581fd1"}, + {file = "matplotlib-3.7.2-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:30e1409b857aa8a747c5d4f85f63a79e479835f8dffc52992ac1f3f25837b544"}, + {file = "matplotlib-3.7.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:50e0a55ec74bf2d7a0ebf50ac580a209582c2dd0f7ab51bc270f1b4a0027454e"}, + {file = "matplotlib-3.7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ac60daa1dc83e8821eed155796b0f7888b6b916cf61d620a4ddd8200ac70cd64"}, + {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305e3da477dc8607336ba10bac96986d6308d614706cae2efe7d3ffa60465b24"}, + {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c308b255efb9b06b23874236ec0f10f026673ad6515f602027cc8ac7805352d"}, + {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60c521e21031632aa0d87ca5ba0c1c05f3daacadb34c093585a0be6780f698e4"}, + {file = "matplotlib-3.7.2-cp311-cp311-win32.whl", hash = "sha256:26bede320d77e469fdf1bde212de0ec889169b04f7f1179b8930d66f82b30cbc"}, + {file = "matplotlib-3.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:af4860132c8c05261a5f5f8467f1b269bf1c7c23902d75f2be57c4a7f2394b3e"}, + {file = "matplotlib-3.7.2-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:a1733b8e84e7e40a9853e505fe68cc54339f97273bdfe6f3ed980095f769ddc7"}, + {file = "matplotlib-3.7.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d9881356dc48e58910c53af82b57183879129fa30492be69058c5b0d9fddf391"}, + {file = "matplotlib-3.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f081c03f413f59390a80b3e351cc2b2ea0205839714dbc364519bcf51f4b56ca"}, + {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1cd120fca3407a225168238b790bd5c528f0fafde6172b140a2f3ab7a4ea63e9"}, + {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2c1590b90aa7bd741b54c62b78de05d4186271e34e2377e0289d943b3522273"}, + {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d2ff3c984b8a569bc1383cd468fc06b70d7b59d5c2854ca39f1436ae8394117"}, + {file = "matplotlib-3.7.2-cp38-cp38-win32.whl", hash = "sha256:5dea00b62d28654b71ca92463656d80646675628d0828e08a5f3b57e12869e13"}, + {file = "matplotlib-3.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:0f506a1776ee94f9e131af1ac6efa6e5bc7cb606a3e389b0ccb6e657f60bb676"}, + {file = "matplotlib-3.7.2-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:6515e878f91894c2e4340d81f0911857998ccaf04dbc1bba781e3d89cbf70608"}, + {file = "matplotlib-3.7.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:71f7a8c6b124e904db550f5b9fe483d28b896d4135e45c4ea381ad3b8a0e3256"}, + {file = "matplotlib-3.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12f01b92ecd518e0697da4d97d163b2b3aa55eb3eb4e2c98235b3396d7dad55f"}, + {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7e28d6396563955f7af437894a36bf2b279462239a41028323e04b85179058b"}, + {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbcf59334ff645e6a67cd5f78b4b2cdb76384cdf587fa0d2dc85f634a72e1a3e"}, + {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:318c89edde72ff95d8df67d82aca03861240512994a597a435a1011ba18dbc7f"}, + {file = "matplotlib-3.7.2-cp39-cp39-win32.whl", hash = "sha256:ce55289d5659b5b12b3db4dc9b7075b70cef5631e56530f14b2945e8836f2d20"}, + {file = "matplotlib-3.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:2ecb5be2b2815431c81dc115667e33da0f5a1bcf6143980d180d09a717c4a12e"}, + {file = "matplotlib-3.7.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fdcd28360dbb6203fb5219b1a5658df226ac9bebc2542a9e8f457de959d713d0"}, + {file = "matplotlib-3.7.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c3cca3e842b11b55b52c6fb8bd6a4088693829acbfcdb3e815fa9b7d5c92c1b"}, + {file = "matplotlib-3.7.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebf577c7a6744e9e1bd3fee45fc74a02710b214f94e2bde344912d85e0c9af7c"}, + {file = "matplotlib-3.7.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:936bba394682049919dda062d33435b3be211dc3dcaa011e09634f060ec878b2"}, + {file = "matplotlib-3.7.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bc221ffbc2150458b1cd71cdd9ddd5bb37962b036e41b8be258280b5b01da1dd"}, + {file = "matplotlib-3.7.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35d74ebdb3f71f112b36c2629cf32323adfbf42679e2751252acd468f5001c07"}, + {file = "matplotlib-3.7.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:717157e61b3a71d3d26ad4e1770dc85156c9af435659a25ee6407dc866cb258d"}, + {file = "matplotlib-3.7.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:20f844d6be031948148ba49605c8b96dfe7d3711d1b63592830d650622458c11"}, + {file = "matplotlib-3.7.2.tar.gz", hash = "sha256:a8cdb91dddb04436bd2f098b8fdf4b81352e68cf4d2c6756fcc414791076569b"}, +] [package.dependencies] contourpy = ">=1.0.1" @@ -1371,15 +2096,13 @@ kiwisolver = ">=1.0.1" numpy = ">=1.20" packaging = ">=20.0" pillow = ">=6.2.0" -pyparsing = ">=2.3.1" +pyparsing = ">=2.3.1,<3.1" python-dateutil = ">=2.7" -setuptools_scm = ">=7" [[package]] name = "matplotlib-inline" version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1394,53 +2117,130 @@ traitlets = "*" name = "msgpack" version = "1.0.3" description = "MessagePack (de)serializer." -category = "main" optional = false python-versions = "*" +files = [ + {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:96acc674bb9c9be63fa8b6dabc3248fdc575c4adc005c440ad02f87ca7edd079"}, + {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c3ca57c96c8e69c1a0d2926a6acf2d9a522b41dc4253a8945c4c6cd4981a4e3"}, + {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0a792c091bac433dfe0a70ac17fc2087d4595ab835b47b89defc8bbabcf5c73"}, + {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c58cdec1cb5fcea8c2f1771d7b5fec79307d056874f746690bd2bdd609ab147"}, + {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f97c0f35b3b096a330bb4a1a9247d0bd7e1f3a2eba7ab69795501504b1c2c39"}, + {file = "msgpack-1.0.3-cp310-cp310-win32.whl", hash = "sha256:36a64a10b16c2ab31dcd5f32d9787ed41fe68ab23dd66957ca2826c7f10d0b85"}, + {file = "msgpack-1.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c1ba333b4024c17c7591f0f372e2daa3c31db495a9b2af3cf664aef3c14354f7"}, + {file = "msgpack-1.0.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c2140cf7a3ec475ef0938edb6eb363fa704159e0bf71dde15d953bacc1cf9d7d"}, + {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f4c22717c74d44bcd7af353024ce71c6b55346dad5e2cc1ddc17ce8c4507c6b"}, + {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d733a15ade190540c703de209ffbc42a3367600421b62ac0c09fde594da6ec"}, + {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7e03b06f2982aa98d4ddd082a210c3db200471da523f9ac197f2828e80e7770"}, + {file = "msgpack-1.0.3-cp36-cp36m-win32.whl", hash = "sha256:3d875631ecab42f65f9dce6f55ce6d736696ced240f2634633188de2f5f21af9"}, + {file = "msgpack-1.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:40fb89b4625d12d6027a19f4df18a4de5c64f6f3314325049f219683e07e678a"}, + {file = "msgpack-1.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6eef0cf8db3857b2b556213d97dd82de76e28a6524853a9beb3264983391dc1a"}, + {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d8c332f53ffff01953ad25131272506500b14750c1d0ce8614b17d098252fbc"}, + {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c0903bd93cbd34653dd63bbfcb99d7539c372795201f39d16fdfde4418de43a"}, + {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf1e6bfed4860d72106f4e0a1ab519546982b45689937b40257cfd820650b920"}, + {file = "msgpack-1.0.3-cp37-cp37m-win32.whl", hash = "sha256:d02cea2252abc3756b2ac31f781f7a98e89ff9759b2e7450a1c7a0d13302ff50"}, + {file = "msgpack-1.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f30dd0dc4dfe6231ad253b6f9f7128ac3202ae49edd3f10d311adc358772dba"}, + {file = "msgpack-1.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f201d34dc89342fabb2a10ed7c9a9aaaed9b7af0f16a5923f1ae562b31258dea"}, + {file = "msgpack-1.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bb87f23ae7d14b7b3c21009c4b1705ec107cb21ee71975992f6aca571fb4a42a"}, + {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a3a5c4b16e9d0edb823fe54b59b5660cc8d4782d7bf2c214cb4b91a1940a8ef"}, + {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74da1e5fcf20ade12c6bf1baa17a2dc3604958922de8dc83cbe3eff22e8b611"}, + {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73a80bd6eb6bcb338c1ec0da273f87420829c266379c8c82fa14c23fb586cfa1"}, + {file = "msgpack-1.0.3-cp38-cp38-win32.whl", hash = "sha256:9fce00156e79af37bb6db4e7587b30d11e7ac6a02cb5bac387f023808cd7d7f4"}, + {file = "msgpack-1.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:9b6f2d714c506e79cbead331de9aae6837c8dd36190d02da74cb409b36162e8a"}, + {file = "msgpack-1.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:89908aea5f46ee1474cc37fbc146677f8529ac99201bc2faf4ef8edc023c2bf3"}, + {file = "msgpack-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:973ad69fd7e31159eae8f580f3f707b718b61141838321c6fa4d891c4a2cca52"}, + {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da24375ab4c50e5b7486c115a3198d207954fe10aaa5708f7b65105df09109b2"}, + {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a598d0685e4ae07a0672b59792d2cc767d09d7a7f39fd9bd37ff84e060b1a996"}, + {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4c309a68cb5d6bbd0c50d5c71a25ae81f268c2dc675c6f4ea8ab2feec2ac4e2"}, + {file = "msgpack-1.0.3-cp39-cp39-win32.whl", hash = "sha256:494471d65b25a8751d19c83f1a482fd411d7ca7a3b9e17d25980a74075ba0e88"}, + {file = "msgpack-1.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:f01b26c2290cbd74316990ba84a14ac3d599af9cebefc543d241a66e785cf17d"}, + {file = "msgpack-1.0.3.tar.gz", hash = "sha256:51fdc7fb93615286428ee7758cecc2f374d5ff363bdd884c7ea622a7a327a81e"}, +] [[package]] name = "mypy-extensions" version = "0.4.3" description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "main" optional = false python-versions = "*" +files = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] [[package]] name = "nest-asyncio" -version = "1.5.6" +version = "1.5.7" description = "Patch asyncio to allow nested event loops" -category = "dev" optional = false python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, - {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, + {file = "nest_asyncio-1.5.7-py3-none-any.whl", hash = "sha256:5301c82941b550b3123a1ea772ba9a1c80bad3a182be8c1a5ae6ad3be57a9657"}, + {file = "nest_asyncio-1.5.7.tar.gz", hash = "sha256:6a80f7b98f24d9083ed24608977c09dd608d83f91cccc24c9d2cba6d10e01c10"}, ] [[package]] name = "nodeenv" version = "1.8.0" description = "Node.js virtual environment builder" -category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, +] + +[package.dependencies] +setuptools = "*" [[package]] name = "numpy" version = "1.21.4" description = "NumPy is the fundamental package for array computing with Python." -category = "main" optional = false python-versions = ">=3.7,<3.11" +files = [ + {file = "numpy-1.21.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8890b3360f345e8360133bc078d2dacc2843b6ee6059b568781b15b97acbe39f"}, + {file = "numpy-1.21.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:69077388c5a4b997442b843dbdc3a85b420fb693ec8e33020bb24d647c164fa5"}, + {file = "numpy-1.21.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e89717274b41ebd568cd7943fc9418eeb49b1785b66031bc8a7f6300463c5898"}, + {file = "numpy-1.21.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b78ecfa070460104934e2caf51694ccd00f37d5e5dbe76f021b1b0b0d221823"}, + {file = "numpy-1.21.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:615d4e328af7204c13ae3d4df7615a13ff60a49cb0d9106fde07f541207883ca"}, + {file = "numpy-1.21.4-cp310-cp310-win_amd64.whl", hash = "sha256:1403b4e2181fc72664737d848b60e65150f272fe5a1c1cbc16145ed43884065a"}, + {file = "numpy-1.21.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:74b85a17528ca60cf98381a5e779fc0264b4a88b46025e6bcbe9621f46bb3e63"}, + {file = "numpy-1.21.4-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92aafa03da8658609f59f18722b88f0a73a249101169e28415b4fa148caf7e41"}, + {file = "numpy-1.21.4-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5d95668e727c75b3f5088ec7700e260f90ec83f488e4c0aaccb941148b2cd377"}, + {file = "numpy-1.21.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5162ec777ba7138906c9c274353ece5603646c6965570d82905546579573f73"}, + {file = "numpy-1.21.4-cp37-cp37m-win32.whl", hash = "sha256:81225e58ef5fce7f1d80399575576fc5febec79a8a2742e8ef86d7b03beef49f"}, + {file = "numpy-1.21.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32fe5b12061f6446adcbb32cf4060a14741f9c21e15aaee59a207b6ce6423469"}, + {file = "numpy-1.21.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c449eb870616a7b62e097982c622d2577b3dbc800aaf8689254ec6e0197cbf1e"}, + {file = "numpy-1.21.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2e4ed57f45f0aa38beca2a03b6532e70e548faf2debbeb3291cfc9b315d9be8f"}, + {file = "numpy-1.21.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1247ef28387b7bb7f21caf2dbe4767f4f4175df44d30604d42ad9bd701ebb31f"}, + {file = "numpy-1.21.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34f3456f530ae8b44231c63082c8899fe9c983fd9b108c997c4b1c8c2d435333"}, + {file = "numpy-1.21.4-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c9c23158b87ed0e70d9a50c67e5c0b3f75bcf2581a8e34668d4e9d7474d76c6"}, + {file = "numpy-1.21.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4799be6a2d7d3c33699a6f77201836ac975b2e1b98c2a07f66a38f499cb50ce"}, + {file = "numpy-1.21.4-cp38-cp38-win32.whl", hash = "sha256:bc988afcea53e6156546e5b2885b7efab089570783d9d82caf1cfd323b0bb3dd"}, + {file = "numpy-1.21.4-cp38-cp38-win_amd64.whl", hash = "sha256:170b2a0805c6891ca78c1d96ee72e4c3ed1ae0a992c75444b6ab20ff038ba2cd"}, + {file = "numpy-1.21.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fde96af889262e85aa033f8ee1d3241e32bf36228318a61f1ace579df4e8170d"}, + {file = "numpy-1.21.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c885bfc07f77e8fee3dc879152ba993732601f1f11de248d4f357f0ffea6a6d4"}, + {file = "numpy-1.21.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e6f5f50d1eff2f2f752b3089a118aee1ea0da63d56c44f3865681009b0af162"}, + {file = "numpy-1.21.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ad010846cdffe7ec27e3f933397f8a8d6c801a48634f419e3d075db27acf5880"}, + {file = "numpy-1.21.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c74c699b122918a6c4611285cc2cad4a3aafdb135c22a16ec483340ef97d573c"}, + {file = "numpy-1.21.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9864424631775b0c052f3bd98bc2712d131b3e2cd95d1c0c68b91709170890b0"}, + {file = "numpy-1.21.4-cp39-cp39-win32.whl", hash = "sha256:b1e2312f5b8843a3e4e8224b2b48fe16119617b8fc0a54df8f50098721b5bed2"}, + {file = "numpy-1.21.4-cp39-cp39-win_amd64.whl", hash = "sha256:e3c3e990274444031482a31280bf48674441e0a5b55ddb168f3a6db3e0c38ec8"}, + {file = "numpy-1.21.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a3deb31bc84f2b42584b8c4001c85d1934dbfb4030827110bc36bfd11509b7bf"}, + {file = "numpy-1.21.4.zip", hash = "sha256:e6c76a87633aa3fa16614b61ccedfae45b91df2767cf097aa9c933932a7ed1e0"}, +] [[package]] name = "oauth2client" version = "4.1.3" description = "OAuth 2.0 client library" -category = "main" optional = false python-versions = "*" +files = [ + {file = "oauth2client-4.1.3-py2.py3-none-any.whl", hash = "sha256:b8a81cc5d60e2d364f0b1b98f958dbd472887acaf1a5b05e21c28c31a2d6d3ac"}, + {file = "oauth2client-4.1.3.tar.gz", hash = "sha256:d486741e451287f69568a4d26d70d9acd73a2bbfa275746c535b4209891cccc6"}, +] [package.dependencies] httplib2 = ">=0.9.1" @@ -1453,9 +2253,12 @@ six = ">=1.6.1" name = "oauthlib" version = "3.1.1" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "oauthlib-3.1.1-py2.py3-none-any.whl", hash = "sha256:42bf6354c2ed8c6acb54d971fce6f88193d97297e18602a3a886603f9d7730cc"}, + {file = "oauthlib-3.1.1.tar.gz", hash = "sha256:8f0215fcc533dd8dd1bee6f4c412d4f0cd7297307d43ac61666389e3bc3198a3"}, +] [package.extras] rsa = ["cryptography (>=3.0.0,<4)"] @@ -1466,16 +2269,13 @@ signedtoken = ["cryptography (>=3.0.0,<4)", "pyjwt (>=2.0.0,<3)"] name = "openpyxl" version = "3.0.9" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" -category = "main" optional = false python-versions = ">=3.6" - files = [ {file = "openpyxl-3.0.9-py2.py3-none-any.whl", hash = "sha256:8f3b11bd896a95468a4ab162fc4fcd260d46157155d1f8bfaabb99d88cfcf79f"}, {file = "openpyxl-3.0.9.tar.gz", hash = "sha256:40f568b9829bf9e446acfffce30250ac1fa39035124d55fc024025c41481c90f"}, ] - [package.dependencies] et-xmlfile = "*" @@ -1483,9 +2283,12 @@ et-xmlfile = "*" name = "packaging" version = "21.3" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] [package.dependencies] pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" @@ -1494,9 +2297,37 @@ pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" name = "pandas" version = "1.5.3" description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, + {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, + {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, + {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, + {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, + {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, + {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, + {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, +] [package.dependencies] numpy = [ @@ -1513,21 +2344,25 @@ test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] name = "pandas-gbq" version = "0.17.4" description = "Google BigQuery connector for pandas" -category = "main" optional = false python-versions = ">=3.7, <3.11" +files = [ + {file = "pandas-gbq-0.17.4.tar.gz", hash = "sha256:70ac57cc6ebf9d1e1c1c810f5ccac710163acd4c3d13e8badea27bb66fae19f7"}, + {file = "pandas_gbq-0.17.4-py2.py3-none-any.whl", hash = "sha256:3b3714167bdc4b1a6013ff6286a452727efbceb412922a2ca39aa996e8e8b129"}, +] [package.dependencies] db-dtypes = ">=0.3.1,<2.0.0" -google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev" +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev" google-auth = ">=1.25.0" google-auth-oauthlib = ">=0.0.1" -google-cloud-bigquery = ">=1.27.2,<2.4.0 || >=2.5.0,<4.0.0dev" +google-cloud-bigquery = ">=1.27.2,<2.4.dev0 || >=2.5.dev0,<4.0.0dev" google-cloud-bigquery-storage = ">=1.1.0,<3.0.0dev" numpy = ">=1.16.6" pandas = ">=0.24.2" pyarrow = ">=3.0.0,<8.0dev" pydata-google-auth = "*" +setuptools = "*" [package.extras] tqdm = ["tqdm (>=4.23.0)"] @@ -1536,9 +2371,12 @@ tqdm = ["tqdm (>=4.23.0)"] name = "pandavro" version = "1.7.2" description = "The interface between Avro and pandas DataFrame" -category = "main" optional = false python-versions = ">=3.6.1" +files = [ + {file = "pandavro-1.7.2-py3-none-any.whl", hash = "sha256:5b4a2fbc86fb2b102e5b2b24490084e4775a5ac546fc8981931abecf6bb4a34b"}, + {file = "pandavro-1.7.2.tar.gz", hash = "sha256:4f2b7b6823522f54e8bfe33c091fb29898349892b70634f46c928e6a42a76e69"}, +] [package.dependencies] fastavro = ">=1.5.1,<1.6.0" @@ -1552,7 +2390,6 @@ tests = ["pytest (==7.1.2)"] name = "parameterized" version = "0.9.0" description = "Parameterized testing with any Python test framework" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1567,7 +2404,6 @@ dev = ["jinja2"] name = "parso" version = "0.8.3" description = "A Python Parser" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1583,24 +2419,49 @@ testing = ["docopt", "pytest (<6.0.0)"] name = "partd" version = "1.2.0" description = "Appendable key-value storage" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "partd-1.2.0-py3-none-any.whl", hash = "sha256:5c3a5d70da89485c27916328dc1e26232d0e270771bd4caef4a5124b6a457288"}, + {file = "partd-1.2.0.tar.gz", hash = "sha256:aa67897b84d522dcbc86a98b942afab8c6aa2f7f677d904a616b74ef5ddbc3eb"}, +] [package.dependencies] locket = "*" toolz = "*" [package.extras] -complete = ["numpy (>=1.9.0)", "pandas (>=0.19.0)", "pyzmq", "blosc"] +complete = ["blosc", "numpy (>=1.9.0)", "pandas (>=0.19.0)", "pyzmq"] [[package]] name = "pendulum" version = "2.1.2" description = "Python datetimes made easy" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, + {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, + {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, + {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, + {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, + {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, + {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, + {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, + {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, + {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, + {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, +] [package.dependencies] python-dateutil = ">=2.6,<3.0" @@ -1610,7 +2471,6 @@ pytzdata = ">=2020.1" name = "pexpect" version = "4.8.0" description = "Pexpect allows easy control of interactive console applications." -category = "dev" optional = false python-versions = "*" files = [ @@ -1625,7 +2485,6 @@ ptyprocess = ">=0.5" name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" -category = "dev" optional = false python-versions = "*" files = [ @@ -1635,11 +2494,68 @@ files = [ [[package]] name = "pillow" -version = "9.5.0" +version = "10.0.0" description = "Python Imaging Library (Fork)" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "Pillow-10.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f62406a884ae75fb2f818694469519fb685cc7eaff05d3451a9ebe55c646891"}, + {file = "Pillow-10.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d5db32e2a6ccbb3d34d87c87b432959e0db29755727afb37290e10f6e8e62614"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf4392b77bdc81f36e92d3a07a5cd072f90253197f4a52a55a8cec48a12483b"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:520f2a520dc040512699f20fa1c363eed506e94248d71f85412b625026f6142c"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:8c11160913e3dd06c8ffdb5f233a4f254cb449f4dfc0f8f4549eda9e542c93d1"}, + {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a74ba0c356aaa3bb8e3eb79606a87669e7ec6444be352870623025d75a14a2bf"}, + {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d0dae4cfd56969d23d94dc8e89fb6a217be461c69090768227beb8ed28c0a3"}, + {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22c10cc517668d44b211717fd9775799ccec4124b9a7f7b3635fc5386e584992"}, + {file = "Pillow-10.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:dffe31a7f47b603318c609f378ebcd57f1554a3a6a8effbc59c3c69f804296de"}, + {file = "Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485"}, + {file = "Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ed64f9ca2f0a95411e88a4efbd7a29e5ce2cea36072c53dd9d26d9c76f753b3"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6eb5502f45a60a3f411c63187db83a3d3107887ad0d036c13ce836f8a36f1d"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd"}, + {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629"}, + {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3b08d4cc24f471b2c8ca24ec060abf4bebc6b144cb89cba638c720546b1cf538"}, + {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737a602fbd82afd892ca746392401b634e278cb65d55c4b7a8f48e9ef8d008d"}, + {file = "Pillow-10.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3a82c40d706d9aa9734289740ce26460a11aeec2d9c79b7af87bb35f0073c12f"}, + {file = "Pillow-10.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:bc2ec7c7b5d66b8ec9ce9f720dbb5fa4bace0f545acd34870eff4a369b44bf37"}, + {file = "Pillow-10.0.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:d80cf684b541685fccdd84c485b31ce73fc5c9b5d7523bf1394ce134a60c6883"}, + {file = "Pillow-10.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76de421f9c326da8f43d690110f0e79fe3ad1e54be811545d7d91898b4c8493e"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ff539a12457809666fef6624684c008e00ff6bf455b4b89fd00a140eecd640"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce543ed15570eedbb85df19b0a1a7314a9c8141a36ce089c0a894adbfccb4568"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:685ac03cc4ed5ebc15ad5c23bc555d68a87777586d970c2c3e216619a5476223"}, + {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d72e2ecc68a942e8cf9739619b7f408cc7b272b279b56b2c83c6123fcfa5cdff"}, + {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d50b6aec14bc737742ca96e85d6d0a5f9bfbded018264b3b70ff9d8c33485551"}, + {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:00e65f5e822decd501e374b0650146063fbb30a7264b4d2744bdd7b913e0cab5"}, + {file = "Pillow-10.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:f31f9fdbfecb042d046f9d91270a0ba28368a723302786c0009ee9b9f1f60199"}, + {file = "Pillow-10.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:1ce91b6ec08d866b14413d3f0bbdea7e24dfdc8e59f562bb77bc3fe60b6144ca"}, + {file = "Pillow-10.0.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:349930d6e9c685c089284b013478d6f76e3a534e36ddfa912cde493f235372f3"}, + {file = "Pillow-10.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3a684105f7c32488f7153905a4e3015a3b6c7182e106fe3c37fbb5ef3e6994c3"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4f69b3700201b80bb82c3a97d5e9254084f6dd5fb5b16fc1a7b974260f89f43"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f07ea8d2f827d7d2a49ecf1639ec02d75ffd1b88dcc5b3a61bbb37a8759ad8d"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:040586f7d37b34547153fa383f7f9aed68b738992380ac911447bb78f2abe530"}, + {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f88a0b92277de8e3ca715a0d79d68dc82807457dae3ab8699c758f07c20b3c51"}, + {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c7cf14a27b0d6adfaebb3ae4153f1e516df54e47e42dcc073d7b3d76111a8d86"}, + {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3400aae60685b06bb96f99a21e1ada7bc7a413d5f49bce739828ecd9391bb8f7"}, + {file = "Pillow-10.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:dbc02381779d412145331789b40cc7b11fdf449e5d94f6bc0b080db0a56ea3f0"}, + {file = "Pillow-10.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9211e7ad69d7c9401cfc0e23d49b69ca65ddd898976d660a2fa5904e3d7a9baa"}, + {file = "Pillow-10.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:faaf07ea35355b01a35cb442dd950d8f1bb5b040a7787791a535de13db15ed90"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f72a021fbb792ce98306ffb0c348b3c9cb967dce0f12a49aa4c3d3fdefa967"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f7c16705f44e0504a3a2a14197c1f0b32a95731d251777dcb060aa83022cb2d"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:76edb0a1fa2b4745fb0c99fb9fb98f8b180a1bbceb8be49b087e0b21867e77d3"}, + {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:368ab3dfb5f49e312231b6f27b8820c823652b7cd29cfbd34090565a015e99ba"}, + {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:608bfdee0d57cf297d32bcbb3c728dc1da0907519d1784962c5f0c68bb93e5a3"}, + {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5c6e3df6bdd396749bafd45314871b3d0af81ff935b2d188385e970052091017"}, + {file = "Pillow-10.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:7be600823e4c8631b74e4a0d38384c73f680e6105a7d3c6824fcf226c178c7e6"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:92be919bbc9f7d09f7ae343c38f5bb21c973d2576c1d45600fce4b74bafa7ac0"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8182b523b2289f7c415f589118228d30ac8c355baa2f3194ced084dac2dbba"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:38250a349b6b390ee6047a62c086d3817ac69022c127f8a5dc058c31ccef17f3"}, + {file = "Pillow-10.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:88af2003543cc40c80f6fca01411892ec52b11021b3dc22ec3bc9d5afd1c5334"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c189af0545965fa8d3b9613cfdb0cd37f9d71349e0f7750e1fd704648d475ed2"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7b031a6fc11365970e6a5686d7ba8c63e4c1cf1ea143811acbb524295eabed"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db24668940f82321e746773a4bc617bfac06ec831e5c88b643f91f122a785684"}, + {file = "Pillow-10.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:efe8c0681042536e0d06c11f48cebe759707c9e9abf880ee213541c5b46c5bf3"}, + {file = "Pillow-10.0.0.tar.gz", hash = "sha256:9c82b5b3e043c7af0d95792d0d20ccf68f61a1fec6b3530e718b688422727396"}, +] [package.extras] docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] @@ -1647,32 +2563,29 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa [[package]] name = "platformdirs" -version = "3.8.0" - +version = "3.10.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" optional = false python-versions = ">=3.7" - files = [ - {file = "platformdirs-3.5.0-py3-none-any.whl", hash = "sha256:47692bc24c1958e8b0f13dd727307cff1db103fca36399f457da8e05f222fdc4"}, - {file = "platformdirs-3.5.0.tar.gz", hash = "sha256:7954a68d0ba23558d753f73437c55f89027cf8f5108c19844d4b82e5af396335"}, + {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, + {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, ] - - [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)", "sphinx (>=7.0.1)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest (>=7.3.1)"] - +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pluggy" -version = "1.2.0" +version = "1.3.0" description = "plugin and hook calling mechanisms for python" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] [package.extras] dev = ["pre-commit", "tox"] @@ -1680,18 +2593,17 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "polars" -version = "0.17.12" +version = "0.17.15" description = "Blazingly fast DataFrame library" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "polars-0.17.12-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:0e14abda95c572261e4029dc87419179517faf0fb4ea11a2c0bb10c2eca7da4d"}, - {file = "polars-0.17.12-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:7bf7e865c11a151306296f730817ffa0e3df971765e0d5643ada185c627b3599"}, - {file = "polars-0.17.12-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1958ce4213ca491a5fa3cb307d9a47a1d101a0fe15382648ee87ee4d23cc356b"}, - {file = "polars-0.17.12-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfe4b9b0e1c9501bf3ea73522923b757a0b125e6d4fe72d1c943036b2aac0f49"}, - {file = "polars-0.17.12-cp37-abi3-win_amd64.whl", hash = "sha256:d998917bf3ea1149c33c901f3311a69f0a2bde64b6198635c7d72658ceb898f9"}, - {file = "polars-0.17.12.tar.gz", hash = "sha256:0d043f1fbcf4efced53b048f76ffd7cf2e203caec635517de2e9cf2e235cb3e5"}, + {file = "polars-0.17.15-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:e14f31799e73cd6aa7a5f28b7acc40fc0b70eb6f8554f8e9246bf7afc620a929"}, + {file = "polars-0.17.15-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:9ecec1476764d615a0def5a35421e4a8f0f43dbf365cda7f95d79bb29d80da34"}, + {file = "polars-0.17.15-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ce049ed923ff2a8902f8925bde0e10722e7a9747133b7d0856feb86000543bd"}, + {file = "polars-0.17.15-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f3a723ee318f8f7e7330df82bb27c9efd3c345d3ecd03307389e4e1564f4df6"}, + {file = "polars-0.17.15-cp37-abi3-win_amd64.whl", hash = "sha256:112300a41b97291486edb604945275f7e5238ec1335f164f028e476c0401fca4"}, + {file = "polars-0.17.15.tar.gz", hash = "sha256:78a1d520279c0ade91712d19c530d7933e07885d87f09c0cd38daac6260162bf"}, ] [package.extras] @@ -1712,7 +2624,6 @@ xlsxwriter = ["xlsxwriter"] name = "poyo" version = "0.5.0" description = "A lightweight YAML Parser for Python. 🐓" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1724,9 +2635,12 @@ files = [ name = "pre-commit" version = "2.21.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, + {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, +] [package.dependencies] cfgv = ">=2.0.0" @@ -1739,9 +2653,12 @@ virtualenv = ">=20.10.0" name = "prefect" version = "0.15.9" description = "The Prefect Core automation and scheduling engine." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "prefect-0.15.9-py3-none-any.whl", hash = "sha256:595c9f229349528f7bcd2aa866c9c10dcfbf059a20803526924339d45604ec76"}, + {file = "prefect-0.15.9.tar.gz", hash = "sha256:52d4d28493cd1a90e1acf96b5a92b2902950849b481a49f762998448a41cf127"}, +] [package.dependencies] click = ">=7.0,<9.0" @@ -1767,26 +2684,26 @@ urllib3 = ">=1.24.3" [package.extras] airtable = ["airtable-python-wrapper (>=0.11,<0.12)"] -all_extras = ["airtable-python-wrapper (>=0.11,<0.12)", "boto3 (>=1.9,<2.0)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "azure-cosmos (>=3.1.1,<3.2)", "atlassian-python-api (>=2.0.1)", "dask-cloudprovider[aws] (>=0.2.0)", "black", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "mypy (>=0.600,<0.813)", "Pygments (>=2.2,<3.0)", "pytest (>=6.0)", "testfixtures (>=6.10.3)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "flaky (>=3.0)", "responses (>=0.14.0)", "dropbox (>=9.0,<10.0)", "great-expectations (>=0.11.1)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-auth (>=2.0,<3.0)", "dulwich (>=0.19.7)", "PyGithub (>=1.51,<2.0)", "python-gitlab (>=2.5.0,<3.0)", "gspread (>=3.6.0)", "jira (>=2.0.0)", "papermill (>=2.2.0)", "nbconvert (>=6.0.7)", "confluent-kafka (>=1.7.0)", "dask-kubernetes (>=0.8.0)", "kubernetes (>=9.0.0a1,<=13.0)", "pandas (>=1.0.1)", "psycopg2-binary (>=2.8.2)", "prometheus-client (>=0.9.0)", "pymysql (>=0.9.3)", "pyodbc (>=4.0.30)", "pushbullet.py (>=0.11.0)", "redis (>=3.2.1)", "feedparser (>=5.0.1,<6.0)", "snowflake-connector-python (>=1.8.2,<2.5)", "spacy (>=2.0.0,<3.0.0)", "hvac (>=0.10)", "graphviz (>=0.8.3)", "tweepy (>=3.5,<4.0)", "pyarrow (>=5.0.0)", "pyexasol (>=0.16.1)", "soda-sql (>=2.0.0b25)", "sendgrid (>=6.7.0)"] -all_orchestration_extras = ["boto3 (>=1.9,<2.0)", "azure-storage-blob (>=12.1.0,<13.0)", "atlassian-python-api (>=2.0.1)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-auth (>=2.0,<3.0)", "dulwich (>=0.19.7)", "PyGithub (>=1.51,<2.0)", "python-gitlab (>=2.5.0,<3.0)", "kubernetes (>=9.0.0a1,<=13.0)"] +all-extras = ["PyGithub (>=1.51,<2.0)", "Pygments (>=2.2,<3.0)", "airtable-python-wrapper (>=0.11,<0.12)", "atlassian-python-api (>=2.0.1)", "azure-cosmos (>=3.1.1,<3.2)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "black", "boto3 (>=1.9,<2.0)", "confluent-kafka (>=1.7.0)", "dask-cloudprovider[aws] (>=0.2.0)", "dask-kubernetes (>=0.8.0)", "dropbox (>=9.0,<10.0)", "dulwich (>=0.19.7)", "feedparser (>=5.0.1,<6.0)", "flaky (>=3.0)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "graphviz (>=0.8)", "graphviz (>=0.8.3)", "great-expectations (>=0.11.1)", "gspread (>=3.6.0)", "hvac (>=0.10)", "jinja2 (>=2.0,<4.0)", "jira (>=2.0.0)", "kubernetes (>=9.0.0a1,<=13.0)", "mypy (>=0.600,<0.813)", "nbconvert (>=6.0.7)", "pandas (>=1.0.1)", "papermill (>=2.2.0)", "prometheus-client (>=0.9.0)", "psycopg2-binary (>=2.8.2)", "pushbullet.py (>=0.11.0)", "pyarrow (>=5.0.0)", "pyexasol (>=0.16.1)", "pymysql (>=0.9.3)", "pyodbc (>=4.0.30)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "python-gitlab (>=2.5.0,<3.0)", "redis (>=3.2.1)", "responses (>=0.14.0)", "sendgrid (>=6.7.0)", "snowflake-connector-python (>=1.8.2,<2.5)", "soda-sql (>=2.0.0b25)", "spacy (>=2.0.0,<3.0.0)", "testfixtures (>=6.10.3)", "tweepy (>=3.5,<4.0)"] +all-orchestration-extras = ["PyGithub (>=1.51,<2.0)", "atlassian-python-api (>=2.0.1)", "azure-storage-blob (>=12.1.0,<13.0)", "boto3 (>=1.9,<2.0)", "dulwich (>=0.19.7)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "kubernetes (>=9.0.0a1,<=13.0)", "python-gitlab (>=2.5.0,<3.0)"] aws = ["boto3 (>=1.9,<2.0)"] -azure = ["azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "azure-cosmos (>=3.1.1,<3.2)"] -base_library_ci = ["boto3 (>=1.9,<2.0)", "azure-storage-blob (>=12.1.0,<13.0)", "atlassian-python-api (>=2.0.1)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-auth (>=2.0,<3.0)", "dulwich (>=0.19.7)", "PyGithub (>=1.51,<2.0)", "python-gitlab (>=2.5.0,<3.0)", "kubernetes (>=9.0.0a1,<=13.0)", "black", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "mypy (>=0.600,<0.813)", "Pygments (>=2.2,<3.0)", "pytest (>=6.0)", "testfixtures (>=6.10.3)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "flaky (>=3.0)", "responses (>=0.14.0)", "pandas (>=1.0.1)", "jira (>=2.0.0)"] +azure = ["azure-cosmos (>=3.1.1,<3.2)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)"] +base-library-ci = ["PyGithub (>=1.51,<2.0)", "Pygments (>=2.2,<3.0)", "atlassian-python-api (>=2.0.1)", "azure-storage-blob (>=12.1.0,<13.0)", "black", "boto3 (>=1.9,<2.0)", "dulwich (>=0.19.7)", "flaky (>=3.0)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "jira (>=2.0.0)", "kubernetes (>=9.0.0a1,<=13.0)", "mypy (>=0.600,<0.813)", "pandas (>=1.0.1)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "python-gitlab (>=2.5.0,<3.0)", "responses (>=0.14.0)", "testfixtures (>=6.10.3)"] bitbucket = ["atlassian-python-api (>=2.0.1)"] -dask_cloudprovider = ["dask-cloudprovider[aws] (>=0.2.0)"] -dev = ["black", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "mypy (>=0.600,<0.813)", "Pygments (>=2.2,<3.0)", "pytest (>=6.0)", "testfixtures (>=6.10.3)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "flaky (>=3.0)", "responses (>=0.14.0)"] +dask-cloudprovider = ["dask-cloudprovider[aws] (>=0.2.0)"] +dev = ["Pygments (>=2.2,<3.0)", "black", "flaky (>=3.0)", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "mypy (>=0.600,<0.813)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "responses (>=0.14.0)", "testfixtures (>=6.10.3)"] dremio = ["pyarrow (>=5.0.0)"] dropbox = ["dropbox (>=9.0,<10.0)"] exasol = ["pyexasol (>=0.16.1)"] -gcp = ["google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-auth (>=2.0,<3.0)"] +gcp = ["google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)"] ge = ["great-expectations (>=0.11.1)"] git = ["dulwich (>=0.19.7)"] github = ["PyGithub (>=1.51,<2.0)"] gitlab = ["python-gitlab (>=2.5.0,<3.0)"] -google = ["google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-auth (>=2.0,<3.0)"] +google = ["google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)"] gsheets = ["gspread (>=3.6.0)"] jira = ["jira (>=2.0.0)"] -jupyter = ["papermill (>=2.2.0)", "nbconvert (>=6.0.7)"] +jupyter = ["nbconvert (>=6.0.7)", "papermill (>=2.2.0)"] kafka = ["confluent-kafka (>=1.7.0)"] kubernetes = ["dask-kubernetes (>=0.8.0)", "kubernetes (>=9.0.0a1,<=13.0)"] mysql = ["pymysql (>=0.9.3)"] @@ -1800,24 +2717,23 @@ sendgrid = ["sendgrid (>=6.7.0)"] snowflake = ["snowflake-connector-python (>=1.8.2,<2.5)"] sodasql = ["soda-sql (>=2.0.0b25)"] spacy = ["spacy (>=2.0.0,<3.0.0)"] -sql_server = ["pyodbc (>=4.0.30)"] -task_library_ci = ["airtable-python-wrapper (>=0.11,<0.12)", "boto3 (>=1.9,<2.0)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "azure-cosmos (>=3.1.1,<3.2)", "atlassian-python-api (>=2.0.1)", "black", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "mypy (>=0.600,<0.813)", "Pygments (>=2.2,<3.0)", "pytest (>=6.0)", "testfixtures (>=6.10.3)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "flaky (>=3.0)", "responses (>=0.14.0)", "dropbox (>=9.0,<10.0)", "great-expectations (>=0.11.1)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-auth (>=2.0,<3.0)", "dulwich (>=0.19.7)", "PyGithub (>=1.51,<2.0)", "python-gitlab (>=2.5.0,<3.0)", "gspread (>=3.6.0)", "jira (>=2.0.0)", "papermill (>=2.2.0)", "nbconvert (>=6.0.7)", "confluent-kafka (>=1.7.0)", "dask-kubernetes (>=0.8.0)", "kubernetes (>=9.0.0a1,<=13.0)", "pandas (>=1.0.1)", "psycopg2-binary (>=2.8.2)", "prometheus-client (>=0.9.0)", "pymysql (>=0.9.3)", "pushbullet.py (>=0.11.0)", "redis (>=3.2.1)", "feedparser (>=5.0.1,<6.0)", "snowflake-connector-python (>=1.8.2,<2.5)", "spacy (>=2.0.0,<3.0.0)", "hvac (>=0.10)", "graphviz (>=0.8.3)", "tweepy (>=3.5,<4.0)", "pyarrow (>=5.0.0)", "pyexasol (>=0.16.1)", "soda-sql (>=2.0.0b25)", "sendgrid (>=6.7.0)"] +sql-server = ["pyodbc (>=4.0.30)"] +task-library-ci = ["PyGithub (>=1.51,<2.0)", "Pygments (>=2.2,<3.0)", "airtable-python-wrapper (>=0.11,<0.12)", "atlassian-python-api (>=2.0.1)", "azure-cosmos (>=3.1.1,<3.2)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "black", "boto3 (>=1.9,<2.0)", "confluent-kafka (>=1.7.0)", "dask-kubernetes (>=0.8.0)", "dropbox (>=9.0,<10.0)", "dulwich (>=0.19.7)", "feedparser (>=5.0.1,<6.0)", "flaky (>=3.0)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "graphviz (>=0.8)", "graphviz (>=0.8.3)", "great-expectations (>=0.11.1)", "gspread (>=3.6.0)", "hvac (>=0.10)", "jinja2 (>=2.0,<4.0)", "jira (>=2.0.0)", "kubernetes (>=9.0.0a1,<=13.0)", "mypy (>=0.600,<0.813)", "nbconvert (>=6.0.7)", "pandas (>=1.0.1)", "papermill (>=2.2.0)", "prometheus-client (>=0.9.0)", "psycopg2-binary (>=2.8.2)", "pushbullet.py (>=0.11.0)", "pyarrow (>=5.0.0)", "pyexasol (>=0.16.1)", "pymysql (>=0.9.3)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "python-gitlab (>=2.5.0,<3.0)", "redis (>=3.2.1)", "responses (>=0.14.0)", "sendgrid (>=6.7.0)", "snowflake-connector-python (>=1.8.2,<2.5)", "soda-sql (>=2.0.0b25)", "spacy (>=2.0.0,<3.0.0)", "testfixtures (>=6.10.3)", "tweepy (>=3.5,<4.0)"] templates = ["jinja2 (>=2.0,<4.0)"] -test = ["pytest (>=6.0)", "testfixtures (>=6.10.3)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "flaky (>=3.0)", "responses (>=0.14.0)"] +test = ["flaky (>=3.0)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "responses (>=0.14.0)", "testfixtures (>=6.10.3)"] twitter = ["tweepy (>=3.5,<4.0)"] vault = ["hvac (>=0.10)"] viz = ["graphviz (>=0.8.3)"] [[package]] name = "prompt-toolkit" -version = "3.0.38" +version = "3.0.39" description = "Library for building powerful interactive command lines in Python" -category = "dev" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f"}, - {file = "prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b"}, + {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, + {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, ] [package.dependencies] @@ -1827,9 +2743,12 @@ wcwidth = "*" name = "proto-plus" version = "1.19.8" description = "Beautiful, Pythonic protocol buffers." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "proto-plus-1.19.8.tar.gz", hash = "sha256:bdf45f0e0be71510eb2ec9db4da78afde7b5fb8b0a507a36340a9b6ce8e48e58"}, + {file = "proto_plus-1.19.8-py3-none-any.whl", hash = "sha256:3434eadaed845a337d6c488d2b7d055d733aaa231c0c0d4c778ec720bb91cf87"}, +] [package.dependencies] protobuf = ">=3.19.0" @@ -1841,26 +2760,79 @@ testing = ["google-api-core[grpc] (>=1.22.2)"] name = "protobuf" version = "3.19.1" description = "Protocol Buffers" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "protobuf-3.19.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d80f80eb175bf5f1169139c2e0c5ada98b1c098e2b3c3736667f28cbbea39fc8"}, + {file = "protobuf-3.19.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a529e7df52204565bcd33738a7a5f288f3d2d37d86caa5d78c458fa5fabbd54d"}, + {file = "protobuf-3.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28ccea56d4dc38d35cd70c43c2da2f40ac0be0a355ef882242e8586c6d66666f"}, + {file = "protobuf-3.19.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b30a7de128c46b5ecb343917d9fa737612a6e8280f440874e5cc2ba0d79b8f6"}, + {file = "protobuf-3.19.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5935c8ce02e3d89c7900140a8a42b35bc037ec07a6aeb61cc108be8d3c9438a6"}, + {file = "protobuf-3.19.1-cp36-cp36m-win32.whl", hash = "sha256:74f33edeb4f3b7ed13d567881da8e5a92a72b36495d57d696c2ea1ae0cfee80c"}, + {file = "protobuf-3.19.1-cp36-cp36m-win_amd64.whl", hash = "sha256:038daf4fa38a7e818dd61f51f22588d61755160a98db087a046f80d66b855942"}, + {file = "protobuf-3.19.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e51561d72efd5bd5c91490af1f13e32bcba8dab4643761eb7de3ce18e64a853"}, + {file = "protobuf-3.19.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:6e8ea9173403219239cdfd8d946ed101f2ab6ecc025b0fda0c6c713c35c9981d"}, + {file = "protobuf-3.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db3532d9f7a6ebbe2392041350437953b6d7a792de10e629c1e4f5a6b1fe1ac6"}, + {file = "protobuf-3.19.1-cp37-cp37m-win32.whl", hash = "sha256:615b426a177780ce381ecd212edc1e0f70db8557ed72560b82096bd36b01bc04"}, + {file = "protobuf-3.19.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d8919368410110633717c406ab5c97e8df5ce93020cfcf3012834f28b1fab1ea"}, + {file = "protobuf-3.19.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:71b0250b0cfb738442d60cab68abc166de43411f2a4f791d31378590bfb71bd7"}, + {file = "protobuf-3.19.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3cd0458870ea7d1c58e948ac8078f6ba8a7ecc44a57e03032ed066c5bb318089"}, + {file = "protobuf-3.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:655264ed0d0efe47a523e2255fc1106a22f6faab7cc46cfe99b5bae085c2a13e"}, + {file = "protobuf-3.19.1-cp38-cp38-win32.whl", hash = "sha256:b691d996c6d0984947c4cf8b7ae2fe372d99b32821d0584f0b90277aa36982d3"}, + {file = "protobuf-3.19.1-cp38-cp38-win_amd64.whl", hash = "sha256:e7e8d2c20921f8da0dea277dfefc6abac05903ceac8e72839b2da519db69206b"}, + {file = "protobuf-3.19.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fd390367fc211cc0ffcf3a9e149dfeca78fecc62adb911371db0cec5c8b7472d"}, + {file = "protobuf-3.19.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d83e1ef8cb74009bebee3e61cc84b1c9cd04935b72bca0cbc83217d140424995"}, + {file = "protobuf-3.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36d90676d6f426718463fe382ec6274909337ca6319d375eebd2044e6c6ac560"}, + {file = "protobuf-3.19.1-cp39-cp39-win32.whl", hash = "sha256:e7b24c11df36ee8e0c085e5b0dc560289e4b58804746fb487287dda51410f1e2"}, + {file = "protobuf-3.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:77d2fadcf369b3f22859ab25bd12bb8e98fb11e05d9ff9b7cd45b711c719c002"}, + {file = "protobuf-3.19.1-py2.py3-none-any.whl", hash = "sha256:e813b1c9006b6399308e917ac5d298f345d95bb31f46f02b60cd92970a9afa17"}, + {file = "protobuf-3.19.1.tar.gz", hash = "sha256:62a8e4baa9cb9e064eb62d1002eca820857ab2138440cb4b3ea4243830f94ca7"}, +] [[package]] name = "psutil" version = "5.8.0" description = "Cross-platform lib for process and system monitoring in Python." -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "psutil-5.8.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64"}, + {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0ae6f386d8d297177fd288be6e8d1afc05966878704dad9847719650e44fc49c"}, + {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:12d844996d6c2b1d3881cfa6fa201fd635971869a9da945cf6756105af73d2df"}, + {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:02b8292609b1f7fcb34173b25e48d0da8667bc85f81d7476584d889c6e0f2131"}, + {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6ffe81843131ee0ffa02c317186ed1e759a145267d54fdef1bc4ea5f5931ab60"}, + {file = "psutil-5.8.0-cp27-none-win32.whl", hash = "sha256:ea313bb02e5e25224e518e4352af4bf5e062755160f77e4b1767dd5ccb65f876"}, + {file = "psutil-5.8.0-cp27-none-win_amd64.whl", hash = "sha256:5da29e394bdedd9144c7331192e20c1f79283fb03b06e6abd3a8ae45ffecee65"}, + {file = "psutil-5.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:74fb2557d1430fff18ff0d72613c5ca30c45cdbfcddd6a5773e9fc1fe9364be8"}, + {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:74f2d0be88db96ada78756cb3a3e1b107ce8ab79f65aa885f76d7664e56928f6"}, + {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99de3e8739258b3c3e8669cb9757c9a861b2a25ad0955f8e53ac662d66de61ac"}, + {file = "psutil-5.8.0-cp36-cp36m-win32.whl", hash = "sha256:36b3b6c9e2a34b7d7fbae330a85bf72c30b1c827a4366a07443fc4b6270449e2"}, + {file = "psutil-5.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:52de075468cd394ac98c66f9ca33b2f54ae1d9bff1ef6b67a212ee8f639ec06d"}, + {file = "psutil-5.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c6a5fd10ce6b6344e616cf01cc5b849fa8103fbb5ba507b6b2dee4c11e84c935"}, + {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:61f05864b42fedc0771d6d8e49c35f07efd209ade09a5afe6a5059e7bb7bf83d"}, + {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:0dd4465a039d343925cdc29023bb6960ccf4e74a65ad53e768403746a9207023"}, + {file = "psutil-5.8.0-cp37-cp37m-win32.whl", hash = "sha256:1bff0d07e76114ec24ee32e7f7f8d0c4b0514b3fae93e3d2aaafd65d22502394"}, + {file = "psutil-5.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:fcc01e900c1d7bee2a37e5d6e4f9194760a93597c97fee89c4ae51701de03563"}, + {file = "psutil-5.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6223d07a1ae93f86451d0198a0c361032c4c93ebd4bf6d25e2fb3edfad9571ef"}, + {file = "psutil-5.8.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d225cd8319aa1d3c85bf195c4e07d17d3cd68636b8fc97e6cf198f782f99af28"}, + {file = "psutil-5.8.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:28ff7c95293ae74bf1ca1a79e8805fcde005c18a122ca983abf676ea3466362b"}, + {file = "psutil-5.8.0-cp38-cp38-win32.whl", hash = "sha256:ce8b867423291cb65cfc6d9c4955ee9bfc1e21fe03bb50e177f2b957f1c2469d"}, + {file = "psutil-5.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:90f31c34d25b1b3ed6c40cdd34ff122b1887a825297c017e4cbd6796dd8b672d"}, + {file = "psutil-5.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6323d5d845c2785efb20aded4726636546b26d3b577aded22492908f7c1bdda7"}, + {file = "psutil-5.8.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:245b5509968ac0bd179287d91210cd3f37add77dad385ef238b275bad35fa1c4"}, + {file = "psutil-5.8.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:90d4091c2d30ddd0a03e0b97e6a33a48628469b99585e2ad6bf21f17423b112b"}, + {file = "psutil-5.8.0-cp39-cp39-win32.whl", hash = "sha256:ea372bcc129394485824ae3e3ddabe67dc0b118d262c568b4d2602a7070afdb0"}, + {file = "psutil-5.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3"}, + {file = "psutil-5.8.0.tar.gz", hash = "sha256:0c9ccb99ab76025f2f0bbecf341d4656e9c1351db8cc8a03ccd62e318ab4b5c6"}, +] [package.extras] -test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"] +test = ["enum34", "ipaddress", "mock", "pywin32", "unittest2", "wmi"] [[package]] name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -1872,7 +2844,6 @@ files = [ name = "pure-eval" version = "0.2.2" description = "Safely evaluate AST nodes without side effects" -category = "dev" optional = false python-versions = "*" files = [ @@ -1887,9 +2858,12 @@ tests = ["pytest"] name = "pyaml" version = "20.4.0" description = "PyYAML-based module to produce pretty and readable YAML-serialized data" -category = "main" optional = false python-versions = "*" +files = [ + {file = "pyaml-20.4.0-py2.py3-none-any.whl", hash = "sha256:67081749a82b72c45e5f7f812ee3a14a03b3f5c25ff36ec3b290514f8c4c4b99"}, + {file = "pyaml-20.4.0.tar.gz", hash = "sha256:29a5c2a68660a799103d6949167bd6c7953d031449d08802386372de1db6ad71"}, +] [package.dependencies] PyYAML = "*" @@ -1898,9 +2872,46 @@ PyYAML = "*" name = "pyarrow" version = "6.0.0" description = "Python library for Apache Arrow" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_13_universal2.whl", hash = "sha256:c7a6e7e0bf8779e9c3428ced85507541f3da9a0675e2f4781d4eb2c7042cbf81"}, + {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:7a683f71b848eb6310b4ec48c0def55dac839e9994c1ac874c9b2d3d5625def1"}, + {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5144bd9db2920c7cb566c96462d62443cc239104f94771d110f74393f2fb42a2"}, + {file = "pyarrow-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed0be080cf595ea15ff1c9ff4097bbf1fcc4b50847d98c0a3c0412fbc6ede7e9"}, + {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:072c1a0fca4509eefd7d018b78542fb7e5c63aaf5698f1c0a6e45628ae17ba44"}, + {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5bed4f948c032c40597302e9bdfa65f62295240306976ecbe43a54924c6f94f"}, + {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:465f87fa0be0b2928b2beeba22b5813a0203fb05d90fd8563eea48e08ecc030e"}, + {file = "pyarrow-6.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:ddf2e6e3b321adaaf716f2d5af8e92d205a9671e0cb7c0779710a567fd1dd580"}, + {file = "pyarrow-6.0.0-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:0204e80777ab8f4e9abd3a765a8ec07ed1e3c4630bacda50d2ce212ef0f3826f"}, + {file = "pyarrow-6.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:82fe80309e01acf29e3943a1f6d3c98ec109fe1d356bc1ac37d639bcaadcf684"}, + {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:281ce5fa03621d786a9beb514abb09846db7f0221b50eabf543caa24037eaacd"}, + {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5408fa8d623e66a0445f3fb0e4027fd219bf99bfb57422d543d7b7876e2c5b55"}, + {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a19e58dfb04e451cd8b7bdec3ac8848373b95dfc53492c9a69789aa9074a3c1b"}, + {file = "pyarrow-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b86d175262db1eb46afdceb36d459409eb6f8e532d3dec162f8bf572c7f57623"}, + {file = "pyarrow-6.0.0-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:2d2c681659396c745e4f1988d5dd41dcc3ad557bb8d4a8c2e44030edafc08a91"}, + {file = "pyarrow-6.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c666bc6a1cebf01206e2dc1ab05f25f39f35d3a499e0ef5cd635225e07306ca"}, + {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8d41dfb09ba9236cca6245f33088eb42f3c54023da281139241e0f9f3b4b754e"}, + {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477c746ef42c039348a288584800e299456c80c5691401bb9b19aa9c02a427b7"}, + {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c38263ea438a1666b13372e7565450cfeec32dbcd1c2595749476a58465eaec"}, + {file = "pyarrow-6.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e81508239a71943759cee272ce625ae208092dd36ef2c6713fccee30bbcf52bb"}, + {file = "pyarrow-6.0.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:a50d2f77b86af38ceabf45617208b9105d20e7a5eebc584e7c8c0acededd82ce"}, + {file = "pyarrow-6.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbda7595f24a639bcef3419ecfac17216efacb09f7b0f1b4c4c97f900d65ca0e"}, + {file = "pyarrow-6.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bf3400780c4d3c9cb43b1e8a1aaf2e1b7199a0572d0a645529d2784e4d0d8497"}, + {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:15dc0d673d3f865ca63c877bd7a2eced70b0a08969fb733a28247134b8a1f18b"}, + {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1d9a2f4ee812ed0bd4182cabef99ea914ac297274f0de086f2488093d284ef"}, + {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d046dc78a9337baa6415be915c5a16222505233e238a1017f368243c89817eea"}, + {file = "pyarrow-6.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:ea64a48a85c631eb2a0ea13ccdec5143c85b5897836b16331ee4289d27a57247"}, + {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_13_universal2.whl", hash = "sha256:cc1d4a70efd583befe92d4ea6f74ed2e0aa31ccdde767cd5cae8e77c65a1c2d4"}, + {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:004185e0babc6f3c3fba6ba4f106e406a0113d0f82bb9ad9a8571a1978c45d04"}, + {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c23f8cdecd3d9e49f9b0f9a651ae5549d1d32fd4901fb1bdc2d327edfba844f"}, + {file = "pyarrow-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fb701ec4a94b92102606d4e88f0b8eba34f09a5ad8e014eaa4af76f42b7f62ae"}, + {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da7860688c33ca88ac05f1a487d32d96d9caa091412496c35f3d1d832145675a"}, + {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac941a147d14993987cc8b605b721735a34b3e54d167302501fb4db1ad7382c7"}, + {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6163d82cca7541774b00503c295fe86a1722820eddb958b57f091bb6f5b0a6db"}, + {file = "pyarrow-6.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:376c4b5f248ae63df21fe15c194e9013753164be2d38f4b3fb8bde63ac5a1958"}, + {file = "pyarrow-6.0.0.tar.gz", hash = "sha256:5be62679201c441356d3f2a739895dcc8d4d299f2a6eabcd2163bfb6a898abba"}, +] [package.dependencies] numpy = ">=1.16.6" @@ -1909,17 +2920,23 @@ numpy = ">=1.16.6" name = "pyasn1" version = "0.4.8" description = "ASN.1 types and codecs" -category = "main" optional = false python-versions = "*" +files = [ + {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, + {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, +] [[package]] name = "pyasn1-modules" version = "0.2.8" description = "A collection of ASN.1-based protocols modules." -category = "main" optional = false python-versions = "*" +files = [ + {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, + {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, +] [package.dependencies] pyasn1 = ">=0.4.6,<0.5.0" @@ -1928,7 +2945,6 @@ pyasn1 = ">=0.4.6,<0.5.0" name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1940,19 +2956,22 @@ files = [ name = "pydata-google-auth" version = "1.2.0" description = "PyData helpers for authenticating to Google APIs" -category = "main" optional = false python-versions = "*" +files = [ + {file = "pydata-google-auth-1.2.0.tar.gz", hash = "sha256:076411ecd7a5ac927ba9741c32ea599bc66e54170dffc1259f3cd353cf25cbd7"}, + {file = "pydata_google_auth-1.2.0-py2.py3-none-any.whl", hash = "sha256:2e2b27425d6f8a9ead496c0fd677a09448cbca2b71055abe3ee72c7f8f1774f4"}, +] [package.dependencies] google-auth = "*" google-auth-oauthlib = "*" +setuptools = "*" [[package]] name = "pydocstyle" version = "6.3.0" description = "Python docstring style checker" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1968,14 +2987,13 @@ toml = ["tomli (>=1.2.3)"] [[package]] name = "pygments" -version = "2.15.1" +version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, - {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, ] [package.extras] @@ -1985,17 +3003,72 @@ plugins = ["importlib-metadata"] name = "pymssql" version = "2.2.5" description = "DB-API interface to Microsoft SQL Server for Python. (new Cython-based version)" -category = "main" optional = false python-versions = "*" +files = [ + {file = "pymssql-2.2.5-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:6462017183f05ae231c3f84efce4e9a8d085b4a2e9e3ed5c407ee643494a0842"}, + {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6a013c82f7320c92039ac20db935e897a3fcd7423435705cef177f863dbb32e4"}, + {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:45e9bba4870103363c865d2b867de8de082745dd753083f27927ded3d15df587"}, + {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20de2f718f3c99040637a0e7d3b81f22e62211bcac01fb65641b964e70f26e20"}, + {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18eb4fcb55b67aaa2811e124eb8750fd84eeba1668a695908c6cc13682f6be5d"}, + {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_24_i686.whl", hash = "sha256:9969971117401096a8a7c1e08d84ea3d5d3f598ee482822583a44e2e6d3791d0"}, + {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:bb858c8a64990dd0145d874ef01af4b6fe39e9202ee0a74a8dff8285b801db21"}, + {file = "pymssql-2.2.5-cp310-cp310-win32.whl", hash = "sha256:da78a94908d42aa0f8af1b917c49c4dea38273035f81ea168b095e0b3ba8e486"}, + {file = "pymssql-2.2.5-cp310-cp310-win_amd64.whl", hash = "sha256:b691779a450ebbbb98cd2ad89ae9f17799b0bf0c9dd2e65b316efcc74246716e"}, + {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92262bf5d21b6d80e887d6fd0f03ab6337dad39b642b1887416cc67b1bd04cbf"}, + {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00f5b7e22bf7eb0faa5c6693e02c00f10ecc89fe505bbe84d553352681c2a749"}, + {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac80d1d11703120b986c604ddf4993c3dcbcbe907b04e34729c5aae2891399c0"}, + {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bf813ea0e4a0bfbb53a3469125eed06635222ea729339403585fd45f18a7812"}, + {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_24_i686.whl", hash = "sha256:73b747261cdf8d69395823cf650cf143d618ada412cbec90a88e4d449e7fa7f8"}, + {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_24_x86_64.whl", hash = "sha256:ce9e7ed16793c72d28e80506abd59a06b594fc55fe24f6256b7007b5b5e26120"}, + {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b5dcb4e4ceb16592a5d9ea3868162f21e7c215dde5c5e7f992709696c84a69b0"}, + {file = "pymssql-2.2.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9c90bc134a0c5c60e9acf651d87275c7e6dc6682981f62d574fa3dd441acb0f2"}, + {file = "pymssql-2.2.5-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:29d647ef61641cebc0e16d4a549b3f793f32bab88e7ba7c7550772a7aba9dea3"}, + {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:633079e248cdefef2207c0a55608637d0f3410f53e5679c589b37ea7965a2cca"}, + {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e373764cc81719f830b113ce6fee6849f2c4e5dfe1037804864b7dfb9946817e"}, + {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b47c05da0fffd6dd77141c1c37975a8469334f63e6faf03f5eab6d83c9001cc"}, + {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc245011aad9c018105193585469461c35fb35e7255b8e66fa27479f835742aa"}, + {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_24_i686.whl", hash = "sha256:72bbccdaf4938db7ff99db1f82ecdf6dc78778d8b7bbe6080590dd01024988de"}, + {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:395ec9e512a8d5b707aea8f516eebf51291b6fb6bc18fe4da88b222843bd4d46"}, + {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bb912b4681d55dce63f940becb7f4533661cfdb99cd6cd3daa7d7b5e285e977"}, + {file = "pymssql-2.2.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14dee37da84653d1e483236d51bc0545e6442e0642ee362526db6599fd3c1733"}, + {file = "pymssql-2.2.5-cp37-cp37m-win32.whl", hash = "sha256:5e2cd5a6da441aa3e8ee13e8811f884791d77a4cb17028381543bf50d010c919"}, + {file = "pymssql-2.2.5-cp37-cp37m-win_amd64.whl", hash = "sha256:ba43efd1057018ab404c8603bbce643347b9165c08364df8a8c03d54dffc4453"}, + {file = "pymssql-2.2.5-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:ac8d6b7e0dc97a9261b7500f086772ff5cf2bf9a0340d0aaee4dff5b217dd526"}, + {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ed7c5e58cd0ffcf3448cc38dfd2a6011f657759fcae9509748320cd89a0b8d32"}, + {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:30c4ab08cff619c7fe4d309fa6a05219b343082a1f46ca368deab5841632b8bf"}, + {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49806c343a6dea5221e98cabed1532fdd14535c5e5bb183001e0ffad31e11032"}, + {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15cc71762ec75a66bcb3751c2534ba4151b8512252b0377b842efec7cae6d953"}, + {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_24_i686.whl", hash = "sha256:e42c7043c472d45db686ae67601c6680596a2f12ceaa99fb136e647d3d8cd643"}, + {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:c738d51181ab4b3332631644ef7b561543837d1d942a291f8bc36a9e2dfb65db"}, + {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e33770ad113a646a45e4fc75f30683e92c9b929431e12977f824d6c810f28162"}, + {file = "pymssql-2.2.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8c5ad8d09f9035009ccb6f20bc9829ef60c03c436efb4b5c33af395c4030ea3d"}, + {file = "pymssql-2.2.5-cp38-cp38-win32.whl", hash = "sha256:c0611a3ea2a7ac496df30506fd28e4f7389808c59743b2eac0069e89af7289b8"}, + {file = "pymssql-2.2.5-cp38-cp38-win_amd64.whl", hash = "sha256:45c1519c94f9915911075c95fc63d62ba612e152248093aa12b7e902499c6416"}, + {file = "pymssql-2.2.5-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:1089cd5871daedc9918f8958605bbd2621006c29c06b571b419be53ea46c113a"}, + {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8ac2b3213462f078671806702dfadb8e459923f0f5013d371febebf4caf598ba"}, + {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9b707e5867bb49ad9d8945231112dfa3e9588b98f6f1248714d1f1af88321230"}, + {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:538a8e7ce255cabf093b25b72f8037b1d5fd3ba28b13a34c761a029840dc1880"}, + {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b9f5ec7896fd2f19393cd564d8ef562b26692218a84088ce1b10e9fe1215032"}, + {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_24_i686.whl", hash = "sha256:6086f0b695b7ceb4603cdc2f66356a58e367a3f1828d1ca99255c4d92d1f0932"}, + {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:e0b1bcb8465d787d5141bfc02d98e1e507d02155848b1b5622528402760f5dbf"}, + {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ebb7867207cf4cd497ea1d01b42590ed1db3561ef3ab8e135239301b6ee2695e"}, + {file = "pymssql-2.2.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8b32ad436f293c8cbadc1ba3aaf2621ab82303d169b1ab6f30f55053640ab5b1"}, + {file = "pymssql-2.2.5-cp39-cp39-win32.whl", hash = "sha256:cc523bfd26671346faccb1273b16a74dcdf1a8ac81c93c6bfebdb240e4d5a042"}, + {file = "pymssql-2.2.5-cp39-cp39-win_amd64.whl", hash = "sha256:e9cce9c47e6d550992936f91f8f2e97a8f5132749bad1cd4f5f7923bf8732d1f"}, + {file = "pymssql-2.2.5.tar.gz", hash = "sha256:857411c308ecb584a3ca633be30f1971d2a8cc0bcd978709b1abf96ff43767ad"}, +] [[package]] name = "pyparsing" version = "3.0.6" description = "Python parsing module" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, + {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, +] [package.extras] diagrams = ["jinja2", "railroad-diagrams"] @@ -2004,9 +3077,12 @@ diagrams = ["jinja2", "railroad-diagrams"] name = "pytest" version = "7.4.0" description = "pytest: simple powerful testing with Python" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} @@ -2021,37 +3097,38 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no [[package]] name = "pytest-cov" -version = "4.0.0" +version = "4.1.0" description = "Pytest plugin for measuring coverage." -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pytest-cov-4.0.0.tar.gz", hash = "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470"}, - {file = "pytest_cov-4.0.0-py3-none-any.whl", hash = "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b"}, + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, ] - [package.dependencies] coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] -testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] [[package]] name = "python-box" version = "5.4.1" description = "Advanced Python dictionaries with dot notation access" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "python-box-5.4.1.tar.gz", hash = "sha256:b68e0f8abc86f3deda751b3390f64df64a0989459de51ba4db949662a7b4d8ac"}, + {file = "python_box-5.4.1-py3-none-any.whl", hash = "sha256:60ae9156de34cf92b899bd099580950df70a5b0813e67a3310a1cdd1976457fa"}, +] [package.extras] -pyyaml = ["pyyaml"] -all = ["ruamel.yaml", "toml", "msgpack"] +all = ["msgpack", "ruamel.yaml", "toml"] msgpack = ["msgpack"] -"ruamel.yaml" = ["ruamel.yaml"] +pyyaml = ["PyYAML"] +ruamel-yaml = ["ruamel.yaml"] toml = ["toml"] yaml = ["ruamel.yaml"] @@ -2059,9 +3136,12 @@ yaml = ["ruamel.yaml"] name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] [package.dependencies] six = ">=1.5" @@ -2070,9 +3150,12 @@ six = ">=1.5" name = "python-levenshtein" version = "0.21.1" description = "Python extension for computing string edit distances and similarities." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "python-Levenshtein-0.21.1.tar.gz", hash = "sha256:01ea6828c03738a475ee18ea8b86a674eb45ce80e9cce88376d132cf3ab26060"}, + {file = "python_Levenshtein-0.21.1-py3-none-any.whl", hash = "sha256:5f49ebb4772a274aac4aeb190fc23ad537ebe778dec15a8f17975f746478c691"}, +] [package.dependencies] Levenshtein = "0.21.1" @@ -2081,9 +3164,12 @@ Levenshtein = "0.21.1" name = "python-slugify" version = "5.0.2" description = "A Python Slugify application that handles Unicode" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "python-slugify-5.0.2.tar.gz", hash = "sha256:f13383a0b9fcbe649a1892b9c8eb4f8eab1d6d84b84bb7a624317afa98159cab"}, + {file = "python_slugify-5.0.2-py2.py3-none-any.whl", hash = "sha256:6d8c5df75cd4a7c3a2d21e257633de53f52ab0265cd2d1dc62a730e8194a7380"}, +] [package.dependencies] text-unidecode = ">=1.3" @@ -2092,11 +3178,9 @@ text-unidecode = ">=1.3" unidecode = ["Unidecode (>=1.1.1)"] [[package]] - name = "python-string-utils" version = "1.0.0" description = "Utility functions for strings validation and manipulation." -category = "main" optional = false python-versions = ">=3.5" files = [] @@ -2109,62 +3193,327 @@ reference = "master" resolved_reference = "78929d88d90b1f90cb4837528ed955166bf0f559" [[package]] - name = "pytz" version = "2021.3" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" - -[[package]] -name = "pytz-deprecation-shim" -version = "0.1.0.post0" -description = "Shims to make deprecation of pytz easier" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl", hash = "sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6"}, - {file = "pytz_deprecation_shim-0.1.0.post0.tar.gz", hash = "sha256:af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d"}, + {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, + {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, ] -[package.dependencies] -"backports.zoneinfo" = {version = "*", markers = "python_version >= \"3.6\" and python_version < \"3.9\""} -tzdata = {version = "*", markers = "python_version >= \"3.6\""} - [[package]] name = "pytzdata" version = "2020.1" description = "The Olson timezone database for Python." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, + {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, +] [[package]] name = "pywin32" version = "227" description = "Python for Window Extensions" -category = "main" optional = false python-versions = "*" +files = [ + {file = "pywin32-227-cp27-cp27m-win32.whl", hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"}, + {file = "pywin32-227-cp27-cp27m-win_amd64.whl", hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"}, + {file = "pywin32-227-cp35-cp35m-win32.whl", hash = "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"}, + {file = "pywin32-227-cp35-cp35m-win_amd64.whl", hash = "sha256:a929a4af626e530383a579431b70e512e736e9588106715215bf685a3ea508d4"}, + {file = "pywin32-227-cp36-cp36m-win32.whl", hash = "sha256:300a2db938e98c3e7e2093e4491439e62287d0d493fe07cce110db070b54c0be"}, + {file = "pywin32-227-cp36-cp36m-win_amd64.whl", hash = "sha256:9b31e009564fb95db160f154e2aa195ed66bcc4c058ed72850d047141b36f3a2"}, + {file = "pywin32-227-cp37-cp37m-win32.whl", hash = "sha256:47a3c7551376a865dd8d095a98deba954a98f326c6fe3c72d8726ca6e6b15507"}, + {file = "pywin32-227-cp37-cp37m-win_amd64.whl", hash = "sha256:31f88a89139cb2adc40f8f0e65ee56a8c585f629974f9e07622ba80199057511"}, + {file = "pywin32-227-cp38-cp38-win32.whl", hash = "sha256:7f18199fbf29ca99dff10e1f09451582ae9e372a892ff03a28528a24d55875bc"}, + {file = "pywin32-227-cp38-cp38-win_amd64.whl", hash = "sha256:7c1ae32c489dc012930787f06244426f8356e129184a02c25aef163917ce158e"}, + {file = "pywin32-227-cp39-cp39-win32.whl", hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"}, + {file = "pywin32-227-cp39-cp39-win_amd64.whl", hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"}, +] [[package]] name = "pyyaml" version = "6.0" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] + +[[package]] +name = "pyzmq" +version = "25.1.1" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"}, + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"}, + {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"}, + {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"}, + {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"}, + {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"}, + {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"}, + {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"}, + {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"}, + {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"}, + {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"}, + {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"}, + {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "rapidfuzz" +version = "3.2.0" +description = "rapid fuzzy string matching" +optional = false +python-versions = ">=3.7" +files = [ + {file = "rapidfuzz-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f5787f1cc456207dee1902804209e1a90df67e88517213aeeb1b248822413b4c"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e8d91137b0b5a6ef06c3979b6302265129dee1741486b6baa241ac63a632bea7"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c130e73e0079f403b7c3dbf6f85816a3773971c3e639f7289f8b4337b8fd70fe"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e18059188bfe3cdbc3462aeec2fa3302b08717e04ca34e2cc6e02fb3c0280d8"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:37bb6bd6a79d5524f121ff2a7d7df4491519b3f43565dccd4596bd75aa73ab7c"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca0d6aee42effaf2e8883d2181196dd0957b1af5731b0763f10f994c32c823db"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49fc2cbbf05bfa1af3fe4c0e0c8e5c8ac118d6b6ddfb0081cff48ad53734f7ac"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd4fdee46f6ba7d254dba8e7e8f33012c964fc891a06b036b0fd20cab0db301"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ab2863732eafd1cc58f249f145c20ad13d4c902d3ef3a369b00438c05e5bfb55"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a9658c545de62ac948027092ba7f4e8507ebc5c9aef964eca654409c58f207f0"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:5f3e36cfadaf29f081ad4ca476e320b639d610e930e0557f395780c9b2bdb135"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:239ffc04328e14f5e4097102bd934352a43d5912acf34fb7d3e3fe306de92787"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b56ce39ba0a77501d491bc20a2266989ae0264452758b004950ee5f4c10c641f"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-win32.whl", hash = "sha256:dbebd639579ab113644699fe0c536ae00aba15b224e40a79987684333d1104a5"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:88e99229c4df99a7e5810d4d361033b44e29d8eb4faaddcfb8e4bdcb604cf40a"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:8e39c4e2e85828aa6c39cc7f30e2917d991b40190a2a3af1fa02396a3362a54e"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2f2e618389427c5e8304357a78f83df22558e61f11bc21aeb95dd544c274d330"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a2a6babfe4d3ce2eadd0079ee7861cb5f1584845c5a3394edead85457e7d7464"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f223deb06895c9c136b40cd8fd7e96ee745c3bb9ed502d7367f6ad9ab6fdd40e"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0de6962b45f761355fa4b37de635e4df467d57530732a40d82e748a5bc911731"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76953516cb3b75fb1234c5a90e0b86be4525f055a9e276237adb1ffe40dca536"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1e04861dddbb477500449dc67fb037656a049b6f78c4c434c6000e64aa42bb4"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff6e725eec9c769f9d22126c80a6ada90275c0d693eca2b35d5933178bda5a2"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f21ce33242e579ba255c8a8b438782164acaa55bf188d9410298c40cbaa07d5"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:986a7aad18768b920bb710e15ed7629d1da0af31589348c0a51d152820efc05d"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6e98f0a6fac14b7b9893147deceae12131f6ff169ae1c973635ef97617949c8f"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5dd5c4b9f5cd8a8271a90d1bab643028e7172808c68ed5d8dde661a3e51098e3"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:e336b0a81c5a8e689edf6928136d19e791733a66509026d9acbaa148238186e0"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8fa44afb731535a803c4c15ee846257fef050768af96d1d6c0eadb30285d0f7b"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-win32.whl", hash = "sha256:d04ad155dbecc0c143912f691d38d4790e290c2ce5411b146c0e00d4f4afd26f"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:b9e79e27344af95a71a3bb6cd3562581da5d0780ff847a13ad69ee622d940d3c"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:dc53747e73f34e8f3a3c1b0bc5b437b90a2c69d873e97781aa7c06543201409a"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:613c1043332eeba0c0910de71af221ac10d820b4fa9615b0083c733b90a757f9"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0907f87beca70e44f78e318eede2416ddba19ec43d28af9248617e8a1741ef3"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcfd184e0b5c58497cc3d961f49ac07ae1656d161c6c4d06230d267ae4e11f00"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a7d53a2f1ccfb169be26fa3824b1b185420592c75853f16c6b7115315ea6784"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2eac585803c4e8132ed5f4a150621db05c418304982c88cf706abdded65e1632"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc859f654b350def5df2ebc6d09f822b04399823e3dad1c3f2e8776c825fcde7"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8a165f64c528edc0bbbd09c76d64efd4dbe4240fd1961710b69586ef40486e79"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:56a392b655597ecf40535b56bfb7c0856c10c0abc0cbc369fd25a1665420710b"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:5863b176da42b1bb450a28375ef1502f81fbecd210a5aae295d7f2221284ad41"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:8f8590c39a3f745b314f2697b140c8f8600fe7ecfb2101e9e4ec6e7716c66827"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:da00990adf1fbc0904f22409b3451473fa465a0ef49f3075703c206080aa31b2"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:2504205552bf568ac478f17dd612d0e31c4a82c645c66209a442df7e572b5adc"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:af3ac648232c109e36c8b941106d726969972644aa3ef55218c5988aa1daea03"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:04d22f6058ce5d620ec4ecd771e44cfa77d571137d6c6547df57bdfc44ee2a98"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac7ddcd372ed202d1b59b117506da695b291f135435cfbf3e71490aa8e687173"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd3fca0224b84350f73eab1fb5728c58fd25ee4f20e512607c7d83f9bc836d3f"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bdb1f92c4666c7e1d3c21268b931cf3f06f32af98dfdeb37641159b15fa31dd"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:871052405c465a45b53a3dc854a8be62079f42cdbb052651ff0b65e2452131e6"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb9bb1af5680741cf974f510fb3894907a1b308e819aff3d9ea10b5326e8a5f6"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84ce2e010677835fa5ba591419e4404f11a1446f33eec3724a2bff557ae5144a"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c13107e0fdca5ccae70659f45646d57453338a9dfc6b152fb7372e4bf73466a0"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:538027685a1a8f1699e329f6443951267f169bfa149298734ea679db8f0e7171"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3557736672115d082979a8a12f884ed5b24268f4471fee85cfb2ec7212b68607"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6bc5e3da74644cf75663f5b438e0ae79b67d1f96d082cda771b0ecfed0528f40"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:d2d0fc98d9d7bba44f929d201c2c2c35eb69ea2ffef43d939b297dafef934625"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2bf85a3bf34f27383691e8af0fd148b2a3a89f1444d4640d04ef58030f596ee0"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-win32.whl", hash = "sha256:cf5ea3f1d65a0bee707245a0096c3a6f769b3ad6f1b9afc7176dfb73eb0ac98f"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:54906095444ea8b0a4013f3799b3f2c380205d7f60b9c55774e7d2264fa8d9c6"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6d44218823533e0d47770feef86c73c90a6f7e8d4923eafabf56a1fa3444eda0"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:87c3d4077e61c66d5dd11198a317f83db8e8cf034239baa16e4384037b611652"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc0e1142350566349c41173685988d942ebc89578f25ee27750d261e7d79e1ce"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de44a378751fdfb19ddf6af412b3395db4b21ab61f40139f815c82f1a1611b50"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca0983b30c7b289f540b11cdb550e301b3f2e8f0ef9df866aa24a16f6cd96041"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adfffb79288437006be412d74e28cddd7c5e6cc9f84a34aa9c356b13dc1ad2c9"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a284386652efb3b7d41ed5dd101ab4ce5936f585c52a47fa9838fc0342235700"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c546c83d6bc9006b86f56921b92c3e16d8ddeb4e1663653e755a5d8a3ac258da"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:53b3575fa398a5021192c1592dce98965560ad00690be3ade056eab99288562c"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:366ade5d0067dc6281e2a6c9e5c91bbfe023b09cef86894de8fe480b4696e3bf"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f946dec03cc2c77bc091d186c007d1e957d1f16a4d68a181f5fa75aea40bdf87"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:045e5cccb0e792005d5465de0ea4621b9b67778580e558f266984704e68b0087"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fd80288b9538c87209893f0934563c20b6a43acf30693794bcc111b294447ee9"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-win32.whl", hash = "sha256:a359436754ed5dd10d88706f076caa7f8e5c1469bf5ebba1897dc87aa9ff953e"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:75df3d9b895910ee810b2c96c8626cc2b5b63bb237762db36ff79fb466eccc43"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:893833a903875a50acdbcb7ed33b5426ba47412bd18b3eb80d56d982b641dc59"}, + {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3002c3660180747243cccb40c95ade1960e6665b340f211a114f5994b345ab53"}, + {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa50de7e0f95e1400b2bf38cfeb6e40cf87c862537871c2f7b2050b5db0a9dfc"}, + {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54842a578a2a8e5258812a9032ffb55e6f1185490fd160cae64e57b4dc342297"}, + {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:108861623838cd574b0faa3309ce8525c2086159de7f9e23ac263a987c070ebd"}, + {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d39128415f0b52be08c15eeee5f79288189933a4d6fa5dc5fff11e20614b7989"}, + {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3af2b75635f33ffab84e295773c84a176d4cba75311d836ad79b6795e9da11ac"}, + {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68c678f7f3ca3d83d1e1dd7fb7db3232037d9eef12a47f1d5fe248a76ca47571"}, + {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25d2bd257034e910df0951cdeff337dbd086d7d90af3ed9f6721e7bba9fc388a"}, + {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c7f20e68cad26fc140c6f2ac9e8f2632a0cd66e407ba3ea4ace63c669fd4719"}, + {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f09fd9dc73180deb9ca1c4fbd9cc27378f0ab6ee74e97318c38c5080708702b6"}, + {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:af7914fc7683f921492f32314cfbe915a5376cc08a982e09084cbd9b866c9fd4"}, + {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08a242c4b909abbcfa44504dc5041d5eeca4cd088ae51afd6a52b4dc61684fa2"}, + {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b07afaca28398b93d727a2565491c455896898b66daee4664acde4af94e557"}, + {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24e4c4a031c50e4eeb4787263319a0ac5bed20f4a263d28eac060150e3ba0018"}, + {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d19c2853a464c7b98cc408654412fd875b030f78023ccbefc4ba9eec754e07e7"}, + {file = "rapidfuzz-3.2.0.tar.gz", hash = "sha256:448d031d9960fea7826d42bd4284156fc68d3b55a6946eb34ca5c6acf960577b"}, +] + +[package.extras] +full = ["numpy"] +[[package]] +name = "rarfile" +version = "4.0" +description = "RAR archive reader for Python" +optional = false +python-versions = "*" +files = [ + {file = "rarfile-4.0-py3-none-any.whl", hash = "sha256:1094869119012f95c31a6f22cc3a9edbdca61861b805241116adbe2d737b68f8"}, + {file = "rarfile-4.0.tar.gz", hash = "sha256:67548769229c5bda0827c1663dce3f54644f9dbfba4ae86d4da2b2afd3e602a1"}, +] [[package]] name = "redis" version = "4.6.0" description = "Python client for Redis database and key-value store" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "redis-4.6.0-py3-none-any.whl", hash = "sha256:e2b03db868160ee4591de3cb90d40ebb50a90dd302138775937f6a42b7ed183c"}, + {file = "redis-4.6.0.tar.gz", hash = "sha256:585dc516b9eb042a619ef0a39c3d7d55fe81bdb4df09a52c9cdde0d07bf1aa7d"}, +] [package.dependencies] async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""} @@ -2177,9 +3526,12 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" name = "redis-pal" version = "1.0.0" description = "Store things in Redis without worrying about types or anything, just do it!" -category = "main" optional = false python-versions = ">=3.8,<4.0" +files = [ + {file = "redis-pal-1.0.0.tar.gz", hash = "sha256:8e20caf8127056a2d1208d6dd0873643efb8357602193e26c1ada8ed6737fa88"}, + {file = "redis_pal-1.0.0-py3-none-any.whl", hash = "sha256:8cbf55c926c761ce9d60803ed66ef2575f351b43c9554fd66f6458d323430bf0"}, +] [package.dependencies] dill = ">=0.3.5,<0.4.0" @@ -2189,9 +3541,12 @@ redis = ">=4.0,<5.0" name = "requests" version = "2.26.0" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, + {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, +] [package.dependencies] certifi = ">=2017.4.17" @@ -2201,15 +3556,18 @@ urllib3 = ">=1.21.1,<1.27" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<5)"] [[package]] name = "requests-oauthlib" version = "1.3.0" description = "OAuthlib authentication support for Requests." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-oauthlib-1.3.0.tar.gz", hash = "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a"}, + {file = "requests_oauthlib-1.3.0-py2.py3-none-any.whl", hash = "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d"}, +] [package.dependencies] oauthlib = ">=3.0.0" @@ -2220,23 +3578,24 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] [[package]] name = "rpy2" -version = "3.5.11" +version = "3.5.13" description = "Python interface to the R language (embedded R)" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "rpy2-3.5.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c1eb9efecaac95f907172c91178e1898ca2bcf06b56a0a31beb0641f2d5fa395"}, - {file = "rpy2-3.5.11-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:fcc78a7431ef9c75719894706db3a18e47f69e63a651bbe3be93d7a2f1e22c0e"}, - {file = "rpy2-3.5.11-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:c265030b1962f5b889d95843c69526807f3bb9092f8191d6f16f99131482d054"}, - {file = "rpy2-3.5.11.tar.gz", hash = "sha256:0d3e554dac8f4e55a28932f2946341aae3e02894304e1198547222aa86b89e21"}, + {file = "rpy2-3.5.13-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:1748f56343be608558f2f40b43c2e8a9103af91e721b7f9617f10c86cc284dde"}, + {file = "rpy2-3.5.13-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:488f2ad3220275b7717073d561b22ebf29e4be4d26aed7f45e49b453ff08a640"}, + {file = "rpy2-3.5.13-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:5353f3ada4cb01245fbec03fdec326e68f32f032b19836154d95c56c7568fd50"}, + {file = "rpy2-3.5.13-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:f2eaf6910cf96cc812a34501f45d485ef8d1c36ed1a83955aa6691ea38a85216"}, + {file = "rpy2-3.5.13-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:11f9d68ed416f7802c7673f25796e49e9717a9e05f950277b90ad1e50fd95e42"}, + {file = "rpy2-3.5.13.tar.gz", hash = "sha256:41d037599f54336f54e754d82853fae06be9438d9fb3b514d90da74eaf328ddd"}, ] [package.dependencies] +"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} cffi = ">=1.10.0" jinja2 = "*" packaging = {version = "*", markers = "platform_system == \"Windows\""} -pytz = "*" tzlocal = "*" [package.extras] @@ -2244,26 +3603,32 @@ all = ["ipython", "numpy", "pandas (>=1.3.5)", "pytest"] pandas = ["numpy", "pandas (>=1.3.5)"] test = ["ipython", "numpy", "pandas (>=1.3.5)", "pytest"] test-minimal = ["coverage", "pytest", "pytest-cov"] -types = ["mypy", "types-pytz", "types-tzlocal"] +types = ["mypy", "types-tzlocal"] [[package]] name = "rsa" version = "4.8" description = "Pure-Python RSA implementation" -category = "main" optional = false python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.8-py3-none-any.whl", hash = "sha256:95c5d300c4e879ee69708c428ba566c59478fd653cc3a22243eeb8ed846950bb"}, + {file = "rsa-4.8.tar.gz", hash = "sha256:5c6bd9dc7a543b7fe4304a631f8a8a3b674e2bbfc49c2ae96200cdbe55df6b17"}, +] [package.dependencies] pyasn1 = ">=0.1.3" [[package]] -name = "ruamel.yaml" +name = "ruamel-yaml" version = "0.17.10" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" -category = "main" optional = false python-versions = ">=3" +files = [ + {file = "ruamel.yaml-0.17.10-py3-none-any.whl", hash = "sha256:ffb9b703853e9e8b7861606dfdab1026cf02505bade0653d1880f4b2db47f815"}, + {file = "ruamel.yaml-0.17.10.tar.gz", hash = "sha256:106bc8d6dc6a0ff7c9196a47570432036f41d556b779c6b4e618085f57e39e67"}, +] [package.dependencies] "ruamel.yaml.clib" = {version = ">=0.1.2", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.10\""} @@ -2273,36 +3638,92 @@ docs = ["ryd"] jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [[package]] -name = "ruamel.yaml.clib" +name = "ruamel-yaml-clib" version = "0.2.6" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e7be2c5bcb297f5b82fee9c665eb2eb7001d1050deaba8471842979293a80b0"}, + {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:066f886bc90cc2ce44df8b5f7acfc6a7e2b2e672713f027136464492b0c34d7c"}, + {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:221eca6f35076c6ae472a531afa1c223b9c29377e62936f61bc8e6e8bdc5f9e7"}, + {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win32.whl", hash = "sha256:1070ba9dd7f9370d0513d649420c3b362ac2d687fe78c6e888f5b12bf8bc7bee"}, + {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:77df077d32921ad46f34816a9a16e6356d8100374579bc35e15bab5d4e9377de"}, + {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:cfdb9389d888c5b74af297e51ce357b800dd844898af9d4a547ffc143fa56751"}, + {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7b2927e92feb51d830f531de4ccb11b320255ee95e791022555971c466af4527"}, + {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win32.whl", hash = "sha256:ada3f400d9923a190ea8b59c8f60680c4ef8a4b0dfae134d2f2ff68429adfab5"}, + {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win_amd64.whl", hash = "sha256:de9c6b8a1ba52919ae919f3ae96abb72b994dd0350226e28f3686cb4f142165c"}, + {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d67f273097c368265a7b81e152e07fb90ed395df6e552b9fa858c6d2c9f42502"}, + {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:72a2b8b2ff0a627496aad76f37a652bcef400fd861721744201ef1b45199ab78"}, + {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d3c620a54748a3d4cf0bcfe623e388407c8e85a4b06b8188e126302bcab93ea8"}, + {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win32.whl", hash = "sha256:9efef4aab5353387b07f6b22ace0867032b900d8e91674b5d8ea9150db5cae94"}, + {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win_amd64.whl", hash = "sha256:846fc8336443106fe23f9b6d6b8c14a53d38cef9a375149d61f99d78782ea468"}, + {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0847201b767447fc33b9c235780d3aa90357d20dd6108b92be544427bea197dd"}, + {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:78988ed190206672da0f5d50c61afef8f67daa718d614377dcd5e3ed85ab4a99"}, + {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:210c8fcfeff90514b7133010bf14e3bad652c8efde6b20e00c43854bf94fa5a6"}, + {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win32.whl", hash = "sha256:a49e0161897901d1ac9c4a79984b8410f450565bbad64dbfcbf76152743a0cdb"}, + {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win_amd64.whl", hash = "sha256:bf75d28fa071645c529b5474a550a44686821decebdd00e21127ef1fd566eabe"}, + {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a32f8d81ea0c6173ab1b3da956869114cae53ba1e9f72374032e33ba3118c233"}, + {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7f7ecb53ae6848f959db6ae93bdff1740e651809780822270eab111500842a84"}, + {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:61bc5e5ca632d95925907c569daa559ea194a4d16084ba86084be98ab1cec1c6"}, + {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win32.whl", hash = "sha256:89221ec6d6026f8ae859c09b9718799fea22c0e8da8b766b0b2c9a9ba2db326b"}, + {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win_amd64.whl", hash = "sha256:31ea73e564a7b5fbbe8188ab8b334393e06d997914a4e184975348f204790277"}, + {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc6a613d6c74eef5a14a214d433d06291526145431c3b964f5e16529b1842bed"}, + {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1866cf2c284a03b9524a5cc00daca56d80057c5ce3cdc86a52020f4c720856f0"}, + {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1b4139a6ffbca8ef60fdaf9b33dec05143ba746a6f0ae0f9d11d38239211d335"}, + {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win32.whl", hash = "sha256:3fb9575a5acd13031c57a62cc7823e5d2ff8bc3835ba4d94b921b4e6ee664104"}, + {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win_amd64.whl", hash = "sha256:825d5fccef6da42f3c8eccd4281af399f21c02b32d98e113dbc631ea6a6ecbc7"}, + {file = "ruamel.yaml.clib-0.2.6.tar.gz", hash = "sha256:4ff604ce439abb20794f05613c374759ce10e3595d1867764dd1ae675b85acbd"}, +] [[package]] name = "scipy" version = "1.10.1" description = "Fundamental algorithms for scientific computing in Python" -category = "main" optional = false python-versions = "<3.12,>=3.8" +files = [ + {file = "scipy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7354fd7527a4b0377ce55f286805b34e8c54b91be865bac273f527e1b839019"}, + {file = "scipy-1.10.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4b3f429188c66603a1a5c549fb414e4d3bdc2a24792e061ffbd607d3d75fd84e"}, + {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1553b5dcddd64ba9a0d95355e63fe6c3fc303a8fd77c7bc91e77d61363f7433f"}, + {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c0ff64b06b10e35215abce517252b375e580a6125fd5fdf6421b98efbefb2d2"}, + {file = "scipy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:fae8a7b898c42dffe3f7361c40d5952b6bf32d10c4569098d276b4c547905ee1"}, + {file = "scipy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f1564ea217e82c1bbe75ddf7285ba0709ecd503f048cb1236ae9995f64217bd"}, + {file = "scipy-1.10.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d925fa1c81b772882aa55bcc10bf88324dadb66ff85d548c71515f6689c6dac5"}, + {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaea0a6be54462ec027de54fca511540980d1e9eea68b2d5c1dbfe084797be35"}, + {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15a35c4242ec5f292c3dd364a7c71a61be87a3d4ddcc693372813c0b73c9af1d"}, + {file = "scipy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:43b8e0bcb877faf0abfb613d51026cd5cc78918e9530e375727bf0625c82788f"}, + {file = "scipy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5678f88c68ea866ed9ebe3a989091088553ba12c6090244fdae3e467b1139c35"}, + {file = "scipy-1.10.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:39becb03541f9e58243f4197584286e339029e8908c46f7221abeea4b749fa88"}, + {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bce5869c8d68cf383ce240e44c1d9ae7c06078a9396df68ce88a1230f93a30c1"}, + {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07c3457ce0b3ad5124f98a86533106b643dd811dd61b548e78cf4c8786652f6f"}, + {file = "scipy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:049a8bbf0ad95277ffba9b3b7d23e5369cc39e66406d60422c8cfef40ccc8415"}, + {file = "scipy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd9f1027ff30d90618914a64ca9b1a77a431159df0e2a195d8a9e8a04c78abf9"}, + {file = "scipy-1.10.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:79c8e5a6c6ffaf3a2262ef1be1e108a035cf4f05c14df56057b64acc5bebffb6"}, + {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51af417a000d2dbe1ec6c372dfe688e041a7084da4fdd350aeb139bd3fb55353"}, + {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b4735d6c28aad3cdcf52117e0e91d6b39acd4272f3f5cd9907c24ee931ad601"}, + {file = "scipy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ff7f37b1bf4417baca958d254e8e2875d0cc23aaadbe65b3d5b3077b0eb23ea"}, + {file = "scipy-1.10.1.tar.gz", hash = "sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5"}, +] [package.dependencies] numpy = ">=1.19.5,<1.27.0" [package.extras] -test = ["pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "asv", "mpmath", "gmpy2", "threadpoolctl", "scikit-umfpack", "pooch"] -doc = ["sphinx (!=4.1.0)", "pydata-sphinx-theme (==0.9.0)", "sphinx-design (>=0.2.0)", "matplotlib (>2)", "numpydoc"] -dev = ["mypy", "typing-extensions", "pycodestyle", "flake8", "rich-click", "click", "doit (>=0.36.0)", "pydevtool"] +dev = ["click", "doit (>=0.36.0)", "flake8", "mypy", "pycodestyle", "pydevtool", "rich-click", "typing_extensions"] +doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "seaborn" version = "0.11.2" description = "seaborn: statistical data visualization" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "seaborn-0.11.2-py3-none-any.whl", hash = "sha256:85a6baa9b55f81a0623abddc4a26b334653ff4c6b18c418361de19dbba0ef283"}, + {file = "seaborn-0.11.2.tar.gz", hash = "sha256:cf45e9286d40826864be0e3c066f98536982baf701a7caa386511792d61ff4f6"}, +] [package.dependencies] matplotlib = ">=2.2" @@ -2311,36 +3732,36 @@ pandas = ">=0.23" scipy = ">=1.0" [[package]] -name = "setuptools-scm" -version = "7.1.0" -description = "the blessed package to manage your versions by scm tags" -category = "main" +name = "setuptools" +version = "67.8.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.7" - -[package.dependencies] -packaging = ">=20.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} -typing-extensions = "*" - +files = [ + {file = "setuptools-67.8.0-py3-none-any.whl", hash = "sha256:5df61bf30bb10c6f756eb19e7c9f3b473051f48db77fddbe06ff2ca307df9a6f"}, + {file = "setuptools-67.8.0.tar.gz", hash = "sha256:62642358adc77ffa87233bc4d2354c4b2682d214048f500964dbe760ccedf102"}, +] [package.extras] -test = ["pytest (>=6.2)", "virtualenv (>20)"] -toml = ["setuptools (>=42)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "snowballstemmer" version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" optional = false python-versions = "*" files = [ @@ -2352,23 +3773,28 @@ files = [ name = "sortedcontainers" version = "2.4.0" description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" -category = "main" optional = false python-versions = "*" +files = [ + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, +] [[package]] name = "soupsieve" version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, + {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, +] [[package]] name = "stack-data" version = "0.6.2" description = "Extract data from python stack frames and tracebacks for informative displays" -category = "dev" optional = false python-versions = "*" files = [ @@ -2388,9 +3814,12 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] name = "tabulate" version = "0.8.9" description = "Pretty-print tabular data" -category = "main" optional = false python-versions = "*" +files = [ + {file = "tabulate-0.8.9-py3-none-any.whl", hash = "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4"}, + {file = "tabulate-0.8.9.tar.gz", hash = "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7"}, +] [package.extras] widechars = ["wcwidth"] @@ -2399,74 +3828,136 @@ widechars = ["wcwidth"] name = "tblib" version = "1.7.0" description = "Traceback serialization library." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "tblib-1.7.0-py2.py3-none-any.whl", hash = "sha256:289fa7359e580950e7d9743eab36b0691f0310fce64dee7d9c31065b8f723e23"}, + {file = "tblib-1.7.0.tar.gz", hash = "sha256:059bd77306ea7b419d4f76016aef6d7027cc8a0785579b5aad198803435f882c"}, +] [[package]] name = "text-unidecode" version = "1.3" description = "The most basic Text::Unidecode port" -category = "main" optional = false python-versions = "*" +files = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] [[package]] name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] [[package]] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] [[package]] name = "tomlkit" version = "0.7.0" description = "Style preserving TOML library" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "tomlkit-0.7.0-py2.py3-none-any.whl", hash = "sha256:6babbd33b17d5c9691896b0e68159215a9387ebfa938aa3ac42f4a4beeb2b831"}, + {file = "tomlkit-0.7.0.tar.gz", hash = "sha256:ac57f29693fab3e309ea789252fcce3061e19110085aa31af5446ca749325618"}, +] [[package]] name = "toolz" version = "0.11.2" description = "List processing tools and functional utilities" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "toolz-0.11.2-py3-none-any.whl", hash = "sha256:a5700ce83414c64514d82d60bcda8aabfde092d1c1a8663f9200c07fdcc6da8f"}, + {file = "toolz-0.11.2.tar.gz", hash = "sha256:6b312d5e15138552f1bda8a4e66c30e236c831b612b2bf0005f8a1df10a4bc33"}, +] [[package]] name = "tornado" version = "6.1" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "main" optional = false python-versions = ">= 3.5" +files = [ + {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, + {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, + {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, + {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, + {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, + {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, + {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, + {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, + {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, + {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, + {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, + {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, + {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, + {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, + {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, + {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, + {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, + {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, + {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, + {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, + {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, + {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, + {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, + {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, + {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, + {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, + {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, + {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, + {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, + {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, + {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, + {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, +] [[package]] name = "tqdm" version = "4.50.2" description = "Fast, Extensible Progress Meter" -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*" +files = [ + {file = "tqdm-4.50.2-py2.py3-none-any.whl", hash = "sha256:43ca183da3367578ebf2f1c2e3111d51ea161ed1dc4e6345b86e27c2a93beff7"}, + {file = "tqdm-4.50.2.tar.gz", hash = "sha256:69dfa6714dee976e2425a9aab84b622675b7b1742873041e3db8a8e86132a4af"}, +] [package.extras] -dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] +dev = ["argopt", "py-make (>=0.1.0)", "pydoc-markdown", "twine"] [[package]] name = "traitlets" version = "5.9.0" description = "Traitlets Python configuration system" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2482,9 +3973,12 @@ test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] name = "tweepy" version = "4.4.0" description = "Twitter library for Python" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "tweepy-4.4.0-py2.py3-none-any.whl", hash = "sha256:cf02c4fbbd027fbc7172c24d03f53f061329ac040b22d201e59592a1cff86364"}, + {file = "tweepy-4.4.0.tar.gz", hash = "sha256:8d4b4520271b796fa7efc4c5d5ef3228af4d79f6a4d3ace3900b2778ed8f6f1c"}, +] [package.dependencies] requests = ">=2.11.1,<3" @@ -2497,30 +3991,40 @@ socks = ["requests[socks] (>=2.11.1,<3)"] test = ["vcrpy (>=1.10.3)"] [[package]] -name = "typing-extensions" -version = "4.7.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" +name = "typer" +version = "0.4.0" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" +files = [ + {file = "typer-0.4.0-py3-none-any.whl", hash = "sha256:d81169725140423d072df464cad1ff25ee154ef381aaf5b8225352ea187ca338"}, + {file = "typer-0.4.0.tar.gz", hash = "sha256:63c3aeab0549750ffe40da79a1b524f60e08a2cbc3126c520ebf2eeaf507f5dd"}, +] + +[package.dependencies] +click = ">=7.1.1,<9.0.0" + +[package.extras] +all = ["colorama (>=0.4.3,<0.5.0)", "shellingham (>=1.3.0,<2.0.0)"] +dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)"] +doc = ["markdown-include (>=0.5.1,<0.6.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=5.4.0,<6.0.0)"] +test = ["black (>=19.10b0,<20.0b0)", "coverage (>=5.2,<6.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<5.4.0)", "pytest-cov (>=2.10.0,<3.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<2.0.0)", "shellingham (>=1.3.0,<2.0.0)"] [[package]] name = "typing-extensions" -version = "4.5.0" +version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, - {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] [[package]] name = "tzdata" version = "2023.3" description = "Provider of IANA time zone data" -category = "main" optional = false python-versions = ">=2" files = [ @@ -2530,19 +4034,17 @@ files = [ [[package]] name = "tzlocal" -version = "4.3" +version = "5.0.1" description = "tzinfo object for the local timezone" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "tzlocal-4.3-py3-none-any.whl", hash = "sha256:b44c4388f3d34f25862cfbb387578a4d70fec417649da694a132f628a23367e2"}, - {file = "tzlocal-4.3.tar.gz", hash = "sha256:3f21d09e1b2aa9f2dacca12da240ca37de3ba5237a93addfd6d593afe9073355"}, + {file = "tzlocal-5.0.1-py3-none-any.whl", hash = "sha256:f3596e180296aaf2dbd97d124fe76ae3a0e3d32b258447de7b939b3fd4be992f"}, + {file = "tzlocal-5.0.1.tar.gz", hash = "sha256:46eb99ad4bdb71f3f72b7d24f4267753e240944ecfc16f25d2719ba89827a803"}, ] [package.dependencies] "backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} -pytz-deprecation-shim = "*" tzdata = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] @@ -2552,62 +4054,64 @@ devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pyte name = "unidecode" version = "1.3.6" description = "ASCII transliterations of Unicode text" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "Unidecode-1.3.6-py3-none-any.whl", hash = "sha256:547d7c479e4f377b430dd91ac1275d593308dce0fc464fb2ab7d41f82ec653be"}, + {file = "Unidecode-1.3.6.tar.gz", hash = "sha256:fed09cf0be8cf415b391642c2a5addfc72194407caee4f98719e40ec2a72b830"}, +] [[package]] name = "uritemplate" version = "4.1.1" description = "Implementation of RFC 6570 URI Templates" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, + {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, +] [[package]] name = "urllib3" version = "1.26.7" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +files = [ + {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, + {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, +] [package.extras] brotli = ["brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.23.0" - - +version = "20.24.3" description = "Virtual Python Environment builder" -category = "main" optional = false python-versions = ">=3.7" - files = [ - {file = "virtualenv-20.23.0-py3-none-any.whl", hash = "sha256:6abec7670e5802a528357fdc75b26b9f57d5d92f29c5462ba0fbe45feacc685e"}, - {file = "virtualenv-20.23.0.tar.gz", hash = "sha256:a85caa554ced0c0afbd0d638e7e2d7b5f92d23478d05d17a76daeac8f279f924"}, + {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, + {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, ] - [package.dependencies] -distlib = ">=0.3.6,<1" -filelock = ">=3.12,<4" -platformdirs = ">=3.5.1,<4" +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<4" [package.extras] - -docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.7.1)", "time-machine (>=2.9)"] +docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] name = "wcwidth" version = "0.2.6" description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -2615,14 +4119,16 @@ files = [ {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, ] - [[package]] name = "websocket-client" version = "1.2.1" description = "WebSocket client for Python with low level API options" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "websocket-client-1.2.1.tar.gz", hash = "sha256:8dfb715d8a992f5712fff8c843adae94e22b22a99b2c5e6b0ec4a1a981cc4e0d"}, + {file = "websocket_client-1.2.1-py2.py3-none-any.whl", hash = "sha256:0133d2f784858e59959ce82ddac316634229da55b498aac311f1620567a710ec"}, +] [package.extras] optional = ["python-socks", "wsaccel"] @@ -2632,26 +4138,30 @@ test = ["websockets"] name = "wget" version = "3.2" description = "pure python download utility" -category = "main" optional = false python-versions = "*" +files = [ + {file = "wget-3.2.zip", hash = "sha256:35e630eca2aa50ce998b9b1a127bb26b30dfee573702782aa982f875e3f16061"}, +] [[package]] name = "win32-setctime" version = "1.1.0" description = "A small Python utility to set file creation time on Windows" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, + {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, +] [package.extras] -dev = ["pytest (>=4.6.2)", "black (>=19.3b0)"] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] [[package]] name = "xlrd" version = "2.0.1" description = "Library for developers to extract data from Microsoft Excel (tm) .xls spreadsheet files" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ @@ -2668,7 +4178,6 @@ test = ["pytest", "pytest-cov"] name = "xlsx2csv" version = "0.8.1" description = "xlsx to csv converter" -category = "main" optional = false python-versions = "*" files = [ @@ -2680,166 +4189,32 @@ files = [ name = "zict" version = "2.0.0" description = "Mutable mapping tools" -category = "main" optional = false python-versions = "*" +files = [ + {file = "zict-2.0.0-py3-none-any.whl", hash = "sha256:26aa1adda8250a78dfc6a78d200bfb2ea43a34752cf58980bca75dde0ba0c6e9"}, + {file = "zict-2.0.0.tar.gz", hash = "sha256:8e2969797627c8a663575c2fc6fcb53a05e37cdb83ee65f341fc6e0c3d0ced16"}, +] [package.dependencies] heapdict = "*" [[package]] name = "zipp" -version = "3.15.0" +version = "3.16.2" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, + {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, +] [package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "jaraco.functools", "more-itertools", "big-o", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [metadata] -lock-version = "1.1" +lock-version = "2.0" python-versions = ">=3.8,<3.11" - -content-hash = "88418bb0e507f91de17af411b1da5cc9e6709f4a993442e23a1828fd1301d95f" - - -[metadata.files] -async-timeout = [] -basedosdados = [] -beautifulsoup4 = [] -cachetools = [] -certifi = [] -cfgv = [] -charset-normalizer = [] -ckanapi = [] -click = [] -cloudpickle = [] -colorama = [] -contourpy = [] -coverage = [] -croniter = [] -cycler = [] -dask = [] -db-dtypes = [] -dbt-client = [] -dill = [] -distlib = [] -distributed = [] -docker = [] -docopt = [] -et-xmlfile = [] -exceptiongroup = [] -fake-useragent = [] -fastavro = [] -filelock = [] -fonttools = [] -fsspec = [] -google-analytics-data = [] -google-api-core = [] -google-api-python-client = [] -google-auth = [] -google-auth-httplib2 = [] -google-auth-oauthlib = [] -google-cloud-bigquery = [] -google-cloud-bigquery-storage = [] -google-cloud-core = [] -google-cloud-storage = [] -google-crc32c = [] -google-resumable-media = [] -googleapis-common-protos = [] -grpcio = [] -heapdict = [] -httplib2 = [] -hvac = [] -identify = [] -idna = [] -importlib-metadata = [] -importlib-resources = [] -iniconfig = [] -ipeadatapy = [] -jinja2 = [] -kiwisolver = [] -levenshtein = [] -locket = [] -loguru = [] -lxml = [] -markupsafe = [] -marshmallow = [] -marshmallow-oneofschema = [] -matplotlib = [] -msgpack = [] -mypy-extensions = [] -nodeenv = [] -numpy = [] -oauth2client = [] -oauthlib = [] -openpyxl = [] -packaging = [] -pandas = [] -pandas-gbq = [] -pandavro = [] -partd = [] -pendulum = [] -pillow = [] -platformdirs = [] -pluggy = [] -pre-commit = [] -prefect = [] -proto-plus = [] -protobuf = [] -psutil = [] -pyaml = [] -pyarrow = [] -pyasn1 = [] -pyasn1-modules = [] -pydata-google-auth = [] -pymssql = [] -pyparsing = [] -pytest = [] -pytest-cov = [] -python-box = [] -python-dateutil = [] -python-levenshtein = [] -python-slugify = [] -pytz = [] -pytzdata = [] -pywin32 = [] -pyyaml = [] -rapidfuzz = [] -redis = [] -redis-pal = [] -requests = [] -requests-oauthlib = [] -rsa = [] -"ruamel.yaml" = [] -"ruamel.yaml.clib" = [] -scipy = [] -seaborn = [] -setuptools-scm = [] -six = [] -sortedcontainers = [] -soupsieve = [] -tabulate = [] -tblib = [] -text-unidecode = [] -toml = [] -tomli = [] -tomlkit = [] -toolz = [] -tornado = [] -tqdm = [] -tweepy = [] -typing-extensions = [] -unidecode = [] -uritemplate = [] -urllib3 = [] -virtualenv = [] -websocket-client = [] -wget = [] -win32-setctime = [] -zict = [] -zipp = [] - +content-hash = "d64a8ddad917a7b8acecc4a2d17c1c5ad63fe763771c3292a460c98d93564f7b" From 9ad3894a1043cdc48e28a1f6d4403deac002bc17 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Wed, 30 Aug 2023 17:51:49 -0300 Subject: [PATCH 207/265] =?UTF-8?q?Corre=C3=A7=C3=A3o=20no=20TOML=20p?= =?UTF-8?q?=C3=B3s=20merge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8e1d50a4c..db1db5d85 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -102,19 +102,11 @@ urllib3 = "1.26.7" websocket-client = "1.2.1" wget = "^3.2" zict = "2.0.0" -pre-commit = "^2.20.0" -google-analytics-data = "0.12.1" -google-api-python-client = "^2.58.0" -oauth2client = "^4.1.3" -redis-pal = "^1.0.0" -fake-useragent = "^1.1.3" -python-Levenshtein = "^0.21.1" [tool.poetry.dev-dependencies] pytest_cov = "^3.0.0" - [build-system] build-backend = "poetry.core.masonry.api" requires = ["poetry-core>=1.0.0"] From 2f518d155445171cb9b21a4d10f3018b77e2bb3c Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Wed, 30 Aug 2023 17:51:55 -0300 Subject: [PATCH 208/265] Regera o .lock --- poetry.lock | 1669 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 1099 insertions(+), 570 deletions(-) diff --git a/poetry.lock b/poetry.lock index ba9843e68..5171ac94f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,17 +1,65 @@ +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. + [[package]] name = "async-timeout" version = "4.0.3" description = "Timeout context manager for asyncio programs" -category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + +[[package]] +name = "backoff" +version = "2.2.1" +description = "Function decoration for backoff and retry" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] + +[[package]] +name = "backports-zoneinfo" +version = "0.2.1" +description = "Backport of the standard library zoneinfo module" optional = false python-versions = ">=3.6" +files = [ + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"}, + {file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"}, +] + +[package.extras] +tzdata = ["tzdata"] [[package]] name = "basedosdados" version = "2.0.0b5" description = "Organizar e facilitar o acesso a dados brasileiros através de tabelas públicas no BigQuery." optional = false -python-versions = ">=3.7.1,<3.11" +python-versions = ">=3.8,<3.11" +files = [ + {file = "basedosdados-2.0.0b5-py3-none-any.whl", hash = "sha256:a15fdbaa41d621094dabde3f2f14bcc4842b87f59f16a7a6c7a293351f841be5"}, + {file = "basedosdados-2.0.0b5.tar.gz", hash = "sha256:e4bdf3a0018f7208aa57adac9bb9340d07076a3c18d875e80c488cb4b80f0959"}, +] [package.dependencies] google-api-python-client = ">=2.86.0,<3.0.0" @@ -47,20 +95,6 @@ soupsieve = ">1.2" html5lib = ["html5lib"] lxml = ["lxml"] -[[package]] -name = "binaryornot" -version = "0.4.4" -description = "Ultra-lightweight pure Python package to check if a file is binary or text." -optional = false -python-versions = "*" -files = [ - {file = "binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4"}, - {file = "binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061"}, -] - -[package.dependencies] -chardet = ">=3.0.2" - [[package]] name = "cachetools" version = "4.2.4" @@ -78,13 +112,97 @@ version = "2021.10.8" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = "*" +files = [ + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, +] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" [[package]] name = "cfgv" version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] [[package]] name = "charset-normalizer" @@ -137,6 +255,10 @@ version = "2.0.0" description = "Extended pickling support for Python objects" optional = false python-versions = ">=3.6" +files = [ + {file = "cloudpickle-2.0.0-py3-none-any.whl", hash = "sha256:6b2df9741d06f43839a3275c4e6632f7df6487a1f181f5f46a052d3c917c3d11"}, + {file = "cloudpickle-2.0.0.tar.gz", hash = "sha256:5cd02f3b417a783ba84a4ec3e290ff7929009fe51f6405423cfccfadd43ba4a4"}, +] [[package]] name = "colorama" @@ -144,6 +266,10 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "contourpy" @@ -203,33 +329,66 @@ mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.2.0)", "types-Pill test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] test-no-images = ["pytest", "pytest-cov", "wurlitzer"] -[[package]] -name = "cookiecutter" -version = "1.7.3" -description = "A command-line utility that creates projects from project templates, e.g. creating a Python package project from a Python package project template." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "cookiecutter-1.7.3-py2.py3-none-any.whl", hash = "sha256:f8671531fa96ab14339d0c59b4f662a4f12a2ecacd94a0f70a3500843da588e2"}, - {file = "cookiecutter-1.7.3.tar.gz", hash = "sha256:6b9a4d72882e243be077a7397d0f1f76fe66cf3df91f3115dbb5330e214fa457"}, -] - -[package.dependencies] -binaryornot = ">=0.4.4" -click = ">=7.0" -Jinja2 = ">=2.7,<4.0.0" -jinja2-time = ">=0.2.0" -poyo = ">=0.5.0" -python-slugify = ">=4.0.0" -requests = ">=2.23.0" -six = ">=1.10" - [[package]] name = "coverage" version = "7.3.0" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "coverage-7.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db76a1bcb51f02b2007adacbed4c88b6dee75342c37b05d1822815eed19edee5"}, + {file = "coverage-7.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c02cfa6c36144ab334d556989406837336c1d05215a9bdf44c0bc1d1ac1cb637"}, + {file = "coverage-7.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477c9430ad5d1b80b07f3c12f7120eef40bfbf849e9e7859e53b9c93b922d2af"}, + {file = "coverage-7.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce2ee86ca75f9f96072295c5ebb4ef2a43cecf2870b0ca5e7a1cbdd929cf67e1"}, + {file = "coverage-7.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68d8a0426b49c053013e631c0cdc09b952d857efa8f68121746b339912d27a12"}, + {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b3eb0c93e2ea6445b2173da48cb548364f8f65bf68f3d090404080d338e3a689"}, + {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:90b6e2f0f66750c5a1178ffa9370dec6c508a8ca5265c42fbad3ccac210a7977"}, + {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:96d7d761aea65b291a98c84e1250cd57b5b51726821a6f2f8df65db89363be51"}, + {file = "coverage-7.3.0-cp310-cp310-win32.whl", hash = "sha256:63c5b8ecbc3b3d5eb3a9d873dec60afc0cd5ff9d9f1c75981d8c31cfe4df8527"}, + {file = "coverage-7.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:97c44f4ee13bce914272589b6b41165bbb650e48fdb7bd5493a38bde8de730a1"}, + {file = "coverage-7.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74c160285f2dfe0acf0f72d425f3e970b21b6de04157fc65adc9fd07ee44177f"}, + {file = "coverage-7.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b543302a3707245d454fc49b8ecd2c2d5982b50eb63f3535244fd79a4be0c99d"}, + {file = "coverage-7.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad0f87826c4ebd3ef484502e79b39614e9c03a5d1510cfb623f4a4a051edc6fd"}, + {file = "coverage-7.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13c6cbbd5f31211d8fdb477f0f7b03438591bdd077054076eec362cf2207b4a7"}, + {file = "coverage-7.3.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fac440c43e9b479d1241fe9d768645e7ccec3fb65dc3a5f6e90675e75c3f3e3a"}, + {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3c9834d5e3df9d2aba0275c9f67989c590e05732439b3318fa37a725dff51e74"}, + {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4c8e31cf29b60859876474034a83f59a14381af50cbe8a9dbaadbf70adc4b214"}, + {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7a9baf8e230f9621f8e1d00c580394a0aa328fdac0df2b3f8384387c44083c0f"}, + {file = "coverage-7.3.0-cp311-cp311-win32.whl", hash = "sha256:ccc51713b5581e12f93ccb9c5e39e8b5d4b16776d584c0f5e9e4e63381356482"}, + {file = "coverage-7.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:887665f00ea4e488501ba755a0e3c2cfd6278e846ada3185f42d391ef95e7e70"}, + {file = "coverage-7.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d000a739f9feed900381605a12a61f7aaced6beae832719ae0d15058a1e81c1b"}, + {file = "coverage-7.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59777652e245bb1e300e620ce2bef0d341945842e4eb888c23a7f1d9e143c446"}, + {file = "coverage-7.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9737bc49a9255d78da085fa04f628a310c2332b187cd49b958b0e494c125071"}, + {file = "coverage-7.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5247bab12f84a1d608213b96b8af0cbb30d090d705b6663ad794c2f2a5e5b9fe"}, + {file = "coverage-7.3.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2ac9a1de294773b9fa77447ab7e529cf4fe3910f6a0832816e5f3d538cfea9a"}, + {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:85b7335c22455ec12444cec0d600533a238d6439d8d709d545158c1208483873"}, + {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:36ce5d43a072a036f287029a55b5c6a0e9bd73db58961a273b6dc11a2c6eb9c2"}, + {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:211a4576e984f96d9fce61766ffaed0115d5dab1419e4f63d6992b480c2bd60b"}, + {file = "coverage-7.3.0-cp312-cp312-win32.whl", hash = "sha256:56afbf41fa4a7b27f6635bc4289050ac3ab7951b8a821bca46f5b024500e6321"}, + {file = "coverage-7.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f297e0c1ae55300ff688568b04ff26b01c13dfbf4c9d2b7d0cb688ac60df479"}, + {file = "coverage-7.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac0dec90e7de0087d3d95fa0533e1d2d722dcc008bc7b60e1143402a04c117c1"}, + {file = "coverage-7.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:438856d3f8f1e27f8e79b5410ae56650732a0dcfa94e756df88c7e2d24851fcd"}, + {file = "coverage-7.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1084393c6bda8875c05e04fce5cfe1301a425f758eb012f010eab586f1f3905e"}, + {file = "coverage-7.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49ab200acf891e3dde19e5aa4b0f35d12d8b4bd805dc0be8792270c71bd56c54"}, + {file = "coverage-7.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67e6bbe756ed458646e1ef2b0778591ed4d1fcd4b146fc3ba2feb1a7afd4254"}, + {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f39c49faf5344af36042b293ce05c0d9004270d811c7080610b3e713251c9b0"}, + {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7df91fb24c2edaabec4e0eee512ff3bc6ec20eb8dccac2e77001c1fe516c0c84"}, + {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:34f9f0763d5fa3035a315b69b428fe9c34d4fc2f615262d6be3d3bf3882fb985"}, + {file = "coverage-7.3.0-cp38-cp38-win32.whl", hash = "sha256:bac329371d4c0d456e8d5f38a9b0816b446581b5f278474e416ea0c68c47dcd9"}, + {file = "coverage-7.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:b859128a093f135b556b4765658d5d2e758e1fae3e7cc2f8c10f26fe7005e543"}, + {file = "coverage-7.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed8d310afe013db1eedd37176d0839dc66c96bcfcce8f6607a73ffea2d6ba"}, + {file = "coverage-7.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61260ec93f99f2c2d93d264b564ba912bec502f679793c56f678ba5251f0393"}, + {file = "coverage-7.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97af9554a799bd7c58c0179cc8dbf14aa7ab50e1fd5fa73f90b9b7215874ba28"}, + {file = "coverage-7.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3558e5b574d62f9c46b76120a5c7c16c4612dc2644c3d48a9f4064a705eaee95"}, + {file = "coverage-7.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37d5576d35fcb765fca05654f66aa71e2808d4237d026e64ac8b397ffa66a56a"}, + {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:07ea61bcb179f8f05ffd804d2732b09d23a1238642bf7e51dad62082b5019b34"}, + {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:80501d1b2270d7e8daf1b64b895745c3e234289e00d5f0e30923e706f110334e"}, + {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4eddd3153d02204f22aef0825409091a91bf2a20bce06fe0f638f5c19a85de54"}, + {file = "coverage-7.3.0-cp39-cp39-win32.whl", hash = "sha256:2d22172f938455c156e9af2612650f26cceea47dc86ca048fa4e0b2d21646ad3"}, + {file = "coverage-7.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:60f64e2007c9144375dd0f480a54d6070f00bb1a28f65c408370544091c9bc9e"}, + {file = "coverage-7.3.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:5492a6ce3bdb15c6ad66cb68a0244854d9917478877a25671d70378bdc8562d0"}, + {file = "coverage-7.3.0.tar.gz", hash = "sha256:49dbb19cdcafc130f597d9e04a29d0a032ceedf729e41b181f51cd170e6ee865"}, +] [package.dependencies] tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} @@ -237,17 +396,6 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1 [package.extras] toml = ["tomli"] -[[package]] -name = "cramjam" -version = "2.7.0" -description = "Thin Python bindings to de/compression algorithms in Rust" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.extras] -dev = ["black (==22.3.0)", "hypothesis", "numpy", "pytest (>=5.30)", "pytest-xdist"] - [[package]] name = "croniter" version = "1.0.15" @@ -331,44 +479,6 @@ files = [ [package.dependencies] requests = ">=2.26.0,<3.0.0" -[[package]] -name = "debugpy" -version = "1.6.7.post1" -description = "An implementation of the Debug Adapter Protocol for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "debugpy-1.6.7.post1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:903bd61d5eb433b6c25b48eae5e23821d4c1a19e25c9610205f5aeaccae64e32"}, - {file = "debugpy-1.6.7.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16882030860081e7dd5aa619f30dec3c2f9a421e69861125f83cc372c94e57d"}, - {file = "debugpy-1.6.7.post1-cp310-cp310-win32.whl", hash = "sha256:eea8d8cfb9965ac41b99a61f8e755a8f50e9a20330938ad8271530210f54e09c"}, - {file = "debugpy-1.6.7.post1-cp310-cp310-win_amd64.whl", hash = "sha256:85969d864c45f70c3996067cfa76a319bae749b04171f2cdeceebe4add316155"}, - {file = "debugpy-1.6.7.post1-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:890f7ab9a683886a0f185786ffbda3b46495c4b929dab083b8c79d6825832a52"}, - {file = "debugpy-1.6.7.post1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4ac7a4dba28801d184b7fc0e024da2635ca87d8b0a825c6087bb5168e3c0d28"}, - {file = "debugpy-1.6.7.post1-cp37-cp37m-win32.whl", hash = "sha256:3370ef1b9951d15799ef7af41f8174194f3482ee689988379763ef61a5456426"}, - {file = "debugpy-1.6.7.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:65b28435a17cba4c09e739621173ff90c515f7b9e8ea469b92e3c28ef8e5cdfb"}, - {file = "debugpy-1.6.7.post1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:92b6dae8bfbd497c90596bbb69089acf7954164aea3228a99d7e43e5267f5b36"}, - {file = "debugpy-1.6.7.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72f5d2ecead8125cf669e62784ef1e6300f4067b0f14d9f95ee00ae06fc7c4f7"}, - {file = "debugpy-1.6.7.post1-cp38-cp38-win32.whl", hash = "sha256:f0851403030f3975d6e2eaa4abf73232ab90b98f041e3c09ba33be2beda43fcf"}, - {file = "debugpy-1.6.7.post1-cp38-cp38-win_amd64.whl", hash = "sha256:3de5d0f97c425dc49bce4293df6a04494309eedadd2b52c22e58d95107e178d9"}, - {file = "debugpy-1.6.7.post1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:38651c3639a4e8bbf0ca7e52d799f6abd07d622a193c406be375da4d510d968d"}, - {file = "debugpy-1.6.7.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:038c51268367c9c935905a90b1c2d2dbfe304037c27ba9d19fe7409f8cdc710c"}, - {file = "debugpy-1.6.7.post1-cp39-cp39-win32.whl", hash = "sha256:4b9eba71c290852f959d2cf8a03af28afd3ca639ad374d393d53d367f7f685b2"}, - {file = "debugpy-1.6.7.post1-cp39-cp39-win_amd64.whl", hash = "sha256:973a97ed3b434eab0f792719a484566c35328196540676685c975651266fccf9"}, - {file = "debugpy-1.6.7.post1-py2.py3-none-any.whl", hash = "sha256:1093a5c541af079c13ac8c70ab8b24d1d35c8cacb676306cf11e57f699c02926"}, - {file = "debugpy-1.6.7.post1.zip", hash = "sha256:fe87ec0182ef624855d05e6ed7e0b7cb1359d2ffa2a925f8ec2d22e98b75d0ca"}, -] - -[[package]] -name = "decorator" -version = "5.1.1" -description = "Decorators for Humans" -optional = false -python-versions = ">=3.5" -files = [ - {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, - {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, -] - [[package]] name = "dill" version = "0.3.7" @@ -446,6 +556,9 @@ version = "0.6.2" description = "Pythonic argument parser, that will make you smile" optional = false python-versions = "*" +files = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] [[package]] name = "et-xmlfile" @@ -460,27 +573,17 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.1.1" +version = "1.1.3" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "executing" -version = "1.2.0" -description = "Get the currently executing AST node of a frame, and other information" -optional = false -python-versions = "*" files = [ - {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, - {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, ] [package.extras] -tests = ["asttokens", "littleutils", "pytest", "rich"] +test = ["pytest (>=6)"] [[package]] name = "fake-useragent" @@ -488,6 +591,10 @@ version = "1.2.1" description = "Up-to-date simple useragent faker with real world database" optional = false python-versions = "*" +files = [ + {file = "fake-useragent-1.2.1.tar.gz", hash = "sha256:b411f903331f695e3840ccadcf011f745a405764e97c588f2b8fde9e400a5446"}, + {file = "fake_useragent-1.2.1-py3-none-any.whl", hash = "sha256:ad2b5414d19493d0789572f04200d4f656f84d20b205cc805233212957fe385d"}, +] [package.dependencies] importlib-resources = {version = ">=5.0", markers = "python_version < \"3.10\""} @@ -524,41 +631,66 @@ lz4 = ["lz4"] snappy = ["python-snappy"] zstandard = ["zstandard"] -[[package]] -name = "fastparquet" -version = "2023.7.0" -description = "Python support for Parquet file format" -category = "main" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -cramjam = ">=2.3" -fsspec = "*" -numpy = ">=1.20.3" -packaging = "*" -pandas = ">=1.5.0" - -[package.extras] -lzo = ["python-lzo"] - [[package]] name = "filelock" version = "3.12.3" description = "A platform independent file lock." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "filelock-3.12.3-py3-none-any.whl", hash = "sha256:f067e40ccc40f2b48395a80fcbd4728262fab54e232e090a4063ab804179efeb"}, + {file = "filelock-3.12.3.tar.gz", hash = "sha256:0ecc1dd2ec4672a10c8550a8182f1bd0c0a5088470ecd5a125e45f49472fac3d"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.11\""} [package.extras] -docs = ["furo (>=2023.5.20)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)", "sphinx (>=7.0.1)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)", "pytest (>=7.3.1)"] +docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] [[package]] name = "fonttools" -version = "4.40.0" +version = "4.42.1" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" +files = [ + {file = "fonttools-4.42.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ed1a13a27f59d1fc1920394a7f596792e9d546c9ca5a044419dca70c37815d7c"}, + {file = "fonttools-4.42.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9b1ce7a45978b821a06d375b83763b27a3a5e8a2e4570b3065abad240a18760"}, + {file = "fonttools-4.42.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f720fa82a11c0f9042376fd509b5ed88dab7e3cd602eee63a1af08883b37342b"}, + {file = "fonttools-4.42.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db55cbaea02a20b49fefbd8e9d62bd481aaabe1f2301dabc575acc6b358874fa"}, + {file = "fonttools-4.42.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a35981d90feebeaef05e46e33e6b9e5b5e618504672ca9cd0ff96b171e4bfff"}, + {file = "fonttools-4.42.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:68a02bbe020dc22ee0540e040117535f06df9358106d3775e8817d826047f3fd"}, + {file = "fonttools-4.42.1-cp310-cp310-win32.whl", hash = "sha256:12a7c247d1b946829bfa2f331107a629ea77dc5391dfd34fdcd78efa61f354ca"}, + {file = "fonttools-4.42.1-cp310-cp310-win_amd64.whl", hash = "sha256:a398bdadb055f8de69f62b0fc70625f7cbdab436bbb31eef5816e28cab083ee8"}, + {file = "fonttools-4.42.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:689508b918332fb40ce117131633647731d098b1b10d092234aa959b4251add5"}, + {file = "fonttools-4.42.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e36344e48af3e3bde867a1ca54f97c308735dd8697005c2d24a86054a114a71"}, + {file = "fonttools-4.42.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19b7db825c8adee96fac0692e6e1ecd858cae9affb3b4812cdb9d934a898b29e"}, + {file = "fonttools-4.42.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:113337c2d29665839b7d90b39f99b3cac731f72a0eda9306165a305c7c31d341"}, + {file = "fonttools-4.42.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:37983b6bdab42c501202500a2be3a572f50d4efe3237e0686ee9d5f794d76b35"}, + {file = "fonttools-4.42.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6ed2662a3d9c832afa36405f8748c250be94ae5dfc5283d668308391f2102861"}, + {file = "fonttools-4.42.1-cp311-cp311-win32.whl", hash = "sha256:179737095eb98332a2744e8f12037b2977f22948cf23ff96656928923ddf560a"}, + {file = "fonttools-4.42.1-cp311-cp311-win_amd64.whl", hash = "sha256:f2b82f46917d8722e6b5eafeefb4fb585d23babd15d8246c664cd88a5bddd19c"}, + {file = "fonttools-4.42.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:62f481ac772fd68901573956231aea3e4b1ad87b9b1089a61613a91e2b50bb9b"}, + {file = "fonttools-4.42.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2f806990160d1ce42d287aa419df3ffc42dfefe60d473695fb048355fe0c6a0"}, + {file = "fonttools-4.42.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db372213d39fa33af667c2aa586a0c1235e88e9c850f5dd5c8e1f17515861868"}, + {file = "fonttools-4.42.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d18fc642fd0ac29236ff88ecfccff229ec0386090a839dd3f1162e9a7944a40"}, + {file = "fonttools-4.42.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8708b98c278012ad267ee8a7433baeb809948855e81922878118464b274c909d"}, + {file = "fonttools-4.42.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c95b0724a6deea2c8c5d3222191783ced0a2f09bd6d33f93e563f6f1a4b3b3a4"}, + {file = "fonttools-4.42.1-cp38-cp38-win32.whl", hash = "sha256:4aa79366e442dbca6e2c8595645a3a605d9eeabdb7a094d745ed6106816bef5d"}, + {file = "fonttools-4.42.1-cp38-cp38-win_amd64.whl", hash = "sha256:acb47f6f8680de24c1ab65ebde39dd035768e2a9b571a07c7b8da95f6c8815fd"}, + {file = "fonttools-4.42.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5fb289b7a815638a7613d46bcf324c9106804725b2bb8ad913c12b6958ffc4ec"}, + {file = "fonttools-4.42.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:53eb5091ddc8b1199330bb7b4a8a2e7995ad5d43376cadce84523d8223ef3136"}, + {file = "fonttools-4.42.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46a0ec8adbc6ff13494eb0c9c2e643b6f009ce7320cf640de106fb614e4d4360"}, + {file = "fonttools-4.42.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cc7d685b8eeca7ae69dc6416833fbfea61660684b7089bca666067cb2937dcf"}, + {file = "fonttools-4.42.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:be24fcb80493b2c94eae21df70017351851652a37de514de553435b256b2f249"}, + {file = "fonttools-4.42.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:515607ec756d7865f23070682622c49d922901943697871fc292277cf1e71967"}, + {file = "fonttools-4.42.1-cp39-cp39-win32.whl", hash = "sha256:0eb79a2da5eb6457a6f8ab904838454accc7d4cccdaff1fd2bd3a0679ea33d64"}, + {file = "fonttools-4.42.1-cp39-cp39-win_amd64.whl", hash = "sha256:7286aed4ea271df9eab8d7a9b29e507094b51397812f7ce051ecd77915a6e26b"}, + {file = "fonttools-4.42.1-py3-none-any.whl", hash = "sha256:9398f244e28e0596e2ee6024f808b06060109e33ed38dcc9bded452fd9bbb853"}, + {file = "fonttools-4.42.1.tar.gz", hash = "sha256:c391cd5af88aacaf41dd7cfb96eeedfad297b5899a39e12f4c2c3706d0a3329d"}, +] [package.extras] all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] @@ -609,33 +741,38 @@ ssh = ["paramiko"] [[package]] name = "google-analytics-data" -version = "0.12.1" -description = "" -category = "main" +version = "0.17.0" +description = "Google Analytics Data API client library" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "google-analytics-data-0.17.0.tar.gz", hash = "sha256:f7ed38016674f577d20400bcd9efe9951e1a150ea53c24461b5e9eee5d537858"}, + {file = "google_analytics_data-0.17.0-py2.py3-none-any.whl", hash = "sha256:26f0870e857f60c2cd70774d82d02e9751283f54ad33a73d42bd33e950b59fbd"}, +] [package.dependencies] -google-api-core = {version = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.15.0,<2.0.0dev" -protobuf = ">=3.19.0,<4.0.0dev" +google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] name = "google-api-core" version = "2.11.1" description = "Google API client core library" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +python-versions = ">=3.7" +files = [ + {file = "google-api-core-2.11.1.tar.gz", hash = "sha256:25d29e05a0058ed5f19c61c0a78b1b53adea4d9364b464d014fbda941f6d1c9a"}, + {file = "google_api_core-2.11.1-py3-none-any.whl", hash = "sha256:d92a5a92dc36dd4f4b9ee4e55528a90e432b059f93aee6ad857f9de8cc7ae94a"}, +] [package.dependencies] -google-auth = ">=1.25.0,<2.0dev" -googleapis-common-protos = ">=1.6.0,<2.0dev" -grpcio = {version = ">=1.29.0,<2.0dev", optional = true, markers = "extra == \"grpc\""} -packaging = ">=14.3" -protobuf = {version = ">=3.12.0", markers = "python_version > \"3\""} -pytz = "*" -requests = ">=2.18.0,<3.0.0dev" -six = ">=1.13.0" +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" +grpcio = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} +grpcio-status = {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""} +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" [package.extras] grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] @@ -644,10 +781,14 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.91.0" +version = "2.97.0" description = "Google API Client Library for Python" optional = false python-versions = ">=3.7" +files = [ + {file = "google-api-python-client-2.97.0.tar.gz", hash = "sha256:48277291894876a1ca7ed4127e055e81f81e6343ced1b544a7200ae2c119dcd7"}, + {file = "google_api_python_client-2.97.0-py2.py3-none-any.whl", hash = "sha256:5215f4cd577753fc4192ccfbe0bb8b55d4bb5fd68fa6268ac5cf271b6305de31"}, +] [package.dependencies] google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0.dev0" @@ -661,18 +802,23 @@ name = "google-auth" version = "2.22.0" description = "Google Authentication Library" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +python-versions = ">=3.6" +files = [ + {file = "google-auth-2.22.0.tar.gz", hash = "sha256:164cba9af4e6e4e40c3a4f90a1a6c12ee56f14c0b4868d1ca91b32826ab334ce"}, + {file = "google_auth-2.22.0-py2.py3-none-any.whl", hash = "sha256:d61d1b40897407b574da67da1a833bdc10d5a11642566e506565d1b1a46ba873"}, +] [package.dependencies] cachetools = ">=2.0.0,<6.0" pyasn1-modules = ">=0.2.1" -rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} +rsa = ">=3.1.4,<5" six = ">=1.9.0" urllib3 = "<2.0" [package.extras] -aiohttp = ["requests (>=2.20.0,<3.0.0dev)", "aiohttp (>=3.6.2,<4.0.0dev)"] -pyopenssl = ["pyopenssl (>=20.0.0)"] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] +enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] requests = ["requests (>=2.20.0,<3.0.0.dev0)"] @@ -698,6 +844,10 @@ version = "1.0.0" description = "Google Authentication Library" optional = false python-versions = ">=3.6" +files = [ + {file = "google-auth-oauthlib-1.0.0.tar.gz", hash = "sha256:e375064964820b47221a7e1b7ee1fd77051b6323c3f9e3e19785f78ab67ecfc5"}, + {file = "google_auth_oauthlib-1.0.0-py2.py3-none-any.whl", hash = "sha256:95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb"}, +] [package.dependencies] google-auth = ">=2.15.0" @@ -711,7 +861,11 @@ name = "google-cloud-bigquery" version = "3.11.4" description = "Google BigQuery API client library" optional = false -python-versions = ">=3.6, <3.11" +python-versions = ">=3.7" +files = [ + {file = "google-cloud-bigquery-3.11.4.tar.gz", hash = "sha256:697df117241a2283bcbb93b21e10badc14e51c9a90800d2a7e1a3e1c7d842974"}, + {file = "google_cloud_bigquery-3.11.4-py2.py3-none-any.whl", hash = "sha256:5fa7897743a0ed949ade25a0942fc9e7557d8fce307c6f8a76d1b604cf27f1b1"}, +] [package.dependencies] google-api-core = {version = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} @@ -725,23 +879,24 @@ python-dateutil = ">=2.7.2,<3.0dev" requests = ">=2.21.0,<3.0.0dev" [package.extras] -all = ["google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.38.1,<2.0dev)", "pyarrow (>=3.0.0,<7.0dev)", "geopandas (>=0.9.0,<1.0dev)", "Shapely (>=1.6.0,<2.0dev)", "pandas (>=0.24.2)", "tqdm (>=4.7.4,<5.0.0dev)", "opentelemetry-api (>=0.11b0)", "opentelemetry-sdk (>=0.11b0)", "opentelemetry-instrumentation (>=0.11b0)"] -bignumeric_type = ["pyarrow (>=3.0.0,<7.0dev)"] -bqstorage = ["google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.38.1,<2.0dev)", "pyarrow (>=3.0.0,<7.0dev)"] -geopandas = ["geopandas (>=0.9.0,<1.0dev)", "Shapely (>=1.6.0,<2.0dev)"] -opentelemetry = ["opentelemetry-api (>=0.11b0)", "opentelemetry-sdk (>=0.11b0)", "opentelemetry-instrumentation (>=0.11b0)"] -pandas = ["pandas (>=0.24.2)", "pyarrow (>=3.0.0,<7.0dev)"] +all = ["Shapely (>=1.8.4,<2.0dev)", "db-dtypes (>=0.3.0,<2.0.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)", "ipywidgets (>=7.7.0)", "opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)", "tqdm (>=4.7.4,<5.0.0dev)"] +bqstorage = ["google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] +geopandas = ["Shapely (>=1.8.4,<2.0dev)", "geopandas (>=0.9.0,<1.0dev)"] +ipython = ["ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)"] +ipywidgets = ["ipykernel (>=6.0.0)", "ipywidgets (>=7.7.0)"] +opentelemetry = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] +pandas = ["db-dtypes (>=0.3.0,<2.0.0dev)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)"] tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] [[package]] name = "google-cloud-bigquery-connection" -version = "1.13.0" +version = "1.13.1" description = "Google Cloud Bigquery Connection API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-bigquery-connection-1.13.0.tar.gz", hash = "sha256:3b35d6e034221d769d4d2168cd384de8c674b323cea65fa7ce8352daf2d78433"}, - {file = "google_cloud_bigquery_connection-1.13.0-py2.py3-none-any.whl", hash = "sha256:9fa79c36ee2e6a9d8846e463d9f9dd92a9431c8278f40d1f9c0214ea8274f263"}, + {file = "google-cloud-bigquery-connection-1.13.1.tar.gz", hash = "sha256:ca188b12f3acf07718b23adc58a9480e19d80291ebb67497fc6da2fea90c1ae7"}, + {file = "google_cloud_bigquery_connection-1.13.1-py2.py3-none-any.whl", hash = "sha256:ba2e0bbecb94a8cb4af88ba4261bc9d9078acdf2ba1b608db51dcd6439ba4c07"}, ] [package.dependencies] @@ -752,11 +907,14 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-bigquery-storage" -version = "1.1.0" -description = "BigQuery Storage API API client library" -category = "main" +version = "2.22.0" +description = "Google Cloud Bigquery Storage API client library" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +python-versions = ">=3.7" +files = [ + {file = "google-cloud-bigquery-storage-2.22.0.tar.gz", hash = "sha256:f6d8c7b3ab9b574c66977fcee9d336e334ad1a3843a722be19123640e7808ea3"}, + {file = "google_cloud_bigquery_storage-2.22.0-py2.py3-none-any.whl", hash = "sha256:7f11b2ae590a5b3874fb6ddf705a66a070340db238f971cf7b53349eee9ca317"}, +] [package.dependencies] google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} @@ -773,7 +931,11 @@ name = "google-cloud-core" version = "2.3.3" description = "Google Cloud API client core library" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "google-cloud-core-2.3.3.tar.gz", hash = "sha256:37b80273c8d7eee1ae816b3a20ae43585ea50506cb0e60f3cf5be5f87f1373cb"}, + {file = "google_cloud_core-2.3.3-py2.py3-none-any.whl", hash = "sha256:fbd11cad3e98a7e5b0343dc07cb1039a5ffd7a5bb96e1f1e27cee4bda4a90863"}, +] [package.dependencies] google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" @@ -787,7 +949,11 @@ name = "google-cloud-storage" version = "2.10.0" description = "Google Cloud Storage API client library" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +python-versions = ">=3.7" +files = [ + {file = "google-cloud-storage-2.10.0.tar.gz", hash = "sha256:934b31ead5f3994e5360f9ff5750982c5b6b11604dc072bc452c25965e076dc7"}, + {file = "google_cloud_storage-2.10.0-py2.py3-none-any.whl", hash = "sha256:9433cf28801671de1c80434238fb1e7e4a1ba3087470e90f70c928ea77c2b9d7"}, +] [package.dependencies] google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev" @@ -859,7 +1025,11 @@ name = "google-resumable-media" version = "2.5.0" description = "Utilities for Google Media Downloads and Resumable Uploads" optional = false -python-versions = ">= 3.6" +python-versions = ">= 3.7" +files = [ + {file = "google-resumable-media-2.5.0.tar.gz", hash = "sha256:218931e8e2b2a73a58eb354a288e03a0fd5fb1c4583261ac6e4c078666468c93"}, + {file = "google_resumable_media-2.5.0-py2.py3-none-any.whl", hash = "sha256:da1bd943e2e114a56d85d6848497ebf9be6a14d3db23e9fc57581e7c3e8170ec"}, +] [package.dependencies] google-crc32c = ">=1.0,<2.0dev" @@ -873,7 +1043,11 @@ name = "googleapis-common-protos" version = "1.59.1" description = "Common protobufs used in Google APIs" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "googleapis-common-protos-1.59.1.tar.gz", hash = "sha256:b35d530fe825fb4227857bc47ad84c33c809ac96f312e13182bdeaa2abe1178a"}, + {file = "googleapis_common_protos-1.59.1-py2.py3-none-any.whl", hash = "sha256:0cbedb6fb68f1c07e18eb4c48256320777707e7d0c55063ae56c15db3224a61e"}, +] [package.dependencies] grpcio = {version = ">=1.44.0,<2.0.0.dev0", optional = true, markers = "extra == \"grpc\""} @@ -939,26 +1113,75 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4 name = "grpcio" version = "1.56.2" description = "HTTP/2-based RPC framework" -category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "grpcio-1.56.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:bf0b9959e673505ee5869950642428046edb91f99942607c2ecf635f8a4b31c9"}, + {file = "grpcio-1.56.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:5144feb20fe76e73e60c7d73ec3bf54f320247d1ebe737d10672480371878b48"}, + {file = "grpcio-1.56.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:a72797549935c9e0b9bc1def1768c8b5a709538fa6ab0678e671aec47ebfd55e"}, + {file = "grpcio-1.56.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3f3237a57e42f79f1e560726576aedb3a7ef931f4e3accb84ebf6acc485d316"}, + {file = "grpcio-1.56.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:900bc0096c2ca2d53f2e5cebf98293a7c32f532c4aeb926345e9747452233950"}, + {file = "grpcio-1.56.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:97e0efaebbfd222bcaac2f1735c010c1d3b167112d9d237daebbeedaaccf3d1d"}, + {file = "grpcio-1.56.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c0c85c5cbe8b30a32fa6d802588d55ffabf720e985abe9590c7c886919d875d4"}, + {file = "grpcio-1.56.2-cp310-cp310-win32.whl", hash = "sha256:06e84ad9ae7668a109e970c7411e7992751a116494cba7c4fb877656527f9a57"}, + {file = "grpcio-1.56.2-cp310-cp310-win_amd64.whl", hash = "sha256:10954662f77dc36c9a1fb5cc4a537f746580d6b5734803be1e587252682cda8d"}, + {file = "grpcio-1.56.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:c435f5ce1705de48e08fcbcfaf8aee660d199c90536e3e06f2016af7d6a938dd"}, + {file = "grpcio-1.56.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:6108e5933eb8c22cd3646e72d5b54772c29f57482fd4c41a0640aab99eb5071d"}, + {file = "grpcio-1.56.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8391cea5ce72f4a12368afd17799474015d5d3dc00c936a907eb7c7eaaea98a5"}, + {file = "grpcio-1.56.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:750de923b456ca8c0f1354d6befca45d1f3b3a789e76efc16741bd4132752d95"}, + {file = "grpcio-1.56.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fda2783c12f553cdca11c08e5af6eecbd717280dc8fbe28a110897af1c15a88c"}, + {file = "grpcio-1.56.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9e04d4e4cfafa7c5264e535b5d28e786f0571bea609c3f0aaab13e891e933e9c"}, + {file = "grpcio-1.56.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:89a49cc5ad08a38b6141af17e00d1dd482dc927c7605bc77af457b5a0fca807c"}, + {file = "grpcio-1.56.2-cp311-cp311-win32.whl", hash = "sha256:6a007a541dff984264981fbafeb052bfe361db63578948d857907df9488d8774"}, + {file = "grpcio-1.56.2-cp311-cp311-win_amd64.whl", hash = "sha256:af4063ef2b11b96d949dccbc5a987272f38d55c23c4c01841ea65a517906397f"}, + {file = "grpcio-1.56.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:a6ff459dac39541e6a2763a4439c4ca6bc9ecb4acc05a99b79246751f9894756"}, + {file = "grpcio-1.56.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:f20fd21f7538f8107451156dd1fe203300b79a9ddceba1ee0ac8132521a008ed"}, + {file = "grpcio-1.56.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:d1fbad1f9077372b6587ec589c1fc120b417b6c8ad72d3e3cc86bbbd0a3cee93"}, + {file = "grpcio-1.56.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ee26e9dfb3996aff7c870f09dc7ad44a5f6732b8bdb5a5f9905737ac6fd4ef1"}, + {file = "grpcio-1.56.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4c60abd950d6de3e4f1ddbc318075654d275c29c846ab6a043d6ed2c52e4c8c"}, + {file = "grpcio-1.56.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1c31e52a04e62c8577a7bf772b3e7bed4df9c9e0dd90f92b6ffa07c16cab63c9"}, + {file = "grpcio-1.56.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:345356b307cce5d14355e8e055b4ca5f99bc857c33a3dc1ddbc544fca9cd0475"}, + {file = "grpcio-1.56.2-cp37-cp37m-win_amd64.whl", hash = "sha256:42e63904ee37ae46aa23de50dac8b145b3596f43598fa33fe1098ab2cbda6ff5"}, + {file = "grpcio-1.56.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:7c5ede2e2558f088c49a1ddda19080e4c23fb5d171de80a726b61b567e3766ed"}, + {file = "grpcio-1.56.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:33971197c47965cc1d97d78d842163c283e998223b151bab0499b951fd2c0b12"}, + {file = "grpcio-1.56.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:d39f5d4af48c138cb146763eda14eb7d8b3ccbbec9fe86fb724cd16e0e914c64"}, + {file = "grpcio-1.56.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ded637176addc1d3eef35331c39acc598bac550d213f0a1bedabfceaa2244c87"}, + {file = "grpcio-1.56.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c90da4b124647547a68cf2f197174ada30c7bb9523cb976665dfd26a9963d328"}, + {file = "grpcio-1.56.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3ccb621749a81dc7755243665a70ce45536ec413ef5818e013fe8dfbf5aa497b"}, + {file = "grpcio-1.56.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4eb37dd8dd1aa40d601212afa27ca5be255ba792e2e0b24d67b8af5e012cdb7d"}, + {file = "grpcio-1.56.2-cp38-cp38-win32.whl", hash = "sha256:ddb4a6061933bd9332b74eac0da25f17f32afa7145a33a0f9711ad74f924b1b8"}, + {file = "grpcio-1.56.2-cp38-cp38-win_amd64.whl", hash = "sha256:8940d6de7068af018dfa9a959a3510e9b7b543f4c405e88463a1cbaa3b2b379a"}, + {file = "grpcio-1.56.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:51173e8fa6d9a2d85c14426bdee5f5c4a0654fd5fddcc21fe9d09ab0f6eb8b35"}, + {file = "grpcio-1.56.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:373b48f210f43327a41e397391715cd11cfce9ded2fe76a5068f9bacf91cc226"}, + {file = "grpcio-1.56.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:42a3bbb2bc07aef72a7d97e71aabecaf3e4eb616d39e5211e2cfe3689de860ca"}, + {file = "grpcio-1.56.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5344be476ac37eb9c9ad09c22f4ea193c1316bf074f1daf85bddb1b31fda5116"}, + {file = "grpcio-1.56.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3fa3ab0fb200a2c66493828ed06ccd1a94b12eddbfb985e7fd3e5723ff156c6"}, + {file = "grpcio-1.56.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b975b85d1d5efc36cf8b237c5f3849b64d1ba33d6282f5e991f28751317504a1"}, + {file = "grpcio-1.56.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cbdf2c498e077282cd427cfd88bdce4668019791deef0be8155385ab2ba7837f"}, + {file = "grpcio-1.56.2-cp39-cp39-win32.whl", hash = "sha256:139f66656a762572ae718fa0d1f2dce47c05e9fbf7a16acd704c354405b97df9"}, + {file = "grpcio-1.56.2-cp39-cp39-win_amd64.whl", hash = "sha256:830215173ad45d670140ff99aac3b461f9be9a6b11bee1a17265aaaa746a641a"}, + {file = "grpcio-1.56.2.tar.gz", hash = "sha256:0ff789ae7d8ddd76d2ac02e7d13bfef6fc4928ac01e1dcaa182be51b6bcc0aaa"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.56.2)"] + +[[package]] +name = "grpcio-status" +version = "1.56.2" +description = "Status proto mapping for gRPC" optional = false python-versions = ">=3.6" +files = [ + {file = "grpcio-status-1.56.2.tar.gz", hash = "sha256:a046b2c0118df4a5687f4585cca9d3c3bae5c498c4dff055dcb43fb06a1180c8"}, + {file = "grpcio_status-1.56.2-py3-none-any.whl", hash = "sha256:63f3842867735f59f5d70e723abffd2e8501a6bcd915612a1119e52f10614782"}, +] [package.dependencies] googleapis-common-protos = ">=1.5.5" grpcio = ">=1.56.2" protobuf = ">=4.21.6" -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - [[package]] name = "heapdict" version = "1.0.1" @@ -1004,10 +1227,14 @@ parser = ["pyhcl (>=0.3.10)"] [[package]] name = "identify" -version = "2.5.24" +version = "2.5.27" description = "File identification library for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "identify-2.5.27-py2.py3-none-any.whl", hash = "sha256:fdb527b2dfe24602809b2201e033c2a113d7bdf716db3ca8e3243f735dcecaba"}, + {file = "identify-2.5.27.tar.gz", hash = "sha256:287b75b04a0e22d727bc9a41f0d4f3c1bcada97490fa6eabb5b28f0e9097e733"}, +] [package.extras] license = ["ukkonen"] @@ -1023,28 +1250,16 @@ files = [ {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] -[[package]] -name = "importlib-metadata" -version = "4.13.0" -description = "Read metadata from Python packages" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "jaraco.tidelift (>=1.4)"] -perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] - [[package]] name = "importlib-resources" -version = "5.12.0" +version = "6.0.1" description = "Read resources from Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"}, + {file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"}, +] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} @@ -1079,97 +1294,6 @@ files = [ pandas = "*" requests = "*" -[[package]] -name = "ipykernel" -version = "6.25.1" -description = "IPython Kernel for Jupyter" -optional = false -python-versions = ">=3.8" -files = [ - {file = "ipykernel-6.25.1-py3-none-any.whl", hash = "sha256:c8a2430b357073b37c76c21c52184db42f6b4b0e438e1eb7df3c4440d120497c"}, - {file = "ipykernel-6.25.1.tar.gz", hash = "sha256:050391364c0977e768e354bdb60cbbfbee7cbb943b1af1618382021136ffd42f"}, -] - -[package.dependencies] -appnope = {version = "*", markers = "platform_system == \"Darwin\""} -comm = ">=0.1.1" -debugpy = ">=1.6.5" -ipython = ">=7.23.1" -jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -matplotlib-inline = ">=0.1" -nest-asyncio = "*" -packaging = "*" -psutil = "*" -pyzmq = ">=20" -tornado = ">=6.1" -traitlets = ">=5.4.0" - -[package.extras] -cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] -pyqt5 = ["pyqt5"] -pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "ipython" -version = "8.12.2" -description = "IPython: Productive Interactive Computing" -optional = false -python-versions = ">=3.8" -files = [ - {file = "ipython-8.12.2-py3-none-any.whl", hash = "sha256:ea8801f15dfe4ffb76dea1b09b847430ffd70d827b41735c64a0638a04103bfc"}, - {file = "ipython-8.12.2.tar.gz", hash = "sha256:c7b80eb7f5a855a88efc971fda506ff7a91c280b42cdae26643e0f601ea281ea"}, -] - -[package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -decorator = "*" -jedi = ">=0.16" -matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" -pygments = ">=2.4.0" -stack-data = "*" -traitlets = ">=5" -typing-extensions = {version = "*", markers = "python_version < \"3.10\""} - -[package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] -black = ["black"] -doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] -kernel = ["ipykernel"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["ipywidgets", "notebook"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] - -[[package]] -name = "jedi" -version = "0.19.0" -description = "An autocompletion tool for Python that can be used for text editors." -optional = false -python-versions = ">=3.6" -files = [ - {file = "jedi-0.19.0-py2.py3-none-any.whl", hash = "sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e"}, - {file = "jedi-0.19.0.tar.gz", hash = "sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4"}, -] - -[package.dependencies] -parso = ">=0.8.3,<0.9.0" - -[package.extras] -docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] - [[package]] name = "jinja2" version = "3.0.3" @@ -1187,71 +1311,118 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] -[[package]] -name = "jinja2-time" -version = "0.2.0" -description = "Jinja2 Extension for Dates and Times" -optional = false -python-versions = "*" -files = [ - {file = "jinja2-time-0.2.0.tar.gz", hash = "sha256:d14eaa4d315e7688daa4969f616f226614350c48730bfa1692d2caebd8c90d40"}, - {file = "jinja2_time-0.2.0-py2.py3-none-any.whl", hash = "sha256:d3eab6605e3ec8b7a0863df09cc1d23714908fa61aa6986a845c20ba488b4efa"}, -] - -[package.dependencies] -arrow = "*" -jinja2 = "*" - -[[package]] -name = "jupyter-client" -version = "7.3.4" -description = "Jupyter protocol implementation and client libraries" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jupyter_client-7.3.4-py3-none-any.whl", hash = "sha256:17d74b0d0a7b24f1c8c527b24fcf4607c56bee542ffe8e3418e50b21e514b621"}, - {file = "jupyter_client-7.3.4.tar.gz", hash = "sha256:aa9a6c32054b290374f95f73bb0cae91455c58dfb84f65c8591912b8f65e6d56"}, -] - -[package.dependencies] -entrypoints = "*" -jupyter-core = ">=4.9.2" -nest-asyncio = ">=1.5.4" -python-dateutil = ">=2.8.2" -pyzmq = ">=23.0" -tornado = ">=6.0" -traitlets = "*" - -[package.extras] -doc = ["ipykernel", "myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] -test = ["codecov", "coverage", "ipykernel (>=6.5)", "ipython", "mypy", "pre-commit", "pytest", "pytest-asyncio (>=0.18)", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "jupyter-core" -version = "5.2.0" -description = "Jupyter core package. A base package on which Jupyter projects rely." -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_core-5.2.0-py3-none-any.whl", hash = "sha256:4bdc2928c37f6917130c667d8b8708f20aee539d8283c6be72aabd2a4b4c83b0"}, - {file = "jupyter_core-5.2.0.tar.gz", hash = "sha256:1407cdb4c79ee467696c04b76633fc1884015fa109323365a6372c8e890cc83f"}, -] - -[package.dependencies] -platformdirs = ">=2.5" -pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} -traitlets = ">=5.3" - -[package.extras] -docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] -test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] - [[package]] name = "kiwisolver" version = "1.4.5" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, +] [[package]] name = "levenshtein" @@ -1384,13 +1555,17 @@ version = "0.7.0" description = "Python logging made (stupidly) simple" optional = false python-versions = ">=3.5" +files = [ + {file = "loguru-0.7.0-py3-none-any.whl", hash = "sha256:b93aa30099fa6860d4727f1b81f8718e965bb96253fa190fab2077aaad6d15d3"}, + {file = "loguru-0.7.0.tar.gz", hash = "sha256:1612053ced6ae84d7959dd7d5e431a0532642237ec21f7fd83ac73fe539e03e1"}, +] [package.dependencies] colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} [package.extras] -dev = ["colorama (>=0.3.4)", "docutils (==0.16)", "flake8 (>=3.7.7)", "tox (>=3.9.0)", "pytest (>=4.6.2)", "pytest-cov (>=2.7.1)", "black (>=19.10b0)", "isort (>=5.1.1)", "Sphinx (>=4.1.1)", "sphinx-autobuild (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)"] +dev = ["Sphinx (==5.3.0)", "colorama (==0.4.5)", "colorama (==0.4.6)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v0.990)", "pre-commit (==3.2.1)", "pytest (==6.1.2)", "pytest (==7.2.1)", "pytest-cov (==2.12.1)", "pytest-cov (==4.0.0)", "pytest-mypy-plugins (==1.10.1)", "pytest-mypy-plugins (==1.9.3)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.2.0)", "tox (==3.27.1)", "tox (==4.4.6)"] [[package]] name = "lxml" @@ -1659,7 +1834,6 @@ packaging = ">=20.0" pillow = ">=6.2.0" pyparsing = ">=2.3.1,<3.1" python-dateutil = ">=2.7" -setuptools_scm = ">=7" [[package]] name = "msgpack" @@ -1667,6 +1841,125 @@ version = "1.0.3" description = "MessagePack (de)serializer." optional = false python-versions = "*" +files = [ + {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:96acc674bb9c9be63fa8b6dabc3248fdc575c4adc005c440ad02f87ca7edd079"}, + {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c3ca57c96c8e69c1a0d2926a6acf2d9a522b41dc4253a8945c4c6cd4981a4e3"}, + {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0a792c091bac433dfe0a70ac17fc2087d4595ab835b47b89defc8bbabcf5c73"}, + {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c58cdec1cb5fcea8c2f1771d7b5fec79307d056874f746690bd2bdd609ab147"}, + {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f97c0f35b3b096a330bb4a1a9247d0bd7e1f3a2eba7ab69795501504b1c2c39"}, + {file = "msgpack-1.0.3-cp310-cp310-win32.whl", hash = "sha256:36a64a10b16c2ab31dcd5f32d9787ed41fe68ab23dd66957ca2826c7f10d0b85"}, + {file = "msgpack-1.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c1ba333b4024c17c7591f0f372e2daa3c31db495a9b2af3cf664aef3c14354f7"}, + {file = "msgpack-1.0.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c2140cf7a3ec475ef0938edb6eb363fa704159e0bf71dde15d953bacc1cf9d7d"}, + {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f4c22717c74d44bcd7af353024ce71c6b55346dad5e2cc1ddc17ce8c4507c6b"}, + {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d733a15ade190540c703de209ffbc42a3367600421b62ac0c09fde594da6ec"}, + {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7e03b06f2982aa98d4ddd082a210c3db200471da523f9ac197f2828e80e7770"}, + {file = "msgpack-1.0.3-cp36-cp36m-win32.whl", hash = "sha256:3d875631ecab42f65f9dce6f55ce6d736696ced240f2634633188de2f5f21af9"}, + {file = "msgpack-1.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:40fb89b4625d12d6027a19f4df18a4de5c64f6f3314325049f219683e07e678a"}, + {file = "msgpack-1.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6eef0cf8db3857b2b556213d97dd82de76e28a6524853a9beb3264983391dc1a"}, + {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d8c332f53ffff01953ad25131272506500b14750c1d0ce8614b17d098252fbc"}, + {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c0903bd93cbd34653dd63bbfcb99d7539c372795201f39d16fdfde4418de43a"}, + {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf1e6bfed4860d72106f4e0a1ab519546982b45689937b40257cfd820650b920"}, + {file = "msgpack-1.0.3-cp37-cp37m-win32.whl", hash = "sha256:d02cea2252abc3756b2ac31f781f7a98e89ff9759b2e7450a1c7a0d13302ff50"}, + {file = "msgpack-1.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f30dd0dc4dfe6231ad253b6f9f7128ac3202ae49edd3f10d311adc358772dba"}, + {file = "msgpack-1.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f201d34dc89342fabb2a10ed7c9a9aaaed9b7af0f16a5923f1ae562b31258dea"}, + {file = "msgpack-1.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bb87f23ae7d14b7b3c21009c4b1705ec107cb21ee71975992f6aca571fb4a42a"}, + {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a3a5c4b16e9d0edb823fe54b59b5660cc8d4782d7bf2c214cb4b91a1940a8ef"}, + {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74da1e5fcf20ade12c6bf1baa17a2dc3604958922de8dc83cbe3eff22e8b611"}, + {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73a80bd6eb6bcb338c1ec0da273f87420829c266379c8c82fa14c23fb586cfa1"}, + {file = "msgpack-1.0.3-cp38-cp38-win32.whl", hash = "sha256:9fce00156e79af37bb6db4e7587b30d11e7ac6a02cb5bac387f023808cd7d7f4"}, + {file = "msgpack-1.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:9b6f2d714c506e79cbead331de9aae6837c8dd36190d02da74cb409b36162e8a"}, + {file = "msgpack-1.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:89908aea5f46ee1474cc37fbc146677f8529ac99201bc2faf4ef8edc023c2bf3"}, + {file = "msgpack-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:973ad69fd7e31159eae8f580f3f707b718b61141838321c6fa4d891c4a2cca52"}, + {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da24375ab4c50e5b7486c115a3198d207954fe10aaa5708f7b65105df09109b2"}, + {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a598d0685e4ae07a0672b59792d2cc767d09d7a7f39fd9bd37ff84e060b1a996"}, + {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4c309a68cb5d6bbd0c50d5c71a25ae81f268c2dc675c6f4ea8ab2feec2ac4e2"}, + {file = "msgpack-1.0.3-cp39-cp39-win32.whl", hash = "sha256:494471d65b25a8751d19c83f1a482fd411d7ca7a3b9e17d25980a74075ba0e88"}, + {file = "msgpack-1.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:f01b26c2290cbd74316990ba84a14ac3d599af9cebefc543d241a66e785cf17d"}, + {file = "msgpack-1.0.3.tar.gz", hash = "sha256:51fdc7fb93615286428ee7758cecc2f374d5ff363bdd884c7ea622a7a327a81e"}, +] + +[[package]] +name = "multidict" +version = "6.0.4" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] [[package]] name = "mypy-extensions" @@ -1674,6 +1967,10 @@ version = "0.4.3" description = "Experimental type system extensions for programs checked with the mypy typechecker." optional = false python-versions = "*" +files = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] [[package]] name = "nodeenv" @@ -1776,20 +2073,6 @@ files = [ [package.dependencies] et-xmlfile = "*" -[[package]] -name = "outcome" -version = "1.2.0" -description = "Capture the outcome of Python function calls." -optional = false -python-versions = ">=3.7" -files = [ - {file = "outcome-1.2.0-py2.py3-none-any.whl", hash = "sha256:c4ab89a56575d6d38a05aa16daeaa333109c1f96167aba8901ab18b6b5e0f7f5"}, - {file = "outcome-1.2.0.tar.gz", hash = "sha256:6f82bd3de45da303cf1f771ecafa1633750a358436a8bb60e06a1ceb745d2672"}, -] - -[package.dependencies] -attrs = ">=19.2.0" - [[package]] name = "packaging" version = "21.3" @@ -1810,6 +2093,33 @@ version = "2.0.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.8" +files = [ + {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, + {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"}, + {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"}, + {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"}, + {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"}, + {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"}, + {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"}, + {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"}, + {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"}, + {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, + {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, +] [package.dependencies] numpy = [ @@ -1848,19 +2158,24 @@ name = "pandas-gbq" version = "0.19.2" description = "Google BigQuery connector for pandas" optional = false -python-versions = ">=3.7, <3.11" +python-versions = ">=3.7" +files = [ + {file = "pandas-gbq-0.19.2.tar.gz", hash = "sha256:b0f7fa84a2be0fe767e33a008ca7e4ad9a9e3ac67255fd0a41fc19b503138447"}, + {file = "pandas_gbq-0.19.2-py2.py3-none-any.whl", hash = "sha256:0ef8da3e4088053a2bea069ed688992a44b52af67dadb97eee494b32a2147563"}, +] [package.dependencies] -db-dtypes = ">=0.3.1,<2.0.0" -google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev" -google-auth = ">=1.25.0" -google-auth-oauthlib = ">=0.0.1" -google-cloud-bigquery = ">=1.27.2,<2.4.0 || >=2.5.0,<4.0.0dev" -google-cloud-bigquery-storage = ">=1.1.0,<3.0.0dev" +db-dtypes = ">=1.0.4,<2.0.0" +google-api-core = ">=2.10.2,<3.0.0dev" +google-auth = ">=2.13.0" +google-auth-oauthlib = ">=0.7.0" +google-cloud-bigquery = ">=3.3.5,<4.0.0dev" +google-cloud-bigquery-storage = ">=2.16.2,<3.0.0dev" numpy = ">=1.16.6" -pandas = ">=0.24.2" -pyarrow = ">=3.0.0,<8.0dev" -pydata-google-auth = "*" +pandas = ">=1.1.4" +pyarrow = ">=3.0.0" +pydata-google-auth = ">=1.5.0" +setuptools = "*" [package.extras] tqdm = ["tqdm (>=4.23.0)"] @@ -1884,35 +2199,6 @@ pandas = ">=1.1" [package.extras] tests = ["pytest (==7.1.2)"] -[[package]] -name = "parameterized" -version = "0.9.0" -description = "Parameterized testing with any Python test framework" -optional = false -python-versions = ">=3.7" -files = [ - {file = "parameterized-0.9.0-py2.py3-none-any.whl", hash = "sha256:4e0758e3d41bea3bbd05ec14fc2c24736723f243b28d702081aef438c9372b1b"}, - {file = "parameterized-0.9.0.tar.gz", hash = "sha256:7fc905272cefa4f364c1a3429cbbe9c0f98b793988efb5bf90aac80f08db09b1"}, -] - -[package.extras] -dev = ["jinja2"] - -[[package]] -name = "parso" -version = "0.8.3" -description = "A Python Parser" -optional = false -python-versions = ">=3.6" -files = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, -] - -[package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] - [[package]] name = "partd" version = "1.2.0" @@ -1965,31 +2251,6 @@ files = [ python-dateutil = ">=2.6,<3.0" pytzdata = ">=2020.1" -[[package]] -name = "pexpect" -version = "4.8.0" -description = "Pexpect allows easy control of interactive console applications." -optional = false -python-versions = "*" -files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, -] - -[package.dependencies] -ptyprocess = ">=0.5" - -[[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -optional = false -python-versions = "*" -files = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] - [[package]] name = "pillow" version = "10.0.0" @@ -2061,65 +2322,33 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa [[package]] name = "platformdirs" -version = "3.8.0" +version = "3.10.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, + {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, +] [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)", "sphinx (>=7.0.1)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest (>=7.3.1)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pluggy" version = "1.3.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.7" - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "polars" -version = "0.17.15" -description = "Blazingly fast DataFrame library" -optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "polars-0.17.15-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:e14f31799e73cd6aa7a5f28b7acc40fc0b70eb6f8554f8e9246bf7afc620a929"}, - {file = "polars-0.17.15-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:9ecec1476764d615a0def5a35421e4a8f0f43dbf365cda7f95d79bb29d80da34"}, - {file = "polars-0.17.15-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ce049ed923ff2a8902f8925bde0e10722e7a9747133b7d0856feb86000543bd"}, - {file = "polars-0.17.15-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f3a723ee318f8f7e7330df82bb27c9efd3c345d3ecd03307389e4e1564f4df6"}, - {file = "polars-0.17.15-cp37-abi3-win_amd64.whl", hash = "sha256:112300a41b97291486edb604945275f7e5238ec1335f164f028e476c0401fca4"}, - {file = "polars-0.17.15.tar.gz", hash = "sha256:78a1d520279c0ade91712d19c530d7933e07885d87f09c0cd38daac6260162bf"}, + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, ] [package.extras] -all = ["polars[connectorx,deltalake,fsspec,matplotlib,numpy,pandas,pyarrow,sqlalchemy,timezone,xlsx2csv,xlsxwriter]"] -connectorx = ["connectorx"] -deltalake = ["deltalake (>=0.8.0)"] -fsspec = ["fsspec"] -matplotlib = ["matplotlib"] -numpy = ["numpy (>=1.16.0)"] -pandas = ["pandas", "pyarrow (>=7.0.0)"] -pyarrow = ["pyarrow (>=7.0.0)"] -sqlalchemy = ["pandas", "sqlalchemy"] -timezone = ["backports.zoneinfo", "tzdata"] -xlsx2csv = ["xlsx2csv (>=0.8.0)"] -xlsxwriter = ["xlsxwriter"] - -[[package]] -name = "poyo" -version = "0.5.0" -description = "A lightweight YAML Parser for Python. 🐓" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "poyo-0.5.0-py2.py3-none-any.whl", hash = "sha256:3e2ca8e33fdc3c411cd101ca395668395dd5dc7ac775b8e809e3def9f9fe041a"}, - {file = "poyo-0.5.0.tar.gz", hash = "sha256:e26956aa780c45f011ca9886f044590e2d8fd8b61db7b1c1cf4e0869f48ed4dd"}, -] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" @@ -2215,26 +2444,16 @@ twitter = ["tweepy (>=3.5,<4.0)"] vault = ["hvac (>=0.10)"] viz = ["graphviz (>=0.8.3)"] -[[package]] -name = "prompt-toolkit" -version = "3.0.39" -description = "Library for building powerful interactive command lines in Python" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, - {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, -] - -[package.dependencies] -wcwidth = "*" - [[package]] name = "proto-plus" version = "1.22.3" description = "Beautiful, Pythonic protocol buffers." optional = false python-versions = ">=3.6" +files = [ + {file = "proto-plus-1.22.3.tar.gz", hash = "sha256:fdcd09713cbd42480740d2fe29c990f7fbd885a67efc328aa8be6ee3e9f76a6b"}, + {file = "proto_plus-1.22.3-py3-none-any.whl", hash = "sha256:a49cd903bc0b6ab41f76bf65510439d56ca76f868adf0274e738bfdd096894df"}, +] [package.dependencies] protobuf = ">=3.19.0,<5.0.0dev" @@ -2244,11 +2463,25 @@ testing = ["google-api-core[grpc] (>=1.31.5)"] [[package]] name = "protobuf" -version = "3.19.1" -description = "Protocol Buffers" -category = "main" +version = "4.23.4" +description = "" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" +files = [ + {file = "protobuf-4.23.4-cp310-abi3-win32.whl", hash = "sha256:5fea3c64d41ea5ecf5697b83e41d09b9589e6f20b677ab3c48e5f242d9b7897b"}, + {file = "protobuf-4.23.4-cp310-abi3-win_amd64.whl", hash = "sha256:7b19b6266d92ca6a2a87effa88ecc4af73ebc5cfde194dc737cf8ef23a9a3b12"}, + {file = "protobuf-4.23.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8547bf44fe8cec3c69e3042f5c4fb3e36eb2a7a013bb0a44c018fc1e427aafbd"}, + {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:fee88269a090ada09ca63551bf2f573eb2424035bcf2cb1b121895b01a46594a"}, + {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:effeac51ab79332d44fba74660d40ae79985901ac21bca408f8dc335a81aa597"}, + {file = "protobuf-4.23.4-cp37-cp37m-win32.whl", hash = "sha256:c3e0939433c40796ca4cfc0fac08af50b00eb66a40bbbc5dee711998fb0bbc1e"}, + {file = "protobuf-4.23.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9053df6df8e5a76c84339ee4a9f5a2661ceee4a0dab019e8663c50ba324208b0"}, + {file = "protobuf-4.23.4-cp38-cp38-win32.whl", hash = "sha256:e1c915778d8ced71e26fcf43c0866d7499891bca14c4368448a82edc61fdbc70"}, + {file = "protobuf-4.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:351cc90f7d10839c480aeb9b870a211e322bf05f6ab3f55fcb2f51331f80a7d2"}, + {file = "protobuf-4.23.4-cp39-cp39-win32.whl", hash = "sha256:6dd9b9940e3f17077e820b75851126615ee38643c2c5332aa7a359988820c720"}, + {file = "protobuf-4.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:0a5759f5696895de8cc913f084e27fd4125e8fb0914bb729a17816a33819f474"}, + {file = "protobuf-4.23.4-py3-none-any.whl", hash = "sha256:e9d0be5bf34b275b9f87ba7407796556abeeba635455d036c7351f7c183ef8ff"}, + {file = "protobuf-4.23.4.tar.gz", hash = "sha256:ccd9430c0719dce806b93f89c91de7977304729e55377f872a92465d548329a9"}, +] [[package]] name = "psutil" @@ -2288,7 +2521,7 @@ files = [ ] [package.extras] -test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"] +test = ["enum34", "ipaddress", "mock", "pywin32", "unittest2", "wmi"] [[package]] name = "pyaml" @@ -2369,20 +2602,40 @@ version = "0.2.8" description = "A collection of ASN.1-based protocols modules." optional = false python-versions = "*" +files = [ + {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, + {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, +] [package.dependencies] pyasn1 = ">=0.4.6,<0.5.0" +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + [[package]] name = "pydata-google-auth" -version = "1.8.1" +version = "1.8.2" description = "PyData helpers for authenticating to Google APIs" optional = false python-versions = "*" +files = [ + {file = "pydata-google-auth-1.8.2.tar.gz", hash = "sha256:547b6c0fbea657dcecd50887c5db8640ebec062a59a2b88e8ff8e53a04818303"}, + {file = "pydata_google_auth-1.8.2-py2.py3-none-any.whl", hash = "sha256:a9dce59af4a170ea60c4b2ebbc83ee1f74d34255a4f97b2469ae9a4a0dc98e99"}, +] [package.dependencies] -google-auth = "*" -google-auth-oauthlib = "*" +google-auth = {version = ">=1.25.0,<3.0dev", markers = "python_version >= \"3.6\""} +google-auth-oauthlib = {version = ">=0.4.0", markers = "python_version >= \"3.6\""} +setuptools = "*" [[package]] name = "pymssql" @@ -2458,18 +2711,6 @@ files = [ [package.extras] diagrams = ["jinja2", "railroad-diagrams"] -[[package]] -name = "pysocks" -version = "1.7.1" -description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"}, - {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"}, - {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"}, -] - [[package]] name = "pytest" version = "7.4.0" @@ -2494,10 +2735,14 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no [[package]] name = "pytest-cov" -version = "4.1.0" +version = "3.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.6" +files = [ + {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, + {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, +] [package.dependencies] coverage = {version = ">=5.2.1", extras = ["toml"]} @@ -2570,21 +2815,6 @@ text-unidecode = ">=1.3" [package.extras] unidecode = ["Unidecode (>=1.1.1)"] -[[package]] -name = "python-string-utils" -version = "1.0.0" -description = "Utility functions for strings validation and manipulation." -optional = false -python-versions = ">=3.5" -files = [] -develop = false - -[package.source] -type = "git" -url = "https://github.com/daveoncode/python-string-utils.git" -reference = "master" -resolved_reference = "78929d88d90b1f90cb4837528ed955166bf0f559" - [[package]] name = "pytz" version = "2021.3" @@ -2634,28 +2864,153 @@ version = "6.0" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] [[package]] name = "rapidfuzz" -version = "3.1.1" +version = "3.2.0" description = "rapid fuzzy string matching" optional = false python-versions = ">=3.7" +files = [ + {file = "rapidfuzz-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f5787f1cc456207dee1902804209e1a90df67e88517213aeeb1b248822413b4c"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e8d91137b0b5a6ef06c3979b6302265129dee1741486b6baa241ac63a632bea7"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c130e73e0079f403b7c3dbf6f85816a3773971c3e639f7289f8b4337b8fd70fe"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e18059188bfe3cdbc3462aeec2fa3302b08717e04ca34e2cc6e02fb3c0280d8"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:37bb6bd6a79d5524f121ff2a7d7df4491519b3f43565dccd4596bd75aa73ab7c"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca0d6aee42effaf2e8883d2181196dd0957b1af5731b0763f10f994c32c823db"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49fc2cbbf05bfa1af3fe4c0e0c8e5c8ac118d6b6ddfb0081cff48ad53734f7ac"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd4fdee46f6ba7d254dba8e7e8f33012c964fc891a06b036b0fd20cab0db301"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ab2863732eafd1cc58f249f145c20ad13d4c902d3ef3a369b00438c05e5bfb55"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a9658c545de62ac948027092ba7f4e8507ebc5c9aef964eca654409c58f207f0"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:5f3e36cfadaf29f081ad4ca476e320b639d610e930e0557f395780c9b2bdb135"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:239ffc04328e14f5e4097102bd934352a43d5912acf34fb7d3e3fe306de92787"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b56ce39ba0a77501d491bc20a2266989ae0264452758b004950ee5f4c10c641f"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-win32.whl", hash = "sha256:dbebd639579ab113644699fe0c536ae00aba15b224e40a79987684333d1104a5"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:88e99229c4df99a7e5810d4d361033b44e29d8eb4faaddcfb8e4bdcb604cf40a"}, + {file = "rapidfuzz-3.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:8e39c4e2e85828aa6c39cc7f30e2917d991b40190a2a3af1fa02396a3362a54e"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2f2e618389427c5e8304357a78f83df22558e61f11bc21aeb95dd544c274d330"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a2a6babfe4d3ce2eadd0079ee7861cb5f1584845c5a3394edead85457e7d7464"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f223deb06895c9c136b40cd8fd7e96ee745c3bb9ed502d7367f6ad9ab6fdd40e"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0de6962b45f761355fa4b37de635e4df467d57530732a40d82e748a5bc911731"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76953516cb3b75fb1234c5a90e0b86be4525f055a9e276237adb1ffe40dca536"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1e04861dddbb477500449dc67fb037656a049b6f78c4c434c6000e64aa42bb4"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff6e725eec9c769f9d22126c80a6ada90275c0d693eca2b35d5933178bda5a2"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f21ce33242e579ba255c8a8b438782164acaa55bf188d9410298c40cbaa07d5"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:986a7aad18768b920bb710e15ed7629d1da0af31589348c0a51d152820efc05d"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6e98f0a6fac14b7b9893147deceae12131f6ff169ae1c973635ef97617949c8f"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5dd5c4b9f5cd8a8271a90d1bab643028e7172808c68ed5d8dde661a3e51098e3"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:e336b0a81c5a8e689edf6928136d19e791733a66509026d9acbaa148238186e0"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8fa44afb731535a803c4c15ee846257fef050768af96d1d6c0eadb30285d0f7b"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-win32.whl", hash = "sha256:d04ad155dbecc0c143912f691d38d4790e290c2ce5411b146c0e00d4f4afd26f"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:b9e79e27344af95a71a3bb6cd3562581da5d0780ff847a13ad69ee622d940d3c"}, + {file = "rapidfuzz-3.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:dc53747e73f34e8f3a3c1b0bc5b437b90a2c69d873e97781aa7c06543201409a"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:613c1043332eeba0c0910de71af221ac10d820b4fa9615b0083c733b90a757f9"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0907f87beca70e44f78e318eede2416ddba19ec43d28af9248617e8a1741ef3"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcfd184e0b5c58497cc3d961f49ac07ae1656d161c6c4d06230d267ae4e11f00"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a7d53a2f1ccfb169be26fa3824b1b185420592c75853f16c6b7115315ea6784"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2eac585803c4e8132ed5f4a150621db05c418304982c88cf706abdded65e1632"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc859f654b350def5df2ebc6d09f822b04399823e3dad1c3f2e8776c825fcde7"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8a165f64c528edc0bbbd09c76d64efd4dbe4240fd1961710b69586ef40486e79"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:56a392b655597ecf40535b56bfb7c0856c10c0abc0cbc369fd25a1665420710b"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:5863b176da42b1bb450a28375ef1502f81fbecd210a5aae295d7f2221284ad41"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:8f8590c39a3f745b314f2697b140c8f8600fe7ecfb2101e9e4ec6e7716c66827"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:da00990adf1fbc0904f22409b3451473fa465a0ef49f3075703c206080aa31b2"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:2504205552bf568ac478f17dd612d0e31c4a82c645c66209a442df7e572b5adc"}, + {file = "rapidfuzz-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:af3ac648232c109e36c8b941106d726969972644aa3ef55218c5988aa1daea03"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:04d22f6058ce5d620ec4ecd771e44cfa77d571137d6c6547df57bdfc44ee2a98"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac7ddcd372ed202d1b59b117506da695b291f135435cfbf3e71490aa8e687173"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd3fca0224b84350f73eab1fb5728c58fd25ee4f20e512607c7d83f9bc836d3f"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bdb1f92c4666c7e1d3c21268b931cf3f06f32af98dfdeb37641159b15fa31dd"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:871052405c465a45b53a3dc854a8be62079f42cdbb052651ff0b65e2452131e6"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb9bb1af5680741cf974f510fb3894907a1b308e819aff3d9ea10b5326e8a5f6"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84ce2e010677835fa5ba591419e4404f11a1446f33eec3724a2bff557ae5144a"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c13107e0fdca5ccae70659f45646d57453338a9dfc6b152fb7372e4bf73466a0"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:538027685a1a8f1699e329f6443951267f169bfa149298734ea679db8f0e7171"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3557736672115d082979a8a12f884ed5b24268f4471fee85cfb2ec7212b68607"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6bc5e3da74644cf75663f5b438e0ae79b67d1f96d082cda771b0ecfed0528f40"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:d2d0fc98d9d7bba44f929d201c2c2c35eb69ea2ffef43d939b297dafef934625"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2bf85a3bf34f27383691e8af0fd148b2a3a89f1444d4640d04ef58030f596ee0"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-win32.whl", hash = "sha256:cf5ea3f1d65a0bee707245a0096c3a6f769b3ad6f1b9afc7176dfb73eb0ac98f"}, + {file = "rapidfuzz-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:54906095444ea8b0a4013f3799b3f2c380205d7f60b9c55774e7d2264fa8d9c6"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6d44218823533e0d47770feef86c73c90a6f7e8d4923eafabf56a1fa3444eda0"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:87c3d4077e61c66d5dd11198a317f83db8e8cf034239baa16e4384037b611652"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc0e1142350566349c41173685988d942ebc89578f25ee27750d261e7d79e1ce"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de44a378751fdfb19ddf6af412b3395db4b21ab61f40139f815c82f1a1611b50"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca0983b30c7b289f540b11cdb550e301b3f2e8f0ef9df866aa24a16f6cd96041"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adfffb79288437006be412d74e28cddd7c5e6cc9f84a34aa9c356b13dc1ad2c9"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a284386652efb3b7d41ed5dd101ab4ce5936f585c52a47fa9838fc0342235700"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c546c83d6bc9006b86f56921b92c3e16d8ddeb4e1663653e755a5d8a3ac258da"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:53b3575fa398a5021192c1592dce98965560ad00690be3ade056eab99288562c"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:366ade5d0067dc6281e2a6c9e5c91bbfe023b09cef86894de8fe480b4696e3bf"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f946dec03cc2c77bc091d186c007d1e957d1f16a4d68a181f5fa75aea40bdf87"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:045e5cccb0e792005d5465de0ea4621b9b67778580e558f266984704e68b0087"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fd80288b9538c87209893f0934563c20b6a43acf30693794bcc111b294447ee9"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-win32.whl", hash = "sha256:a359436754ed5dd10d88706f076caa7f8e5c1469bf5ebba1897dc87aa9ff953e"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:75df3d9b895910ee810b2c96c8626cc2b5b63bb237762db36ff79fb466eccc43"}, + {file = "rapidfuzz-3.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:893833a903875a50acdbcb7ed33b5426ba47412bd18b3eb80d56d982b641dc59"}, + {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3002c3660180747243cccb40c95ade1960e6665b340f211a114f5994b345ab53"}, + {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa50de7e0f95e1400b2bf38cfeb6e40cf87c862537871c2f7b2050b5db0a9dfc"}, + {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54842a578a2a8e5258812a9032ffb55e6f1185490fd160cae64e57b4dc342297"}, + {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:108861623838cd574b0faa3309ce8525c2086159de7f9e23ac263a987c070ebd"}, + {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d39128415f0b52be08c15eeee5f79288189933a4d6fa5dc5fff11e20614b7989"}, + {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3af2b75635f33ffab84e295773c84a176d4cba75311d836ad79b6795e9da11ac"}, + {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68c678f7f3ca3d83d1e1dd7fb7db3232037d9eef12a47f1d5fe248a76ca47571"}, + {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25d2bd257034e910df0951cdeff337dbd086d7d90af3ed9f6721e7bba9fc388a"}, + {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c7f20e68cad26fc140c6f2ac9e8f2632a0cd66e407ba3ea4ace63c669fd4719"}, + {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f09fd9dc73180deb9ca1c4fbd9cc27378f0ab6ee74e97318c38c5080708702b6"}, + {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:af7914fc7683f921492f32314cfbe915a5376cc08a982e09084cbd9b866c9fd4"}, + {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08a242c4b909abbcfa44504dc5041d5eeca4cd088ae51afd6a52b4dc61684fa2"}, + {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b07afaca28398b93d727a2565491c455896898b66daee4664acde4af94e557"}, + {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24e4c4a031c50e4eeb4787263319a0ac5bed20f4a263d28eac060150e3ba0018"}, + {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d19c2853a464c7b98cc408654412fd875b030f78023ccbefc4ba9eec754e07e7"}, + {file = "rapidfuzz-3.2.0.tar.gz", hash = "sha256:448d031d9960fea7826d42bd4284156fc68d3b55a6946eb34ca5c6acf960577b"}, +] [package.extras] full = ["numpy"] -[[package]] -name = "rarfile" -version = "4.0" -description = "RAR archive reader for Python" -optional = false -python-versions = "*" -files = [ - {file = "rarfile-4.0-py3-none-any.whl", hash = "sha256:1094869119012f95c31a6f22cc3a9edbdca61861b805241116adbe2d737b68f8"}, - {file = "rarfile-4.0.tar.gz", hash = "sha256:67548769229c5bda0827c1663dce3f54644f9dbfba4ae86d4da2b2afd3e602a1"}, -] - [[package]] name = "redis" version = "4.6.0" @@ -2728,12 +3083,59 @@ requests = ">=2.0.0" [package.extras] rsa = ["oauthlib[signedtoken] (>=3.0.0)"] +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "rpy2" +version = "3.5.13" +description = "Python interface to the R language (embedded R)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "rpy2-3.5.13-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:1748f56343be608558f2f40b43c2e8a9103af91e721b7f9617f10c86cc284dde"}, + {file = "rpy2-3.5.13-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:488f2ad3220275b7717073d561b22ebf29e4be4d26aed7f45e49b453ff08a640"}, + {file = "rpy2-3.5.13-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:5353f3ada4cb01245fbec03fdec326e68f32f032b19836154d95c56c7568fd50"}, + {file = "rpy2-3.5.13-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:f2eaf6910cf96cc812a34501f45d485ef8d1c36ed1a83955aa6691ea38a85216"}, + {file = "rpy2-3.5.13-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:11f9d68ed416f7802c7673f25796e49e9717a9e05f950277b90ad1e50fd95e42"}, + {file = "rpy2-3.5.13.tar.gz", hash = "sha256:41d037599f54336f54e754d82853fae06be9438d9fb3b514d90da74eaf328ddd"}, +] + +[package.dependencies] +"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} +cffi = ">=1.10.0" +jinja2 = "*" +packaging = {version = "*", markers = "platform_system == \"Windows\""} +tzlocal = "*" + +[package.extras] +all = ["ipython", "numpy", "pandas (>=1.3.5)", "pytest"] +pandas = ["numpy", "pandas (>=1.3.5)"] +test = ["ipython", "numpy", "pandas (>=1.3.5)", "pytest"] +test-minimal = ["coverage", "pytest", "pytest-cov"] +types = ["mypy", "types-tzlocal"] + [[package]] name = "rsa" version = "4.8" description = "Pure-Python RSA implementation" optional = false python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.8-py3-none-any.whl", hash = "sha256:95c5d300c4e879ee69708c428ba566c59478fd653cc3a22243eeb8ed846950bb"}, + {file = "rsa-4.8.tar.gz", hash = "sha256:5c6bd9dc7a543b7fe4304a631f8a8a3b674e2bbfc49c2ae96200cdbe55df6b17"}, +] [package.dependencies] pyasn1 = ">=0.1.3" @@ -2851,21 +3253,19 @@ pandas = ">=0.23" scipy = ">=1.0" [[package]] -name = "setuptools-scm" -version = "7.1.0" -description = "the blessed package to manage your versions by scm tags" -category = "main" +name = "setuptools" +version = "68.1.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.7" - -[package.dependencies] -packaging = ">=20.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} -typing-extensions = "*" +python-versions = ">=3.8" +files = [ + {file = "setuptools-68.1.2-py3-none-any.whl", hash = "sha256:3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b"}, + {file = "setuptools-68.1.2.tar.gz", hash = "sha256:3d4dfa6d95f1b101d695a6160a7626e15583af71a5f52176efa5d39a054d475d"}, +] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5,<=7.1.2)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] @@ -2874,6 +3274,10 @@ version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "sortedcontainers" @@ -2892,6 +3296,10 @@ version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.7" +files = [ + {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, + {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, +] [[package]] name = "tabulate" @@ -2956,7 +3364,11 @@ name = "tomlkit" version = "0.11.8" description = "Style preserving TOML library" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.11.8-py3-none-any.whl", hash = "sha256:8c726c4c202bdb148667835f68d68780b9a003a9ec34167b6c673b38eff2a171"}, + {file = "tomlkit-0.11.8.tar.gz", hash = "sha256:9330fc7faa1db67b541b28e62018c17d20be733177d290a13b24c62d1614e0c3"}, +] [[package]] name = "toolz" @@ -3021,13 +3433,23 @@ files = [ [[package]] name = "tqdm" -version = "4.65.0" +version = "4.66.1" description = "Fast, Extensible Progress Meter" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*" +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] [[package]] name = "tweepy" @@ -3051,32 +3473,44 @@ socks = ["requests[socks] (>=2.11.1,<3)"] test = ["vcrpy (>=1.10.3)"] [[package]] -name = "typer" -version = "0.4.0" -description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +name = "typing-extensions" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "typer-0.4.0-py3-none-any.whl", hash = "sha256:d81169725140423d072df464cad1ff25ee154ef381aaf5b8225352ea187ca338"}, - {file = "typer-0.4.0.tar.gz", hash = "sha256:63c3aeab0549750ffe40da79a1b524f60e08a2cbc3126c520ebf2eeaf507f5dd"}, + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] -[package.dependencies] -click = ">=7.1.1,<9.0.0" - -[package.extras] -all = ["colorama (>=0.4.3,<0.5.0)", "shellingham (>=1.3.0,<2.0.0)"] -dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)"] -doc = ["markdown-include (>=0.5.1,<0.6.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=5.4.0,<6.0.0)"] -test = ["black (>=19.10b0,<20.0b0)", "coverage (>=5.2,<6.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<5.4.0)", "pytest-cov (>=2.10.0,<3.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<2.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] [[package]] -name = "typing-extensions" -version = "4.7.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" +name = "tzlocal" +version = "5.0.1" +description = "tzinfo object for the local timezone" optional = false python-versions = ">=3.7" +files = [ + {file = "tzlocal-5.0.1-py3-none-any.whl", hash = "sha256:f3596e180296aaf2dbd97d124fe76ae3a0e3d32b258447de7b939b3fd4be992f"}, + {file = "tzlocal-5.0.1.tar.gz", hash = "sha256:46eb99ad4bdb71f3f72b7d24f4267753e240944ecfc16f25d2719ba89827a803"}, +] + +[package.dependencies] +"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} +tzdata = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] [[package]] name = "unidecode" @@ -3106,6 +3540,10 @@ version = "1.26.7" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +files = [ + {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, + {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, +] [package.extras] brotli = ["brotlipy (>=0.6.0)"] @@ -3114,10 +3552,14 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.23.1" +version = "20.24.4" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.24.4-py3-none-any.whl", hash = "sha256:29c70bb9b88510f6414ac3e55c8b413a1f96239b6b789ca123437d5e892190cb"}, + {file = "virtualenv-20.24.4.tar.gz", hash = "sha256:772b05bfda7ed3b8ecd16021ca9716273ad9f4467c801f27e83ac73430246dca"}, +] [package.dependencies] distlib = ">=0.3.7,<1" @@ -3125,8 +3567,8 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<4" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx-argparse (>=0.4)", "sphinx (>=7.0.1)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage-enable-subprocess (>=1)", "coverage (>=7.2.7)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest-env (>=0.8.1)", "pytest-freezer (>=0.4.6)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "pytest (>=7.3.1)", "setuptools (>=67.8)", "time-machine (>=2.9)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] name = "websocket-client" @@ -3165,7 +3607,94 @@ files = [ ] [package.extras] -dev = ["pytest (>=4.6.2)", "black (>=19.3b0)"] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + +[[package]] +name = "yarl" +version = "1.9.2" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" [[package]] name = "zict" @@ -3199,4 +3728,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "739ad0b7a777f11202f571fb51865fcc9425e54ff209b9f6dcd53f66a6dc618b" +content-hash = "9f20fce15e8fb35f26391eb45434566e64da81ac1b3229376228fe8e74dc10f8" From 87b4f7ec2eab9b5b225c860f29bf704e4bf790f5 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Wed, 30 Aug 2023 18:01:57 -0300 Subject: [PATCH 209/265] Por algum motivo, faltou Polars --- poetry.lock | 34 +++++++++++++++++++++++++++++++++- pyproject.toml | 1 + 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 5171ac94f..ce2b2d456 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2350,6 +2350,38 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "polars" +version = "0.19.0" +description = "Blazingly fast DataFrame library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "polars-0.19.0-cp38-abi3-macosx_10_7_x86_64.whl", hash = "sha256:1c86783df27926580f215472a2760fc8a6c39554a4156a33ac789f54eedcde0a"}, + {file = "polars-0.19.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d67cb0f5f9a0a6d62b3a0bb3d48e6a49680bbcf0f144ebcaf4a9ffbabb7c8f06"}, + {file = "polars-0.19.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:652b7f911784b4f9c3f9115873e94610268f1e89297477f35898222ff2ccad45"}, + {file = "polars-0.19.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bfebcd0fde831b749e8dc2dcb08913b7b1c0272f10af4e279933203c0635dbb"}, + {file = "polars-0.19.0-cp38-abi3-win_amd64.whl", hash = "sha256:1c194fe6722b5be1721b86f20ba5593ba31f8f04e7ba8e0219235e71e17eda3f"}, + {file = "polars-0.19.0.tar.gz", hash = "sha256:72c0306d2d39d7e24d4530d3977f5853c76efd48a341375ce1f37c62610cfc6a"}, +] + +[package.extras] +adbc = ["adbc_driver_sqlite"] +all = ["polars[adbc,cloudpickle,connectorx,deltalake,fsspec,matplotlib,numpy,pandas,pyarrow,pydantic,sqlalchemy,timezone,xlsx2csv,xlsxwriter]"] +cloudpickle = ["cloudpickle"] +connectorx = ["connectorx"] +deltalake = ["deltalake (>=0.10.0)"] +fsspec = ["fsspec"] +matplotlib = ["matplotlib"] +numpy = ["numpy (>=1.16.0)"] +pandas = ["pandas", "pyarrow (>=7.0.0)"] +pyarrow = ["pyarrow (>=7.0.0)"] +pydantic = ["pydantic"] +sqlalchemy = ["pandas", "sqlalchemy"] +timezone = ["backports.zoneinfo", "tzdata"] +xlsx2csv = ["xlsx2csv (>=0.8.0)"] +xlsxwriter = ["xlsxwriter"] + [[package]] name = "pre-commit" version = "2.21.0" @@ -3728,4 +3760,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "9f20fce15e8fb35f26391eb45434566e64da81ac1b3229376228fe8e74dc10f8" +content-hash = "aedce939153d3e095531054eb14dd03347cda7b26a03737dd3ef55944c2cc5f5" diff --git a/pyproject.toml b/pyproject.toml index db1db5d85..840f268f2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -102,6 +102,7 @@ urllib3 = "1.26.7" websocket-client = "1.2.1" wget = "^3.2" zict = "2.0.0" +polars = "^0.19.0" [tool.poetry.dev-dependencies] pytest_cov = "^3.0.0" From 5ae929f6374b41bca9a7c4103f307472bf3e2cbb Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 30 Aug 2023 21:16:01 +0000 Subject: [PATCH 210/265] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pipelines/datasets/br_denatran_frota/handlers.py | 4 +++- pipelines/datasets/br_denatran_frota/tasks.py | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 21c0f8ef5..850dd7254 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -127,7 +127,9 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: def output_file_to_csv(df: pl.DataFrame, filename: str) -> None: make_dir_when_not_exists(OUTPUT_PATH) pd_df = df.to_pandas() - to_partitions(pd_df, partition_columns=["ano", "mes", "sigla_uf"], savepath=OUTPUT_PATH) + to_partitions( + pd_df, partition_columns=["ano", "mes", "sigla_uf"], savepath=OUTPUT_PATH + ) return OUTPUT_PATH diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 1f27c5bae..4c348fc17 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -53,4 +53,3 @@ def treat_municipio_tipo_task(file: str) -> pl.DataFrame: @task() def get_latest_data_task(table_name: str) -> tuple[int, int]: return get_latest_data(table_name) - From 90b1cde744aa1b03c3e8156a86edf51d9fb6ec05 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Wed, 30 Aug 2023 18:25:10 -0300 Subject: [PATCH 211/265] Flake8 --- pipelines/datasets/br_denatran_frota/handlers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 850dd7254..3567b743c 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -152,7 +152,7 @@ def get_latest_data(table_name: str): denatran_data: pd.DataFrame = get_data_from_prod( table_id=table_name, dataset_id="br_denatran_frota" ) - except: + except Exception as e: return 2003, 1 if not denatran_data.empty: year = denatran_data["ano"].max() From ab07da7ee31f7805fa1076982c521a901ba95c20 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Wed, 30 Aug 2023 18:25:57 -0300 Subject: [PATCH 212/265] Adiciona pacotes faltantes da master --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 840f268f2..6d76655cd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -103,6 +103,9 @@ websocket-client = "1.2.1" wget = "^3.2" zict = "2.0.0" polars = "^0.19.0" +selenium = "^4.11.2" +fastparquet = "^2023.7.0" + [tool.poetry.dev-dependencies] pytest_cov = "^3.0.0" From 0f39d8bcecd05e51a4f9c2e8b49eb9e18cd05bbf Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Wed, 30 Aug 2023 18:27:50 -0300 Subject: [PATCH 213/265] Flake8 dnv --- pipelines/datasets/br_denatran_frota/handlers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 3567b743c..164725797 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -152,7 +152,7 @@ def get_latest_data(table_name: str): denatran_data: pd.DataFrame = get_data_from_prod( table_id=table_name, dataset_id="br_denatran_frota" ) - except Exception as e: + except Exception: return 2003, 1 if not denatran_data.empty: year = denatran_data["ano"].max() From 61cd61b2e01f3317f77b1048836af45cee57d6d4 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Wed, 30 Aug 2023 18:30:00 -0300 Subject: [PATCH 214/265] tirei lixo do gitignore --- .gitignore | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.gitignore b/.gitignore index 12b7b689b..cb0166608 100644 --- a/.gitignore +++ b/.gitignore @@ -141,10 +141,6 @@ dmypy.json notebooks/ /tests/ -poetry.lock -pipelines/datasets/br_denatran_frota/todo_list.txt -pipelines/datasets/br_denatran_frota/run_local.py -basedosdados-dev-ff644018223b.json From 809a41b334ff4c6bac7e4b44af6a7020636f690f Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Wed, 30 Aug 2023 18:36:52 -0300 Subject: [PATCH 215/265] Adiciona pacote faltante --- poetry.lock | 149 ++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + 2 files changed, 149 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 6e5445abf..da38c9731 100644 --- a/poetry.lock +++ b/poetry.lock @@ -11,6 +11,24 @@ files = [ {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + [[package]] name = "backoff" version = "2.2.1" @@ -1305,6 +1323,17 @@ googleapis-common-protos = ">=1.5.5" grpcio = ">=1.56.2" protobuf = ">=4.21.6" +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + [[package]] name = "heapdict" version = "1.0.1" @@ -2196,6 +2225,20 @@ files = [ [package.dependencies] et-xmlfile = "*" +[[package]] +name = "outcome" +version = "1.2.0" +description = "Capture the outcome of Python function calls." +optional = false +python-versions = ">=3.7" +files = [ + {file = "outcome-1.2.0-py2.py3-none-any.whl", hash = "sha256:c4ab89a56575d6d38a05aa16daeaa333109c1f96167aba8901ab18b6b5e0f7f5"}, + {file = "outcome-1.2.0.tar.gz", hash = "sha256:6f82bd3de45da303cf1f771ecafa1633750a358436a8bb60e06a1ceb745d2672"}, +] + +[package.dependencies] +attrs = ">=19.2.0" + [[package]] name = "packaging" version = "21.3" @@ -2866,6 +2909,18 @@ files = [ [package.extras] diagrams = ["jinja2", "railroad-diagrams"] +[[package]] +name = "pysocks" +version = "1.7.1" +description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"}, + {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"}, + {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"}, +] + [[package]] name = "pytest" version = "7.4.0" @@ -3166,6 +3221,17 @@ files = [ [package.extras] full = ["numpy"] +[[package]] +name = "rarfile" +version = "4.0" +description = "RAR archive reader for Python" +optional = false +python-versions = "*" +files = [ + {file = "rarfile-4.0-py3-none-any.whl", hash = "sha256:1094869119012f95c31a6f22cc3a9edbdca61861b805241116adbe2d737b68f8"}, + {file = "rarfile-4.0.tar.gz", hash = "sha256:67548769229c5bda0827c1663dce3f54644f9dbfba4ae86d4da2b2afd3e602a1"}, +] + [[package]] name = "redis" version = "4.6.0" @@ -3407,6 +3473,23 @@ numpy = ">=1.15" pandas = ">=0.23" scipy = ">=1.0" +[[package]] +name = "selenium" +version = "4.11.2" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "selenium-4.11.2-py3-none-any.whl", hash = "sha256:98e72117b194b3fa9c69b48998f44bf7dd4152c7bd98544911a1753b9f03cc7d"}, + {file = "selenium-4.11.2.tar.gz", hash = "sha256:9f9a5ed586280a3594f7461eb1d9dab3eac9d91e28572f365e9b98d9d03e02b5"}, +] + +[package.dependencies] +certifi = ">=2021.10.8" +trio = ">=0.17,<1.0" +trio-websocket = ">=0.9,<1.0" +urllib3 = {version = ">=1.26,<3", extras = ["socks"]} + [[package]] name = "setuptools" version = "68.1.2" @@ -3434,6 +3517,17 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + [[package]] name = "sortedcontainers" version = "2.4.0" @@ -3606,6 +3700,42 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] +[[package]] +name = "trio" +version = "0.22.2" +description = "A friendly Python library for async concurrency and I/O" +optional = false +python-versions = ">=3.7" +files = [ + {file = "trio-0.22.2-py3-none-any.whl", hash = "sha256:f43da357620e5872b3d940a2e3589aa251fd3f881b65a608d742e00809b1ec38"}, + {file = "trio-0.22.2.tar.gz", hash = "sha256:3887cf18c8bcc894433420305468388dac76932e9668afa1c49aa3806b6accb3"}, +] + +[package.dependencies] +attrs = ">=20.1.0" +cffi = {version = ">=1.14", markers = "os_name == \"nt\" and implementation_name != \"pypy\""} +exceptiongroup = {version = ">=1.0.0rc9", markers = "python_version < \"3.11\""} +idna = "*" +outcome = "*" +sniffio = "*" +sortedcontainers = "*" + +[[package]] +name = "trio-websocket" +version = "0.10.3" +description = "WebSocket library for Trio" +optional = false +python-versions = ">=3.7" +files = [ + {file = "trio-websocket-0.10.3.tar.gz", hash = "sha256:1a748604ad906a7dcab9a43c6eb5681e37de4793ba0847ef0bc9486933ed027b"}, + {file = "trio_websocket-0.10.3-py3-none-any.whl", hash = "sha256:a9937d48e8132ebf833019efde2a52ca82d223a30a7ea3e8d60a7d28f75a4e3a"}, +] + +[package.dependencies] +exceptiongroup = "*" +trio = ">=0.11" +wsproto = ">=0.14" + [[package]] name = "tweepy" version = "4.4.0" @@ -3700,6 +3830,9 @@ files = [ {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, ] +[package.dependencies] +PySocks = {version = ">=1.5.6,<1.5.7 || >1.5.7,<2.0", optional = true, markers = "extra == \"socks\""} + [package.extras] brotli = ["brotlipy (>=0.6.0)"] secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"] @@ -3764,6 +3897,20 @@ files = [ [package.extras] dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] +[[package]] +name = "wsproto" +version = "1.2.0" +description = "WebSockets state-machine based protocol implementation" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736"}, + {file = "wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"}, +] + +[package.dependencies] +h11 = ">=0.9.0,<1" + [[package]] name = "yarl" version = "1.9.2" @@ -3883,4 +4030,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "e74524a804c1511e29e1e54e2aa9a7ac981a3867ab29038f4629f906ccd0b98f" +content-hash = "08c3f1c0e73eb0dd90edbc76debb3ff18859414dfb5596b3dd032b7bb2cf07a4" diff --git a/pyproject.toml b/pyproject.toml index 6d76655cd..c201dfeff 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -105,6 +105,7 @@ zict = "2.0.0" polars = "^0.19.0" selenium = "^4.11.2" fastparquet = "^2023.7.0" +rarfile = "^4.0" [tool.poetry.dev-dependencies] From 3381dd1c582cdcca3247df11318e7689c77778a9 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Wed, 30 Aug 2023 18:45:50 -0300 Subject: [PATCH 216/265] Mais pacotes faltantes --- poetry.lock | 13 ++++++++++++- pyproject.toml | 2 ++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index da38c9731..3d2f93174 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3025,6 +3025,17 @@ text-unidecode = ">=1.3" [package.extras] unidecode = ["Unidecode (>=1.1.1)"] +[[package]] +name = "python-string-utils" +version = "1.0.0" +description = "Utility functions for strings validation and manipulation." +optional = false +python-versions = ">=3.5" +files = [ + {file = "python-string-utils-1.0.0.tar.gz", hash = "sha256:dcf9060b03f07647c0a603408dc8b03f807f3b54a05c6e19eb14460256fac0cb"}, + {file = "python_string_utils-1.0.0-py3-none-any.whl", hash = "sha256:f1a88700baf99db1a9b6953f44181ad9ca56623c81e257e6009707e2e7851fa4"}, +] + [[package]] name = "pytz" version = "2021.3" @@ -4030,4 +4041,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "08c3f1c0e73eb0dd90edbc76debb3ff18859414dfb5596b3dd032b7bb2cf07a4" +content-hash = "4725811605c391e09291644e87d927467b0404c841ebda99c80ae7479dc5e708" diff --git a/pyproject.toml b/pyproject.toml index c201dfeff..e3f4fe3e0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -106,6 +106,8 @@ polars = "^0.19.0" selenium = "^4.11.2" fastparquet = "^2023.7.0" rarfile = "^4.0" +setuptools = "^68.1.2" +python-string-utils = "^1.0.0" [tool.poetry.dev-dependencies] From 99c494761edd79d493afbf9ca994e97022e8739c Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Wed, 30 Aug 2023 18:48:49 -0300 Subject: [PATCH 217/265] faltou --- pytest.ini | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 pytest.ini diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 000000000..46ad85d66 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,9 @@ +[pytest] +testpaths = + tests +norecursedirs=dist build .tox scripts +addopts = + --doctest-modules + --cov=pipelines + -r a + -v \ No newline at end of file From bcf4acd6c85edad20c7310c6f44bf0fa4b21de40 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Wed, 30 Aug 2023 19:00:47 -0300 Subject: [PATCH 218/265] Isso agora funciona --- pipelines/datasets/br_denatran_frota/handlers.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 164725797..318c059ab 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -148,11 +148,10 @@ def get_desired_file(year: int, download_directory: str, filetype: str) -> str: def get_latest_data(table_name: str): - try: - denatran_data: pd.DataFrame = get_data_from_prod( - table_id=table_name, dataset_id="br_denatran_frota" - ) - except Exception: + denatran_data: pd.DataFrame = get_data_from_prod( + table_id=table_name, dataset_id="br_denatran_frota" + ) + if not denatran_data: return 2003, 1 if not denatran_data.empty: year = denatran_data["ano"].max() From 7906b0f5f61271d3fe56e73105b637bd274f5627 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Wed, 30 Aug 2023 19:10:01 -0300 Subject: [PATCH 219/265] xlrd --- poetry.lock | 18 +++++++++++++++++- pyproject.toml | 1 + 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 3d2f93174..f12d56df9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3922,6 +3922,22 @@ files = [ [package.dependencies] h11 = ">=0.9.0,<1" +[[package]] +name = "xlrd" +version = "2.0.1" +description = "Library for developers to extract data from Microsoft Excel (tm) .xls spreadsheet files" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "xlrd-2.0.1-py2.py3-none-any.whl", hash = "sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd"}, + {file = "xlrd-2.0.1.tar.gz", hash = "sha256:f72f148f54442c6b056bf931dbc34f986fd0c3b0b6b5a58d013c9aef274d0c88"}, +] + +[package.extras] +build = ["twine", "wheel"] +docs = ["sphinx"] +test = ["pytest", "pytest-cov"] + [[package]] name = "yarl" version = "1.9.2" @@ -4041,4 +4057,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "4725811605c391e09291644e87d927467b0404c841ebda99c80ae7479dc5e708" +content-hash = "be55ea7e2f7f43848079b0bb8afc6c49cb77e9ce3caa4dba1f45abc661fdf696" diff --git a/pyproject.toml b/pyproject.toml index e3f4fe3e0..09fefef0c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -108,6 +108,7 @@ fastparquet = "^2023.7.0" rarfile = "^4.0" setuptools = "^68.1.2" python-string-utils = "^1.0.0" +xlrd = "^2.0.1" [tool.poetry.dev-dependencies] From 62187a03b0f270d31597b8b63e1ad81d13cb9aac Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Sat, 2 Sep 2023 00:22:10 -0300 Subject: [PATCH 220/265] Isso aqui era o erro --- pipelines/datasets/br_denatran_frota/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 5ed81e289..d6565b79c 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -160,7 +160,7 @@ def calculate_total(df): calculated_total = calculate_total(df) mask = df["TOTAL"] != calculated_total - if pl.sum(mask) != 0: + if sum(mask) != 0: # In some cases, the quadriciclo data is multiplied by 10, and this will correct it before you new_df = clean_quadriciclo_data(df) new_calculated_total = calculate_total(new_df) From 803ea5e749a9f1afaab8ef619bcc6778aced3c7e Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Sat, 2 Sep 2023 22:14:12 -0300 Subject: [PATCH 221/265] agr vai --- pipelines/datasets/br_denatran_frota/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index d6565b79c..e8e591394 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -526,7 +526,7 @@ def treat_uf(denatran_df: pl.DataFrame, ibge_df: pl.DataFrame, uf: str) -> None: suggested_name_ibge.alias("suggested_nome_ibge") ) denatran_uf = denatran_uf.with_columns( - denatran_uf.apply(fix_suggested_nome_ibge)["apply"].alias("suggested_nome_ibge") + denatran_uf.apply(fix_suggested_nome_ibge)["map"].alias("suggested_nome_ibge") ) municipios_no_denatran = denatran_uf["suggested_nome_ibge"].to_list() d = set(municipios_no_denatran) - set(municipios_na_bd) From 6d255bc81b02a8dfe0b9c379f6b10044d9ecb20b Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Sun, 3 Sep 2023 19:08:27 -0300 Subject: [PATCH 222/265] Resolve problema 2 --- pipelines/datasets/br_denatran_frota/handlers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 318c059ab..33dace631 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -151,7 +151,7 @@ def get_latest_data(table_name: str): denatran_data: pd.DataFrame = get_data_from_prod( table_id=table_name, dataset_id="br_denatran_frota" ) - if not denatran_data: + if not isinstance(denatran_data, pd.DataFrame): return 2003, 1 if not denatran_data.empty: year = denatran_data["ano"].max() From d5dc7c9c54d46731ec99ebfa104b8aebfaa64d97 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Sat, 16 Sep 2023 05:43:34 -0300 Subject: [PATCH 223/265] kkkkkkkkkkkkkkkkk --- pipelines/datasets/br_denatran_frota/handlers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 33dace631..8c1b55655 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -161,7 +161,7 @@ def get_latest_data(table_name: str): if month == 12: year += 1 month = 1 - log(f"Ano: {year}, mês: {month+1}") + log(f"Ano: {str(year)}, mês: {str(month+1)}") return year, month + 1 else: log("Não achei ano não mané") From d3e2e50a38db0f18a14288c4f9c4b469d6659e6a Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Sat, 16 Sep 2023 05:52:21 -0300 Subject: [PATCH 224/265] schedule fix --- pipelines/datasets/br_denatran_frota/schedules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/schedules.py b/pipelines/datasets/br_denatran_frota/schedules.py index 792760590..7f39a37ac 100644 --- a/pipelines/datasets/br_denatran_frota/schedules.py +++ b/pipelines/datasets/br_denatran_frota/schedules.py @@ -15,7 +15,7 @@ interval=timedelta(weeks=2), start_date=datetime(2021, 1, 1), labels=[ - constants.DATASETS_AGENT_LABEL.value, + constants.BASEDOSDADOS_PROD_AGENT_LABEL.value, ], ), ] From 6323142e44e3fa39115cb4a58b339e37677d5a74 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Sat, 16 Sep 2023 05:59:28 -0300 Subject: [PATCH 225/265] TODO MERGE ISSO --- pyproject.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6d76655cd..87f6968c8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -105,7 +105,10 @@ zict = "2.0.0" polars = "^0.19.0" selenium = "^4.11.2" fastparquet = "^2023.7.0" - +rarfile = "^4.0" +setuptools = "^68.1.2" +python-string-utils = "^1.0.0" +xlrd = "^2.0.1" [tool.poetry.dev-dependencies] pytest_cov = "^3.0.0" From db0dbea1fa382ea62f6953ac987c80e0c111cd0b Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Sat, 16 Sep 2023 06:06:38 -0300 Subject: [PATCH 226/265] . --- pyproject.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 87f6968c8..7df98c036 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -109,6 +109,8 @@ rarfile = "^4.0" setuptools = "^68.1.2" python-string-utils = "^1.0.0" xlrd = "^2.0.1" +geopandas = "0.13.2" +shapely = "2.0.1" [tool.poetry.dev-dependencies] pytest_cov = "^3.0.0" From 7e97dc53f3cac143c65646991cc4f5f88282eaff Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Sat, 16 Sep 2023 06:22:20 -0300 Subject: [PATCH 227/265] Pronto --- pipelines/datasets/br_denatran_frota/handlers.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 8c1b55655..412c7bebf 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -161,8 +161,9 @@ def get_latest_data(table_name: str): if month == 12: year += 1 month = 1 - log(f"Ano: {str(year)}, mês: {str(month+1)}") - return year, month + 1 + else: + month += 1 + return year, month else: log("Não achei ano não mané") return 2003, 1 From ddaee64e30054dfbe0f3e64c65f20fcdc8f12a54 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Sat, 16 Sep 2023 06:34:26 -0300 Subject: [PATCH 228/265] Isso era pra ser tao simples --- pipelines/datasets/br_denatran_frota/handlers.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 412c7bebf..5f8e4d534 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -154,8 +154,8 @@ def get_latest_data(table_name: str): if not isinstance(denatran_data, pd.DataFrame): return 2003, 1 if not denatran_data.empty: - year = denatran_data["ano"].max() - month = denatran_data.loc[denatran_data["ano"] == year]["mes"].max() + year = int(denatran_data["ano"].max()) + month = int(denatran_data.loc[denatran_data["ano"] == year]["mes"].max()) log(year) log(month) if month == 12: @@ -163,6 +163,7 @@ def get_latest_data(table_name: str): month = 1 else: month += 1 + log(f"Ano: {year}, mês: {month}") return year, month else: log("Não achei ano não mané") From 42f0e52216d66a152302e9d97e5ef5a005f94f94 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Sat, 16 Sep 2023 06:44:59 -0300 Subject: [PATCH 229/265] Cara. --- pipelines/datasets/br_denatran_frota/handlers.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 5f8e4d534..64392fc45 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -154,10 +154,12 @@ def get_latest_data(table_name: str): if not isinstance(denatran_data, pd.DataFrame): return 2003, 1 if not denatran_data.empty: - year = int(denatran_data["ano"].max()) - month = int(denatran_data.loc[denatran_data["ano"] == year]["mes"].max()) + year = denatran_data["ano"].max() + month = denatran_data.loc[denatran_data["ano"] == year]["mes"].max() log(year) + log(type(year)) log(month) + log(type(month)) if month == 12: year += 1 month = 1 From 4d33dd2c8fbc550e5915cc0c3626c00c628e666d Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Sat, 16 Sep 2023 06:52:52 -0300 Subject: [PATCH 230/265] Cara --- .../datasets/br_denatran_frota/handlers.py | 1 + pipelines/datasets/br_denatran_frota/run.py | 4 +- poetry.lock | 942 +++++++++++------- 3 files changed, 602 insertions(+), 345 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 64392fc45..c5948dc72 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -154,6 +154,7 @@ def get_latest_data(table_name: str): if not isinstance(denatran_data, pd.DataFrame): return 2003, 1 if not denatran_data.empty: + log(denatran_data.head(2)) year = denatran_data["ano"].max() month = denatran_data.loc[denatran_data["ano"] == year]["mes"].max() log(year) diff --git a/pipelines/datasets/br_denatran_frota/run.py b/pipelines/datasets/br_denatran_frota/run.py index a0ead7920..47e6b3ca5 100644 --- a/pipelines/datasets/br_denatran_frota/run.py +++ b/pipelines/datasets/br_denatran_frota/run.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- -from flows import br_denatran_frota_uf_tipo +from flows import br_denatran_frota_municipio_tipo -br_denatran_frota_uf_tipo.run() +br_denatran_frota_municipio_tipo.run() diff --git a/poetry.lock b/poetry.lock index f12d56df9..946b5d48f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -267,6 +267,40 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} +[[package]] +name = "click-plugins" +version = "1.1.1" +description = "An extension module for click to enable registering CLI commands via setuptools entry-points." +optional = false +python-versions = "*" +files = [ + {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"}, + {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"}, +] + +[package.dependencies] +click = ">=4.0" + +[package.extras] +dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"] + +[[package]] +name = "cligj" +version = "0.7.2" +description = "Click params for commmand line interfaces to GeoJSON" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4" +files = [ + {file = "cligj-0.7.2-py3-none-any.whl", hash = "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df"}, + {file = "cligj-0.7.2.tar.gz", hash = "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27"}, +] + +[package.dependencies] +click = ">=4.0" + +[package.extras] +test = ["pytest-cov"] + [[package]] name = "cloudpickle" version = "2.0.0" @@ -349,63 +383,63 @@ test-no-images = ["pytest", "pytest-cov", "wurlitzer"] [[package]] name = "coverage" -version = "7.3.0" +version = "7.3.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db76a1bcb51f02b2007adacbed4c88b6dee75342c37b05d1822815eed19edee5"}, - {file = "coverage-7.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c02cfa6c36144ab334d556989406837336c1d05215a9bdf44c0bc1d1ac1cb637"}, - {file = "coverage-7.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477c9430ad5d1b80b07f3c12f7120eef40bfbf849e9e7859e53b9c93b922d2af"}, - {file = "coverage-7.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce2ee86ca75f9f96072295c5ebb4ef2a43cecf2870b0ca5e7a1cbdd929cf67e1"}, - {file = "coverage-7.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68d8a0426b49c053013e631c0cdc09b952d857efa8f68121746b339912d27a12"}, - {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b3eb0c93e2ea6445b2173da48cb548364f8f65bf68f3d090404080d338e3a689"}, - {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:90b6e2f0f66750c5a1178ffa9370dec6c508a8ca5265c42fbad3ccac210a7977"}, - {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:96d7d761aea65b291a98c84e1250cd57b5b51726821a6f2f8df65db89363be51"}, - {file = "coverage-7.3.0-cp310-cp310-win32.whl", hash = "sha256:63c5b8ecbc3b3d5eb3a9d873dec60afc0cd5ff9d9f1c75981d8c31cfe4df8527"}, - {file = "coverage-7.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:97c44f4ee13bce914272589b6b41165bbb650e48fdb7bd5493a38bde8de730a1"}, - {file = "coverage-7.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74c160285f2dfe0acf0f72d425f3e970b21b6de04157fc65adc9fd07ee44177f"}, - {file = "coverage-7.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b543302a3707245d454fc49b8ecd2c2d5982b50eb63f3535244fd79a4be0c99d"}, - {file = "coverage-7.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad0f87826c4ebd3ef484502e79b39614e9c03a5d1510cfb623f4a4a051edc6fd"}, - {file = "coverage-7.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13c6cbbd5f31211d8fdb477f0f7b03438591bdd077054076eec362cf2207b4a7"}, - {file = "coverage-7.3.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fac440c43e9b479d1241fe9d768645e7ccec3fb65dc3a5f6e90675e75c3f3e3a"}, - {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3c9834d5e3df9d2aba0275c9f67989c590e05732439b3318fa37a725dff51e74"}, - {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4c8e31cf29b60859876474034a83f59a14381af50cbe8a9dbaadbf70adc4b214"}, - {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7a9baf8e230f9621f8e1d00c580394a0aa328fdac0df2b3f8384387c44083c0f"}, - {file = "coverage-7.3.0-cp311-cp311-win32.whl", hash = "sha256:ccc51713b5581e12f93ccb9c5e39e8b5d4b16776d584c0f5e9e4e63381356482"}, - {file = "coverage-7.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:887665f00ea4e488501ba755a0e3c2cfd6278e846ada3185f42d391ef95e7e70"}, - {file = "coverage-7.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d000a739f9feed900381605a12a61f7aaced6beae832719ae0d15058a1e81c1b"}, - {file = "coverage-7.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59777652e245bb1e300e620ce2bef0d341945842e4eb888c23a7f1d9e143c446"}, - {file = "coverage-7.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9737bc49a9255d78da085fa04f628a310c2332b187cd49b958b0e494c125071"}, - {file = "coverage-7.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5247bab12f84a1d608213b96b8af0cbb30d090d705b6663ad794c2f2a5e5b9fe"}, - {file = "coverage-7.3.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2ac9a1de294773b9fa77447ab7e529cf4fe3910f6a0832816e5f3d538cfea9a"}, - {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:85b7335c22455ec12444cec0d600533a238d6439d8d709d545158c1208483873"}, - {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:36ce5d43a072a036f287029a55b5c6a0e9bd73db58961a273b6dc11a2c6eb9c2"}, - {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:211a4576e984f96d9fce61766ffaed0115d5dab1419e4f63d6992b480c2bd60b"}, - {file = "coverage-7.3.0-cp312-cp312-win32.whl", hash = "sha256:56afbf41fa4a7b27f6635bc4289050ac3ab7951b8a821bca46f5b024500e6321"}, - {file = "coverage-7.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f297e0c1ae55300ff688568b04ff26b01c13dfbf4c9d2b7d0cb688ac60df479"}, - {file = "coverage-7.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac0dec90e7de0087d3d95fa0533e1d2d722dcc008bc7b60e1143402a04c117c1"}, - {file = "coverage-7.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:438856d3f8f1e27f8e79b5410ae56650732a0dcfa94e756df88c7e2d24851fcd"}, - {file = "coverage-7.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1084393c6bda8875c05e04fce5cfe1301a425f758eb012f010eab586f1f3905e"}, - {file = "coverage-7.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49ab200acf891e3dde19e5aa4b0f35d12d8b4bd805dc0be8792270c71bd56c54"}, - {file = "coverage-7.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67e6bbe756ed458646e1ef2b0778591ed4d1fcd4b146fc3ba2feb1a7afd4254"}, - {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f39c49faf5344af36042b293ce05c0d9004270d811c7080610b3e713251c9b0"}, - {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7df91fb24c2edaabec4e0eee512ff3bc6ec20eb8dccac2e77001c1fe516c0c84"}, - {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:34f9f0763d5fa3035a315b69b428fe9c34d4fc2f615262d6be3d3bf3882fb985"}, - {file = "coverage-7.3.0-cp38-cp38-win32.whl", hash = "sha256:bac329371d4c0d456e8d5f38a9b0816b446581b5f278474e416ea0c68c47dcd9"}, - {file = "coverage-7.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:b859128a093f135b556b4765658d5d2e758e1fae3e7cc2f8c10f26fe7005e543"}, - {file = "coverage-7.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed8d310afe013db1eedd37176d0839dc66c96bcfcce8f6607a73ffea2d6ba"}, - {file = "coverage-7.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61260ec93f99f2c2d93d264b564ba912bec502f679793c56f678ba5251f0393"}, - {file = "coverage-7.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97af9554a799bd7c58c0179cc8dbf14aa7ab50e1fd5fa73f90b9b7215874ba28"}, - {file = "coverage-7.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3558e5b574d62f9c46b76120a5c7c16c4612dc2644c3d48a9f4064a705eaee95"}, - {file = "coverage-7.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37d5576d35fcb765fca05654f66aa71e2808d4237d026e64ac8b397ffa66a56a"}, - {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:07ea61bcb179f8f05ffd804d2732b09d23a1238642bf7e51dad62082b5019b34"}, - {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:80501d1b2270d7e8daf1b64b895745c3e234289e00d5f0e30923e706f110334e"}, - {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4eddd3153d02204f22aef0825409091a91bf2a20bce06fe0f638f5c19a85de54"}, - {file = "coverage-7.3.0-cp39-cp39-win32.whl", hash = "sha256:2d22172f938455c156e9af2612650f26cceea47dc86ca048fa4e0b2d21646ad3"}, - {file = "coverage-7.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:60f64e2007c9144375dd0f480a54d6070f00bb1a28f65c408370544091c9bc9e"}, - {file = "coverage-7.3.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:5492a6ce3bdb15c6ad66cb68a0244854d9917478877a25671d70378bdc8562d0"}, - {file = "coverage-7.3.0.tar.gz", hash = "sha256:49dbb19cdcafc130f597d9e04a29d0a032ceedf729e41b181f51cd170e6ee865"}, + {file = "coverage-7.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cd0f7429ecfd1ff597389907045ff209c8fdb5b013d38cfa7c60728cb484b6e3"}, + {file = "coverage-7.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:966f10df9b2b2115da87f50f6a248e313c72a668248be1b9060ce935c871f276"}, + {file = "coverage-7.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0575c37e207bb9b98b6cf72fdaaa18ac909fb3d153083400c2d48e2e6d28bd8e"}, + {file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:245c5a99254e83875c7fed8b8b2536f040997a9b76ac4c1da5bff398c06e860f"}, + {file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c96dd7798d83b960afc6c1feb9e5af537fc4908852ef025600374ff1a017392"}, + {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:de30c1aa80f30af0f6b2058a91505ea6e36d6535d437520067f525f7df123887"}, + {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:50dd1e2dd13dbbd856ffef69196781edff26c800a74f070d3b3e3389cab2600d"}, + {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9c0c19f70d30219113b18fe07e372b244fb2a773d4afde29d5a2f7930765136"}, + {file = "coverage-7.3.1-cp310-cp310-win32.whl", hash = "sha256:770f143980cc16eb601ccfd571846e89a5fe4c03b4193f2e485268f224ab602f"}, + {file = "coverage-7.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdd088c00c39a27cfa5329349cc763a48761fdc785879220d54eb785c8a38520"}, + {file = "coverage-7.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74bb470399dc1989b535cb41f5ca7ab2af561e40def22d7e188e0a445e7639e3"}, + {file = "coverage-7.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:025ded371f1ca280c035d91b43252adbb04d2aea4c7105252d3cbc227f03b375"}, + {file = "coverage-7.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6191b3a6ad3e09b6cfd75b45c6aeeffe7e3b0ad46b268345d159b8df8d835f9"}, + {file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7eb0b188f30e41ddd659a529e385470aa6782f3b412f860ce22b2491c89b8593"}, + {file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c8f0df9dfd8ff745bccff75867d63ef336e57cc22b2908ee725cc552689ec8"}, + {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7eb3cd48d54b9bd0e73026dedce44773214064be93611deab0b6a43158c3d5a0"}, + {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ac3c5b7e75acac31e490b7851595212ed951889918d398b7afa12736c85e13ce"}, + {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b4ee7080878077af0afa7238df1b967f00dc10763f6e1b66f5cced4abebb0a3"}, + {file = "coverage-7.3.1-cp311-cp311-win32.whl", hash = "sha256:229c0dd2ccf956bf5aeede7e3131ca48b65beacde2029f0361b54bf93d36f45a"}, + {file = "coverage-7.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c6f55d38818ca9596dc9019eae19a47410d5322408140d9a0076001a3dcb938c"}, + {file = "coverage-7.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5289490dd1c3bb86de4730a92261ae66ea8d44b79ed3cc26464f4c2cde581fbc"}, + {file = "coverage-7.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca833941ec701fda15414be400c3259479bfde7ae6d806b69e63b3dc423b1832"}, + {file = "coverage-7.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd694e19c031733e446c8024dedd12a00cda87e1c10bd7b8539a87963685e969"}, + {file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aab8e9464c00da5cb9c536150b7fbcd8850d376d1151741dd0d16dfe1ba4fd26"}, + {file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87d38444efffd5b056fcc026c1e8d862191881143c3aa80bb11fcf9dca9ae204"}, + {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8a07b692129b8a14ad7a37941a3029c291254feb7a4237f245cfae2de78de037"}, + {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2829c65c8faaf55b868ed7af3c7477b76b1c6ebeee99a28f59a2cb5907a45760"}, + {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1f111a7d85658ea52ffad7084088277135ec5f368457275fc57f11cebb15607f"}, + {file = "coverage-7.3.1-cp312-cp312-win32.whl", hash = "sha256:c397c70cd20f6df7d2a52283857af622d5f23300c4ca8e5bd8c7a543825baa5a"}, + {file = "coverage-7.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:5ae4c6da8b3d123500f9525b50bf0168023313963e0e2e814badf9000dd6ef92"}, + {file = "coverage-7.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca70466ca3a17460e8fc9cea7123c8cbef5ada4be3140a1ef8f7b63f2f37108f"}, + {file = "coverage-7.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f2781fd3cabc28278dc982a352f50c81c09a1a500cc2086dc4249853ea96b981"}, + {file = "coverage-7.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6407424621f40205bbe6325686417e5e552f6b2dba3535dd1f90afc88a61d465"}, + {file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04312b036580ec505f2b77cbbdfb15137d5efdfade09156961f5277149f5e344"}, + {file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9ad38204887349853d7c313f53a7b1c210ce138c73859e925bc4e5d8fc18e7"}, + {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:53669b79f3d599da95a0afbef039ac0fadbb236532feb042c534fbb81b1a4e40"}, + {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:614f1f98b84eb256e4f35e726bfe5ca82349f8dfa576faabf8a49ca09e630086"}, + {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f1a317fdf5c122ad642db8a97964733ab7c3cf6009e1a8ae8821089993f175ff"}, + {file = "coverage-7.3.1-cp38-cp38-win32.whl", hash = "sha256:defbbb51121189722420a208957e26e49809feafca6afeef325df66c39c4fdb3"}, + {file = "coverage-7.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:f4f456590eefb6e1b3c9ea6328c1e9fa0f1006e7481179d749b3376fc793478e"}, + {file = "coverage-7.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f12d8b11a54f32688b165fd1a788c408f927b0960984b899be7e4c190ae758f1"}, + {file = "coverage-7.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f09195dda68d94a53123883de75bb97b0e35f5f6f9f3aa5bf6e496da718f0cb6"}, + {file = "coverage-7.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6601a60318f9c3945be6ea0f2a80571f4299b6801716f8a6e4846892737ebe4"}, + {file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07d156269718670d00a3b06db2288b48527fc5f36859425ff7cec07c6b367745"}, + {file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:636a8ac0b044cfeccae76a36f3b18264edcc810a76a49884b96dd744613ec0b7"}, + {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5d991e13ad2ed3aced177f524e4d670f304c8233edad3210e02c465351f785a0"}, + {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:586649ada7cf139445da386ab6f8ef00e6172f11a939fc3b2b7e7c9082052fa0"}, + {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4aba512a15a3e1e4fdbfed2f5392ec221434a614cc68100ca99dcad7af29f3f8"}, + {file = "coverage-7.3.1-cp39-cp39-win32.whl", hash = "sha256:6bc6f3f4692d806831c136c5acad5ccedd0262aa44c087c46b7101c77e139140"}, + {file = "coverage-7.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:553d7094cb27db58ea91332e8b5681bac107e7242c23f7629ab1316ee73c4981"}, + {file = "coverage-7.3.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:220eb51f5fb38dfdb7e5d54284ca4d0cd70ddac047d750111a68ab1798945194"}, + {file = "coverage-7.3.1.tar.gz", hash = "sha256:6cb7fe1581deb67b782c153136541e20901aa312ceedaf1467dcb35255787952"}, ] [package.dependencies] @@ -722,44 +756,44 @@ zstandard = ["zstandard"] [[package]] name = "fastparquet" -version = "2023.7.0" +version = "2023.8.0" description = "Python support for Parquet file format" optional = false python-versions = ">=3.8" files = [ - {file = "fastparquet-2023.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:463190b44f545be05d31edabea99fb3ccf6a849500a0b7cf23ede1c2f4108520"}, - {file = "fastparquet-2023.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e88f804f4ce6ecf89f7c034beffcbcf7fc2bcc94eb0b43e941a923e9ac4fd9cd"}, - {file = "fastparquet-2023.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:079637c50fd03c0724b7858542b5d45de80105f9fa89d8475ba73bba5c03e240"}, - {file = "fastparquet-2023.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28a4758d83c4b60c5a0ce6e4cd438576f4d53e2776a6c0160d140c65054c5c90"}, - {file = "fastparquet-2023.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5aabbb55d35f11e2f72f18b0313aac839c0d42b1f16aa3cd22c17a1fab78ca9"}, - {file = "fastparquet-2023.7.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ac0d0ad6f70e170339a55e2611946e48b34519f0421abc00c667b0e564910a8a"}, - {file = "fastparquet-2023.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:969f103567a63d7108b02fd11d97a80942e01bcdb7cffc3991f84aa900ed1183"}, - {file = "fastparquet-2023.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:804fb946f1cd19686d2ea34e27cb6ba679fa76e9279694d37a676747f140492f"}, - {file = "fastparquet-2023.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:19f74093ee457b9b8ca0050f3e1d13f1fa41604d10da84869b3a93ed4983b992"}, - {file = "fastparquet-2023.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:297e75946d817755cab3dc91b7493b03932e604d7c118ec56c2e589da1d5132c"}, - {file = "fastparquet-2023.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdb44543f8884f7d839fcc5d65e17ded933b5b84d39e5fa0daa17982f833fa2"}, - {file = "fastparquet-2023.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8c9667b6a8f9835c018e481fcff9ca34661818bf02a17e13de9a86328f3780"}, - {file = "fastparquet-2023.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d24b79ba87561554abd589ad45b42199112b4f9fa56824164ffe9e3db9d0654f"}, - {file = "fastparquet-2023.7.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3d47918ca184ca39690d6903695e691aef26ed4f4d76ce7f2e4d23f409fe17ce"}, - {file = "fastparquet-2023.7.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:de0a1250e9b0044ca218c0e5c4fcacf3eb2a5b22af2021fcff895463261280e6"}, - {file = "fastparquet-2023.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:f1325922db29a065f84118ffa2976783b53e6da87680762e6dcc20885cd94082"}, - {file = "fastparquet-2023.7.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4cc2caf2160f5ebbf3d83d9e9a7a5a4c3053baf6fe0bf9b7ff15672d09c017a3"}, - {file = "fastparquet-2023.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:915af569d1dd6c116e7487dfbd9b74ce3fa0f9cf896df84e646cbd945f19b51c"}, - {file = "fastparquet-2023.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28f54fdd5a3d2470834697a3f0d3cfddef51ea6c08e058f94fdb0f1d0158ead1"}, - {file = "fastparquet-2023.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd09a57bb5169d08b1180b1611431340697aa35f2aa6bf8826ebaf81d5c95688"}, - {file = "fastparquet-2023.7.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ea7d05bec6c010ff8f0139806c152925d1d2609eb19517568714911d8cde37"}, - {file = "fastparquet-2023.7.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a8dc1c27000a57d03975ff0801a43203efb13b8cdec570ae05235a717f85b51d"}, - {file = "fastparquet-2023.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eed1dcdbb56c166cdfcf65bfb5d4d6abdb50d873541f8ce74d3319349c68de42"}, - {file = "fastparquet-2023.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:11d39457c5aa731f710e9fdfab6552c8399ff8f784b8ef938ea6f5dac3dcc571"}, - {file = "fastparquet-2023.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:be5dfa7f221e2bd6c32f010fba2f873e3060b109bc5b5f99bf0013a4cb36994d"}, - {file = "fastparquet-2023.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2ed33312a2d5d1070277d8df64a20ad14cc51466172538dd4612fd9c06957685"}, - {file = "fastparquet-2023.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07f3a5e83b454a47b13c0b4fb2acfe862619915f3702dbc1724890e5d323abbe"}, - {file = "fastparquet-2023.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5f864f25983f04d0bdfb74c1c857f5489cb3b26bb258b3e68fad2923b4264c"}, - {file = "fastparquet-2023.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e32585eaae9a1478337aca644634f9aec33a32047b707754c9d998314dfef90"}, - {file = "fastparquet-2023.7.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fe517e5a1a8a7cf1cfd09a1c584c95db12de2fcfc52e8ff28e8e6705167752ed"}, - {file = "fastparquet-2023.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7ecbe7dd4f9e97d777398b63b5e04fc4424928372a1f14f38956ad0d3ba89cdf"}, - {file = "fastparquet-2023.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:37865fb74f3ee9b4d4c2cb4197587657ffa10e120747db5192af8d00794e3408"}, - {file = "fastparquet-2023.7.0.tar.gz", hash = "sha256:66ee6448fd8750d7028ccea2072f404ab05e4e00d98fd33f02dad1260e819aaf"}, + {file = "fastparquet-2023.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e374e648bc93d1b499ca29cd16ea09bc7c61b6c60910377b2bbe3d6c4f089b22"}, + {file = "fastparquet-2023.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:31ecf82b3969203ef6aea9458ae9e27387eab80ab9d590031e5bfdff96bad2f1"}, + {file = "fastparquet-2023.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:160ee84241f106a21cf4b0821e95235a47cdd0e1a41c6721380c077af01d07cc"}, + {file = "fastparquet-2023.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3619bb0fb3760038a47fd742ff66acf5b8b19f1a7b9744cb13e4dda43c314e92"}, + {file = "fastparquet-2023.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c23425bd3934971075331113c974929d1362b381bb388825d5a2bf8150568806"}, + {file = "fastparquet-2023.8.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b0f233bd35e2121785b49b461430bb2448ef01a8b8f4196d14580827c24dea67"}, + {file = "fastparquet-2023.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1efa5a140b77ec60fec5d41135cd06ffe6f72b229a971d3756255aeca3c2fa32"}, + {file = "fastparquet-2023.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:a4f7dcd88fc7d58bdefac6b29441766ec3510cf72d4da58354f75d583bd3020d"}, + {file = "fastparquet-2023.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:afe08f3f5b7e8db8a81d765f05a85e05f808118fc981e87edfbc06456c1609b0"}, + {file = "fastparquet-2023.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c4b76d047511949902952d7bb22ab12129efa7ed1ddb30d07bdb087d78914079"}, + {file = "fastparquet-2023.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8eb212e0379cbc01adf904a87868dcfbb5658f71816df812ea49abb42f0d7220"}, + {file = "fastparquet-2023.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7784c2ab4cf7fff28adb2c6b7e88cd90c345f6e4cc1e39aead8b57bc4d001700"}, + {file = "fastparquet-2023.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f8a1381b3272c73f85dfedbdfd7c8538b46382eaaf51f18ca0e0a9afda12cf0"}, + {file = "fastparquet-2023.8.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6648ac0946264159dfadca8ff044d5c12cf0e5587fa2cef1709c4abf84866c06"}, + {file = "fastparquet-2023.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3c3a1cba8c7176690ad7db242f190c9ec6d0ae0fa1d30196db76eabe35536252"}, + {file = "fastparquet-2023.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:c06bdf64512807714d25760c096ea4ac8be5f3dcee6d346a3c7e34ea9622b118"}, + {file = "fastparquet-2023.8.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e11d951450fd0734b9ee1971123c6743f5f44296fbb7258f8c92f722c5878fde"}, + {file = "fastparquet-2023.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23a5b302c1cdbec8450b3ba66db44210dd6b7bbbd298a3a3482588903055347f"}, + {file = "fastparquet-2023.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac6a3a1e157fcb0a89a66d593494f1849d8004a7979bb24aa5b7c01ffb4c5e66"}, + {file = "fastparquet-2023.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dadde182a582313aa8976afc620d73d2f1d995f29d418ecb5fc05dd015e646c"}, + {file = "fastparquet-2023.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12e0fecff7cbf5031944f119c6e11d8a2e578ceb1c2898aa481ddc6d1bc94b6b"}, + {file = "fastparquet-2023.8.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cfe2a49cd8ca612bfbe4a23244d4a25525468b14cc72eb4550d698ec420ed17b"}, + {file = "fastparquet-2023.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b56f048b3b89400e5781093b6160cad8acdeb15f10bc8a0c14d29f96dd5abc56"}, + {file = "fastparquet-2023.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:27be564460e391313ea6c9c0225710abd5c875fa85cab5b89f223961e3065772"}, + {file = "fastparquet-2023.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0c1bed521f149408101e90484e21f74011caa950b3fda2674539d7295f20e5eb"}, + {file = "fastparquet-2023.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cf33f1c9c6f02c94874fa231e28845078a413943684952c19c5b8742be0d1ef0"}, + {file = "fastparquet-2023.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcabba07d2ad07bf07a0d85f3dcc19576c1d5c9bdd781aaa0e8673a4c8552d24"}, + {file = "fastparquet-2023.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c78407941103c8f72270027a287db7e757431f766ce3890d4c16d4773006bd8"}, + {file = "fastparquet-2023.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9814e320fe7040ea440e7fff6aa62cec5e7f0440d9047c7b5316d761f129e956"}, + {file = "fastparquet-2023.8.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8cea82b9260907219ef55db470c891a61bb75f913ccff3f0a9718ab45ceb1856"}, + {file = "fastparquet-2023.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:72a34011217e7c3e5482d03cbee2687732c3b956120fa34666d771e7f5eed4fe"}, + {file = "fastparquet-2023.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:8697a663e1997266bda5cca8107821739bd91a591229d52e3c02ccdc50377577"}, + {file = "fastparquet-2023.8.0.tar.gz", hash = "sha256:2ff39bc20869829ea8fd85bf0336c5006d0ffcc276d0de070030cf8ffd929160"}, ] [package.dependencies] @@ -774,21 +808,63 @@ lzo = ["python-lzo"] [[package]] name = "filelock" -version = "3.12.3" +version = "3.12.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.12.3-py3-none-any.whl", hash = "sha256:f067e40ccc40f2b48395a80fcbd4728262fab54e232e090a4063ab804179efeb"}, - {file = "filelock-3.12.3.tar.gz", hash = "sha256:0ecc1dd2ec4672a10c8550a8182f1bd0c0a5088470ecd5a125e45f49472fac3d"}, + {file = "filelock-3.12.4-py3-none-any.whl", hash = "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4"}, + {file = "filelock-3.12.4.tar.gz", hash = "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd"}, ] -[package.dependencies] -typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.11\""} - [package.extras] docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] +typing = ["typing-extensions (>=4.7.1)"] + +[[package]] +name = "fiona" +version = "1.9.4.post1" +description = "Fiona reads and writes spatial data files" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Fiona-1.9.4.post1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:d6483a20037db2209c8e9a0c6f1e552f807d03c8f42ed0c865ab500945a37c4d"}, + {file = "Fiona-1.9.4.post1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dbe158947099a83ad16f9acd3a21f50ff01114c64e2de67805e382e6b6e0083a"}, + {file = "Fiona-1.9.4.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2c7b09eecee3bb074ef8aa518cd6ab30eb663c6fdd0eff3c88d454a9746eaa"}, + {file = "Fiona-1.9.4.post1-cp310-cp310-win_amd64.whl", hash = "sha256:1da8b954f6f222c3c782bc285586ea8dd9d7e55e1bc7861da9cd772bca671660"}, + {file = "Fiona-1.9.4.post1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:c671d8832287cda397621d79c5a635d52e4631f33a8f0e6fdc732a79a93cb96c"}, + {file = "Fiona-1.9.4.post1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b633a2e550e083805c638d2ab8059c283ca112aaea8241e170c012d2ee0aa905"}, + {file = "Fiona-1.9.4.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1faa625d5202b8403471bbc9f9c96b1bf9099cfcb0ee02a80a3641d3d02383e"}, + {file = "Fiona-1.9.4.post1-cp311-cp311-win_amd64.whl", hash = "sha256:39baf11ff0e4318397e2b2197de427b4eebdc49d4a9a7c1366f8a7ed682978a4"}, + {file = "Fiona-1.9.4.post1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d93c993265f6378b23f47708c83bddb3377ca6814a1f0b5a0ae0bee9c8d72cf8"}, + {file = "Fiona-1.9.4.post1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:b0387cae39e27f338fd948b3b50b6e6ce198cc4cec257fc91660849697c69dc3"}, + {file = "Fiona-1.9.4.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:450561d308d3ce7c7e30294822b1de3f4f942033b703ddd4a91a7f7f5f506ca0"}, + {file = "Fiona-1.9.4.post1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:71b023ef5248ebfa5524e7a875033f7db3bbfaf634b1b5c1ae36958d1eb82083"}, + {file = "Fiona-1.9.4.post1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:74511d3755695d75cea0f4ff6f5e0c6c5d5be8e0d46dafff124c6a219e99b1eb"}, + {file = "Fiona-1.9.4.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:285f3dd4f96aa0a3955ed469f0543375b20989731b2dddc85124453f11ac62bc"}, + {file = "Fiona-1.9.4.post1-cp38-cp38-win_amd64.whl", hash = "sha256:a670ea4262cb9140445bcfc97cbfd2f508a058be342f4a97e966b8ce7696601f"}, + {file = "Fiona-1.9.4.post1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:ea7c44c15b3a653452b9b3173181490b7afc5f153b0473c145c43c0fbf90448b"}, + {file = "Fiona-1.9.4.post1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7bfb1f49e0e53f6cd7ad64ae809d72646266b37a7b9881205977408b443a8d79"}, + {file = "Fiona-1.9.4.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a585002a6385cc8ab0f66ddf3caf18711f531901906abd011a67a0cc89ab7b0"}, + {file = "Fiona-1.9.4.post1-cp39-cp39-win_amd64.whl", hash = "sha256:f5da66b723a876142937e683431bbaa5c3d81bb2ed3ec98941271bc99b7f8cd0"}, + {file = "Fiona-1.9.4.post1.tar.gz", hash = "sha256:5679d3f7e0d513035eb72e59527bb90486859af4405755dfc739138633106120"}, +] + +[package.dependencies] +attrs = ">=19.2.0" +certifi = "*" +click = ">=8.0,<9.0" +click-plugins = ">=1.0" +cligj = ">=0.5" +importlib-metadata = {version = "*", markers = "python_version < \"3.10\""} +six = "*" + +[package.extras] +all = ["Fiona[calc,s3,test]"] +calc = ["shapely"] +s3 = ["boto3 (>=1.3.1)"] +test = ["Fiona[s3]", "pytest (>=7)", "pytest-cov", "pytz"] [[package]] name = "fonttools" @@ -880,6 +956,24 @@ sftp = ["paramiko"] smb = ["smbprotocol"] ssh = ["paramiko"] +[[package]] +name = "geopandas" +version = "0.13.2" +description = "Geographic pandas extensions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "geopandas-0.13.2-py3-none-any.whl", hash = "sha256:101cfd0de54bcf9e287a55b5ea17ebe0db53a5e25a28bacf100143d0507cabd9"}, + {file = "geopandas-0.13.2.tar.gz", hash = "sha256:e5b56d9c20800c77bcc0c914db3f27447a37b23b2cd892be543f5001a694a968"}, +] + +[package.dependencies] +fiona = ">=1.8.19" +packaging = "*" +pandas = ">=1.1.0" +pyproj = ">=3.0.1" +shapely = ">=1.7.1" + [[package]] name = "google-analytics-data" version = "0.17.0" @@ -922,13 +1016,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.97.0" +version = "2.99.0" description = "Google API Client Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-python-client-2.97.0.tar.gz", hash = "sha256:48277291894876a1ca7ed4127e055e81f81e6343ced1b544a7200ae2c119dcd7"}, - {file = "google_api_python_client-2.97.0-py2.py3-none-any.whl", hash = "sha256:5215f4cd577753fc4192ccfbe0bb8b55d4bb5fd68fa6268ac5cf271b6305de31"}, + {file = "google-api-python-client-2.99.0.tar.gz", hash = "sha256:e733fd0f2c8793b1a000d5e69ac81b1b9ec0665b445b7ed83bdbbb0038973306"}, + {file = "google_api_python_client-2.99.0-py2.py3-none-any.whl", hash = "sha256:40272131d3a4a7aecab840ebcf3df51c54d49560156f3b9d54a4ef82c795985d"}, ] [package.dependencies] @@ -965,29 +1059,28 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-auth-httplib2" -version = "0.1.0" +version = "0.1.1" description = "Google Authentication Library: httplib2 transport" optional = false python-versions = "*" files = [ - {file = "google-auth-httplib2-0.1.0.tar.gz", hash = "sha256:a07c39fd632becacd3f07718dfd6021bf396978f03ad3ce4321d060015cc30ac"}, - {file = "google_auth_httplib2-0.1.0-py2.py3-none-any.whl", hash = "sha256:31e49c36c6b5643b57e82617cb3e021e3e1d2df9da63af67252c02fa9c1f4a10"}, + {file = "google-auth-httplib2-0.1.1.tar.gz", hash = "sha256:c64bc555fdc6dd788ea62ecf7bccffcf497bf77244887a3f3d7a5a02f8e3fc29"}, + {file = "google_auth_httplib2-0.1.1-py2.py3-none-any.whl", hash = "sha256:42c50900b8e4dcdf8222364d1f0efe32b8421fb6ed72f2613f12f75cc933478c"}, ] [package.dependencies] google-auth = "*" -httplib2 = ">=0.15.0" -six = "*" +httplib2 = ">=0.19.0" [[package]] name = "google-auth-oauthlib" -version = "1.0.0" +version = "1.1.0" description = "Google Authentication Library" optional = false python-versions = ">=3.6" files = [ - {file = "google-auth-oauthlib-1.0.0.tar.gz", hash = "sha256:e375064964820b47221a7e1b7ee1fd77051b6323c3f9e3e19785f78ab67ecfc5"}, - {file = "google_auth_oauthlib-1.0.0-py2.py3-none-any.whl", hash = "sha256:95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb"}, + {file = "google-auth-oauthlib-1.1.0.tar.gz", hash = "sha256:83ea8c3b0881e453790baff4448e8a6112ac8778d1de9da0b68010b843937afb"}, + {file = "google_auth_oauthlib-1.1.0-py2.py3-none-any.whl", hash = "sha256:089c6e587d36f4803ac7e0720c045c6a8b1fd1790088b8424975b90d0ee61c12"}, ] [package.dependencies] @@ -1379,13 +1472,13 @@ parser = ["pyhcl (>=0.3.10)"] [[package]] name = "identify" -version = "2.5.27" +version = "2.5.29" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.27-py2.py3-none-any.whl", hash = "sha256:fdb527b2dfe24602809b2201e033c2a113d7bdf716db3ca8e3243f735dcecaba"}, - {file = "identify-2.5.27.tar.gz", hash = "sha256:287b75b04a0e22d727bc9a41f0d4f3c1bcada97490fa6eabb5b28f0e9097e733"}, + {file = "identify-2.5.29-py2.py3-none-any.whl", hash = "sha256:24437fbf6f4d3fe6efd0eb9d67e24dd9106db99af5ceb27996a5f7895f24bf1b"}, + {file = "identify-2.5.29.tar.gz", hash = "sha256:d43d52b86b15918c137e3a74fff5224f60385cd0e9c38e99d07c257f02f151a5"}, ] [package.extras] @@ -1402,6 +1495,25 @@ files = [ {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] +[[package]] +name = "importlib-metadata" +version = "6.8.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + [[package]] name = "importlib-resources" version = "6.0.1" @@ -1703,13 +1815,13 @@ files = [ [[package]] name = "loguru" -version = "0.7.0" +version = "0.7.2" description = "Python logging made (stupidly) simple" optional = false python-versions = ">=3.5" files = [ - {file = "loguru-0.7.0-py3-none-any.whl", hash = "sha256:b93aa30099fa6860d4727f1b81f8718e965bb96253fa190fab2077aaad6d15d3"}, - {file = "loguru-0.7.0.tar.gz", hash = "sha256:1612053ced6ae84d7959dd7d5e431a0532642237ec21f7fd83ac73fe539e03e1"}, + {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, + {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, ] [package.dependencies] @@ -1717,7 +1829,7 @@ colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} [package.extras] -dev = ["Sphinx (==5.3.0)", "colorama (==0.4.5)", "colorama (==0.4.6)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v0.990)", "pre-commit (==3.2.1)", "pytest (==6.1.2)", "pytest (==7.2.1)", "pytest-cov (==2.12.1)", "pytest-cov (==4.0.0)", "pytest-mypy-plugins (==1.10.1)", "pytest-mypy-plugins (==1.9.3)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.2.0)", "tox (==3.27.1)", "tox (==4.4.6)"] +dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] [[package]] name = "lxml" @@ -1927,52 +2039,58 @@ tests = ["mock", "pytest"] [[package]] name = "matplotlib" -version = "3.7.2" +version = "3.7.3" description = "Python plotting package" optional = false python-versions = ">=3.8" files = [ - {file = "matplotlib-3.7.2-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:2699f7e73a76d4c110f4f25be9d2496d6ab4f17345307738557d345f099e07de"}, - {file = "matplotlib-3.7.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a8035ba590658bae7562786c9cc6ea1a84aa49d3afab157e414c9e2ea74f496d"}, - {file = "matplotlib-3.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f8e4a49493add46ad4a8c92f63e19d548b2b6ebbed75c6b4c7f46f57d36cdd1"}, - {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71667eb2ccca4c3537d9414b1bc00554cb7f91527c17ee4ec38027201f8f1603"}, - {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:152ee0b569a37630d8628534c628456b28686e085d51394da6b71ef84c4da201"}, - {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:070f8dddd1f5939e60aacb8fa08f19551f4b0140fab16a3669d5cd6e9cb28fc8"}, - {file = "matplotlib-3.7.2-cp310-cp310-win32.whl", hash = "sha256:fdbb46fad4fb47443b5b8ac76904b2e7a66556844f33370861b4788db0f8816a"}, - {file = "matplotlib-3.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:23fb1750934e5f0128f9423db27c474aa32534cec21f7b2153262b066a581fd1"}, - {file = "matplotlib-3.7.2-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:30e1409b857aa8a747c5d4f85f63a79e479835f8dffc52992ac1f3f25837b544"}, - {file = "matplotlib-3.7.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:50e0a55ec74bf2d7a0ebf50ac580a209582c2dd0f7ab51bc270f1b4a0027454e"}, - {file = "matplotlib-3.7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ac60daa1dc83e8821eed155796b0f7888b6b916cf61d620a4ddd8200ac70cd64"}, - {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305e3da477dc8607336ba10bac96986d6308d614706cae2efe7d3ffa60465b24"}, - {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c308b255efb9b06b23874236ec0f10f026673ad6515f602027cc8ac7805352d"}, - {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60c521e21031632aa0d87ca5ba0c1c05f3daacadb34c093585a0be6780f698e4"}, - {file = "matplotlib-3.7.2-cp311-cp311-win32.whl", hash = "sha256:26bede320d77e469fdf1bde212de0ec889169b04f7f1179b8930d66f82b30cbc"}, - {file = "matplotlib-3.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:af4860132c8c05261a5f5f8467f1b269bf1c7c23902d75f2be57c4a7f2394b3e"}, - {file = "matplotlib-3.7.2-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:a1733b8e84e7e40a9853e505fe68cc54339f97273bdfe6f3ed980095f769ddc7"}, - {file = "matplotlib-3.7.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d9881356dc48e58910c53af82b57183879129fa30492be69058c5b0d9fddf391"}, - {file = "matplotlib-3.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f081c03f413f59390a80b3e351cc2b2ea0205839714dbc364519bcf51f4b56ca"}, - {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1cd120fca3407a225168238b790bd5c528f0fafde6172b140a2f3ab7a4ea63e9"}, - {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2c1590b90aa7bd741b54c62b78de05d4186271e34e2377e0289d943b3522273"}, - {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d2ff3c984b8a569bc1383cd468fc06b70d7b59d5c2854ca39f1436ae8394117"}, - {file = "matplotlib-3.7.2-cp38-cp38-win32.whl", hash = "sha256:5dea00b62d28654b71ca92463656d80646675628d0828e08a5f3b57e12869e13"}, - {file = "matplotlib-3.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:0f506a1776ee94f9e131af1ac6efa6e5bc7cb606a3e389b0ccb6e657f60bb676"}, - {file = "matplotlib-3.7.2-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:6515e878f91894c2e4340d81f0911857998ccaf04dbc1bba781e3d89cbf70608"}, - {file = "matplotlib-3.7.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:71f7a8c6b124e904db550f5b9fe483d28b896d4135e45c4ea381ad3b8a0e3256"}, - {file = "matplotlib-3.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12f01b92ecd518e0697da4d97d163b2b3aa55eb3eb4e2c98235b3396d7dad55f"}, - {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7e28d6396563955f7af437894a36bf2b279462239a41028323e04b85179058b"}, - {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbcf59334ff645e6a67cd5f78b4b2cdb76384cdf587fa0d2dc85f634a72e1a3e"}, - {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:318c89edde72ff95d8df67d82aca03861240512994a597a435a1011ba18dbc7f"}, - {file = "matplotlib-3.7.2-cp39-cp39-win32.whl", hash = "sha256:ce55289d5659b5b12b3db4dc9b7075b70cef5631e56530f14b2945e8836f2d20"}, - {file = "matplotlib-3.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:2ecb5be2b2815431c81dc115667e33da0f5a1bcf6143980d180d09a717c4a12e"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fdcd28360dbb6203fb5219b1a5658df226ac9bebc2542a9e8f457de959d713d0"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c3cca3e842b11b55b52c6fb8bd6a4088693829acbfcdb3e815fa9b7d5c92c1b"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebf577c7a6744e9e1bd3fee45fc74a02710b214f94e2bde344912d85e0c9af7c"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:936bba394682049919dda062d33435b3be211dc3dcaa011e09634f060ec878b2"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bc221ffbc2150458b1cd71cdd9ddd5bb37962b036e41b8be258280b5b01da1dd"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35d74ebdb3f71f112b36c2629cf32323adfbf42679e2751252acd468f5001c07"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:717157e61b3a71d3d26ad4e1770dc85156c9af435659a25ee6407dc866cb258d"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:20f844d6be031948148ba49605c8b96dfe7d3711d1b63592830d650622458c11"}, - {file = "matplotlib-3.7.2.tar.gz", hash = "sha256:a8cdb91dddb04436bd2f098b8fdf4b81352e68cf4d2c6756fcc414791076569b"}, + {file = "matplotlib-3.7.3-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:085c33b27561d9c04386789d5aa5eb4a932ddef43cfcdd0e01735f9a6e85ce0c"}, + {file = "matplotlib-3.7.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c568e80e1c17f68a727f30f591926751b97b98314d8e59804f54f86ae6fa6a22"}, + {file = "matplotlib-3.7.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7baf98c5ad59c5c4743ea884bb025cbffa52dacdfdac0da3e6021a285a90377e"}, + {file = "matplotlib-3.7.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:236024f582e40dac39bca592258888b38ae47a9fed7b8de652d68d3d02d47d2b"}, + {file = "matplotlib-3.7.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12b4f6795efea037ce2d41e7c417ad8bd02d5719c6ad4a8450a0708f4a1cfb89"}, + {file = "matplotlib-3.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b2136cc6c5415b78977e0e8c608647d597204b05b1d9089ccf513c7d913733"}, + {file = "matplotlib-3.7.3-cp310-cp310-win32.whl", hash = "sha256:122dcbf9be0086e2a95d9e5e0632dbf3bd5b65eaa68c369363310a6c87753059"}, + {file = "matplotlib-3.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:4aab27d9e33293389e3c1d7c881d414a72bdfda0fedc3a6bf46c6fa88d9b8015"}, + {file = "matplotlib-3.7.3-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:d5adc743de91e8e0b13df60deb1b1c285b8effea3d66223afceb14b63c9b05de"}, + {file = "matplotlib-3.7.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:55de4cf7cd0071b8ebf203981b53ab64f988a0a1f897a2dff300a1124e8bcd8b"}, + {file = "matplotlib-3.7.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ac03377fd908aaee2312d0b11735753e907adb6f4d1d102de5e2425249693f6c"}, + {file = "matplotlib-3.7.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:755bafc10a46918ce9a39980009b54b02dd249594e5adf52f9c56acfddb5d0b7"}, + {file = "matplotlib-3.7.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a6094c6f8e8d18db631754df4fe9a34dec3caf074f6869a7db09f18f9b1d6b2"}, + {file = "matplotlib-3.7.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:272dba2f1b107790ed78ebf5385b8d14b27ad9e90419de340364b49fe549a993"}, + {file = "matplotlib-3.7.3-cp311-cp311-win32.whl", hash = "sha256:591c123bed1cb4b9996fb60b41a6d89c2ec4943244540776c5f1283fb6960a53"}, + {file = "matplotlib-3.7.3-cp311-cp311-win_amd64.whl", hash = "sha256:3bf3a178c6504694cee8b88b353df0051583f2f6f8faa146f67115c27c856881"}, + {file = "matplotlib-3.7.3-cp312-cp312-macosx_10_12_universal2.whl", hash = "sha256:edf54cac8ee3603f3093616b40a931e8c063969756a4d78a86e82c2fea9659f7"}, + {file = "matplotlib-3.7.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:91e36a85ea639a1ba9f91427041eac064b04829945fe331a92617b6cb21d27e5"}, + {file = "matplotlib-3.7.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:caf5eaaf7c68f8d7df269dfbcaf46f48a70ff482bfcebdcc97519671023f2a7d"}, + {file = "matplotlib-3.7.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74bf57f505efea376097e948b7cdd87191a7ce8180616390aef496639edf601f"}, + {file = "matplotlib-3.7.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee152a88a0da527840a426535514b6ed8ac4240eb856b1da92cf48124320e346"}, + {file = "matplotlib-3.7.3-cp312-cp312-win_amd64.whl", hash = "sha256:67a410a9c9e07cbc83581eeea144bbe298870bf0ac0ee2f2e10a015ab7efee19"}, + {file = "matplotlib-3.7.3-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:259999c05285cb993d7f2a419cea547863fa215379eda81f7254c9e932963729"}, + {file = "matplotlib-3.7.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:3f4e7fd5a6157e1d018ce2166ec8e531a481dd4a36f035b5c23edfe05a25419a"}, + {file = "matplotlib-3.7.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:faa3d12d8811d08d14080a8b7b9caea9a457dc495350166b56df0db4b9909ef5"}, + {file = "matplotlib-3.7.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:336e88900c11441e458da01c8414fc57e04e17f9d3bb94958a76faa2652bcf6b"}, + {file = "matplotlib-3.7.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:12f4c0dd8aa280d796c8772ea8265a14f11a04319baa3a16daa5556065e8baea"}, + {file = "matplotlib-3.7.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1990955b11e7918d256cf3b956b10997f405b7917a3f1c7d8e69c1d15c7b1930"}, + {file = "matplotlib-3.7.3-cp38-cp38-win32.whl", hash = "sha256:e78707b751260b42b721507ad7aa60fe4026d7f51c74cca6b9cd8b123ebb633a"}, + {file = "matplotlib-3.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:e594ee43c59ea39ca5c6244667cac9d017a3527febc31f5532ad9135cf7469ec"}, + {file = "matplotlib-3.7.3-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:6eaa1cf0e94c936a26b78f6d756c5fbc12e0a58c8a68b7248a2a31456ce4e234"}, + {file = "matplotlib-3.7.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0a97af9d22e8ebedc9f00b043d9bbd29a375e9e10b656982012dded44c10fd77"}, + {file = "matplotlib-3.7.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f9c6c16597af660433ab330b59ee2934b832ee1fabcaf5cbde7b2add840f31e"}, + {file = "matplotlib-3.7.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7240259b4b9cbc62381f6378cff4d57af539162a18e832c1e48042fabc40b6b"}, + {file = "matplotlib-3.7.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:747c6191d2e88ae854809e69aa358dbf852ff1a5738401b85c1cc9012309897a"}, + {file = "matplotlib-3.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec726b08a5275d827aa91bb951e68234a4423adb91cf65bc0fcdc0f2777663f7"}, + {file = "matplotlib-3.7.3-cp39-cp39-win32.whl", hash = "sha256:40e3b9b450c6534f07278310c4e34caff41c2a42377e4b9d47b0f8d3ac1083a2"}, + {file = "matplotlib-3.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfc118642903a23e309b1da32886bb39a4314147d013e820c86b5fb4cb2e36d0"}, + {file = "matplotlib-3.7.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:165c8082bf8fc0360c24aa4724a22eaadbfd8c28bf1ccf7e94d685cad48261e4"}, + {file = "matplotlib-3.7.3-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebd8470cc2a3594746ff0513aecbfa2c55ff6f58e6cef2efb1a54eb87c88ffa2"}, + {file = "matplotlib-3.7.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7153453669c9672b52095119fd21dd032d19225d48413a2871519b17db4b0fde"}, + {file = "matplotlib-3.7.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:498a08267dc69dd8f24c4b5d7423fa584d7ce0027ba71f7881df05fc09b89bb7"}, + {file = "matplotlib-3.7.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48999c4b19b5a0c058c9cd828ff6fc7748390679f6cf9a2ad653a3e802c87d3"}, + {file = "matplotlib-3.7.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22d65d18b4ee8070a5fea5761d59293f1f9e2fac37ec9ce090463b0e629432fd"}, + {file = "matplotlib-3.7.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c40cde976c36693cc0767e27cf5f443f91c23520060bd9496678364adfafe9c"}, + {file = "matplotlib-3.7.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:39018a2b17592448fbfdf4b8352955e6c3905359939791d4ff429296494d1a0c"}, + {file = "matplotlib-3.7.3.tar.gz", hash = "sha256:f09b3dd6bdeb588de91f853bbb2d6f0ff8ab693485b0c49035eaa510cb4f142e"}, ] [package.dependencies] @@ -1981,11 +2099,12 @@ cycler = ">=0.10" fonttools = ">=4.22.0" importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} kiwisolver = ">=1.0.1" -numpy = ">=1.20" +numpy = ">=1.20,<2" packaging = ">=20.0" pillow = ">=6.2.0" -pyparsing = ">=2.3.1,<3.1" +pyparsing = ">=2.3.1" python-dateutil = ">=2.7" +setuptools_scm = ">=7" [[package]] name = "msgpack" @@ -2419,67 +2538,65 @@ pytzdata = ">=2020.1" [[package]] name = "pillow" -version = "10.0.0" +version = "10.0.1" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "Pillow-10.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f62406a884ae75fb2f818694469519fb685cc7eaff05d3451a9ebe55c646891"}, - {file = "Pillow-10.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d5db32e2a6ccbb3d34d87c87b432959e0db29755727afb37290e10f6e8e62614"}, - {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf4392b77bdc81f36e92d3a07a5cd072f90253197f4a52a55a8cec48a12483b"}, - {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:520f2a520dc040512699f20fa1c363eed506e94248d71f85412b625026f6142c"}, - {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:8c11160913e3dd06c8ffdb5f233a4f254cb449f4dfc0f8f4549eda9e542c93d1"}, - {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a74ba0c356aaa3bb8e3eb79606a87669e7ec6444be352870623025d75a14a2bf"}, - {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d0dae4cfd56969d23d94dc8e89fb6a217be461c69090768227beb8ed28c0a3"}, - {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22c10cc517668d44b211717fd9775799ccec4124b9a7f7b3635fc5386e584992"}, - {file = "Pillow-10.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:dffe31a7f47b603318c609f378ebcd57f1554a3a6a8effbc59c3c69f804296de"}, - {file = "Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485"}, - {file = "Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f"}, - {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ed64f9ca2f0a95411e88a4efbd7a29e5ce2cea36072c53dd9d26d9c76f753b3"}, - {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6eb5502f45a60a3f411c63187db83a3d3107887ad0d036c13ce836f8a36f1d"}, - {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd"}, - {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629"}, - {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3b08d4cc24f471b2c8ca24ec060abf4bebc6b144cb89cba638c720546b1cf538"}, - {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737a602fbd82afd892ca746392401b634e278cb65d55c4b7a8f48e9ef8d008d"}, - {file = "Pillow-10.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3a82c40d706d9aa9734289740ce26460a11aeec2d9c79b7af87bb35f0073c12f"}, - {file = "Pillow-10.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:bc2ec7c7b5d66b8ec9ce9f720dbb5fa4bace0f545acd34870eff4a369b44bf37"}, - {file = "Pillow-10.0.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:d80cf684b541685fccdd84c485b31ce73fc5c9b5d7523bf1394ce134a60c6883"}, - {file = "Pillow-10.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76de421f9c326da8f43d690110f0e79fe3ad1e54be811545d7d91898b4c8493e"}, - {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ff539a12457809666fef6624684c008e00ff6bf455b4b89fd00a140eecd640"}, - {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce543ed15570eedbb85df19b0a1a7314a9c8141a36ce089c0a894adbfccb4568"}, - {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:685ac03cc4ed5ebc15ad5c23bc555d68a87777586d970c2c3e216619a5476223"}, - {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d72e2ecc68a942e8cf9739619b7f408cc7b272b279b56b2c83c6123fcfa5cdff"}, - {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d50b6aec14bc737742ca96e85d6d0a5f9bfbded018264b3b70ff9d8c33485551"}, - {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:00e65f5e822decd501e374b0650146063fbb30a7264b4d2744bdd7b913e0cab5"}, - {file = "Pillow-10.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:f31f9fdbfecb042d046f9d91270a0ba28368a723302786c0009ee9b9f1f60199"}, - {file = "Pillow-10.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:1ce91b6ec08d866b14413d3f0bbdea7e24dfdc8e59f562bb77bc3fe60b6144ca"}, - {file = "Pillow-10.0.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:349930d6e9c685c089284b013478d6f76e3a534e36ddfa912cde493f235372f3"}, - {file = "Pillow-10.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3a684105f7c32488f7153905a4e3015a3b6c7182e106fe3c37fbb5ef3e6994c3"}, - {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4f69b3700201b80bb82c3a97d5e9254084f6dd5fb5b16fc1a7b974260f89f43"}, - {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f07ea8d2f827d7d2a49ecf1639ec02d75ffd1b88dcc5b3a61bbb37a8759ad8d"}, - {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:040586f7d37b34547153fa383f7f9aed68b738992380ac911447bb78f2abe530"}, - {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f88a0b92277de8e3ca715a0d79d68dc82807457dae3ab8699c758f07c20b3c51"}, - {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c7cf14a27b0d6adfaebb3ae4153f1e516df54e47e42dcc073d7b3d76111a8d86"}, - {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3400aae60685b06bb96f99a21e1ada7bc7a413d5f49bce739828ecd9391bb8f7"}, - {file = "Pillow-10.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:dbc02381779d412145331789b40cc7b11fdf449e5d94f6bc0b080db0a56ea3f0"}, - {file = "Pillow-10.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9211e7ad69d7c9401cfc0e23d49b69ca65ddd898976d660a2fa5904e3d7a9baa"}, - {file = "Pillow-10.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:faaf07ea35355b01a35cb442dd950d8f1bb5b040a7787791a535de13db15ed90"}, - {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f72a021fbb792ce98306ffb0c348b3c9cb967dce0f12a49aa4c3d3fdefa967"}, - {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f7c16705f44e0504a3a2a14197c1f0b32a95731d251777dcb060aa83022cb2d"}, - {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:76edb0a1fa2b4745fb0c99fb9fb98f8b180a1bbceb8be49b087e0b21867e77d3"}, - {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:368ab3dfb5f49e312231b6f27b8820c823652b7cd29cfbd34090565a015e99ba"}, - {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:608bfdee0d57cf297d32bcbb3c728dc1da0907519d1784962c5f0c68bb93e5a3"}, - {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5c6e3df6bdd396749bafd45314871b3d0af81ff935b2d188385e970052091017"}, - {file = "Pillow-10.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:7be600823e4c8631b74e4a0d38384c73f680e6105a7d3c6824fcf226c178c7e6"}, - {file = "Pillow-10.0.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:92be919bbc9f7d09f7ae343c38f5bb21c973d2576c1d45600fce4b74bafa7ac0"}, - {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8182b523b2289f7c415f589118228d30ac8c355baa2f3194ced084dac2dbba"}, - {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:38250a349b6b390ee6047a62c086d3817ac69022c127f8a5dc058c31ccef17f3"}, - {file = "Pillow-10.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:88af2003543cc40c80f6fca01411892ec52b11021b3dc22ec3bc9d5afd1c5334"}, - {file = "Pillow-10.0.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c189af0545965fa8d3b9613cfdb0cd37f9d71349e0f7750e1fd704648d475ed2"}, - {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7b031a6fc11365970e6a5686d7ba8c63e4c1cf1ea143811acbb524295eabed"}, - {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db24668940f82321e746773a4bc617bfac06ec831e5c88b643f91f122a785684"}, - {file = "Pillow-10.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:efe8c0681042536e0d06c11f48cebe759707c9e9abf880ee213541c5b46c5bf3"}, - {file = "Pillow-10.0.0.tar.gz", hash = "sha256:9c82b5b3e043c7af0d95792d0d20ccf68f61a1fec6b3530e718b688422727396"}, + {file = "Pillow-10.0.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a"}, + {file = "Pillow-10.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff"}, + {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf"}, + {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd"}, + {file = "Pillow-10.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0"}, + {file = "Pillow-10.0.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1"}, + {file = "Pillow-10.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2"}, + {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b"}, + {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1"}, + {file = "Pillow-10.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088"}, + {file = "Pillow-10.0.1-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b"}, + {file = "Pillow-10.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91"}, + {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4"}, + {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08"}, + {file = "Pillow-10.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08"}, + {file = "Pillow-10.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a"}, + {file = "Pillow-10.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7"}, + {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a"}, + {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7"}, + {file = "Pillow-10.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3"}, + {file = "Pillow-10.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849"}, + {file = "Pillow-10.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145"}, + {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2"}, + {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf"}, + {file = "Pillow-10.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d"}, + {file = "Pillow-10.0.1.tar.gz", hash = "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d"}, ] [package.extras] @@ -2518,28 +2635,30 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "polars" -version = "0.19.0" +version = "0.19.3" description = "Blazingly fast DataFrame library" optional = false python-versions = ">=3.8" files = [ - {file = "polars-0.19.0-cp38-abi3-macosx_10_7_x86_64.whl", hash = "sha256:1c86783df27926580f215472a2760fc8a6c39554a4156a33ac789f54eedcde0a"}, - {file = "polars-0.19.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d67cb0f5f9a0a6d62b3a0bb3d48e6a49680bbcf0f144ebcaf4a9ffbabb7c8f06"}, - {file = "polars-0.19.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:652b7f911784b4f9c3f9115873e94610268f1e89297477f35898222ff2ccad45"}, - {file = "polars-0.19.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bfebcd0fde831b749e8dc2dcb08913b7b1c0272f10af4e279933203c0635dbb"}, - {file = "polars-0.19.0-cp38-abi3-win_amd64.whl", hash = "sha256:1c194fe6722b5be1721b86f20ba5593ba31f8f04e7ba8e0219235e71e17eda3f"}, - {file = "polars-0.19.0.tar.gz", hash = "sha256:72c0306d2d39d7e24d4530d3977f5853c76efd48a341375ce1f37c62610cfc6a"}, + {file = "polars-0.19.3-cp38-abi3-macosx_10_7_x86_64.whl", hash = "sha256:cd407a847fe581af35dc4144420b9e6d6a639ddce4b5d2c6396719ad74140c40"}, + {file = "polars-0.19.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:2f033e8e4686bf02f923c18b679769bb5871f49b7c1e47a7c7071f272280477a"}, + {file = "polars-0.19.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43340deb657b8398ed2d972577756fb2431d64155cb9647881a35310d05be016"}, + {file = "polars-0.19.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d62122dca315e9ee0fcc52e58284c6d9d8c3163a420fd5a97441d5877746d76b"}, + {file = "polars-0.19.3-cp38-abi3-win_amd64.whl", hash = "sha256:e0990d8df05be5ff0ba2facd8ad7f33968e875f71aaf82d4924c23982434bd65"}, + {file = "polars-0.19.3.tar.gz", hash = "sha256:bef79f1742e6d1e7def1a4e664cafad7c406ff598c2b2b5867eff682920b2e7c"}, ] [package.extras] adbc = ["adbc_driver_sqlite"] -all = ["polars[adbc,cloudpickle,connectorx,deltalake,fsspec,matplotlib,numpy,pandas,pyarrow,pydantic,sqlalchemy,timezone,xlsx2csv,xlsxwriter]"] +all = ["polars[adbc,cloudpickle,connectorx,deltalake,fsspec,gevent,matplotlib,numpy,pandas,pyarrow,pydantic,sqlalchemy,timezone,xlsx2csv,xlsxwriter]"] cloudpickle = ["cloudpickle"] connectorx = ["connectorx"] deltalake = ["deltalake (>=0.10.0)"] fsspec = ["fsspec"] +gevent = ["gevent"] matplotlib = ["matplotlib"] numpy = ["numpy (>=1.16.0)"] +openpyxl = ["openpyxl (>=3.0.0)"] pandas = ["pandas", "pyarrow (>=7.0.0)"] pyarrow = ["pyarrow (>=7.0.0)"] pydantic = ["pydantic"] @@ -2909,6 +3028,53 @@ files = [ [package.extras] diagrams = ["jinja2", "railroad-diagrams"] +[[package]] +name = "pyproj" +version = "3.5.0" +description = "Python interface to PROJ (cartographic projections and coordinate transformations library)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyproj-3.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6475ce653880938468a1a1b7321267243909e34b972ba9e53d5982c41d555918"}, + {file = "pyproj-3.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61e4ad57d89b03a7b173793b31bca8ee110112cde1937ef0f42a70b9120c827d"}, + {file = "pyproj-3.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdd2021bb6f7f346bfe1d2a358aa109da017d22c4704af2d994e7c7ee0a7a53"}, + {file = "pyproj-3.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5674923351e76222e2c10c58b5e1ac119d7a46b270d822c463035971b06f724b"}, + {file = "pyproj-3.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd5e2b6aa255023c4acd0b977590f1f7cc801ba21b4d806fcf6dfac3474ebb83"}, + {file = "pyproj-3.5.0-cp310-cp310-win32.whl", hash = "sha256:6f316a66031a14e9c5a88c91f8b77aa97f5454895674541ed6ab630b682be35d"}, + {file = "pyproj-3.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:f7c2f4d9681e810cf40239caaca00079930a6d9ee6591139b88d592d36051d82"}, + {file = "pyproj-3.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7572983134e310e0ca809c63f1722557a040fe9443df5f247bf11ba887eb1229"}, + {file = "pyproj-3.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eccb417b91d0be27805dfc97550bfb8b7db94e9fe1db5ebedb98f5b88d601323"}, + {file = "pyproj-3.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:621d78a9d8bf4d06e08bef2471021fbcb1a65aa629ad4a20c22e521ce729cc20"}, + {file = "pyproj-3.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9a024370e917c899bff9171f03ea6079deecdc7482a146a2c565f3b9df134ea"}, + {file = "pyproj-3.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b7c2113c4d11184a238077ec85e31eda1dcc58ffeb9a4429830e0a7036e787d"}, + {file = "pyproj-3.5.0-cp311-cp311-win32.whl", hash = "sha256:a730f5b4c98c8a0f312437873e6e34dbd4cc6dc23d5afd91a6691c62724b1f68"}, + {file = "pyproj-3.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:e97573de0ab3bbbcb4c7748bc41f4ceb6da10b45d35b1a294b5820701e7c25f0"}, + {file = "pyproj-3.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2b708fd43453b985642b737d4a6e7f1d6a0ab1677ffa4e14cc258537b49224b0"}, + {file = "pyproj-3.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b60d93a200639e8367c6542a964fd0aa2dbd152f256c1831dc18cd5aa470fb8a"}, + {file = "pyproj-3.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38862fe07316ae12b79d82d298e390973a4f00b684f3c2d037238e20e00610ba"}, + {file = "pyproj-3.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b65f2a38cd9e16883dbb0f8ae82bdf8f6b79b1b02975c78483ab8428dbbf2f"}, + {file = "pyproj-3.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b752b7d9c4b08181c7e8c0d9c7f277cbefff42227f34d3310696a87c863d9dd3"}, + {file = "pyproj-3.5.0-cp38-cp38-win32.whl", hash = "sha256:b937215bfbaf404ec8f03ca741fc3f9f2c4c2c5590a02ccddddd820ae3c71331"}, + {file = "pyproj-3.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:97ed199033c2c770e7eea2ef80ff5e6413426ec2d7ec985b869792f04ab95d05"}, + {file = "pyproj-3.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:052c49fce8b5d55943a35c36ccecb87350c68b48ba95bc02a789770c374ef819"}, + {file = "pyproj-3.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1507138ea28bf2134d31797675380791cc1a7156a3aeda484e65a78a4aba9b62"}, + {file = "pyproj-3.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c02742ef3d846401861a878a61ef7ad911ea7539d6cc4619ddb52dbdf7b45aee"}, + {file = "pyproj-3.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:385b0341861d3ebc8cad98337a738821dcb548d465576527399f4955ca24b6ed"}, + {file = "pyproj-3.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fe6bb1b68a35d07378d38be77b5b2f8dd2bea5910c957bfcc7bee55988d3910"}, + {file = "pyproj-3.5.0-cp39-cp39-win32.whl", hash = "sha256:5c4b85ac10d733c42d73a2e6261c8d6745bf52433a31848dd1b6561c9a382da3"}, + {file = "pyproj-3.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:1798ff7d65d9057ebb2d017ffe8403268b8452f24d0428b2140018c25c7fa1bc"}, + {file = "pyproj-3.5.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d711517a8487ef3245b08dc82f781a906df9abb3b6cb0ce0486f0eeb823ca570"}, + {file = "pyproj-3.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:788a5dadb532644a64efe0f5f01bf508c821eb7e984f13a677d56002f1e8a67a"}, + {file = "pyproj-3.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73f7960a97225812f9b1d7aeda5fb83812f38de9441e3476fcc8abb3e2b2f4de"}, + {file = "pyproj-3.5.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fde5ece4d2436b5a57c8f5f97b49b5de06a856d03959f836c957d3e609f2de7e"}, + {file = "pyproj-3.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e08db25b61cf024648d55973cc3d1c3f1d0818fabf594d5f5a8e2318103d2aa0"}, + {file = "pyproj-3.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a87b419a2a352413fbf759ecb66da9da50bd19861c8f26db6a25439125b27b9"}, + {file = "pyproj-3.5.0.tar.gz", hash = "sha256:9859d1591c1863414d875ae0759e72c2cffc01ab989dc64137fbac572cc81bf6"}, +] + +[package.dependencies] +certifi = "*" + [[package]] name = "pysocks" version = "1.7.1" @@ -2923,13 +3089,13 @@ files = [ [[package]] name = "pytest" -version = "7.4.0" +version = "7.4.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, - {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, + {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, + {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, ] [package.dependencies] @@ -3130,103 +3296,119 @@ files = [ [[package]] name = "rapidfuzz" -version = "3.2.0" +version = "3.3.0" description = "rapid fuzzy string matching" optional = false python-versions = ">=3.7" files = [ - {file = "rapidfuzz-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f5787f1cc456207dee1902804209e1a90df67e88517213aeeb1b248822413b4c"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e8d91137b0b5a6ef06c3979b6302265129dee1741486b6baa241ac63a632bea7"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c130e73e0079f403b7c3dbf6f85816a3773971c3e639f7289f8b4337b8fd70fe"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e18059188bfe3cdbc3462aeec2fa3302b08717e04ca34e2cc6e02fb3c0280d8"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:37bb6bd6a79d5524f121ff2a7d7df4491519b3f43565dccd4596bd75aa73ab7c"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca0d6aee42effaf2e8883d2181196dd0957b1af5731b0763f10f994c32c823db"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49fc2cbbf05bfa1af3fe4c0e0c8e5c8ac118d6b6ddfb0081cff48ad53734f7ac"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd4fdee46f6ba7d254dba8e7e8f33012c964fc891a06b036b0fd20cab0db301"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ab2863732eafd1cc58f249f145c20ad13d4c902d3ef3a369b00438c05e5bfb55"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a9658c545de62ac948027092ba7f4e8507ebc5c9aef964eca654409c58f207f0"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:5f3e36cfadaf29f081ad4ca476e320b639d610e930e0557f395780c9b2bdb135"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:239ffc04328e14f5e4097102bd934352a43d5912acf34fb7d3e3fe306de92787"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b56ce39ba0a77501d491bc20a2266989ae0264452758b004950ee5f4c10c641f"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-win32.whl", hash = "sha256:dbebd639579ab113644699fe0c536ae00aba15b224e40a79987684333d1104a5"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:88e99229c4df99a7e5810d4d361033b44e29d8eb4faaddcfb8e4bdcb604cf40a"}, - {file = "rapidfuzz-3.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:8e39c4e2e85828aa6c39cc7f30e2917d991b40190a2a3af1fa02396a3362a54e"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2f2e618389427c5e8304357a78f83df22558e61f11bc21aeb95dd544c274d330"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a2a6babfe4d3ce2eadd0079ee7861cb5f1584845c5a3394edead85457e7d7464"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f223deb06895c9c136b40cd8fd7e96ee745c3bb9ed502d7367f6ad9ab6fdd40e"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0de6962b45f761355fa4b37de635e4df467d57530732a40d82e748a5bc911731"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76953516cb3b75fb1234c5a90e0b86be4525f055a9e276237adb1ffe40dca536"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1e04861dddbb477500449dc67fb037656a049b6f78c4c434c6000e64aa42bb4"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff6e725eec9c769f9d22126c80a6ada90275c0d693eca2b35d5933178bda5a2"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f21ce33242e579ba255c8a8b438782164acaa55bf188d9410298c40cbaa07d5"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:986a7aad18768b920bb710e15ed7629d1da0af31589348c0a51d152820efc05d"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6e98f0a6fac14b7b9893147deceae12131f6ff169ae1c973635ef97617949c8f"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5dd5c4b9f5cd8a8271a90d1bab643028e7172808c68ed5d8dde661a3e51098e3"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:e336b0a81c5a8e689edf6928136d19e791733a66509026d9acbaa148238186e0"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8fa44afb731535a803c4c15ee846257fef050768af96d1d6c0eadb30285d0f7b"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-win32.whl", hash = "sha256:d04ad155dbecc0c143912f691d38d4790e290c2ce5411b146c0e00d4f4afd26f"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:b9e79e27344af95a71a3bb6cd3562581da5d0780ff847a13ad69ee622d940d3c"}, - {file = "rapidfuzz-3.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:dc53747e73f34e8f3a3c1b0bc5b437b90a2c69d873e97781aa7c06543201409a"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:613c1043332eeba0c0910de71af221ac10d820b4fa9615b0083c733b90a757f9"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0907f87beca70e44f78e318eede2416ddba19ec43d28af9248617e8a1741ef3"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcfd184e0b5c58497cc3d961f49ac07ae1656d161c6c4d06230d267ae4e11f00"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a7d53a2f1ccfb169be26fa3824b1b185420592c75853f16c6b7115315ea6784"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2eac585803c4e8132ed5f4a150621db05c418304982c88cf706abdded65e1632"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc859f654b350def5df2ebc6d09f822b04399823e3dad1c3f2e8776c825fcde7"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8a165f64c528edc0bbbd09c76d64efd4dbe4240fd1961710b69586ef40486e79"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:56a392b655597ecf40535b56bfb7c0856c10c0abc0cbc369fd25a1665420710b"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:5863b176da42b1bb450a28375ef1502f81fbecd210a5aae295d7f2221284ad41"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:8f8590c39a3f745b314f2697b140c8f8600fe7ecfb2101e9e4ec6e7716c66827"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:da00990adf1fbc0904f22409b3451473fa465a0ef49f3075703c206080aa31b2"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:2504205552bf568ac478f17dd612d0e31c4a82c645c66209a442df7e572b5adc"}, - {file = "rapidfuzz-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:af3ac648232c109e36c8b941106d726969972644aa3ef55218c5988aa1daea03"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:04d22f6058ce5d620ec4ecd771e44cfa77d571137d6c6547df57bdfc44ee2a98"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac7ddcd372ed202d1b59b117506da695b291f135435cfbf3e71490aa8e687173"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd3fca0224b84350f73eab1fb5728c58fd25ee4f20e512607c7d83f9bc836d3f"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bdb1f92c4666c7e1d3c21268b931cf3f06f32af98dfdeb37641159b15fa31dd"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:871052405c465a45b53a3dc854a8be62079f42cdbb052651ff0b65e2452131e6"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb9bb1af5680741cf974f510fb3894907a1b308e819aff3d9ea10b5326e8a5f6"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84ce2e010677835fa5ba591419e4404f11a1446f33eec3724a2bff557ae5144a"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c13107e0fdca5ccae70659f45646d57453338a9dfc6b152fb7372e4bf73466a0"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:538027685a1a8f1699e329f6443951267f169bfa149298734ea679db8f0e7171"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3557736672115d082979a8a12f884ed5b24268f4471fee85cfb2ec7212b68607"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6bc5e3da74644cf75663f5b438e0ae79b67d1f96d082cda771b0ecfed0528f40"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:d2d0fc98d9d7bba44f929d201c2c2c35eb69ea2ffef43d939b297dafef934625"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2bf85a3bf34f27383691e8af0fd148b2a3a89f1444d4640d04ef58030f596ee0"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-win32.whl", hash = "sha256:cf5ea3f1d65a0bee707245a0096c3a6f769b3ad6f1b9afc7176dfb73eb0ac98f"}, - {file = "rapidfuzz-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:54906095444ea8b0a4013f3799b3f2c380205d7f60b9c55774e7d2264fa8d9c6"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6d44218823533e0d47770feef86c73c90a6f7e8d4923eafabf56a1fa3444eda0"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:87c3d4077e61c66d5dd11198a317f83db8e8cf034239baa16e4384037b611652"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc0e1142350566349c41173685988d942ebc89578f25ee27750d261e7d79e1ce"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de44a378751fdfb19ddf6af412b3395db4b21ab61f40139f815c82f1a1611b50"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca0983b30c7b289f540b11cdb550e301b3f2e8f0ef9df866aa24a16f6cd96041"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adfffb79288437006be412d74e28cddd7c5e6cc9f84a34aa9c356b13dc1ad2c9"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a284386652efb3b7d41ed5dd101ab4ce5936f585c52a47fa9838fc0342235700"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c546c83d6bc9006b86f56921b92c3e16d8ddeb4e1663653e755a5d8a3ac258da"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:53b3575fa398a5021192c1592dce98965560ad00690be3ade056eab99288562c"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:366ade5d0067dc6281e2a6c9e5c91bbfe023b09cef86894de8fe480b4696e3bf"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f946dec03cc2c77bc091d186c007d1e957d1f16a4d68a181f5fa75aea40bdf87"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:045e5cccb0e792005d5465de0ea4621b9b67778580e558f266984704e68b0087"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fd80288b9538c87209893f0934563c20b6a43acf30693794bcc111b294447ee9"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-win32.whl", hash = "sha256:a359436754ed5dd10d88706f076caa7f8e5c1469bf5ebba1897dc87aa9ff953e"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:75df3d9b895910ee810b2c96c8626cc2b5b63bb237762db36ff79fb466eccc43"}, - {file = "rapidfuzz-3.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:893833a903875a50acdbcb7ed33b5426ba47412bd18b3eb80d56d982b641dc59"}, - {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3002c3660180747243cccb40c95ade1960e6665b340f211a114f5994b345ab53"}, - {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa50de7e0f95e1400b2bf38cfeb6e40cf87c862537871c2f7b2050b5db0a9dfc"}, - {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54842a578a2a8e5258812a9032ffb55e6f1185490fd160cae64e57b4dc342297"}, - {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:108861623838cd574b0faa3309ce8525c2086159de7f9e23ac263a987c070ebd"}, - {file = "rapidfuzz-3.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d39128415f0b52be08c15eeee5f79288189933a4d6fa5dc5fff11e20614b7989"}, - {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3af2b75635f33ffab84e295773c84a176d4cba75311d836ad79b6795e9da11ac"}, - {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68c678f7f3ca3d83d1e1dd7fb7db3232037d9eef12a47f1d5fe248a76ca47571"}, - {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25d2bd257034e910df0951cdeff337dbd086d7d90af3ed9f6721e7bba9fc388a"}, - {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c7f20e68cad26fc140c6f2ac9e8f2632a0cd66e407ba3ea4ace63c669fd4719"}, - {file = "rapidfuzz-3.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f09fd9dc73180deb9ca1c4fbd9cc27378f0ab6ee74e97318c38c5080708702b6"}, - {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:af7914fc7683f921492f32314cfbe915a5376cc08a982e09084cbd9b866c9fd4"}, - {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08a242c4b909abbcfa44504dc5041d5eeca4cd088ae51afd6a52b4dc61684fa2"}, - {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b07afaca28398b93d727a2565491c455896898b66daee4664acde4af94e557"}, - {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24e4c4a031c50e4eeb4787263319a0ac5bed20f4a263d28eac060150e3ba0018"}, - {file = "rapidfuzz-3.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d19c2853a464c7b98cc408654412fd875b030f78023ccbefc4ba9eec754e07e7"}, - {file = "rapidfuzz-3.2.0.tar.gz", hash = "sha256:448d031d9960fea7826d42bd4284156fc68d3b55a6946eb34ca5c6acf960577b"}, + {file = "rapidfuzz-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6bec4903d4127d1eaa20a62105a03b38184ddaef40e18393caa1d98ae3de6a0c"}, + {file = "rapidfuzz-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2e6c4580b0de835156671390959efad13741d0fb35cc355bc546d1dbf399db5e"}, + {file = "rapidfuzz-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66b92484cc5ea1b546d2adef50407aa011df8c92fcc22ec9b9803eff2d917dcc"}, + {file = "rapidfuzz-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5103c8f4aca404d1db4ba65c393d85d8a78f2547ce7d4a434921a4a1383aa67"}, + {file = "rapidfuzz-3.3.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cf3d37e38e7a205758269cd8c8a2ae506214732ef2a82bb1ef01c695963b3f5"}, + {file = "rapidfuzz-3.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:efb8cc7da41926e4e68773afcdb2fa9bb6a32caefbc297c818526232a58ad5d7"}, + {file = "rapidfuzz-3.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8b22e1973009e89ac0e1ad157ff978a15021c2acddfa15371456ef58156aa47"}, + {file = "rapidfuzz-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:307c6b9e1e47afe9dc274e2e5bccb81be0941f90f395a38f77405f1d7216bc0a"}, + {file = "rapidfuzz-3.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:404b6bf53ac0b2b0b1f901f51953e04b758bf6905e1ee1cc29001b1cdfa55316"}, + {file = "rapidfuzz-3.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:dfccefebbda76796164f8ec6ec04999d635be2d86d83b09d703b8a1f312234c7"}, + {file = "rapidfuzz-3.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:4f77055d29ab2af3d3be16d50ecabb3ade6ea61bb1768b578f84cf558be5ef1a"}, + {file = "rapidfuzz-3.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7ea934a589a7b3d522cbc358e9f8bdf6fae38c65d35596b12616f78c1c3089ec"}, + {file = "rapidfuzz-3.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:536238d37c9918b235899cc0e330a45304ab3c25be963912b7a969b61bbb309f"}, + {file = "rapidfuzz-3.3.0-cp310-cp310-win32.whl", hash = "sha256:c7070a163017739bfaf4c8c31d66d347d7ab401c4bdb136b268508c24410aa58"}, + {file = "rapidfuzz-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:e45e5930d9f4f78f8d4b34baf4700f150b845cf8ed31bb2fb9149e29e07c6bb8"}, + {file = "rapidfuzz-3.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:783d082341785a832c65010a5dbba3f0c3d500f919edb25f076ddd5991fc8fba"}, + {file = "rapidfuzz-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:12fd4e7c7d8a58fc43a9fbbe76b577c599403174740160937f852be4e78734e7"}, + {file = "rapidfuzz-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a661302b2a93afd3cbeed7a2c43d671d65de1f503c129e745255507c8a91a24"}, + {file = "rapidfuzz-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ba3421dd0f5048403acdad536b451d59bccda7b050144928c07d5830af1fb127"}, + {file = "rapidfuzz-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b047aca009e7978a39b85f36a2ab3dbea2bec773d0cab739caa5c6c3e51fe051"}, + {file = "rapidfuzz-3.3.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed199d15bfac7a9692bba218f63d117b558f5e08d44c678e2bc9bb43931a701b"}, + {file = "rapidfuzz-3.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d91e0d03dce17d5e80fc3f12c0c1d1b304f1ad7c26e79e9378236772ab5de393"}, + {file = "rapidfuzz-3.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c72aafd9f4a83d504c898473e084548ddd3fb2b2eb56121513a13807544a8d6"}, + {file = "rapidfuzz-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:324bc1b508a32972bcf267d1fbf5fddf831da0bbb9c052ffaf733d0be30819f4"}, + {file = "rapidfuzz-3.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b8fd22c2fc3218614991abff75989a55ca9d99c50f69376457246515ce95e27d"}, + {file = "rapidfuzz-3.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8f5793a577570211f5dc9b08a9c53d9b7e649372a6dcb8756f3eb823504778eb"}, + {file = "rapidfuzz-3.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1370bb6decb505b7fee362ffd2f111ca0c369e62a35eac35386b87a8c8f29a38"}, + {file = "rapidfuzz-3.3.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:906ddf3902ac4537bf21b2140c9b089c5cf4b203fdba72b447d89d6e8137132b"}, + {file = "rapidfuzz-3.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb60f7d2bbdabcd41059ccb68a8aea2353f96147a8402fac6581391e7edf809a"}, + {file = "rapidfuzz-3.3.0-cp311-cp311-win32.whl", hash = "sha256:ab7b2c2cb65075d68a9c0f28513ce5154c6e7520fe13b76755971eb135138e74"}, + {file = "rapidfuzz-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:cae783ac3830a20fe32e80c53a406654d3a75b9b5d3351e81ac75ce470f24ad2"}, + {file = "rapidfuzz-3.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:f4b8fd0acbbddaf0d96c1f01e949d645073ad54f8fee1a59af6aa914340ae331"}, + {file = "rapidfuzz-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9558411d11dfcf85d4b080e0bc005114868e217c41f0a36cc13dc2c8ec91eacc"}, + {file = "rapidfuzz-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0965b30b84687107658cb6dc0852d1e14e2a80a93036320264128c8940643db7"}, + {file = "rapidfuzz-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5724ba0f4ac93ad43cc80407cbca2c598a36daf7f65c14279deaf3ad159f00ac"}, + {file = "rapidfuzz-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6467e0adfcb43b4d5bdd92a009cf7c8b952189b943c55050a9f1a8cd8180865"}, + {file = "rapidfuzz-3.3.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da5d006f329518eb797c9ed12e05bb8332663c3afa5d2a508032f64f7232766c"}, + {file = "rapidfuzz-3.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:343f863df7000f212156ed030196ed20215f5231ca54749228a5d6a317b626e8"}, + {file = "rapidfuzz-3.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:113fb1020be6f4727ecbd4fb29a510e14effe85910edf22cafb6c5d1eea75694"}, + {file = "rapidfuzz-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78e0d6d061835b16ad42df98fe826e4a0a3380621568f80c6ee2fa230d8d7020"}, + {file = "rapidfuzz-3.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:47ddf5d075e09d0baccc3d499c5eba36e2605771da65a6d95fcc72e22c5e36b9"}, + {file = "rapidfuzz-3.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bc354de84a2a56890a68a526b0d689dd010df1003794d24f222ee5ba6405d39d"}, + {file = "rapidfuzz-3.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:2a58279ee1595838dfc2b80562e0a89f6cb98b427c738b57ea146318604dba11"}, + {file = "rapidfuzz-3.3.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:f3b40aa31c7a970696967ff43d6d5bf3be4f6c008c9ad661cf8721af9c7c81fc"}, + {file = "rapidfuzz-3.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7437bfcef4b2b1417731293b97343cb45f1ca46ced381d511cd601ea41b8ab49"}, + {file = "rapidfuzz-3.3.0-cp312-cp312-win32.whl", hash = "sha256:bd6ec3ad3fa5a490dfce534bb87429c122faf6239c97d6c2763353ef61ddab08"}, + {file = "rapidfuzz-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:3ef0cf46d84bc307100f48212966e58f7a55c6045cb4ce9fb3e386313e0fc3a1"}, + {file = "rapidfuzz-3.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:cfa1345d5007efc1bdad6f40d2bbdc42fc83bb6b9fcb8cd3cc830180ccf360b9"}, + {file = "rapidfuzz-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fbafe4e45086b9245e12d97d0c4232e866a52469221acef05192bdb2a9b96a21"}, + {file = "rapidfuzz-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e053d10f01f06d0e10a8a229f2d82845f6d5ec13d67b6a6c11910f49f6e46b2"}, + {file = "rapidfuzz-3.3.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b2ca9583c9e0361144138f4884b59e7165daa56b5983f15bbc1441de3d548a9"}, + {file = "rapidfuzz-3.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1441d18aa459e72c5aeacf6ec140878c2ec6debdbbabfd68cd5968ac07ac9b2b"}, + {file = "rapidfuzz-3.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2de666fb4d3558847b229b4a06909557628a6a1fe5ccdc68e522eed90f442e6f"}, + {file = "rapidfuzz-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b632178ac063e8ad5b8d8bf051bd2436170c3822e865eab63e45a3289b80683"}, + {file = "rapidfuzz-3.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7f3da8741463e0345480e49d8bc89b83713d802c5c2851d590bd7ba1aaeace87"}, + {file = "rapidfuzz-3.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4839f1760c7d5e1f1d01230065a111773f2f78277df5d66a55902bdef77f3f93"}, + {file = "rapidfuzz-3.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:78641fecf74571d0f693cda9aaeb70db581c1df4f0ce6a9077b05558e7c5b6f5"}, + {file = "rapidfuzz-3.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5df1d384283aa2491ecdc23d00d3b2c2f1ed745f9ca42813b3e51e39a180f9b2"}, + {file = "rapidfuzz-3.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b13dc341f4deb2f599db3fe0ad52ab87f7bb1fc09911b4823ac618925fa400e0"}, + {file = "rapidfuzz-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:ca3c582e57df2407c5e07db26edb4ef19c2a7882ce2bf0fc1c5a6394986f84e5"}, + {file = "rapidfuzz-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:483299d57306c29a2bb1eb5d978f4d25a5e8d67ffee18b4155847bf9fc422b82"}, + {file = "rapidfuzz-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4671cd2e0d7e861b7c7aea8ed529b93e7ebec9ec4f6858cd72c395a99074826b"}, + {file = "rapidfuzz-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9bb2690f0d760ebfb4a943f51deb7b3d689b1fa7f87f8de1f005b19574f59259"}, + {file = "rapidfuzz-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8a1bba2aa6af58ff04e9fdde40747dfdb3f1bc836bbb86533e317f9a4b6a607d"}, + {file = "rapidfuzz-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a6f8edd755d29ac7a9804382780d4b383f494fed894514819932b9a484fa117"}, + {file = "rapidfuzz-3.3.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1eb377265e4d2f9e6c21a0adc865dddd52b1cd90ecd2552e99b386bb1effe38a"}, + {file = "rapidfuzz-3.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:319e67f8c1d7b9b45386821ace33edd289ec0995d80361775f5d6d15d684c6a6"}, + {file = "rapidfuzz-3.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9837f4528071e5dc695fb30098d9b49341e62fab32ef5c15094be260df1a48e4"}, + {file = "rapidfuzz-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29acfc446d091e723caa65e2a7e1b2d7669ac927d02effc5cc636bcd2f41bba5"}, + {file = "rapidfuzz-3.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:25704f21afa6fc767902e9d0b840623c008d28f58022904c282e26e4f38b770d"}, + {file = "rapidfuzz-3.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e5051c47a2a00b10c62b51bf1c4aefd2adb34d837b56fe16cfe505db7b7cc2be"}, + {file = "rapidfuzz-3.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a441e90ec5ac09746d3960221df1268e7a7f0b47978c388e7dcae83e23ae3462"}, + {file = "rapidfuzz-3.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e7f8056826ba8342f6d9c199750cddce70d1d90254320494115c26480fac44cc"}, + {file = "rapidfuzz-3.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:78c73efada660cc548d166f08970aeff0ee4dd0a66fa4f27bd24ac6c31551503"}, + {file = "rapidfuzz-3.3.0-cp38-cp38-win32.whl", hash = "sha256:9acd9cd547089b8835ac36223888a43bdfd2492064a8c5ee00cdaf6ef010de4b"}, + {file = "rapidfuzz-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:93bdb512798f8226cd4b785a73c70efa582f26a7287d55337b9216b384946494"}, + {file = "rapidfuzz-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5b8cdcf915c7058815321f2c0c30d20097722459bbb1fd2e1cae574bd03a39db"}, + {file = "rapidfuzz-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:376b87d6b7c83b6b2923f0916fea6fb7288ab66b1b1f3b0cc39e601bb09488cf"}, + {file = "rapidfuzz-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3363beb1da090be877e8a22ac6daefe8e0a6f6aeec10cebc4ec39db3abece897"}, + {file = "rapidfuzz-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1dbf0b3dcb5b9615ea5b90619eb5d7756c2d377770d53c4101ce728de53a8e"}, + {file = "rapidfuzz-3.3.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5c4628e165910aeb96099dd42822ad32819511c2a4061dbf62169302d7299f6e"}, + {file = "rapidfuzz-3.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f25757cb21df937daed9727b628435390ce86af7734cbb3b5c055a1c57ffb434"}, + {file = "rapidfuzz-3.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4aad090c40474f26578a968e4fbcc9418a4292201a3a0f96a2290465f5aaeec"}, + {file = "rapidfuzz-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ddf7a03740420bfae76ca5d86f934389729cc231285b669fd3d1c913b84005"}, + {file = "rapidfuzz-3.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:888c096f29f1dbfa6614ffc2780d2c766033e6c2906413d4d6d1f04e5cda05d7"}, + {file = "rapidfuzz-3.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2a62d1435ef7d897ac37c5975d1f672f5e73857eb183bec821a174ed937f53fb"}, + {file = "rapidfuzz-3.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ecc437ad773d40217e0a4704ee60002f7e699383dffbf576f41ed7ae6f4a8acc"}, + {file = "rapidfuzz-3.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e59462ea2f94c809fdea2426a7cd2fe219f171cc7d0dfdbc5681176f86884da4"}, + {file = "rapidfuzz-3.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:68484409517617feccac3092ec879d5630253890e6895ffbe7880f063329d114"}, + {file = "rapidfuzz-3.3.0-cp39-cp39-win32.whl", hash = "sha256:78abf9f6e3e60d4004f66085bf4618cb5480ca6155d39d17277db7d29388e49d"}, + {file = "rapidfuzz-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:56dec09e716fb12c9fa10649b5980e4bad9563b2b7dc74776618b84603740f6c"}, + {file = "rapidfuzz-3.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:3dfe9f4cdd9f9087f7bdd7c9f4e9304557ca8c44d4a1b1eca69230535e9ab2df"}, + {file = "rapidfuzz-3.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c089bf351657a16a31b911ddab3e2f19b04062f7c8244cea1ec5a40f490e0829"}, + {file = "rapidfuzz-3.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e737bd4f30917643c50694df1486ce1a5f869bbf523f38b867076a775ca1a00"}, + {file = "rapidfuzz-3.3.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68800fe792718b5b2a5ff7febbb6e4cc551ef767704873ec04062f642c9f5901"}, + {file = "rapidfuzz-3.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:557a736c8c6e01e2d844211eb4f6f7913f54a912f6578fdf8d72312ae906929c"}, + {file = "rapidfuzz-3.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e809367f75b1d65ea5524a6acfcc4dcced79f4f2d19dbad8f17175ad4864515b"}, + {file = "rapidfuzz-3.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2cc8ea602e030dd5a220e537cc6bbb241ecfe293614415076d8045dd198acd8"}, + {file = "rapidfuzz-3.3.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0861477cb2d21ed3e3a96a98adba6b24ecaaf50021991fdd72794f963a8f8e9"}, + {file = "rapidfuzz-3.3.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7fa079737a22e5b098545476be428a90635bf7c89bf3ea5587fa2d07645b1569"}, + {file = "rapidfuzz-3.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada0258e3d23518b74af2363bb4062cfe492ec0c7c4c752aff6cd084d6917830"}, + {file = "rapidfuzz-3.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:50b2b2b96b9c7841f6e2ab001153cd0bfcf707c427f20fed2f1f3849a99bd3fc"}, + {file = "rapidfuzz-3.3.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:062a5ed305a6d45798cf5548c780d4a434d1f188cc10b971c5c389d11fa356e7"}, + {file = "rapidfuzz-3.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18b51a2858e7adc950407bdb21382256d499472ba5c5d870eada0fa880d854eb"}, + {file = "rapidfuzz-3.3.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0f0b3587ee7dd0f8d96078c33ba88e583dab8834dd658b18df29cfced360cc6"}, + {file = "rapidfuzz-3.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f9a40cc64ef814ae60d567c3c9ad01ce92243a9ed6746b31bcddebc1ecc2284"}, + {file = "rapidfuzz-3.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cd254dc3436347a12e683c9d1984230228270009ff0985a38cbf5cbd25e8bc8c"}, + {file = "rapidfuzz-3.3.0.tar.gz", hash = "sha256:5e71bc5829f41e78b2d009431aedeb308ee3699d2bbbc68b7739db9b40bd1465"}, ] [package.extras] @@ -3331,17 +3513,16 @@ requests = ">=2.0.1,<3.0.0" [[package]] name = "rpy2" -version = "3.5.13" +version = "3.5.14" description = "Python interface to the R language (embedded R)" optional = false python-versions = ">=3.7" files = [ - {file = "rpy2-3.5.13-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:1748f56343be608558f2f40b43c2e8a9103af91e721b7f9617f10c86cc284dde"}, - {file = "rpy2-3.5.13-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:488f2ad3220275b7717073d561b22ebf29e4be4d26aed7f45e49b453ff08a640"}, - {file = "rpy2-3.5.13-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:5353f3ada4cb01245fbec03fdec326e68f32f032b19836154d95c56c7568fd50"}, - {file = "rpy2-3.5.13-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:f2eaf6910cf96cc812a34501f45d485ef8d1c36ed1a83955aa6691ea38a85216"}, - {file = "rpy2-3.5.13-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:11f9d68ed416f7802c7673f25796e49e9717a9e05f950277b90ad1e50fd95e42"}, - {file = "rpy2-3.5.13.tar.gz", hash = "sha256:41d037599f54336f54e754d82853fae06be9438d9fb3b514d90da74eaf328ddd"}, + {file = "rpy2-3.5.14-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cb7398adfcb6ca4faefbe856fb7af95eb11722ad18fbfcb4a79dbea1cf71c7c"}, + {file = "rpy2-3.5.14-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f35910208e5945b5108b7668bcb58127742f47fc0e8df8b2f4889c86be6f6519"}, + {file = "rpy2-3.5.14-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:adbd8e08f67f807fcca8e47473340e233a55c25fffd418081e6719316e03dbd7"}, + {file = "rpy2-3.5.14-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:ca95dee528d0a8032913de5fa85b8252b925f389aa2e2219d5314dcf43beeb1e"}, + {file = "rpy2-3.5.14.tar.gz", hash = "sha256:5f46ae31d36e117be366ad4ae02493c015ac6ba59ebe3b4cd7200075332fc481"}, ] [package.dependencies] @@ -3486,13 +3667,13 @@ scipy = ">=1.0" [[package]] name = "selenium" -version = "4.11.2" +version = "4.12.0" description = "" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "selenium-4.11.2-py3-none-any.whl", hash = "sha256:98e72117b194b3fa9c69b48998f44bf7dd4152c7bd98544911a1753b9f03cc7d"}, - {file = "selenium-4.11.2.tar.gz", hash = "sha256:9f9a5ed586280a3594f7461eb1d9dab3eac9d91e28572f365e9b98d9d03e02b5"}, + {file = "selenium-4.12.0-py3-none-any.whl", hash = "sha256:b2c48b1440db54a0653300d9955f5421390723d53b36ec835e18de8e13bbd401"}, + {file = "selenium-4.12.0.tar.gz", hash = "sha256:95be6aa449a0ab4ac1198bb9de71bbe9170405e04b9752f4b450dc7292a21828"}, ] [package.dependencies] @@ -3503,19 +3684,94 @@ urllib3 = {version = ">=1.26,<3", extras = ["socks"]} [[package]] name = "setuptools" -version = "68.1.2" +version = "68.2.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-68.1.2-py3-none-any.whl", hash = "sha256:3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b"}, - {file = "setuptools-68.1.2.tar.gz", hash = "sha256:3d4dfa6d95f1b101d695a6160a7626e15583af71a5f52176efa5d39a054d475d"}, + {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, + {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5,<=7.1.2)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "setuptools-scm" +version = "7.1.0" +description = "the blessed package to manage your versions by scm tags" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools_scm-7.1.0-py3-none-any.whl", hash = "sha256:73988b6d848709e2af142aa48c986ea29592bbcfca5375678064708205253d8e"}, + {file = "setuptools_scm-7.1.0.tar.gz", hash = "sha256:6c508345a771aad7d56ebff0e70628bf2b0ec7573762be9960214730de278f27"}, +] + +[package.dependencies] +packaging = ">=20.0" +setuptools = "*" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +typing-extensions = "*" + +[package.extras] +test = ["pytest (>=6.2)", "virtualenv (>20)"] +toml = ["setuptools (>=42)"] + +[[package]] +name = "shapely" +version = "2.0.1" +description = "Manipulation and analysis of geometric objects" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shapely-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b06d031bc64149e340448fea25eee01360a58936c89985cf584134171e05863f"}, + {file = "shapely-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9a6ac34c16f4d5d3c174c76c9d7614ec8fe735f8f82b6cc97a46b54f386a86bf"}, + {file = "shapely-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:865bc3d7cc0ea63189d11a0b1120d1307ed7a64720a8bfa5be2fde5fc6d0d33f"}, + {file = "shapely-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45b4833235b90bc87ee26c6537438fa77559d994d2d3be5190dd2e54d31b2820"}, + {file = "shapely-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce88ec79df55430e37178a191ad8df45cae90b0f6972d46d867bf6ebbb58cc4d"}, + {file = "shapely-2.0.1-cp310-cp310-win32.whl", hash = "sha256:01224899ff692a62929ef1a3f5fe389043e262698a708ab7569f43a99a48ae82"}, + {file = "shapely-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:da71de5bf552d83dcc21b78cc0020e86f8d0feea43e202110973987ffa781c21"}, + {file = "shapely-2.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:502e0a607f1dcc6dee0125aeee886379be5242c854500ea5fd2e7ac076b9ce6d"}, + {file = "shapely-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7d3bbeefd8a6a1a1017265d2d36f8ff2d79d0162d8c141aa0d37a87063525656"}, + {file = "shapely-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f470a130d6ddb05b810fc1776d918659407f8d025b7f56d2742a596b6dffa6c7"}, + {file = "shapely-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4641325e065fd3e07d55677849c9ddfd0cf3ee98f96475126942e746d55b17c8"}, + {file = "shapely-2.0.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90cfa4144ff189a3c3de62e2f3669283c98fb760cfa2e82ff70df40f11cadb39"}, + {file = "shapely-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70a18fc7d6418e5aea76ac55dce33f98e75bd413c6eb39cfed6a1ba36469d7d4"}, + {file = "shapely-2.0.1-cp311-cp311-win32.whl", hash = "sha256:09d6c7763b1bee0d0a2b84bb32a4c25c6359ad1ac582a62d8b211e89de986154"}, + {file = "shapely-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:d8f55f355be7821dade839df785a49dc9f16d1af363134d07eb11e9207e0b189"}, + {file = "shapely-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:83a8ec0ee0192b6e3feee9f6a499d1377e9c295af74d7f81ecba5a42a6b195b7"}, + {file = "shapely-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a529218e72a3dbdc83676198e610485fdfa31178f4be5b519a8ae12ea688db14"}, + {file = "shapely-2.0.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91575d97fd67391b85686573d758896ed2fc7476321c9d2e2b0c398b628b961c"}, + {file = "shapely-2.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8b0d834b11be97d5ab2b4dceada20ae8e07bcccbc0f55d71df6729965f406ad"}, + {file = "shapely-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:b4f0711cc83734c6fad94fc8d4ec30f3d52c1787b17d9dca261dc841d4731c64"}, + {file = "shapely-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:05c51a29336e604c084fb43ae5dbbfa2c0ef9bd6fedeae0a0d02c7b57a56ba46"}, + {file = "shapely-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b519cf3726ddb6c67f6a951d1bb1d29691111eaa67ea19ddca4d454fbe35949c"}, + {file = "shapely-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:193a398d81c97a62fc3634a1a33798a58fd1dcf4aead254d080b273efbb7e3ff"}, + {file = "shapely-2.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e55698e0ed95a70fe9ff9a23c763acfe0bf335b02df12142f74e4543095e9a9b"}, + {file = "shapely-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f32a748703e7bf6e92dfa3d2936b2fbfe76f8ce5f756e24f49ef72d17d26ad02"}, + {file = "shapely-2.0.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a34a23d6266ca162499e4a22b79159dc0052f4973d16f16f990baa4d29e58b6"}, + {file = "shapely-2.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d173d24e85e51510e658fb108513d5bc11e3fd2820db6b1bd0522266ddd11f51"}, + {file = "shapely-2.0.1-cp38-cp38-win32.whl", hash = "sha256:3cb256ae0c01b17f7bc68ee2ffdd45aebf42af8992484ea55c29a6151abe4386"}, + {file = "shapely-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:c7eed1fb3008a8a4a56425334b7eb82651a51f9e9a9c2f72844a2fb394f38a6c"}, + {file = "shapely-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ac1dfc397475d1de485e76de0c3c91cc9d79bd39012a84bb0f5e8a199fc17bef"}, + {file = "shapely-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:33403b8896e1d98aaa3a52110d828b18985d740cc9f34f198922018b1e0f8afe"}, + {file = "shapely-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2569a4b91caeef54dd5ae9091ae6f63526d8ca0b376b5bb9fd1a3195d047d7d4"}, + {file = "shapely-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a70a614791ff65f5e283feed747e1cc3d9e6c6ba91556e640636bbb0a1e32a71"}, + {file = "shapely-2.0.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c43755d2c46b75a7b74ac6226d2cc9fa2a76c3263c5ae70c195c6fb4e7b08e79"}, + {file = "shapely-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad81f292fffbd568ae71828e6c387da7eb5384a79db9b4fde14dd9fdeffca9a"}, + {file = "shapely-2.0.1-cp39-cp39-win32.whl", hash = "sha256:b50c401b64883e61556a90b89948297f1714dbac29243d17ed9284a47e6dd731"}, + {file = "shapely-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:bca57b683e3d94d0919e2f31e4d70fdfbb7059650ef1b431d9f4e045690edcd5"}, + {file = "shapely-2.0.1.tar.gz", hash = "sha256:66a6b1a3e72ece97fc85536a281476f9b7794de2e646ca8a4517e2e3c1446893"}, +] + +[package.dependencies] +numpy = ">=1.14" + +[package.extras] +docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] +test = ["pytest", "pytest-cov"] [[package]] name = "six" @@ -3552,13 +3808,13 @@ files = [ [[package]] name = "soupsieve" -version = "2.4.1" +version = "2.5" description = "A modern CSS selector implementation for Beautiful Soup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, - {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, ] [[package]] @@ -3733,13 +3989,13 @@ sortedcontainers = "*" [[package]] name = "trio-websocket" -version = "0.10.3" +version = "0.10.4" description = "WebSocket library for Trio" optional = false python-versions = ">=3.7" files = [ - {file = "trio-websocket-0.10.3.tar.gz", hash = "sha256:1a748604ad906a7dcab9a43c6eb5681e37de4793ba0847ef0bc9486933ed027b"}, - {file = "trio_websocket-0.10.3-py3-none-any.whl", hash = "sha256:a9937d48e8132ebf833019efde2a52ca82d223a30a7ea3e8d60a7d28f75a4e3a"}, + {file = "trio-websocket-0.10.4.tar.gz", hash = "sha256:e66b3db3e2453017431dfbd352081006654e1241c2a6800dc2f43d7df54d55c5"}, + {file = "trio_websocket-0.10.4-py3-none-any.whl", hash = "sha256:c7a620c4013c34b7e4477d89fe76695da1e455e4510a8d7ae13f81c632bdce1d"}, ] [package.dependencies] @@ -3851,13 +4107,13 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.24.4" +version = "20.24.5" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.4-py3-none-any.whl", hash = "sha256:29c70bb9b88510f6414ac3e55c8b413a1f96239b6b789ca123437d5e892190cb"}, - {file = "virtualenv-20.24.4.tar.gz", hash = "sha256:772b05bfda7ed3b8ecd16021ca9716273ad9f4467c801f27e83ac73430246dca"}, + {file = "virtualenv-20.24.5-py3-none-any.whl", hash = "sha256:b80039f280f4919c77b30f1c23294ae357c4c8701042086e3fc005963e4e537b"}, + {file = "virtualenv-20.24.5.tar.gz", hash = "sha256:e8361967f6da6fbdf1426483bfe9fca8287c242ac0bc30429905721cefbff752"}, ] [package.dependencies] @@ -4057,4 +4313,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "be55ea7e2f7f43848079b0bb8afc6c49cb77e9ce3caa4dba1f45abc661fdf696" +content-hash = "5bfd6f1711f3ff26b94f4f7eaa9256c08c3dc4e9e3c0717367474a390545c644" From 104fb3bb673bc258aa8581ef064fd68f11036fd7 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Sat, 16 Sep 2023 07:05:01 -0300 Subject: [PATCH 231/265] converte na hr certa --- pipelines/datasets/br_denatran_frota/handlers.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index c5948dc72..678922767 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -157,6 +157,8 @@ def get_latest_data(table_name: str): log(denatran_data.head(2)) year = denatran_data["ano"].max() month = denatran_data.loc[denatran_data["ano"] == year]["mes"].max() + year = int(year) + month = int(month) log(year) log(type(year)) log(month) From dafcdc8a17dc5f35e5dca86bb2aa8f1313e4cec4 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Fri, 22 Sep 2023 02:50:56 -0300 Subject: [PATCH 232/265] Meu deus cara --- pipelines/datasets/br_denatran_frota/backfill.py | 10 ++++++++++ pipelines/datasets/br_denatran_frota/run.py | 4 ---- 2 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 pipelines/datasets/br_denatran_frota/backfill.py delete mode 100644 pipelines/datasets/br_denatran_frota/run.py diff --git a/pipelines/datasets/br_denatran_frota/backfill.py b/pipelines/datasets/br_denatran_frota/backfill.py new file mode 100644 index 000000000..ad8739398 --- /dev/null +++ b/pipelines/datasets/br_denatran_frota/backfill.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +from pipelines.datasets.br_denatran_frota.handlers import crawl, get_desired_file +from pipelines.datasets.br_denatran_frota.constants import constants + +months = range(1, 13) +year = 2003 +for month in months: + print(month) + crawl(month=month, year=year, temp_dir="DENATRAN_FILES") + get_desired_file(year=year, download_directory=constants.DOWNLOAD_PATH.value) diff --git a/pipelines/datasets/br_denatran_frota/run.py b/pipelines/datasets/br_denatran_frota/run.py deleted file mode 100644 index 47e6b3ca5..000000000 --- a/pipelines/datasets/br_denatran_frota/run.py +++ /dev/null @@ -1,4 +0,0 @@ -# -*- coding: utf-8 -*- -from flows import br_denatran_frota_municipio_tipo - -br_denatran_frota_municipio_tipo.run() From e1014942936028ef623fd9bbed18ccdf7687b67f Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Fri, 22 Sep 2023 02:54:45 -0300 Subject: [PATCH 233/265] =?UTF-8?q?Eu=20s=C3=B3=20quero=20que=20isso=20n?= =?UTF-8?q?=C3=A3o=20rode=20agora=20como=20parece?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pipelines/datasets/br_denatran_frota/flows.py | 436 +++++++++--------- 1 file changed, 218 insertions(+), 218 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index d23f80558..93b87405a 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -1,219 +1,219 @@ # -*- coding: utf-8 -*- -""" -Flows for br_denatran_frota -""" - - -from datetime import datetime, timedelta -from prefect.run_configs import KubernetesRun -from prefect.storage import GCS -from prefect import Parameter, case, unmapped -from prefect.tasks.prefect import ( - create_flow_run, - wait_for_flow_run, -) -import os -from pipelines.constants import constants as pipelines_constants -from pipelines.utils.constants import constants as utils_constants - -from pipelines.utils.decorators import Flow -from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants -from pipelines.utils.tasks import ( - create_table_and_upload_to_gcs, - rename_current_flow_run_dataset_table, - get_current_flow_labels, -) -from pipelines.datasets.br_denatran_frota.tasks import ( - crawl_task, - treat_uf_tipo_task, - output_file_to_csv_task, - get_desired_file_task, - treat_municipio_tipo_task, - get_latest_data_task, -) -from pipelines.datasets.br_denatran_frota.constants import constants -from itertools import product - -year_range = list(range(2003, 2023)) -month_range = list(range(1, 13)) -date_pairs = list(product(year_range, month_range)) - -date_pairs_param: list[tuple] = Parameter("date_pairs", default=date_pairs) - -# from pipelines.datasets.br_denatran_frota.schedules import every_two_weeks - -with Flow( - name="br_denatran_frota.uf_tipo", - code_owners=[ - "Tamir", - ], -) as br_denatran_frota_uf_tipo: - dataset_id = Parameter("dataset_id", default="br_denatran_frota") - table_id = Parameter("table_id", default="uf_tipo") - - # Materialization mode - materialization_mode = Parameter( - "materialization_mode", default="dev", required=False - ) - - materialize_after_dump = Parameter( - "materialize after dump", default=False, required=False - ) - - dbt_alias = Parameter("dbt_alias", default=True, required=False) - rename_flow_run = rename_current_flow_run_dataset_table( - prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id - ) - - year_to_fetch = get_latest_data_task("uf_tipo") - crawled = crawl_task( - month=year_to_fetch[1], - year=year_to_fetch[0], - temp_dir=constants.DOWNLOAD_PATH.value, - upstream_tasks=[year_to_fetch], - ) - # Now get the downloaded file: - municipio_tipo_file = get_desired_file_task( - year=year_to_fetch[0], - download_directory=constants.DOWNLOAD_PATH.value, - filetype=constants.UF_TIPO_BASIC_FILENAME.value, - upstream_tasks=[crawled], - ) - df = treat_uf_tipo_task( - file=municipio_tipo_file, upstream_tasks=[crawled, municipio_tipo_file] - ) - csv_output = output_file_to_csv_task( - df, constants.UF_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] - ) - wait_upload_table = create_table_and_upload_to_gcs( - data_path=csv_output, - dataset_id=dataset_id, - table_id=table_id, - dump_mode="append", - wait=csv_output, - ) - - with case(materialize_after_dump, True): - # Trigger DBT flow run - current_flow_labels = get_current_flow_labels() - materialization_flow = create_flow_run( - flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, - project_name=pipelines_constants.PREFECT_DEFAULT_PROJECT.value, - parameters={ - "dataset_id": dataset_id, - "table_id": table_id, - "mode": materialization_mode, - "dbt_alias": dbt_alias, - }, - labels=current_flow_labels, - run_name=f"Materialize {dataset_id}.{table_id}", - ) - wait_for_materialization = wait_for_flow_run( - materialization_flow, - stream_states=True, - stream_logs=True, - raise_final_state=True, - ) - wait_for_materialization.max_retries = ( - dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value - ) - wait_for_materialization.retry_delay = timedelta( - seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value - ) - - -br_denatran_frota_uf_tipo.storage = GCS(pipelines_constants.GCS_FLOWS_BUCKET.value) -br_denatran_frota_uf_tipo.run_config = KubernetesRun( - image=pipelines_constants.DOCKER_IMAGE.value -) -# flow.schedule = every_two_weeks - - -with Flow( - name="br_denatran_frota.municipio_tipo", - code_owners=[ - "Tamir", - ], -) as br_denatran_frota_municipio_tipo: - dataset_id = Parameter("dataset_id", default="br_denatran_frota") - table_id = Parameter("table_id", default="municipio_tipo") - - # Materialization mode - materialization_mode = Parameter( - "materialization_mode", default="dev", required=False - ) - - materialize_after_dump = Parameter( - "materialize after dump", default=False, required=False - ) - - dbt_alias = Parameter("dbt_alias", default=True, required=False) - - rename_flow_run = rename_current_flow_run_dataset_table( - prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id - ) - year_to_fetch = get_latest_data_task("municipio_tipo") - crawled = crawl_task( - month=year_to_fetch[1], - year=year_to_fetch[0], - temp_dir=constants.DOWNLOAD_PATH.value, - upstream_tasks=[year_to_fetch], - ) - # Now get the downloaded file: - municipio_tipo_file = get_desired_file_task( - year=year_to_fetch[0], - download_directory=constants.DOWNLOAD_PATH.value, - filetype=constants.MUNIC_TIPO_BASIC_FILENAME.value, - upstream_tasks=[crawled], - ) - df = treat_municipio_tipo_task( - file=municipio_tipo_file, upstream_tasks=[crawled, municipio_tipo_file] - ) - csv_output = output_file_to_csv_task( - df, constants.MUNIC_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] - ) - wait_upload_table = create_table_and_upload_to_gcs( - data_path=csv_output, - dataset_id=dataset_id, - table_id=table_id, - dump_mode="append", - wait=csv_output, - ) - - with case(materialize_after_dump, True): - # Trigger DBT flow run - current_flow_labels = get_current_flow_labels() - materialization_flow = create_flow_run( - flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, - project_name=pipelines_constants.PREFECT_DEFAULT_PROJECT.value, - parameters={ - "dataset_id": dataset_id, - "table_id": table_id, - "mode": materialization_mode, - "dbt_alias": dbt_alias, - }, - labels=current_flow_labels, - run_name=f"Materialize {dataset_id}.{table_id}", - ) - - wait_for_materialization = wait_for_flow_run( - materialization_flow, - stream_states=True, - stream_logs=True, - raise_final_state=True, - ) - wait_for_materialization.max_retries = ( - dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value - ) - wait_for_materialization.retry_delay = timedelta( - seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value - ) - - -br_denatran_frota_municipio_tipo.storage = GCS( - pipelines_constants.GCS_FLOWS_BUCKET.value -) -br_denatran_frota_municipio_tipo.run_config = KubernetesRun( - image=pipelines_constants.DOCKER_IMAGE.value -) -# flow.schedule = every_two_weeks +# """ +# Flows for br_denatran_frota +# """ + + +# from datetime import datetime, timedelta +# from prefect.run_configs import KubernetesRun +# from prefect.storage import GCS +# from prefect import Parameter, case, unmapped +# from prefect.tasks.prefect import ( +# create_flow_run, +# wait_for_flow_run, +# ) +# import os +# from pipelines.constants import constants as pipelines_constants +# from pipelines.utils.constants import constants as utils_constants + +# from pipelines.utils.decorators import Flow +# from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants +# from pipelines.utils.tasks import ( +# create_table_and_upload_to_gcs, +# rename_current_flow_run_dataset_table, +# get_current_flow_labels, +# ) +# from pipelines.datasets.br_denatran_frota.tasks import ( +# crawl_task, +# treat_uf_tipo_task, +# output_file_to_csv_task, +# get_desired_file_task, +# treat_municipio_tipo_task, +# get_latest_data_task, +# ) +# from pipelines.datasets.br_denatran_frota.constants import constants +# from itertools import product + +# year_range = list(range(2003, 2023)) +# month_range = list(range(1, 13)) +# date_pairs = list(product(year_range, month_range)) + +# date_pairs_param: list[tuple] = Parameter("date_pairs", default=date_pairs) + +# # from pipelines.datasets.br_denatran_frota.schedules import every_two_weeks + +# with Flow( +# name="br_denatran_frota.uf_tipo", +# code_owners=[ +# "Tamir", +# ], +# ) as br_denatran_frota_uf_tipo: +# dataset_id = Parameter("dataset_id", default="br_denatran_frota") +# table_id = Parameter("table_id", default="uf_tipo") + +# # Materialization mode +# materialization_mode = Parameter( +# "materialization_mode", default="dev", required=False +# ) + +# materialize_after_dump = Parameter( +# "materialize after dump", default=False, required=False +# ) + +# dbt_alias = Parameter("dbt_alias", default=True, required=False) +# rename_flow_run = rename_current_flow_run_dataset_table( +# prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id +# ) + +# year_to_fetch = get_latest_data_task("uf_tipo") +# crawled = crawl_task( +# month=year_to_fetch[1], +# year=year_to_fetch[0], +# temp_dir=constants.DOWNLOAD_PATH.value, +# upstream_tasks=[year_to_fetch], +# ) +# # Now get the downloaded file: +# municipio_tipo_file = get_desired_file_task( +# year=year_to_fetch[0], +# download_directory=constants.DOWNLOAD_PATH.value, +# filetype=constants.UF_TIPO_BASIC_FILENAME.value, +# upstream_tasks=[crawled], +# ) +# df = treat_uf_tipo_task( +# file=municipio_tipo_file, upstream_tasks=[crawled, municipio_tipo_file] +# ) +# csv_output = output_file_to_csv_task( +# df, constants.UF_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] +# ) +# wait_upload_table = create_table_and_upload_to_gcs( +# data_path=csv_output, +# dataset_id=dataset_id, +# table_id=table_id, +# dump_mode="append", +# wait=csv_output, +# ) + +# with case(materialize_after_dump, True): +# # Trigger DBT flow run +# current_flow_labels = get_current_flow_labels() +# materialization_flow = create_flow_run( +# flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, +# project_name=pipelines_constants.PREFECT_DEFAULT_PROJECT.value, +# parameters={ +# "dataset_id": dataset_id, +# "table_id": table_id, +# "mode": materialization_mode, +# "dbt_alias": dbt_alias, +# }, +# labels=current_flow_labels, +# run_name=f"Materialize {dataset_id}.{table_id}", +# ) +# wait_for_materialization = wait_for_flow_run( +# materialization_flow, +# stream_states=True, +# stream_logs=True, +# raise_final_state=True, +# ) +# wait_for_materialization.max_retries = ( +# dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value +# ) +# wait_for_materialization.retry_delay = timedelta( +# seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value +# ) + + +# br_denatran_frota_uf_tipo.storage = GCS(pipelines_constants.GCS_FLOWS_BUCKET.value) +# br_denatran_frota_uf_tipo.run_config = KubernetesRun( +# image=pipelines_constants.DOCKER_IMAGE.value +# ) +# # flow.schedule = every_two_weeks + + +# with Flow( +# name="br_denatran_frota.municipio_tipo", +# code_owners=[ +# "Tamir", +# ], +# ) as br_denatran_frota_municipio_tipo: +# dataset_id = Parameter("dataset_id", default="br_denatran_frota") +# table_id = Parameter("table_id", default="municipio_tipo") + +# # Materialization mode +# materialization_mode = Parameter( +# "materialization_mode", default="dev", required=False +# ) + +# materialize_after_dump = Parameter( +# "materialize after dump", default=False, required=False +# ) + +# dbt_alias = Parameter("dbt_alias", default=True, required=False) + +# rename_flow_run = rename_current_flow_run_dataset_table( +# prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id +# ) +# year_to_fetch = get_latest_data_task("municipio_tipo") +# crawled = crawl_task( +# month=year_to_fetch[1], +# year=year_to_fetch[0], +# temp_dir=constants.DOWNLOAD_PATH.value, +# upstream_tasks=[year_to_fetch], +# ) +# # Now get the downloaded file: +# municipio_tipo_file = get_desired_file_task( +# year=year_to_fetch[0], +# download_directory=constants.DOWNLOAD_PATH.value, +# filetype=constants.MUNIC_TIPO_BASIC_FILENAME.value, +# upstream_tasks=[crawled], +# ) +# df = treat_municipio_tipo_task( +# file=municipio_tipo_file, upstream_tasks=[crawled, municipio_tipo_file] +# ) +# csv_output = output_file_to_csv_task( +# df, constants.MUNIC_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] +# ) +# wait_upload_table = create_table_and_upload_to_gcs( +# data_path=csv_output, +# dataset_id=dataset_id, +# table_id=table_id, +# dump_mode="append", +# wait=csv_output, +# ) + +# with case(materialize_after_dump, True): +# # Trigger DBT flow run +# current_flow_labels = get_current_flow_labels() +# materialization_flow = create_flow_run( +# flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, +# project_name=pipelines_constants.PREFECT_DEFAULT_PROJECT.value, +# parameters={ +# "dataset_id": dataset_id, +# "table_id": table_id, +# "mode": materialization_mode, +# "dbt_alias": dbt_alias, +# }, +# labels=current_flow_labels, +# run_name=f"Materialize {dataset_id}.{table_id}", +# ) + +# wait_for_materialization = wait_for_flow_run( +# materialization_flow, +# stream_states=True, +# stream_logs=True, +# raise_final_state=True, +# ) +# wait_for_materialization.max_retries = ( +# dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value +# ) +# wait_for_materialization.retry_delay = timedelta( +# seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value +# ) + + +# br_denatran_frota_municipio_tipo.storage = GCS( +# pipelines_constants.GCS_FLOWS_BUCKET.value +# ) +# br_denatran_frota_municipio_tipo.run_config = KubernetesRun( +# image=pipelines_constants.DOCKER_IMAGE.value +# ) +# # flow.schedule = every_two_weeks From 0cfa89a6bab2f2680b21211b3f61d66cb666211b Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Fri, 22 Sep 2023 02:59:33 -0300 Subject: [PATCH 234/265] =?UTF-8?q?Tem=20algo=20rodando=20autom=C3=A1tico?= =?UTF-8?q?=20e=20eu=20cansei?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pipelines/datasets/br_denatran_frota/backfill.py | 7 ++++++- pipelines/datasets/br_denatran_frota/handlers.py | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/backfill.py b/pipelines/datasets/br_denatran_frota/backfill.py index ad8739398..b574ef739 100644 --- a/pipelines/datasets/br_denatran_frota/backfill.py +++ b/pipelines/datasets/br_denatran_frota/backfill.py @@ -2,9 +2,14 @@ from pipelines.datasets.br_denatran_frota.handlers import crawl, get_desired_file from pipelines.datasets.br_denatran_frota.constants import constants +# Fill for UF TIPO months = range(1, 13) year = 2003 for month in months: print(month) crawl(month=month, year=year, temp_dir="DENATRAN_FILES") - get_desired_file(year=year, download_directory=constants.DOWNLOAD_PATH.value) + file = get_desired_file( + year=year, + download_directory=constants.DOWNLOAD_PATH.value, + filetype=constants.UF_TIPO_BASIC_FILENAME.value, + ) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 678922767..b7627ce41 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -58,7 +58,7 @@ def crawl(month: int, year: int, temp_dir: str = "") -> None: log("Downloading file") files_dir = os.path.join(temp_dir, "files") make_dir_when_not_exists(files_dir) - year_dir_name = os.path.join(files_dir, f"{year}") + year_dir_name = os.path.join(files_dir, f"{year}/{month}") make_dir_when_not_exists(year_dir_name) if year > 2012: files_to_download = extract_links_post_2012(month, year, year_dir_name) From af9bebc0c902b4492c621a91734200cd86dfc726 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Fri, 22 Sep 2023 03:24:14 -0300 Subject: [PATCH 235/265] Seguro morreu de velho --- pipelines/datasets/br_denatran_frota/backfill.py | 3 ++- pipelines/datasets/br_denatran_frota/utils.py | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/backfill.py b/pipelines/datasets/br_denatran_frota/backfill.py index b574ef739..9a4856720 100644 --- a/pipelines/datasets/br_denatran_frota/backfill.py +++ b/pipelines/datasets/br_denatran_frota/backfill.py @@ -10,6 +10,7 @@ crawl(month=month, year=year, temp_dir="DENATRAN_FILES") file = get_desired_file( year=year, - download_directory=constants.DOWNLOAD_PATH.value, + download_directory=f"DENATRAN_FILES/{year}/{month}", filetype=constants.UF_TIPO_BASIC_FILENAME.value, ) + print(file) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index e8e591394..65f8c3a74 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -433,6 +433,8 @@ def extraction_pre_2012(month: int, year: int, year_dir_name: str, zip_file: str zip_file (str): _description_ """ # Aí depois eu preciso andar pelo zip: + if not zip_file.endswith(".zip"): + return with ZipFile(zip_file, "r") as g: compressed_files = [file for file in g.infolist() if not file.is_dir()] new_filename = None From 5bd07ec722d8d7f4c7cb435808c00ebeff9b3ac8 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Fri, 22 Sep 2023 03:28:55 -0300 Subject: [PATCH 236/265] Acho que isso segura --- pipelines/datasets/br_denatran_frota/backfill.py | 2 +- pipelines/datasets/br_denatran_frota/handlers.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/backfill.py b/pipelines/datasets/br_denatran_frota/backfill.py index 9a4856720..7c0f23a63 100644 --- a/pipelines/datasets/br_denatran_frota/backfill.py +++ b/pipelines/datasets/br_denatran_frota/backfill.py @@ -10,7 +10,7 @@ crawl(month=month, year=year, temp_dir="DENATRAN_FILES") file = get_desired_file( year=year, - download_directory=f"DENATRAN_FILES/{year}/{month}", + download_directory="DENATRAN_FILES", filetype=constants.UF_TIPO_BASIC_FILENAME.value, ) print(file) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index b7627ce41..678922767 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -58,7 +58,7 @@ def crawl(month: int, year: int, temp_dir: str = "") -> None: log("Downloading file") files_dir = os.path.join(temp_dir, "files") make_dir_when_not_exists(files_dir) - year_dir_name = os.path.join(files_dir, f"{year}/{month}") + year_dir_name = os.path.join(files_dir, f"{year}") make_dir_when_not_exists(year_dir_name) if year > 2012: files_to_download = extract_links_post_2012(month, year, year_dir_name) From 06561f3bcd95f22dde3e0a82d6458ed72cea7400 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Tue, 26 Sep 2023 17:49:16 -0300 Subject: [PATCH 237/265] OK --- .../datasets/br_denatran_frota/backfill.py | 33 ++++++++++++------- .../datasets/br_denatran_frota/handlers.py | 3 +- pipelines/datasets/br_denatran_frota/utils.py | 19 ++++++++--- 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/backfill.py b/pipelines/datasets/br_denatran_frota/backfill.py index 7c0f23a63..3f2175169 100644 --- a/pipelines/datasets/br_denatran_frota/backfill.py +++ b/pipelines/datasets/br_denatran_frota/backfill.py @@ -1,16 +1,27 @@ # -*- coding: utf-8 -*- -from pipelines.datasets.br_denatran_frota.handlers import crawl, get_desired_file +from pipelines.datasets.br_denatran_frota.handlers import ( + crawl, + treat_uf_tipo, + get_desired_file, + output_file_to_csv, +) from pipelines.datasets.br_denatran_frota.constants import constants # Fill for UF TIPO months = range(1, 13) -year = 2003 -for month in months: - print(month) - crawl(month=month, year=year, temp_dir="DENATRAN_FILES") - file = get_desired_file( - year=year, - download_directory="DENATRAN_FILES", - filetype=constants.UF_TIPO_BASIC_FILENAME.value, - ) - print(file) +years = range(2003, 2023) +for year in years: + for month in months: + print(month) + crawl(month=month, year=year, temp_dir="DENATRAN_FILES") + file = get_desired_file( + year=year, + download_directory="DENATRAN_FILES", + filetype=f"{constants.UF_TIPO_BASIC_FILENAME.value}_{month}", + ) + if year == 2004 and month == 3: + breakpoint() + df = treat_uf_tipo(file=file) + path = output_file_to_csv( + df=df, filename=constants.UF_TIPO_BASIC_FILENAME.value + ) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 678922767..edac9a51e 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -24,6 +24,7 @@ get_data_from_prod, DenatranType, ) + import pandas as pd import polars as pl from string_utils import asciify @@ -37,7 +38,7 @@ MONTHS = constants.MONTHS.value DATASET = constants.DATASET.value DICT_UFS = constants.DICT_UFS.value -OUTPUT_PATH = constants.OUTPUT_PATH.value +OUTPUT_PATH = "DENATRAN_FILES" MONTHS_SHORT = constants.MONTHS_SHORT.value UF_TIPO_BASIC_FILENAME = constants.UF_TIPO_BASIC_FILENAME.value MUNIC_TIPO_BASIC_FILENAME = constants.MUNIC_TIPO_BASIC_FILENAME.value diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 65f8c3a74..9522c82ca 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -61,6 +61,12 @@ def guess_header( expected_header = MUNICIPIO_TIPO_HEADER else: raise ValueError("Unrecognized type of dataframe.") + current_header = [c for c in df.columns] + equal_column_names = [ + (x, y) for x, y in zip(expected_header, current_header) if x == y + ] + if len(equal_column_names) / len(expected_header) >= 0.6: + return -1 header_guess = 0 while header_guess < max_header_guess: if len(df) - 1 < header_guess: @@ -90,6 +96,8 @@ def change_df_header(df: pd.DataFrame, header_row: int) -> pd.DataFrame: Returns: pd.DataFrame: Returns the same dataframe but with the corrected header """ + if header_row == -1: + return df new_header = df.iloc[header_row] new_df = df[(header_row + 1) :].reset_index(drop=True) new_df.rename(columns=new_header, inplace=True) @@ -480,11 +488,11 @@ def call_r_to_read_excel(file: str) -> pd.DataFrame: """ if not os.path.isfile(file): raise ValueError("Invalid file") - packages = ("readxl",) - r_utils = rpackages.importr("utils", suppress_messages=True) - r_utils.chooseCRANmirror(ind=1) - r_utils.install_packages(StrVector(packages)) - rpackages.importr("readxl", suppress_messages=True) + # packages = ("readxl",) + # r_utils = rpackages.importr("utils", suppress_messages=True) + # r_utils.chooseCRANmirror(ind=1) + # r_utils.install_packages(StrVector(packages)) + # rpackages.importr("readxl", lib_loc="usr/lib/R/library", suppress_messages=True) # Read the Excel file robjects.r( @@ -499,6 +507,7 @@ def call_r_to_read_excel(file: str) -> pd.DataFrame: ) # Convert the R dataframe to a pandas dataframe df = robjects.r["df"] + df = pd.DataFrame(dict(zip(df.names, list(df)))) return df From b7f00abfb7180a296f48d0d24f5ef61fe5c6bfc9 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Wed, 27 Sep 2023 13:57:30 -0300 Subject: [PATCH 238/265] pronto --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 7665019ad..0c847e57d 100644 --- a/.gitignore +++ b/.gitignore @@ -155,3 +155,4 @@ notebooks/ .DS_Store +/DENATRAN_FILES \ No newline at end of file From 736722a821adac906cdb12bbbaefe39ea756b02b Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Fri, 29 Sep 2023 01:29:48 -0300 Subject: [PATCH 239/265] solucao --- pipelines/datasets/br_denatran_frota/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 9522c82ca..a93c29b54 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -445,8 +445,9 @@ def extraction_pre_2012(month: int, year: int, year_dir_name: str, zip_file: str return with ZipFile(zip_file, "r") as g: compressed_files = [file for file in g.infolist() if not file.is_dir()] - new_filename = None + for file in compressed_files: + new_filename = None filename = file.filename.split("/")[-1] if re.search("Tipo", filename, re.IGNORECASE) or re.search( r"Tipo[-\s]UF", zip_file.split("/")[-1] From 87ee5632a5818641c609aa2693ad05e17eac15a4 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Sun, 29 Oct 2023 18:27:37 -0300 Subject: [PATCH 240/265] Bugged data --- pipelines/datasets/br_denatran_frota/handlers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index edac9a51e..aea2aa290 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -106,6 +106,7 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: ) # Now we get all the actual RELEVANT uf data. month, year = get_year_month_from_filename(filename) # If the df is all strings, try to get numbers where it makes sense. + clean_df.replace(" - ", 0, inplace=True) if all(clean_df.dtypes == "object"): clean_df = clean_df.apply(pd.to_numeric, errors="ignore") clean_pl_df = pl.from_pandas(clean_df).lazy() From 83704962f013bf7f8cc6eaa693a08932e324f9bd Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Mon, 6 Nov 2023 17:53:49 -0300 Subject: [PATCH 241/265] Escaneia e resolve colunas multiplicadas por 10 --- .../datasets/br_denatran_frota/handlers.py | 4 +-- pipelines/datasets/br_denatran_frota/utils.py | 34 ++++++++++++------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index aea2aa290..f0723216f 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -110,7 +110,7 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: if all(clean_df.dtypes == "object"): clean_df = clean_df.apply(pd.to_numeric, errors="ignore") clean_pl_df = pl.from_pandas(clean_df).lazy() - verify_total(clean_pl_df.collect()) + clean_pl_df = verify_total(clean_pl_df.collect()) # Add year and month clean_pl_df = clean_pl_df.with_columns( pl.lit(year, dtype=pl.Int64).alias("ano"), @@ -200,7 +200,7 @@ def treat_municipio_tipo(file: str) -> pl.DataFrame: ) # Rename for ease of use. new_df.sigla_uf = new_df.sigla_uf.str.strip() # Remove whitespace. new_pl_df = pl.from_pandas(new_df) - verify_total(new_pl_df) + new_pl_df = verify_total(new_pl_df) new_pl_df = new_pl_df.with_columns( pl.col("nome_denatran").apply(asciify).str.to_lowercase(), pl.lit(year, dtype=pl.Int64).alias("ano"), diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index a93c29b54..9b064b530 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -140,7 +140,7 @@ def get_year_month_from_filename(filename: str) -> tuple[int, int]: raise ValueError("No match found") -def verify_total(df: pl.DataFrame) -> None: +def verify_total(df: pl.DataFrame) -> pl.DataFrame: """Verify that we can pivot from wide to long. Essentially, gets a Wide dataframe, excludes all string columns and the TOTAL column and sums it all row wise. @@ -169,28 +169,38 @@ def calculate_total(df): mask = df["TOTAL"] != calculated_total if sum(mask) != 0: - # In some cases, the quadriciclo data is multiplied by 10, and this will correct it before you - new_df = clean_quadriciclo_data(df) - new_calculated_total = calculate_total(new_df) - mask = new_df["TOTAL"] != new_calculated_total + # In some cases, one of the columsn in the data is multiplied by 10, and this will correct it before you + columns_to_try = df.select(pl.exclude("TOTAL")).select( + pl.exclude([pl.col(pl.Utf8)]) + ) + for col in columns_to_try.columns: + new_df = clean_dirty_data(df=df, column_name=col) + new_calculated_total = calculate_total(new_df) + mask = new_df["TOTAL"] != new_calculated_total + if pl.sum(mask) == 0: + return new_df if pl.sum(mask) != 0: raise ValueError( "A coluna de TOTAL da base original tem inconsistências e é diferente da soma das demais colunas." ) + else: + return df -def clean_quadriciclo_data(df: pl.DataFrame) -> pl.DataFrame: - """Divide the quadriciclo column by 10 when the data is dirty. +def clean_dirty_data( + df: pl.DataFrame, column_name: str = "QUADRICICLO" +) -> pl.DataFrame: + """Divide the column_name column by 10 when the data is dirty. Args: df (pl.DataFrame): Denatran data to be cleaned Returns: - pl.DataFrame: Cleaned Denatran data with the quadriciclo column altered. + pl.DataFrame: Cleaned Denatran data with the column_name column altered. """ - old_quadriciclo = df["QUADRICICLO"] - new_quadriciclo = old_quadriciclo / 10 - return df.with_columns(new_quadriciclo.cast(pl.Int32).alias("QUADRICICLO")) + old_column = df[column_name] + new_column = old_column / 10 + return df.with_columns(new_column.cast(pl.Int32).alias(column_name)) def fix_suggested_nome_ibge(row: tuple[str, ...]) -> str: @@ -413,7 +423,7 @@ def extract_links_post_2012(month: int, year: int, directory: str) -> list[dict] match = re.search( r"(?i)\/([\w-]+)\/(\d{4})\/(\w+)\/([\w-]+)\.(?:xls|xlsx|rar|zip)$", href ) - if match: + if match and re.search("tipo", txt, flags=re.IGNORECASE): matched_month = match.group(3) matched_year = match.group(2) if MONTHS.get(matched_month) == month and matched_year == str(year): From e411b8a6de8bdd250fb710f7cf76024cf14aad58 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Mon, 6 Nov 2023 18:55:05 -0300 Subject: [PATCH 242/265] Pronto --- pipelines/datasets/br_denatran_frota/utils.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 9b064b530..9b0ef7dcf 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -157,7 +157,9 @@ def verify_total(df: pl.DataFrame) -> pl.DataFrame: """ def calculate_total(df): - columns_for_total = df.select(pl.exclude("TOTAL")).select(pl.exclude([pl.Utf8])) + columns_for_total = df.select( + [col for col in df.columns if df[col].dtype != pl.Utf8] + ).select(pl.exclude("TOTAL")) calculated_total = columns_for_total.select( pl.fold( acc=pl.lit(0), function=lambda acc, x: acc + x, exprs=pl.col("*") @@ -168,18 +170,19 @@ def calculate_total(df): calculated_total = calculate_total(df) mask = df["TOTAL"] != calculated_total - if sum(mask) != 0: + if mask.sum() != 0: # In some cases, one of the columsn in the data is multiplied by 10, and this will correct it before you - columns_to_try = df.select(pl.exclude("TOTAL")).select( - pl.exclude([pl.col(pl.Utf8)]) - ) + columns_to_try = df.select( + [col for col in df.columns if df[col].dtype != pl.Utf8] + ).select(pl.exclude("TOTAL")) + for col in columns_to_try.columns: new_df = clean_dirty_data(df=df, column_name=col) new_calculated_total = calculate_total(new_df) mask = new_df["TOTAL"] != new_calculated_total - if pl.sum(mask) == 0: + if mask.sum() == 0: return new_df - if pl.sum(mask) != 0: + if mask.sum() != 0: raise ValueError( "A coluna de TOTAL da base original tem inconsistências e é diferente da soma das demais colunas." ) From 57385dc5f429daa444fdf5148bf3a2fd91d48389 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Sun, 19 Nov 2023 19:10:11 -0300 Subject: [PATCH 243/265] All is good --- pipelines/datasets/br_denatran_frota/flows.py | 444 +++++++++--------- .../datasets/br_denatran_frota/handlers.py | 20 + pipelines/datasets/br_denatran_frota/tasks.py | 6 + pipelines/datasets/br_denatran_frota/utils.py | 4 +- 4 files changed, 254 insertions(+), 220 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 93b87405a..879895d30 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -1,219 +1,227 @@ # -*- coding: utf-8 -*- -# """ -# Flows for br_denatran_frota -# """ - - -# from datetime import datetime, timedelta -# from prefect.run_configs import KubernetesRun -# from prefect.storage import GCS -# from prefect import Parameter, case, unmapped -# from prefect.tasks.prefect import ( -# create_flow_run, -# wait_for_flow_run, -# ) -# import os -# from pipelines.constants import constants as pipelines_constants -# from pipelines.utils.constants import constants as utils_constants - -# from pipelines.utils.decorators import Flow -# from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants -# from pipelines.utils.tasks import ( -# create_table_and_upload_to_gcs, -# rename_current_flow_run_dataset_table, -# get_current_flow_labels, -# ) -# from pipelines.datasets.br_denatran_frota.tasks import ( -# crawl_task, -# treat_uf_tipo_task, -# output_file_to_csv_task, -# get_desired_file_task, -# treat_municipio_tipo_task, -# get_latest_data_task, -# ) -# from pipelines.datasets.br_denatran_frota.constants import constants -# from itertools import product - -# year_range = list(range(2003, 2023)) -# month_range = list(range(1, 13)) -# date_pairs = list(product(year_range, month_range)) - -# date_pairs_param: list[tuple] = Parameter("date_pairs", default=date_pairs) - -# # from pipelines.datasets.br_denatran_frota.schedules import every_two_weeks - -# with Flow( -# name="br_denatran_frota.uf_tipo", -# code_owners=[ -# "Tamir", -# ], -# ) as br_denatran_frota_uf_tipo: -# dataset_id = Parameter("dataset_id", default="br_denatran_frota") -# table_id = Parameter("table_id", default="uf_tipo") - -# # Materialization mode -# materialization_mode = Parameter( -# "materialization_mode", default="dev", required=False -# ) - -# materialize_after_dump = Parameter( -# "materialize after dump", default=False, required=False -# ) - -# dbt_alias = Parameter("dbt_alias", default=True, required=False) -# rename_flow_run = rename_current_flow_run_dataset_table( -# prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id -# ) - -# year_to_fetch = get_latest_data_task("uf_tipo") -# crawled = crawl_task( -# month=year_to_fetch[1], -# year=year_to_fetch[0], -# temp_dir=constants.DOWNLOAD_PATH.value, -# upstream_tasks=[year_to_fetch], -# ) -# # Now get the downloaded file: -# municipio_tipo_file = get_desired_file_task( -# year=year_to_fetch[0], -# download_directory=constants.DOWNLOAD_PATH.value, -# filetype=constants.UF_TIPO_BASIC_FILENAME.value, -# upstream_tasks=[crawled], -# ) -# df = treat_uf_tipo_task( -# file=municipio_tipo_file, upstream_tasks=[crawled, municipio_tipo_file] -# ) -# csv_output = output_file_to_csv_task( -# df, constants.UF_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] -# ) -# wait_upload_table = create_table_and_upload_to_gcs( -# data_path=csv_output, -# dataset_id=dataset_id, -# table_id=table_id, -# dump_mode="append", -# wait=csv_output, -# ) - -# with case(materialize_after_dump, True): -# # Trigger DBT flow run -# current_flow_labels = get_current_flow_labels() -# materialization_flow = create_flow_run( -# flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, -# project_name=pipelines_constants.PREFECT_DEFAULT_PROJECT.value, -# parameters={ -# "dataset_id": dataset_id, -# "table_id": table_id, -# "mode": materialization_mode, -# "dbt_alias": dbt_alias, -# }, -# labels=current_flow_labels, -# run_name=f"Materialize {dataset_id}.{table_id}", -# ) -# wait_for_materialization = wait_for_flow_run( -# materialization_flow, -# stream_states=True, -# stream_logs=True, -# raise_final_state=True, -# ) -# wait_for_materialization.max_retries = ( -# dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value -# ) -# wait_for_materialization.retry_delay = timedelta( -# seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value -# ) - - -# br_denatran_frota_uf_tipo.storage = GCS(pipelines_constants.GCS_FLOWS_BUCKET.value) -# br_denatran_frota_uf_tipo.run_config = KubernetesRun( -# image=pipelines_constants.DOCKER_IMAGE.value -# ) -# # flow.schedule = every_two_weeks - - -# with Flow( -# name="br_denatran_frota.municipio_tipo", -# code_owners=[ -# "Tamir", -# ], -# ) as br_denatran_frota_municipio_tipo: -# dataset_id = Parameter("dataset_id", default="br_denatran_frota") -# table_id = Parameter("table_id", default="municipio_tipo") - -# # Materialization mode -# materialization_mode = Parameter( -# "materialization_mode", default="dev", required=False -# ) - -# materialize_after_dump = Parameter( -# "materialize after dump", default=False, required=False -# ) - -# dbt_alias = Parameter("dbt_alias", default=True, required=False) - -# rename_flow_run = rename_current_flow_run_dataset_table( -# prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id -# ) -# year_to_fetch = get_latest_data_task("municipio_tipo") -# crawled = crawl_task( -# month=year_to_fetch[1], -# year=year_to_fetch[0], -# temp_dir=constants.DOWNLOAD_PATH.value, -# upstream_tasks=[year_to_fetch], -# ) -# # Now get the downloaded file: -# municipio_tipo_file = get_desired_file_task( -# year=year_to_fetch[0], -# download_directory=constants.DOWNLOAD_PATH.value, -# filetype=constants.MUNIC_TIPO_BASIC_FILENAME.value, -# upstream_tasks=[crawled], -# ) -# df = treat_municipio_tipo_task( -# file=municipio_tipo_file, upstream_tasks=[crawled, municipio_tipo_file] -# ) -# csv_output = output_file_to_csv_task( -# df, constants.MUNIC_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] -# ) -# wait_upload_table = create_table_and_upload_to_gcs( -# data_path=csv_output, -# dataset_id=dataset_id, -# table_id=table_id, -# dump_mode="append", -# wait=csv_output, -# ) - -# with case(materialize_after_dump, True): -# # Trigger DBT flow run -# current_flow_labels = get_current_flow_labels() -# materialization_flow = create_flow_run( -# flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, -# project_name=pipelines_constants.PREFECT_DEFAULT_PROJECT.value, -# parameters={ -# "dataset_id": dataset_id, -# "table_id": table_id, -# "mode": materialization_mode, -# "dbt_alias": dbt_alias, -# }, -# labels=current_flow_labels, -# run_name=f"Materialize {dataset_id}.{table_id}", -# ) - -# wait_for_materialization = wait_for_flow_run( -# materialization_flow, -# stream_states=True, -# stream_logs=True, -# raise_final_state=True, -# ) -# wait_for_materialization.max_retries = ( -# dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value -# ) -# wait_for_materialization.retry_delay = timedelta( -# seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value -# ) - - -# br_denatran_frota_municipio_tipo.storage = GCS( -# pipelines_constants.GCS_FLOWS_BUCKET.value -# ) -# br_denatran_frota_municipio_tipo.run_config = KubernetesRun( -# image=pipelines_constants.DOCKER_IMAGE.value -# ) -# # flow.schedule = every_two_weeks +from datetime import datetime, timedelta +from prefect.run_configs import KubernetesRun +from prefect.storage import GCS +from prefect import Parameter, case, unmapped +from prefect.tasks.prefect import ( + create_flow_run, + wait_for_flow_run, +) +from pipelines.constants import constants as pipelines_constants +from pipelines.utils.constants import constants as utils_constants + +from pipelines.utils.decorators import Flow +from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants +from pipelines.utils.tasks import ( + create_table_and_upload_to_gcs, + rename_current_flow_run_dataset_table, + get_current_flow_labels, +) +from pipelines.datasets.br_denatran_frota.tasks import ( + crawl_task, + treat_uf_tipo_task, + output_file_to_csv_task, + get_desired_file_task, + treat_municipio_tipo_task, + get_latest_data_task, + should_process_data_task, +) +from pipelines.datasets.br_denatran_frota.constants import constants +from itertools import product + +year_range = list(range(2003, 2023)) +month_range = list(range(1, 13)) +date_pairs = list(product(year_range, month_range)) + +date_pairs_param: list[tuple] = Parameter("date_pairs", default=date_pairs) + +# from pipelines.datasets.br_denatran_frota.schedules import every_two_weeks + +with Flow( + name="br_denatran_frota.uf_tipo", + code_owners=[ + "Tamir", + ], +) as br_denatran_frota_uf_tipo: + dataset_id = Parameter("dataset_id", default="br_denatran_frota") + table_id = Parameter("table_id", default="uf_tipo") + + # Materialization mode + materialization_mode = Parameter( + "materialization_mode", default="dev", required=False + ) + + materialize_after_dump = Parameter( + "materialize after dump", default=False, required=False + ) + + dbt_alias = Parameter("dbt_alias", default=True, required=False) + rename_flow_run = rename_current_flow_run_dataset_table( + prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id + ) + + year_to_fetch = get_latest_data_task("uf_tipo") + crawled = crawl_task( + month=year_to_fetch[1], + year=year_to_fetch[0], + temp_dir=constants.DOWNLOAD_PATH.value, + upstream_tasks=[year_to_fetch], + ) + # Now get the downloaded file: + desired_file = get_desired_file_task( + year=year_to_fetch[0], + download_directory=constants.DOWNLOAD_PATH.value, + filetype=constants.UF_TIPO_BASIC_FILENAME.value, + upstream_tasks=[crawled], + ) + decision = should_process_data_task( + bq_year=year_to_fetch[0], + bq_month=year_to_fetch[1], + filename=desired_file, + upstream_tasks=[crawled, desired_file], + ) + with case(decision, True): + df = treat_uf_tipo_task( + file=desired_file, upstream_tasks=[crawled, desired_file] + ) + csv_output = output_file_to_csv_task( + df, constants.UF_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] + ) + wait_upload_table = create_table_and_upload_to_gcs( + data_path=csv_output, + dataset_id=dataset_id, + table_id=table_id, + dump_mode="append", + wait=csv_output, + ) + + with case(materialize_after_dump, True): + # Trigger DBT flow run + current_flow_labels = get_current_flow_labels() + materialization_flow = create_flow_run( + flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, + project_name=pipelines_constants.PREFECT_DEFAULT_PROJECT.value, + parameters={ + "dataset_id": dataset_id, + "table_id": table_id, + "mode": materialization_mode, + "dbt_alias": dbt_alias, + }, + labels=current_flow_labels, + run_name=f"Materialize {dataset_id}.{table_id}", + ) + wait_for_materialization = wait_for_flow_run( + materialization_flow, + stream_states=True, + stream_logs=True, + raise_final_state=True, + ) + wait_for_materialization.max_retries = ( + dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value + ) + wait_for_materialization.retry_delay = timedelta( + seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value + ) + + +br_denatran_frota_uf_tipo.storage = GCS(pipelines_constants.GCS_FLOWS_BUCKET.value) +br_denatran_frota_uf_tipo.run_config = KubernetesRun( + image=pipelines_constants.DOCKER_IMAGE.value +) +# flow.schedule = every_two_weeks + + +with Flow( + name="br_denatran_frota.municipio_tipo", + code_owners=[ + "Tamir", + ], +) as br_denatran_frota_municipio_tipo: + dataset_id = Parameter("dataset_id", default="br_denatran_frota") + table_id = Parameter("table_id", default="municipio_tipo") + + # Materialization mode + materialization_mode = Parameter( + "materialization_mode", default="dev", required=False + ) + + materialize_after_dump = Parameter( + "materialize after dump", default=False, required=False + ) + + dbt_alias = Parameter("dbt_alias", default=True, required=False) + + rename_flow_run = rename_current_flow_run_dataset_table( + prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id + ) + year_to_fetch = get_latest_data_task("municipio_tipo") + crawled = crawl_task( + month=year_to_fetch[1], + year=year_to_fetch[0], + temp_dir=constants.DOWNLOAD_PATH.value, + upstream_tasks=[year_to_fetch], + ) + # Now get the downloaded file: + desired_file = get_desired_file_task( + year=year_to_fetch[0], + download_directory=constants.DOWNLOAD_PATH.value, + filetype=constants.MUNIC_TIPO_BASIC_FILENAME.value, + upstream_tasks=[crawled], + ) + + decision = should_process_data_task( + bq_year=year_to_fetch[0], + bq_month=year_to_fetch[1], + filename=desired_file, + upstream_tasks=[crawled, desired_file], + ) + with case(decision, True): + df = treat_municipio_tipo_task(file=desired_file, upstream_tasks=[decision]) + csv_output = output_file_to_csv_task( + df, constants.MUNIC_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] + ) + wait_upload_table = create_table_and_upload_to_gcs( + data_path=csv_output, + dataset_id=dataset_id, + table_id=table_id, + dump_mode="append", + wait=csv_output, + ) + + with case(materialize_after_dump, True): + # Trigger DBT flow run + current_flow_labels = get_current_flow_labels() + materialization_flow = create_flow_run( + flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, + project_name=pipelines_constants.PREFECT_DEFAULT_PROJECT.value, + parameters={ + "dataset_id": dataset_id, + "table_id": table_id, + "mode": materialization_mode, + "dbt_alias": dbt_alias, + }, + labels=current_flow_labels, + run_name=f"Materialize {dataset_id}.{table_id}", + ) + + wait_for_materialization = wait_for_flow_run( + materialization_flow, + stream_states=True, + stream_logs=True, + raise_final_state=True, + ) + wait_for_materialization.max_retries = ( + dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value + ) + wait_for_materialization.retry_delay = timedelta( + seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value + ) + + +br_denatran_frota_municipio_tipo.storage = GCS( + pipelines_constants.GCS_FLOWS_BUCKET.value +) +br_denatran_frota_municipio_tipo.run_config = KubernetesRun( + image=pipelines_constants.DOCKER_IMAGE.value +) +# flow.schedule = every_two_weeks diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index f0723216f..41383390b 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -224,3 +224,23 @@ def treat_municipio_tipo(file: str) -> pl.DataFrame: value_name="quantidade", ) # Long format. return full_pl_df + + +def should_process_data(bq_year: int, bq_month: int, filename: str) -> bool: + """Verify if the crawled data is new enough to be uploaded. + + Args: + bq_year (int): Year gotten from get_latest_data, comes from BQ data. + bq_month (int): Month gotten from get_latest_data, comes from BQ data. + filename (str): Name of the DENATRAN data file downloaded. + + Returns: + bool: Whether or not the data obtained from the website is recent enough to be updated. + """ + crawled_year, crawled_month = get_year_month_from_filename(filename) + if crawled_year > bq_year or ( + crawled_year == bq_year and crawled_month >= bq_month + ): + return True + else: + return False diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 4c348fc17..c217941b9 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -13,6 +13,7 @@ get_desired_file, treat_municipio_tipo, get_latest_data, + should_process_data, ) from pipelines.utils.utils import ( log, @@ -53,3 +54,8 @@ def treat_municipio_tipo_task(file: str) -> pl.DataFrame: @task() def get_latest_data_task(table_name: str) -> tuple[int, int]: return get_latest_data(table_name) + + +@task() +def should_process_data_task(bq_year: int, bq_month: int, filename: str) -> bool: + return should_process_data(bq_year, bq_month, filename) diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 9b0ef7dcf..64f342f50 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -20,7 +20,7 @@ from rpy2.robjects.vectors import StrVector import basedosdados as bd from enum import Enum - +from datetime import datetime DICT_UFS = constants.DICT_UFS.value SUBSTITUTIONS = constants.SUBSTITUTIONS.value @@ -426,7 +426,7 @@ def extract_links_post_2012(month: int, year: int, directory: str) -> list[dict] match = re.search( r"(?i)\/([\w-]+)\/(\d{4})\/(\w+)\/([\w-]+)\.(?:xls|xlsx|rar|zip)$", href ) - if match and re.search("tipo", txt, flags=re.IGNORECASE): + if match and re.search("tipo|município", txt, flags=re.IGNORECASE): matched_month = match.group(3) matched_year = match.group(2) if MONTHS.get(matched_month) == month and matched_year == str(year): From abb6614ea2bd36fd0033dd434a32b0d70e0902ab Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Thu, 23 Nov 2023 19:49:33 -0300 Subject: [PATCH 244/265] =?UTF-8?q?Refaz=20o=20pre=20commit,=20que=20N?= =?UTF-8?q?=C3=83O=20funciona=20aqui.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .pre-commit-config.yaml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 000000000..776fb49e4 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,34 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: check-added-large-files # prevents adding large files + - id: detect-private-key # detects private keys + - id: fix-byte-order-marker # fixes BOM + - id: fix-encoding-pragma # fixes encoding pragma + - id: no-commit-to-branch # prevents committing to protected branches + - id: trailing-whitespace # prevents trailing whitespace + - repo: https://github.com/python-poetry/poetry + rev: 1.7.0 + hooks: + - id: poetry-check + - repo: https://github.com/psf/black + rev: 23.11.0 + hooks: + - id: black + exclude: 'pipelines\/\{\{cookiecutter\.project_name\}\}.*' + - repo: https://github.com/pycqa/isort + rev: 5.12.0 + hooks: + - id: isort + args: [--profile, black, --skip, "pipelines/{{cookiecutter.project_name}}"] + - repo: https://github.com/PyCQA/autoflake + rev: v2.2.1 + hooks: + - id: autoflake + exclude: 'pipelines\/\{\{cookiecutter\.project_name\}\}.*' + - repo: https://github.com/PyCQA/flake8 + rev: 6.1.0 + hooks: + - id: flake8 + exclude: 'pipelines\/\{\{cookiecutter\.project_name\}\}.*' \ No newline at end of file From f81b5871ae90b4c6b140c7fcb39db52309dd6736 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 22:49:55 +0000 Subject: [PATCH 245/265] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pipelines/datasets/__init__.py | 14 +------- .../datasets/br_denatran_frota/backfill.py | 4 +-- pipelines/datasets/br_denatran_frota/flows.py | 36 +++++++++---------- .../br_denatran_frota/functions_test.py | 11 +++--- .../datasets/br_denatran_frota/handlers.py | 35 +++++++++--------- .../datasets/br_denatran_frota/schedules.py | 4 ++- pipelines/datasets/br_denatran_frota/tasks.py | 18 +++++----- .../datasets/br_denatran_frota/tasks_test.py | 11 +++--- pipelines/datasets/br_denatran_frota/utils.py | 25 ++++++------- 9 files changed, 72 insertions(+), 86 deletions(-) diff --git a/pipelines/datasets/__init__.py b/pipelines/datasets/__init__.py index 6d608d615..1441b7df4 100644 --- a/pipelines/datasets/__init__.py +++ b/pipelines/datasets/__init__.py @@ -7,19 +7,6 @@ ############################################################################### from pipelines.datasets.botdosdados.flows import * -from pipelines.datasets.br_cgu_pessoal_executivo_federal.flows import * -from pipelines.datasets.fundacao_lemann.flows import * -from pipelines.datasets.br_tse_eleicoes.flows import * -from pipelines.datasets.delete_flows.flows import * -from pipelines.datasets.br_jota.flows import * -from pipelines.datasets.br_fgv_igp.flows import * -from pipelines.datasets.br_me_caged.flows import * -from pipelines.datasets.br_ibge_pnadc.flows import * -from pipelines.datasets.cross_update.flows import * -from pipelines.datasets.br_denatran_frota.flows import * -from pipelines.datasets.br_bcb_estban.flows import * -from pipelines.datasets.br_ms_cnes.flows import * -from pipelines.datasets.br_rj_isp_estatisticas_seguranca.flows import * from pipelines.datasets.br_anatel_banda_larga_fixa.flows import * from pipelines.datasets.br_anatel_telefonia_movel.flows import * from pipelines.datasets.br_anp_precos_combustiveis.flows import * @@ -37,6 +24,7 @@ from pipelines.datasets.br_cvm_administradores_carteira.flows import * from pipelines.datasets.br_cvm_fi.flows import * from pipelines.datasets.br_cvm_oferta_publica_distribuicao.flows import * +from pipelines.datasets.br_denatran_frota.flows import * from pipelines.datasets.br_fgv_igp.flows import * from pipelines.datasets.br_ibge_inpc.flows import * from pipelines.datasets.br_ibge_ipca15.flows import * diff --git a/pipelines/datasets/br_denatran_frota/backfill.py b/pipelines/datasets/br_denatran_frota/backfill.py index 3f2175169..75805a585 100644 --- a/pipelines/datasets/br_denatran_frota/backfill.py +++ b/pipelines/datasets/br_denatran_frota/backfill.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- +from pipelines.datasets.br_denatran_frota.constants import constants from pipelines.datasets.br_denatran_frota.handlers import ( crawl, - treat_uf_tipo, get_desired_file, output_file_to_csv, + treat_uf_tipo, ) -from pipelines.datasets.br_denatran_frota.constants import constants # Fill for UF TIPO months = range(1, 13) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 879895d30..1613e1a27 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -1,33 +1,31 @@ # -*- coding: utf-8 -*- -from datetime import datetime, timedelta +from datetime import timedelta +from itertools import product + +from prefect import Parameter, case, unmapped from prefect.run_configs import KubernetesRun from prefect.storage import GCS -from prefect import Parameter, case, unmapped -from prefect.tasks.prefect import ( - create_flow_run, - wait_for_flow_run, -) +from prefect.tasks.prefect import create_flow_run, wait_for_flow_run + from pipelines.constants import constants as pipelines_constants +from pipelines.datasets.br_denatran_frota.constants import constants +from pipelines.datasets.br_denatran_frota.tasks import ( + crawl_task, + get_desired_file_task, + get_latest_data_task, + output_file_to_csv_task, + should_process_data_task, + treat_municipio_tipo_task, + treat_uf_tipo_task, +) from pipelines.utils.constants import constants as utils_constants - from pipelines.utils.decorators import Flow from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants from pipelines.utils.tasks import ( create_table_and_upload_to_gcs, - rename_current_flow_run_dataset_table, get_current_flow_labels, + rename_current_flow_run_dataset_table, ) -from pipelines.datasets.br_denatran_frota.tasks import ( - crawl_task, - treat_uf_tipo_task, - output_file_to_csv_task, - get_desired_file_task, - treat_municipio_tipo_task, - get_latest_data_task, - should_process_data_task, -) -from pipelines.datasets.br_denatran_frota.constants import constants -from itertools import product year_range = list(range(2003, 2023)) month_range = list(range(1, 13)) diff --git a/pipelines/datasets/br_denatran_frota/functions_test.py b/pipelines/datasets/br_denatran_frota/functions_test.py index 11657cdd2..c104b8b5c 100644 --- a/pipelines/datasets/br_denatran_frota/functions_test.py +++ b/pipelines/datasets/br_denatran_frota/functions_test.py @@ -3,16 +3,17 @@ import shutil import tempfile import unittest + import pandas as pd +from pipelines.datasets.br_denatran_frota.constants import constants +from pipelines.datasets.br_denatran_frota.tasks import crawl from pipelines.datasets.br_denatran_frota.utils import ( - make_filename, - make_dir_when_not_exists, - guess_header, get_year_month_from_filename, + guess_header, + make_dir_when_not_exists, + make_filename, ) -from pipelines.datasets.br_denatran_frota.constants import constants -from pipelines.datasets.br_denatran_frota.tasks import crawl DOWNLOAD_PATH = constants.DOWNLOAD_PATH.value diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 41383390b..501fbdc82 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -7,33 +7,30 @@ import os import re +from zipfile import ZipFile + import basedosdados as bd +import pandas as pd +import polars as pl +from string_utils import asciify + from pipelines.datasets.br_denatran_frota.constants import constants from pipelines.datasets.br_denatran_frota.utils import ( - make_dir_when_not_exists, - extract_links_post_2012, - verify_total, - change_df_header, - guess_header, - get_year_month_from_filename, + DenatranType, call_downloader, + call_r_to_read_excel, + change_df_header, download_file, + extract_links_post_2012, extraction_pre_2012, - call_r_to_read_excel, - treat_uf, get_data_from_prod, - DenatranType, -) - -import pandas as pd -import polars as pl -from string_utils import asciify -from zipfile import ZipFile -from pipelines.utils.utils import ( - clean_dataframe, - to_partitions, - log, + get_year_month_from_filename, + guess_header, + make_dir_when_not_exists, + treat_uf, + verify_total, ) +from pipelines.utils.utils import clean_dataframe, log, to_partitions MONTHS = constants.MONTHS.value DATASET = constants.DATASET.value diff --git a/pipelines/datasets/br_denatran_frota/schedules.py b/pipelines/datasets/br_denatran_frota/schedules.py index 7f39a37ac..5ae6b53bc 100644 --- a/pipelines/datasets/br_denatran_frota/schedules.py +++ b/pipelines/datasets/br_denatran_frota/schedules.py @@ -4,9 +4,11 @@ """ -from datetime import timedelta, datetime +from datetime import datetime, timedelta + from prefect.schedules import Schedule from prefect.schedules.clocks import IntervalClock + from pipelines.constants import constants every_two_weeks = Schedule( diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index c217941b9..e21845ef2 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -1,23 +1,21 @@ # -*- coding: utf-8 -*- -from prefect import task -import glob -import os -from pipelines.datasets.br_denatran_frota.constants import constants + import pandas as pd import polars as pl +from prefect import task + +from pipelines.datasets.br_denatran_frota.constants import constants from pipelines.datasets.br_denatran_frota.handlers import ( crawl, - treat_uf_tipo, - output_file_to_csv, get_desired_file, - treat_municipio_tipo, get_latest_data, + output_file_to_csv, should_process_data, + treat_municipio_tipo, + treat_uf_tipo, ) -from pipelines.utils.utils import ( - log, -) +from pipelines.utils.utils import log MONTHS = constants.MONTHS.value DATASET = constants.DATASET.value diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index a434ed96d..a2d73c50a 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -1,20 +1,21 @@ # -*- coding: utf-8 -*- import os +import re import shutil import tempfile import unittest -import re -import polars as pl +import polars as pl from parameterized import parameterized + +from pipelines.datasets.br_denatran_frota.constants import constants from pipelines.datasets.br_denatran_frota.handlers import ( crawl, - treat_uf_tipo, get_desired_file, - treat_municipio_tipo, get_latest_data, + treat_municipio_tipo, + treat_uf_tipo, ) -from pipelines.datasets.br_denatran_frota.constants import constants DATASET = constants.DATASET.value DOWNLOAD_PATH = constants.DOWNLOAD_PATH.value diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 64f342f50..d320567ca 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -3,24 +3,25 @@ General purpose functions for the br_denatran_frota project. """ -import pandas as pd -import polars as pl import difflib -import re import os +import re +from enum import Enum +from urllib.request import urlopen from zipfile import ZipFile -from rarfile import RarFile + +import basedosdados as bd +import pandas as pd +import polars as pl import requests -from string_utils import asciify -from pipelines.datasets.br_denatran_frota.constants import constants -from bs4 import BeautifulSoup -from urllib.request import urlopen -import rpy2.robjects.packages as rpackages import rpy2.robjects as robjects +import rpy2.robjects.packages as rpackages +from bs4 import BeautifulSoup +from rarfile import RarFile from rpy2.robjects.vectors import StrVector -import basedosdados as bd -from enum import Enum -from datetime import datetime +from string_utils import asciify + +from pipelines.datasets.br_denatran_frota.constants import constants DICT_UFS = constants.DICT_UFS.value SUBSTITUTIONS = constants.SUBSTITUTIONS.value From 863fc057dc7c2fb8e2fa37143d2c1acbad78ffd7 Mon Sep 17 00:00:00 2001 From: Tamir Einhorn Salem Date: Thu, 23 Nov 2023 23:07:50 -0300 Subject: [PATCH 246/265] Usa a task pra decidir --- pipelines/datasets/br_denatran_frota/flows.py | 29 ++++++++++++------- pipelines/datasets/br_denatran_frota/tasks.py | 8 +++++ 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 1613e1a27..625dc996f 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -17,10 +17,12 @@ should_process_data_task, treat_municipio_tipo_task, treat_uf_tipo_task, + get_denatran_date, ) from pipelines.utils.constants import constants as utils_constants from pipelines.utils.decorators import Flow from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants +from pipelines.utils.metadata.tasks import check_if_data_is_outdated from pipelines.utils.tasks import ( create_table_and_upload_to_gcs, get_current_flow_labels, @@ -72,11 +74,14 @@ filetype=constants.UF_TIPO_BASIC_FILENAME.value, upstream_tasks=[crawled], ) - decision = should_process_data_task( - bq_year=year_to_fetch[0], - bq_month=year_to_fetch[1], - filename=desired_file, - upstream_tasks=[crawled, desired_file], + # We need to see the year, month from the file to decide on updating + extracted_date = get_denatran_date(desired_file, upstream_tasks=[desired_file]) + decision = check_if_data_is_outdated( + dataset_id=dataset_id, + table_id=table_id, + data_source_max_date=extracted_date, + date_format="%Y-%m", + upstream_tasks=[extracted_date], ) with case(decision, True): df = treat_uf_tipo_task( @@ -166,12 +171,14 @@ filetype=constants.MUNIC_TIPO_BASIC_FILENAME.value, upstream_tasks=[crawled], ) - - decision = should_process_data_task( - bq_year=year_to_fetch[0], - bq_month=year_to_fetch[1], - filename=desired_file, - upstream_tasks=[crawled, desired_file], + # We need to see the year, month from the file to decide on updating + extracted_date = get_denatran_date(desired_file, upstream_tasks=[desired_file]) + decision = check_if_data_is_outdated( + dataset_id=dataset_id, + table_id=table_id, + data_source_max_date=extracted_date, + date_format="%Y-%m", + upstream_tasks=[extracted_date], ) with case(decision, True): df = treat_municipio_tipo_task(file=desired_file, upstream_tasks=[decision]) diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index e21845ef2..19af17c5c 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -4,6 +4,7 @@ import pandas as pd import polars as pl from prefect import task +import datetime from pipelines.datasets.br_denatran_frota.constants import constants from pipelines.datasets.br_denatran_frota.handlers import ( @@ -14,6 +15,7 @@ should_process_data, treat_municipio_tipo, treat_uf_tipo, + get_year_month_from_filename, ) from pipelines.utils.utils import log @@ -57,3 +59,9 @@ def get_latest_data_task(table_name: str) -> tuple[int, int]: @task() def should_process_data_task(bq_year: int, bq_month: int, filename: str) -> bool: return should_process_data(bq_year, bq_month, filename) + + +@task() +def get_denatran_date(filename: str) -> datetime.date: + year, month = get_year_month_from_filename(filename) + return datetime.date(year, month, 1) From 7d0bd15ebc4035e1624f3d207672964191b95e82 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 24 Nov 2023 02:08:12 +0000 Subject: [PATCH 247/265] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pipelines/datasets/br_denatran_frota/flows.py | 2 +- pipelines/datasets/br_denatran_frota/tasks.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 625dc996f..75137b1a8 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -11,13 +11,13 @@ from pipelines.datasets.br_denatran_frota.constants import constants from pipelines.datasets.br_denatran_frota.tasks import ( crawl_task, + get_denatran_date, get_desired_file_task, get_latest_data_task, output_file_to_csv_task, should_process_data_task, treat_municipio_tipo_task, treat_uf_tipo_task, - get_denatran_date, ) from pipelines.utils.constants import constants as utils_constants from pipelines.utils.decorators import Flow diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 19af17c5c..9d97203df 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -1,21 +1,22 @@ # -*- coding: utf-8 -*- +import datetime + import pandas as pd import polars as pl from prefect import task -import datetime from pipelines.datasets.br_denatran_frota.constants import constants from pipelines.datasets.br_denatran_frota.handlers import ( crawl, get_desired_file, get_latest_data, + get_year_month_from_filename, output_file_to_csv, should_process_data, treat_municipio_tipo, treat_uf_tipo, - get_year_month_from_filename, ) from pipelines.utils.utils import log From 136da7b659aae36d2acf45678ae57aafa489dd59 Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Tue, 12 Dec 2023 12:38:56 -0300 Subject: [PATCH 248/265] feat: add update_django_metadata task --- pipelines/datasets/br_denatran_frota/flows.py | 39 +- .../datasets/br_denatran_frota/handlers.py | 3 + poetry.lock | 5053 +++++++---------- 3 files changed, 2009 insertions(+), 3086 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 75137b1a8..b3a9282d4 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -22,7 +22,10 @@ from pipelines.utils.constants import constants as utils_constants from pipelines.utils.decorators import Flow from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants -from pipelines.utils.metadata.tasks import check_if_data_is_outdated +from pipelines.utils.metadata.tasks import ( + check_if_data_is_outdated, + update_django_metadata, +) from pipelines.utils.tasks import ( create_table_and_upload_to_gcs, get_current_flow_labels, @@ -55,6 +58,8 @@ "materialize after dump", default=False, required=False ) + update_metadata = Parameter("update_metadata", default=False, required=False) + dbt_alias = Parameter("dbt_alias", default=True, required=False) rename_flow_run = rename_current_flow_run_dataset_table( prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id @@ -126,6 +131,19 @@ seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value ) + with case(update_metadata, True): + update_django_metadata( + dataset_id=dataset_id, + table_id=table_id, + date_column_name={"year": "ano", "month": "mes"}, + date_format="%Y-%m", + coverage_type="all_free", + # time_delta={"months": 6}, + prefect_mode=materialization_mode, + bq_project="basedosdados", + upstream_tasks=[wait_for_materialization], + ) + br_denatran_frota_uf_tipo.storage = GCS(pipelines_constants.GCS_FLOWS_BUCKET.value) br_denatran_frota_uf_tipo.run_config = KubernetesRun( @@ -152,12 +170,18 @@ "materialize after dump", default=False, required=False ) + update_metadata = Parameter("update_metadata", default=False, required=False) + dbt_alias = Parameter("dbt_alias", default=True, required=False) rename_flow_run = rename_current_flow_run_dataset_table( prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) + + # inserir get_api_most_recente_date + # na função get_latest_data year_to_fetch = get_latest_data_task("municipio_tipo") + crawled = crawl_task( month=year_to_fetch[1], year=year_to_fetch[0], @@ -222,6 +246,19 @@ seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value ) + with case(update_metadata, True): + update_django_metadata( + dataset_id=dataset_id, + table_id=table_id, + date_column_name={"year": "ano", "month": "mes"}, + date_format="%Y-%m", + coverage_type="all_free", + # time_delta={"months": 6}, + prefect_mode=materialization_mode, + bq_project="basedosdados", + upstream_tasks=[wait_for_materialization], + ) + br_denatran_frota_municipio_tipo.storage = GCS( pipelines_constants.GCS_FLOWS_BUCKET.value diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 501fbdc82..ab8eaa6fb 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -150,6 +150,9 @@ def get_latest_data(table_name: str): denatran_data: pd.DataFrame = get_data_from_prod( table_id=table_name, dataset_id="br_denatran_frota" ) + # substituir por get_api_most_recente_date aqui + # pipelines.utils.metadata.utils.get_api_most_recente_date + # ela vai retonar a data mais recente da tabela extraida da api if not isinstance(denatran_data, pd.DataFrame): return 2003, 1 if not denatran_data.empty: diff --git a/poetry.lock b/poetry.lock index 82019f7d7..916e2c0bb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,8 +1,9 @@ +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. + [[package]] name = "async-timeout" version = "4.0.3" description = "Timeout context manager for asyncio programs" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -14,9 +15,12 @@ files = [ name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] @@ -29,17 +33,37 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte name = "backoff" version = "2.2.1" description = "Function decoration for backoff and retry" -category = "main" optional = false python-versions = ">=3.7,<4.0" +files = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] [[package]] name = "backports-zoneinfo" version = "0.2.1" description = "Backport of the standard library zoneinfo module" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"}, + {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"}, + {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"}, + {file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"}, + {file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"}, +] [package.extras] tzdata = ["tzdata"] @@ -48,9 +72,12 @@ tzdata = ["tzdata"] name = "basedosdados" version = "2.0.0b5" description = "Organizar e facilitar o acesso a dados brasileiros através de tabelas públicas no BigQuery." -category = "main" optional = false python-versions = ">=3.8,<3.11" +files = [ + {file = "basedosdados-2.0.0b5-py3-none-any.whl", hash = "sha256:a15fdbaa41d621094dabde3f2f14bcc4842b87f59f16a7a6c7a293351f841be5"}, + {file = "basedosdados-2.0.0b5.tar.gz", hash = "sha256:e4bdf3a0018f7208aa57adac9bb9340d07076a3c18d875e80c488cb4b80f0959"}, +] [package.dependencies] google-api-python-client = ">=2.86.0,<3.0.0" @@ -72,9 +99,12 @@ tqdm = ">=4.65.0,<5.0.0" name = "beautifulsoup4" version = "4.11.1" description = "Screen-scraping library" -category = "main" optional = false python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, + {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, +] [package.dependencies] soupsieve = ">1.2" @@ -87,25 +117,84 @@ lxml = ["lxml"] name = "cachetools" version = "4.2.4" description = "Extensible memoizing collections and decorators" -category = "main" optional = false python-versions = "~=3.5" +files = [ + {file = "cachetools-4.2.4-py3-none-any.whl", hash = "sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1"}, + {file = "cachetools-4.2.4.tar.gz", hash = "sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693"}, +] [[package]] name = "certifi" version = "2021.10.8" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = "*" +files = [ + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, +] [[package]] name = "cffi" -version = "1.15.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] [package.dependencies] pycparser = "*" @@ -114,17 +203,23 @@ pycparser = "*" name = "cfgv" version = "3.4.0" description = "Validate configuration and produce human readable error messages." -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] [[package]] name = "charset-normalizer" version = "2.0.8" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.5.0" +files = [ + {file = "charset-normalizer-2.0.8.tar.gz", hash = "sha256:735e240d9a8506778cd7a453d97e817e536bb1fc29f4f6961ce297b9c7a917b0"}, + {file = "charset_normalizer-2.0.8-py3-none-any.whl", hash = "sha256:83fcdeb225499d6344c8f7f34684c2981270beacc32ede2e669e94f7fa544405"}, +] [package.extras] unicode-backport = ["unicodedata2"] @@ -133,9 +228,11 @@ unicode-backport = ["unicodedata2"] name = "ckanapi" version = "4.6" description = "A command line interface and Python module for accessing the CKAN Action API" -category = "main" optional = false python-versions = "*" +files = [ + {file = "ckanapi-4.6.tar.gz", hash = "sha256:35361965bfb38c8e146d7229f2d7c3aaf1c0f2ef547de4239b4d38931bf081d2"}, +] [package.dependencies] docopt = "*" @@ -148,9 +245,12 @@ six = ">=1.9,<2.0" name = "click" version = "8.0.3" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, + {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -159,9 +259,12 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "click-plugins" version = "1.1.1" description = "An extension module for click to enable registering CLI commands via setuptools entry-points." -category = "main" optional = false python-versions = "*" +files = [ + {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"}, + {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"}, +] [package.dependencies] click = ">=4.0" @@ -173,9 +276,12 @@ dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"] name = "cligj" version = "0.7.2" description = "Click params for commmand line interfaces to GeoJSON" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4" +files = [ + {file = "cligj-0.7.2-py3-none-any.whl", hash = "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df"}, + {file = "cligj-0.7.2.tar.gz", hash = "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27"}, +] [package.dependencies] click = ">=4.0" @@ -187,25 +293,84 @@ test = ["pytest-cov"] name = "cloudpickle" version = "2.0.0" description = "Extended pickling support for Python objects" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "cloudpickle-2.0.0-py3-none-any.whl", hash = "sha256:6b2df9741d06f43839a3275c4e6632f7df6487a1f181f5f46a052d3c917c3d11"}, + {file = "cloudpickle-2.0.0.tar.gz", hash = "sha256:5cd02f3b417a783ba84a4ec3e290ff7929009fe51f6405423cfccfadd43ba4a4"}, +] [[package]] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "contourpy" version = "1.1.1" description = "Python library for calculating contours of 2D quadrilateral grids" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b"}, + {file = "contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1"}, + {file = "contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d"}, + {file = "contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431"}, + {file = "contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5"}, + {file = "contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62"}, + {file = "contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33"}, + {file = "contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf"}, + {file = "contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d"}, + {file = "contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6"}, + {file = "contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8"}, + {file = "contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251"}, + {file = "contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7"}, + {file = "contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85"}, + {file = "contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e"}, + {file = "contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0"}, + {file = "contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c"}, + {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, +] [package.dependencies] numpy = {version = ">=1.16,<2.0", markers = "python_version <= \"3.11\""} @@ -219,11 +384,64 @@ test-no-images = ["pytest", "pytest-cov", "wurlitzer"] [[package]] name = "coverage" -version = "7.3.1" +version = "7.3.2" description = "Code coverage measurement for Python" -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, + {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, + {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, + {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, + {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, + {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, + {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, + {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, + {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, + {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, + {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, + {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, + {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, + {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, +] [package.dependencies] tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} @@ -235,9 +453,69 @@ toml = ["tomli"] name = "cramjam" version = "2.7.0" description = "Thin Python bindings to de/compression algorithms in Rust" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "cramjam-2.7.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:aac9d49e16f473ceb4eaf74a53180eac3363127f01855c39122b400a988e80bf"}, + {file = "cramjam-2.7.0-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:a08dcb7c7b54f82db4ee9120aaace06326499c0d4108770ee7ac63d7bd1d803d"}, + {file = "cramjam-2.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c411d785cec410d4164e4ecc76b6c152761fbb61325bcc4acbdc8926874c0b"}, + {file = "cramjam-2.7.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d07c5af763501bd23523658aeb535082eaac014746f7973df85f76b0d9b40967"}, + {file = "cramjam-2.7.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7f93316abc1abfd348b04afc6cadbbd4fba44cd91e7b9803c9330045a7a1885"}, + {file = "cramjam-2.7.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d56afb5f278a18743a218514825b6ab176f18a4084d8f6515c64e3acef19478"}, + {file = "cramjam-2.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea1c781d3760df0b6ad80b7b19dc8e038e0638fb1cfabc68da96cedb8d0adca"}, + {file = "cramjam-2.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f3544ea95d0e98ac926d92d652adc417e78091117cbe2ef7733e26c40601604c"}, + {file = "cramjam-2.7.0-cp310-none-win32.whl", hash = "sha256:0ffb891294e77f2a3b0137992ebd6eb9b1f1bc3728d7d4314632e30270855117"}, + {file = "cramjam-2.7.0-cp310-none-win_amd64.whl", hash = "sha256:79c36d95e89b43c29595c889c7a4d30d29aefc55d7c58a26a058b9bbe7abd5cf"}, + {file = "cramjam-2.7.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:71bf6a6632648333c402a8692fe61f45416066eb0d8b7f4530cdf37fee221a11"}, + {file = "cramjam-2.7.0-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:bee04fd1cdd5f2a2e91e4b271f22e228c698fe7b7f8ef209374d717f7889e80c"}, + {file = "cramjam-2.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60951e64d3e05ef2a46d2a92fc4e4563ae5e28bb3b6f231f2dca68a5078a72dc"}, + {file = "cramjam-2.7.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e6231fd3ac680c34c0d8405abfa8c3d12f92e28d0897d960aa905f053cc09e63"}, + {file = "cramjam-2.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2602c42ed101ada634fa37253d40946f0468b2b749689781cba715a7d78038e"}, + {file = "cramjam-2.7.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbc59b223750a901d65d96333461ab17076594fa34448ed2ef911bd4b628f068"}, + {file = "cramjam-2.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fab800ed93fb129d85c63f26660b695fb194efb29765a163f269321778e28a8d"}, + {file = "cramjam-2.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b48b11c328d91250dadc63c00753f5ba26eb9df5fe75ba2ce8a78631260479d"}, + {file = "cramjam-2.7.0-cp311-none-win32.whl", hash = "sha256:bef07e7d4607c4d70627e58eb630fe60e48b80a61ab05b33314e3296eb90af78"}, + {file = "cramjam-2.7.0-cp311-none-win_amd64.whl", hash = "sha256:3f2e41dc8143d0e88ec9ba3ff66c8d2aea486b04931119abe9e394f9961d74bc"}, + {file = "cramjam-2.7.0-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:d143ccb3f5aae640f0c2dd6244d43f5e5e81d847b50c2eb9f08dcc3dc33f367a"}, + {file = "cramjam-2.7.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47ae97247a58d3095be800420bba7e43cc6958e67f9dfddd12decdb4c99c4d6f"}, + {file = "cramjam-2.7.0-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a8f0fd14bd11f2a625e5c554fd93c7775082c31ffd9fbabb4fe9db3031645d0"}, + {file = "cramjam-2.7.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89b683919ffc846b91b405d5f14df8a2ba1167f4ed9277150298fbe91a3d4aae"}, + {file = "cramjam-2.7.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:66d6a7906fbe8c2e46e987d5a3a9cb235e931b3e4721ac7d8573151c419e3f73"}, + {file = "cramjam-2.7.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:272ab041e95e4088321bffd63ead85d32f86f9fc79f37944663abb59e7fecbb1"}, + {file = "cramjam-2.7.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9698ed7fe78b4de81dcee0624311ee93a4436f0b3e3c6b147a6745a3fd210272"}, + {file = "cramjam-2.7.0-cp37-none-win32.whl", hash = "sha256:5e3869a2ecb7764f18e81afa07aa15a6f28921ae4508ab002314aafecfe7a285"}, + {file = "cramjam-2.7.0-cp37-none-win_amd64.whl", hash = "sha256:58bf5b4dd8f1edaa3bd66b51a26790115efa36cebf66a198a60d095739010b36"}, + {file = "cramjam-2.7.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:1bfd9e9f050a4ef82644a5443742bd6e4d41afc201d5142dfbb5ac73a4f96b94"}, + {file = "cramjam-2.7.0-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:e8b8b968db6a6ec03de231ca17536f8cd69d74e36f0e47e68391a22231c0042c"}, + {file = "cramjam-2.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:820421600d395d0e11b9da1e983acde453637090f5a15abb45f5182cd35f9c3a"}, + {file = "cramjam-2.7.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f8d684a8b918e289bd213d55ea5f67dbf6cc379492e2a7e094724ec62846dea"}, + {file = "cramjam-2.7.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f48e35701528beed092d97c5a1a6ba6c8902c3485d7e3a55c463162bb66afa0"}, + {file = "cramjam-2.7.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:241b9853de56524895c17541d34bdcdd316261247253cb9faeb57a21cc2ae28c"}, + {file = "cramjam-2.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0fa1f8600fdf093a4e5eac5dc56084047abec50d589a8121618e3fb1f9de3f"}, + {file = "cramjam-2.7.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:01573d3c05f75845af75f87d9f6d4d995ee48fafc9c9662679d944c71e658c59"}, + {file = "cramjam-2.7.0-cp38-none-win32.whl", hash = "sha256:44e262f083a0d1c19bc7b8bf8aaa54d31653eab67762cdaeb68fb40b844d50b9"}, + {file = "cramjam-2.7.0-cp38-none-win_amd64.whl", hash = "sha256:2645f0e01735231e3c4d1568c95cc00ed477c1c2e2ed45cb123bef2ccbe72282"}, + {file = "cramjam-2.7.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:f52718e1c7aed3d0e3ffbbe5c085d9c449daa726379788ddb27cb62ffc2b6ba1"}, + {file = "cramjam-2.7.0-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ee4bc46e5cf87d6097833bca33a66f2724b4773242a71ed642d13682fedefb71"}, + {file = "cramjam-2.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd77e784289fc44a5e6487b2e263f07cc271f25a8395e97213b6a934fe47a768"}, + {file = "cramjam-2.7.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53ac8df43546d3f70acbc5c17424a8c083418bd6d2cacfbd5108aaa8f3eb26db"}, + {file = "cramjam-2.7.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca6309d06edf29a9a5c22e25d1d7f7609abb8ae7281583bc486afb19fd645898"}, + {file = "cramjam-2.7.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96ff622f0db7f89d7c9aeadd9cc0c9bf61e804841a03a22ca919aa4955640d"}, + {file = "cramjam-2.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebc87176851c50c5aaf6bacafb6bed5a86e3b4ee6a749d6ec13f3d37ae0e951a"}, + {file = "cramjam-2.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f9340c70d95ea102cf51a07ecc09f93f1363e585d97b5276734a5f8c4476e560"}, + {file = "cramjam-2.7.0-cp39-none-win32.whl", hash = "sha256:3d5ed0fa20b42e063ef66ad01d9948e868bbfc327bf86604e078b67f074f76f3"}, + {file = "cramjam-2.7.0-cp39-none-win_amd64.whl", hash = "sha256:7e44dda432a8c8a47cb73869201d2f9777604bd913d859def84c659fb736cfd3"}, + {file = "cramjam-2.7.0-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:22927dbdda85d8719074e061f9ec024c9bf16088e5e4c6c1c134c46e2d9153b7"}, + {file = "cramjam-2.7.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee80ebd85acec1031e7563cce3de3961bd3f2ec8947c5bf84a9356b25af67a75"}, + {file = "cramjam-2.7.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91bb03ca0d3857f319afd13525d5c6214a55aa49778ce46a02c16f0eee37907c"}, + {file = "cramjam-2.7.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:202e4a5a496ea49d0bb5252fbee8b6e421d256968773c7a8b3e86d98eec9228e"}, + {file = "cramjam-2.7.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19c44de9dee2ea0c586a5b12adc9bc28224544717bce88a94c3ee202b9ece25d"}, + {file = "cramjam-2.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03a72a689c93b8a2c7c08b529c1224c47bd469722e559af231016694b90f6442"}, + {file = "cramjam-2.7.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:fbffb1f63edf4cb4272a25de288c2f2e20914bb93e003883656774e61794b960"}, + {file = "cramjam-2.7.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df46019cb999d874ce86e08d71d7d2983c052d6a63f7aa6bce960e4e05e8ea37"}, + {file = "cramjam-2.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44fe99233ef2f42ff03d8395e7d97e0c45306eb356f6f01fa69bdb49783fdb8a"}, + {file = "cramjam-2.7.0.tar.gz", hash = "sha256:579fb724eec048b1a18ca8f7ad9a7ef296dc02eba5f87fd4d5031f0c32c5c9ac"}, +] [package.extras] dev = ["black (==22.3.0)", "hypothesis", "numpy", "pytest (>=5.30)", "pytest-xdist"] @@ -246,28 +524,41 @@ dev = ["black (==22.3.0)", "hypothesis", "numpy", "pytest (>=5.30)", "pytest-xdi name = "croniter" version = "1.0.15" description = "croniter provides iteration for datetime object with cron like format" -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "croniter-1.0.15-py2.py3-none-any.whl", hash = "sha256:0f97b361fe343301a8f66f852e7d84e4fb7f21379948f71e1bbfe10f5d015fbd"}, + {file = "croniter-1.0.15.tar.gz", hash = "sha256:a70dfc9d52de9fc1a886128b9148c89dd9e76b67d55f46516ca94d2d73d58219"}, +] [package.dependencies] python-dateutil = "*" [[package]] name = "cycler" -version = "0.11.0" +version = "0.12.1" description = "Composable style cycles" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "dask" version = "2021.11.2" description = "Parallel PyData with Task Scheduling" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "dask-2021.11.2-py3-none-any.whl", hash = "sha256:2b0ad7beba8950add4fdc7c5cb94fa9444915ddb00c711d5743e2c4bb0a95ef5"}, + {file = "dask-2021.11.2.tar.gz", hash = "sha256:e12bfe272928d62fa99623d98d0e0b0c045b33a47509ef31a22175aa5fd10917"}, +] [package.dependencies] cloudpickle = ">=1.1.1" @@ -287,11 +578,14 @@ test = ["pre-commit", "pytest", "pytest-rerunfailures", "pytest-xdist"] [[package]] name = "db-dtypes" -version = "1.1.1" +version = "1.2.0" description = "Pandas Data Types for SQL systems (BigQuery, Spanner)" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "db-dtypes-1.2.0.tar.gz", hash = "sha256:3531bb1fb8b5fbab33121fe243ccc2ade16ab2524f4c113b05cc702a1908e6ea"}, + {file = "db_dtypes-1.2.0-py2.py3-none-any.whl", hash = "sha256:6320bddd31d096447ef749224d64aab00972ed20e4392d86f7d8b81ad79f7ff0"}, +] [package.dependencies] numpy = ">=1.16.6" @@ -303,9 +597,12 @@ pyarrow = ">=3.0.0" name = "dbt-client" version = "0.1.3" description = "A simple client for DBT RPC instances" -category = "main" optional = false python-versions = ">=3.8,<4.0" +files = [ + {file = "dbt-client-0.1.3.tar.gz", hash = "sha256:192fff51a51d6d002d4048dd494e601592599e004c0f31f1ea5156aa6d516cf5"}, + {file = "dbt_client-0.1.3-py3-none-any.whl", hash = "sha256:31a0db4844c1559c95c643a6f57d1e39d4e9c3b4d9a8c867f7b3e6ed75cedca0"}, +] [package.dependencies] requests = ">=2.26.0,<3.0.0" @@ -314,28 +611,37 @@ requests = ">=2.26.0,<3.0.0" name = "dill" version = "0.3.7" description = "serialize all of Python" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, +] [package.extras] graph = ["objgraph (>=1.7.2)"] [[package]] name = "distlib" -version = "0.3.7" +version = "0.3.8" description = "Distribution utilities" -category = "main" optional = false python-versions = "*" +files = [ + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, +] [[package]] name = "distributed" version = "2021.11.2" description = "Distributed scheduler for Dask" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "distributed-2021.11.2-py3-none-any.whl", hash = "sha256:af1f7b98d85d43886fefe2354379c848c7a5aa6ae4d2313a7aca9ab9081a7e56"}, + {file = "distributed-2021.11.2.tar.gz", hash = "sha256:f86a01a2e1e678865d2e42300c47552b5012cd81a2d354e47827a1fd074cc302"}, +] [package.dependencies] click = ">=6.6" @@ -356,9 +662,12 @@ zict = ">=0.1.3" name = "docker" version = "5.0.3" description = "A Python library for the Docker Engine API." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "docker-5.0.3-py2.py3-none-any.whl", hash = "sha256:7a79bb439e3df59d0a72621775d600bc8bc8b422d285824cb37103eab91d1ce0"}, + {file = "docker-5.0.3.tar.gz", hash = "sha256:d916a26b62970e7c2f554110ed6af04c7ccff8e9f81ad17d0d40c75637e227fb"}, +] [package.dependencies] pywin32 = {version = "227", markers = "sys_platform == \"win32\""} @@ -373,61 +682,143 @@ tls = ["cryptography (>=3.4.7)", "idna (>=2.0.0)", "pyOpenSSL (>=17.5.0)"] name = "docopt" version = "0.6.2" description = "Pythonic argument parser, that will make you smile" -category = "main" optional = false python-versions = "*" +files = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] [[package]] name = "et-xmlfile" version = "1.1.0" description = "An implementation of lxml.xmlfile for the standard library" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, + {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, +] [[package]] name = "exceptiongroup" -version = "1.1.3" +version = "1.2.0" description = "Backport of PEP 654 (exception groups)" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, +] [package.extras] test = ["pytest (>=6)"] [[package]] name = "fake-useragent" -version = "1.2.1" +version = "1.4.0" description = "Up-to-date simple useragent faker with real world database" -category = "main" optional = false python-versions = "*" +files = [ + {file = "fake-useragent-1.4.0.tar.gz", hash = "sha256:5426e4015d8ccc5bb25f64d3dfcfd3915eba30ffebd31b86b60dc7a4c5d65528"}, + {file = "fake_useragent-1.4.0-py3-none-any.whl", hash = "sha256:9acce439ee2c6cf9c3772fa6c200f62dc8d56605063327a4d8c5d0e47f414b85"}, +] [package.dependencies] importlib-resources = {version = ">=5.0", markers = "python_version < \"3.10\""} [[package]] name = "fastavro" -version = "1.5.4" +version = "1.9.1" description = "Fast read/write of AVRO files" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "fastavro-1.9.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:de181b2e67f1f42f0c15f87ff530dda88cfe2efc91653b6d38d0aaf4c8800bbf"}, + {file = "fastavro-1.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84616dae53581733aac1161685d35c269922cee79170d8a1f7dbc56c8e2c6a95"}, + {file = "fastavro-1.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee78b13e118468e6796a97857a02dd2a8076f2946c6ab992a25597ee60a8963"}, + {file = "fastavro-1.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70df5a6428e5c60b08d92a3cf955d2c658e0460059654b0490c908d429bcf332"}, + {file = "fastavro-1.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:47f66f8282f7b2b70d4edc1c1853c154a9db14693a20fc1fa78859eb091c6beb"}, + {file = "fastavro-1.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:b558a789b1a24be3b471a2d430a1583e4e18b09896a27ce80211d40c91d3895a"}, + {file = "fastavro-1.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cd00aa7a7e463538b3930b27ea98270af11de3a6436b658086802964ae53cfc7"}, + {file = "fastavro-1.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d8037a800914acfd2d17894accfdd9ba96e316bce173e3ac2bc36c9d6f91adb"}, + {file = "fastavro-1.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5a6d15fd3783165113b8292058f06c555fecb7b0bbc0dfd391dc6f320675157"}, + {file = "fastavro-1.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:46e69d9fe30ccba8a1a22c2ed2e88deb4ae1ce42f47495f59bd1cac60c3f3e75"}, + {file = "fastavro-1.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a06ae6b12b4dfe8fa6c84019a949b44067bf5d7fb051f7101a9093dc2c8c7631"}, + {file = "fastavro-1.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:47f18c4f3f5a945c32d386402cf007f700433fd1b9b6af78eb35ee09a29ba8ad"}, + {file = "fastavro-1.9.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7ce88e5bc88d3d210dca99b69cffc6a7a0538815e86e806730cd79914ac9c17f"}, + {file = "fastavro-1.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16ebff73e08bc6437746e36a131f3a025d49b5867f5975bcc4a3e57cafcb3338"}, + {file = "fastavro-1.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b5ebcf4ea3b50cfb80c7cd363e57daab8c2662b85de9ced838e32b5a46a106f"}, + {file = "fastavro-1.9.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2d52c69089f6ce7110665149ced29cb68f2f1cd6812b28ebb53b158b53e069f7"}, + {file = "fastavro-1.9.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e21c23b7d19df260244ae8fb4470ce27399dc1c0129fa523285e39d8ff7b5ef8"}, + {file = "fastavro-1.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:28886022b9c5e5175e44aa04ed10d733b7503028092e38e61ecafe006f839362"}, + {file = "fastavro-1.9.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:dfdfb3706646397f1c71e6652c9ca23ed29698c5f1bd20f32903589d3ae62219"}, + {file = "fastavro-1.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9b1edaebef41500028b6bfbef1a46dc2e5b23f8a5dbde8d8c087b290572e5d2"}, + {file = "fastavro-1.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ff2184d82788ff6d986372e72add561700ccdedea13b649593604d078dbf674"}, + {file = "fastavro-1.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:13ae31bb1b9ee69109e4032946d94ab92c1f1c49194917e64bb7f5923ba4f8fd"}, + {file = "fastavro-1.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a9f549ee83ae4df5bc952552caad2011272d20a9fb0cddd50ff3fa1edd8d11a9"}, + {file = "fastavro-1.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:b0265fbec0a268baadf3482eb92d0a4f644f68f8dc266a19a0440b7a28987564"}, + {file = "fastavro-1.9.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0533a430aafe75bc02fe66391361a5f374f08375a89ec93365cb15c016e7f911"}, + {file = "fastavro-1.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dc30d9fa7592b0a652911466a7898547277e7f054e23f95fc5d0e8b88788174"}, + {file = "fastavro-1.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b786f872d5caa34b8c18f2ed73efd99b8b8e1c404342a4242cf3ad7344bdd46c"}, + {file = "fastavro-1.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9a9a7213d80eb5e47ffb471c089cfbc19ec5b2390b75f6ef2e09e8678c0f7aeb"}, + {file = "fastavro-1.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0b9e9cb05500ed8578ce614a5df4b2b525ded2674320725d405435925addd446"}, + {file = "fastavro-1.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:abfef36fdd2cdbf3b7e7551f6506b908f24e241eebc2ab14e7ff6862679fd1ef"}, + {file = "fastavro-1.9.1.tar.gz", hash = "sha256:f37011d66de8ba81b26760db0478009a14c08ebfd34269b3390abfd4616b308f"}, +] [package.extras] -codecs = ["lz4", "python-snappy", "zstandard"] +codecs = ["cramjam", "lz4", "zstandard"] lz4 = ["lz4"] -snappy = ["python-snappy"] +snappy = ["cramjam"] zstandard = ["zstandard"] [[package]] name = "fastparquet" -version = "2023.8.0" +version = "2023.10.1" description = "Python support for Parquet file format" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "fastparquet-2023.10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:75a00475e96d26214dace147b27ab782da7a0ae230cade05ea9181c3aec2e637"}, + {file = "fastparquet-2023.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:af0c1d5559aa0a4fff8eb3b301c8177b6813bb15fe9d2007ad0dc89f8fa519c5"}, + {file = "fastparquet-2023.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b798cdfa8f01cd573b135a493a4d0686ebbcd3a412d6e59889a7ae41ff90efeb"}, + {file = "fastparquet-2023.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a746f521da7459707899fc33b334b2d21f590380f472fc27642f3ef28ee451d2"}, + {file = "fastparquet-2023.10.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e86d64898e846ed0f5745427436e5772fd7bb5d9a930f1dca8233e90385e126b"}, + {file = "fastparquet-2023.10.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5c3afafd4a0907216f5ee4f835f47ad16b84c5dede4c5ca4c0754dffe3eb72d7"}, + {file = "fastparquet-2023.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:68d26a1172be5b02018f6c28603f195807955d8262b913349385d977f3ae081f"}, + {file = "fastparquet-2023.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:b7086ca3a0d8ae8680b380da9b7057a1491d629945b1dd228eba5b362e2e39aa"}, + {file = "fastparquet-2023.10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7f8d53f5e5049b21893964cd27154c2a7c8180f3ffd1f2693f80e0f834a3a35e"}, + {file = "fastparquet-2023.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea74f28494fda892641a564f728d046a074fdea5b9ff664ef9554c0da563bad4"}, + {file = "fastparquet-2023.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab978612d21630033df0a0b12423ed826fe36e83a1710b155968c3c6e2b3174a"}, + {file = "fastparquet-2023.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc30c502feaa67c058c496eb4a734eba8bd373f0d24a32cc69360c79f7220ef"}, + {file = "fastparquet-2023.10.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99568ae6bbbd973b32d796cb664ba156b101e5d1931dba780fe2dc0d9b227dfd"}, + {file = "fastparquet-2023.10.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:53b9ad8d646c2609854cbe7d7b17be343664cabae1cd0eb119011e389df8484d"}, + {file = "fastparquet-2023.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b2a9ee49039223a1e216c409c25072be1f362de27197cbec5f90cf2e736df3b0"}, + {file = "fastparquet-2023.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:9133d2f975c6e05187be4b558060e6a4aafeba02dceaf849cf6ad46d32e59405"}, + {file = "fastparquet-2023.10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b826696cd48f1defb6fcafb4c9798102233e54f3f3491251c034dde3d94f420a"}, + {file = "fastparquet-2023.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bf2d58bee17e0eea8565c2bcd2b339ee032472751651e21f000eb564ad3cd5cf"}, + {file = "fastparquet-2023.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9296098d06c6692ee477fe491381eda39fc0dcfe2fce210496491fe16ce27ef8"}, + {file = "fastparquet-2023.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c975d648ea491e684135e9e3c0a15b440d66d0772fe497269e5c9c4eaaeb62a2"}, + {file = "fastparquet-2023.10.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4c5208db1f38c8ac5f50f309f77bdb828fa7f247b82e2df88d847ad3bec38903"}, + {file = "fastparquet-2023.10.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:118d1832ed2098f313936044012083c8c1b07da85ee11612895f3c4ef27bfd8a"}, + {file = "fastparquet-2023.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:35cff597d2778b6fe8ef7dc36cba056cd7337151dbfc2fb08abaa6b109c75140"}, + {file = "fastparquet-2023.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da633a0bd1889f30acb1b6dffa99832739802d0ae5f455b4e5eb720ab701e09"}, + {file = "fastparquet-2023.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8aff041900ebcb4c2510bede80695fed35fb7c24dfd83b60ba8b56d7ede4e0fe"}, + {file = "fastparquet-2023.10.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62aabf43b6bbbc074b89f9a4769f7276204b6585d2d8fae770a0b782da5b9fc9"}, + {file = "fastparquet-2023.10.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ba85d9e5c298515a347f94bc65c0b570391b344d765dc349bafb35137466ddb2"}, + {file = "fastparquet-2023.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2be7d33969e724c8aa777122d6032845a362cb2075f6e6f2c5b2150bd6223cc8"}, + {file = "fastparquet-2023.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:2a0c1f485d3085fe98dbae9ead2e97a886deb99d3db7af635296bfd3f4f2f814"}, + {file = "fastparquet-2023.10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1fac5319aabcbc4acc2feb5df68336de755de7d60a2ee9329fef178ac016e236"}, + {file = "fastparquet-2023.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c61d26705e9a2ad2d52ed1d527c75e96e6a9a04be35bd4c8d6f4accd778f9b05"}, + {file = "fastparquet-2023.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2635f0f37a983e35be9b8013b84361e3d0cdd4f514b822016445c029b1c6e007"}, + {file = "fastparquet-2023.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cde8f6798d37e2af38ada058fc7018c2157d90a8dd728c0c59fab85b8adb9215"}, + {file = "fastparquet-2023.10.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20c17c5e7186723a175c9e7da94285bdef3cb477cb7cca0e2812b1e245279671"}, + {file = "fastparquet-2023.10.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:91ee6b5b0efc18586e61da6662119de92fc7bf552c3a08a13eb2af16bc12f16a"}, + {file = "fastparquet-2023.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:332cb3b204e1de64dcfc4c5d0b517ea665856d19c139f693e8c9efc11992e19e"}, + {file = "fastparquet-2023.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:5eb06a70daf50d70290b87f3a5ca6f25eb24ad850bcc68197b5438d92b11c763"}, + {file = "fastparquet-2023.10.1.tar.gz", hash = "sha256:076fedfba2b56782b4823c1d351424425cfeaa5b8644c542416ca1363fe6d921"}, +] [package.dependencies] cramjam = ">=2.3" @@ -441,24 +832,52 @@ lzo = ["python-lzo"] [[package]] name = "filelock" -version = "3.12.4" +version = "3.13.1" description = "A platform independent file lock." -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, + {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, +] [package.extras] -docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] -typing = ["typing-extensions (>=4.7.1)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] [[package]] name = "fiona" -version = "1.9.4.post1" +version = "1.9.5" description = "Fiona reads and writes spatial data files" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "fiona-1.9.5-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:5f40a40529ecfca5294260316cf987a0420c77a2f0cf0849f529d1afbccd093e"}, + {file = "fiona-1.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:374efe749143ecb5cfdd79b585d83917d2bf8ecfbfc6953c819586b336ce9c63"}, + {file = "fiona-1.9.5-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:35dae4b0308eb44617cdc4461ceb91f891d944fdebbcba5479efe524ec5db8de"}, + {file = "fiona-1.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:5b4c6a3df53bee8f85bb46685562b21b43346be1fe96419f18f70fa1ab8c561c"}, + {file = "fiona-1.9.5-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:6ad04c1877b9fd742871b11965606c6a52f40706f56a48d66a87cc3073943828"}, + {file = "fiona-1.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9fb9a24a8046c724787719e20557141b33049466145fc3e665764ac7caf5748c"}, + {file = "fiona-1.9.5-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:d722d7f01a66f4ab6cd08d156df3fdb92f0669cf5f8708ddcb209352f416f241"}, + {file = "fiona-1.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:7ede8ddc798f3d447536080c6db9a5fb73733ad8bdb190cb65eed4e289dd4c50"}, + {file = "fiona-1.9.5-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:8b098054a27c12afac4f819f98cb4d4bf2db9853f70b0c588d7d97d26e128c39"}, + {file = "fiona-1.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d9f29e9bcbb33232ff7fa98b4a3c2234db910c1dc6c4147fc36c0b8b930f2e0"}, + {file = "fiona-1.9.5-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:f1af08da4ecea5036cb81c9131946be4404245d1b434b5b24fd3871a1d4030d9"}, + {file = "fiona-1.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:c521e1135c78dec0d7774303e5a1b4c62e0efb0e602bb8f167550ef95e0a2691"}, + {file = "fiona-1.9.5-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:fce4b1dd98810cabccdaa1828430c7402d283295c2ae31bea4f34188ea9e88d7"}, + {file = "fiona-1.9.5-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:3ea04ec2d8c57b5f81a31200fb352cb3242aa106fc3e328963f30ffbdf0ff7c8"}, + {file = "fiona-1.9.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4877cc745d9e82b12b3eafce3719db75759c27bd8a695521202135b36b58c2e7"}, + {file = "fiona-1.9.5-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:ac2c250f509ec19fad7959d75b531984776517ef3c1222d1cc5b4f962825880b"}, + {file = "fiona-1.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4df21906235928faad856c288cfea0298e9647f09c9a69a230535cbc8eadfa21"}, + {file = "fiona-1.9.5-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:81d502369493687746cb8d3cd77e5ada4447fb71d513721c9a1826e4fb32b23a"}, + {file = "fiona-1.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:ce3b29230ef70947ead4e701f3f82be81082b7f37fd4899009b1445cc8fc276a"}, + {file = "fiona-1.9.5-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:8b53ce8de773fcd5e2e102e833c8c58479edd8796a522f3d83ef9e08b62bfeea"}, + {file = "fiona-1.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bd2355e859a1cd24a3e485c6dc5003129f27a2051629def70036535ffa7e16a4"}, + {file = "fiona-1.9.5-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:9a2da52f865db1aff0eaf41cdd4c87a7c079b3996514e8e7a1ca38457309e825"}, + {file = "fiona-1.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:cfef6db5b779d463298b1113b50daa6c5b55f26f834dc9e37752116fa17277c1"}, + {file = "fiona-1.9.5.tar.gz", hash = "sha256:99e2604332caa7692855c2ae6ed91e1fffdf9b59449aa8032dd18e070e59a2f7"}, +] [package.dependencies] attrs = ">=19.2.0" @@ -467,6 +886,7 @@ click = ">=8.0,<9.0" click-plugins = ">=1.0" cligj = ">=0.5" importlib-metadata = {version = "*", markers = "python_version < \"3.10\""} +setuptools = "*" six = "*" [package.extras] @@ -477,14 +897,57 @@ test = ["Fiona[s3]", "pytest (>=7)", "pytest-cov", "pytz"] [[package]] name = "fonttools" -version = "4.42.1" +version = "4.46.0" description = "Tools to manipulate font files" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "fonttools-4.46.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d4e69e2c7f93b695d2e6f18f709d501d945f65c1d237dafaabdd23cd935a5276"}, + {file = "fonttools-4.46.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:25852f0c63df0af022f698464a4a80f7d1d5bd974bcd22f995f6b4ad198e32dd"}, + {file = "fonttools-4.46.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adab73618d0a328b203a0e242b3eba60a2b5662d9cb2bd16ed9c52af8a7d86af"}, + {file = "fonttools-4.46.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cf923a4a556ab4cc4c52f69a4a2db624cf5a2cf360394368b40c5152fe3321e"}, + {file = "fonttools-4.46.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:87c214197712cc14fd2a4621efce2a9c501a77041232b789568149a8a3161517"}, + {file = "fonttools-4.46.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:156ae342a1ed1fe38e180de471e98fbf5b2b6ae280fa3323138569c4ca215844"}, + {file = "fonttools-4.46.0-cp310-cp310-win32.whl", hash = "sha256:c506e3d3a9e898caee4dc094f34b49c5566870d5a2d1ca2125f0a9f35ecc2205"}, + {file = "fonttools-4.46.0-cp310-cp310-win_amd64.whl", hash = "sha256:f8bc3973ed58893c4107993e0a7ae34901cb572b5e798249cbef35d30801ffd4"}, + {file = "fonttools-4.46.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:982f69855ac258260f51048d9e0c53c5f19881138cc7ca06deb38dc4b97404b6"}, + {file = "fonttools-4.46.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c23c59d321d62588620f2255cf951270bf637d88070f38ed8b5e5558775b86c"}, + {file = "fonttools-4.46.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0e94244ec24a940ecfbe5b31c975c8a575d5ed2d80f9a280ce3b21fa5dc9c34"}, + {file = "fonttools-4.46.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a9f9cdd7ef63d1b8ac90db335762451452426b3207abd79f60da510cea62da5"}, + {file = "fonttools-4.46.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ca9eceebe70035b057ce549e2054cad73e95cac3fe91a9d827253d1c14618204"}, + {file = "fonttools-4.46.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8be6adfa4e15977075278dd0a0bae74dec59be7b969b5ceed93fb86af52aa5be"}, + {file = "fonttools-4.46.0-cp311-cp311-win32.whl", hash = "sha256:7b5636f5706d49f13b6d610fe54ee662336cdf56b5a6f6683c0b803e23d826d2"}, + {file = "fonttools-4.46.0-cp311-cp311-win_amd64.whl", hash = "sha256:49ea0983e55fd7586a809787cd4644a7ae471e53ab8ddc016f9093b400e32646"}, + {file = "fonttools-4.46.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7b460720ce81773da1a3e7cc964c48e1e11942b280619582a897fa0117b56a62"}, + {file = "fonttools-4.46.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8bee9f4fc8c99824a424ae45c789ee8c67cb84f8e747afa7f83b7d3cef439c3b"}, + {file = "fonttools-4.46.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3d7b96aba96e05e8c911ce2dfc5acc6a178b8f44f6aa69371ab91aa587563da"}, + {file = "fonttools-4.46.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e6aeb5c340416d11a3209d75c48d13e72deea9e1517837dd1522c1fd1f17c11"}, + {file = "fonttools-4.46.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c779f8701deedf41908f287aeb775b8a6f59875ad1002b98ac6034ae4ddc1b7b"}, + {file = "fonttools-4.46.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce199227ce7921eaafdd4f96536f16b232d6b580ce74ce337de544bf06cb2752"}, + {file = "fonttools-4.46.0-cp312-cp312-win32.whl", hash = "sha256:1c9937c4dd1061afd22643389445fabda858af5e805860ec3082a4bc07c7a720"}, + {file = "fonttools-4.46.0-cp312-cp312-win_amd64.whl", hash = "sha256:a9fa52ef8fd14d7eb3d813e1451e7ace3e1eebfa9b7237d3f81fee8f3de6a114"}, + {file = "fonttools-4.46.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c94564b1f3b5dd87e73577610d85115b1936edcc596deaf84a31bbe70e17456b"}, + {file = "fonttools-4.46.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4a50a1dfad7f7ba5ca3f99cc73bf5cdac67ceade8e4b355a877521f20ad1b63"}, + {file = "fonttools-4.46.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89c2c520f9492844ecd6316d20c6c7a157b5c0cb73a1411b3db28ee304f30122"}, + {file = "fonttools-4.46.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5b7905fd68eacb7cc56a13139da5c312c45baae6950dd00b02563c54508a041"}, + {file = "fonttools-4.46.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8485cc468288e213f31afdaf1fdda3c79010f542559fbba936a54f4644df2570"}, + {file = "fonttools-4.46.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:87c3299da7da55394fb324349db0ede38114a46aafd0e7dfcabfecd28cdd94c3"}, + {file = "fonttools-4.46.0-cp38-cp38-win32.whl", hash = "sha256:f5f1423a504ccc329efb5aa79738de83d38c072be5308788dde6bd419969d7f5"}, + {file = "fonttools-4.46.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d4a4ebcc76e30898ff3296ea786491c70e183f738319ae2629e0d44f17ece42"}, + {file = "fonttools-4.46.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9a0e422ab79e5cb2b47913be6a4b5fd20c4c7ac34a24f3691a4e099e965e0b8"}, + {file = "fonttools-4.46.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:13ac0cba2fc63fa4b232f2a7971f35f35c6eaf10bd1271fa96d4ce6253a8acfd"}, + {file = "fonttools-4.46.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:795150d5edc595e1a2cfb3d65e8f4f3d027704fc2579f8990d381bef6b188eb6"}, + {file = "fonttools-4.46.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d00fc63131dcac6b25f50a5a129758438317e54e3ce5587163f7058de4b0e933"}, + {file = "fonttools-4.46.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3033b55f401a622de2630b3982234d97219d89b058607b87927eccb0f922313c"}, + {file = "fonttools-4.46.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e26e7fb908ae4f622813e7cb32cd2db6c24e3122bb3b98f25e832a2fe0e7e228"}, + {file = "fonttools-4.46.0-cp39-cp39-win32.whl", hash = "sha256:2d0eba685938c603f2f648dfc0aadbf8c6a4fe1c7ca608c2970a6ef39e00f254"}, + {file = "fonttools-4.46.0-cp39-cp39-win_amd64.whl", hash = "sha256:5200b01f463d97cc2b7ff8a1e3584151f4413e98cb8419da5f17d1dbb84cc214"}, + {file = "fonttools-4.46.0-py3-none-any.whl", hash = "sha256:5b627ed142398ea9202bd752c04311592558964d1a765fb2f78dc441a05633f4"}, + {file = "fonttools-4.46.0.tar.gz", hash = "sha256:2ae45716c27a41807d58a9f3f59983bdc8c0a46cb259e4450ab7e196253a9853"}, +] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres", "scipy"] lxml = ["lxml (>=4.0,<5)"] @@ -494,16 +957,19 @@ repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.0.0)"] +unicode = ["unicodedata2 (>=15.1.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "fsspec" version = "2021.11.1" description = "File-system specification" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "fsspec-2021.11.1-py3-none-any.whl", hash = "sha256:bcb136caa37e1470dd8314a7d3917cb9b25dd9da44c10d36df556ab4ef038185"}, + {file = "fsspec-2021.11.1.tar.gz", hash = "sha256:03683e606651d5e4bd9180525d57477bd5430e5dc68d2e459835dc14cecc3dd4"}, +] [package.extras] abfs = ["adlfs"] @@ -531,9 +997,12 @@ ssh = ["paramiko"] name = "geopandas" version = "0.13.2" description = "Geographic pandas extensions" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "geopandas-0.13.2-py3-none-any.whl", hash = "sha256:101cfd0de54bcf9e287a55b5ea17ebe0db53a5e25a28bacf100143d0507cabd9"}, + {file = "geopandas-0.13.2.tar.gz", hash = "sha256:e5b56d9c20800c77bcc0c914db3f27447a37b23b2cd892be543f5001a694a968"}, +] [package.dependencies] fiona = ">=1.8.19" @@ -546,12 +1015,15 @@ shapely = ">=1.7.1" name = "google-analytics-data" version = "0.17.0" description = "Google Analytics Data API client library" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "google-analytics-data-0.17.0.tar.gz", hash = "sha256:f7ed38016674f577d20400bcd9efe9951e1a150ea53c24461b5e9eee5d537858"}, + {file = "google_analytics_data-0.17.0-py2.py3-none-any.whl", hash = "sha256:26f0870e857f60c2cd70774d82d02e9751283f54ad33a73d42bd33e950b59fbd"}, +] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} proto-plus = ">=1.22.0,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" @@ -559,9 +1031,12 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 name = "google-api-core" version = "2.11.1" description = "Google API client core library" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "google-api-core-2.11.1.tar.gz", hash = "sha256:25d29e05a0058ed5f19c61c0a78b1b53adea4d9364b464d014fbda941f6d1c9a"}, + {file = "google_api_core-2.11.1-py3-none-any.whl", hash = "sha256:d92a5a92dc36dd4f4b9ee4e55528a90e432b059f93aee6ad857f9de8cc7ae94a"}, +] [package.dependencies] google-auth = ">=2.14.1,<3.0.dev0" @@ -578,14 +1053,17 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.101.0" +version = "2.110.0" description = "Google API Client Library for Python" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "google-api-python-client-2.110.0.tar.gz", hash = "sha256:1f825e48c7fdc3c96ad6aac179cb73c3755dfff41d16487fa7130e5efcfe7b76"}, + {file = "google_api_python_client-2.110.0-py2.py3-none-any.whl", hash = "sha256:55e7ebd6079e34934b6751537eb13447110351ae3792a724a33825d7b671ba13"}, +] [package.dependencies] -google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0.dev0" +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0.dev0" google-auth = ">=1.19.0,<3.0.0.dev0" google-auth-httplib2 = ">=0.1.0" httplib2 = ">=0.15.0,<1.dev0" @@ -595,9 +1073,12 @@ uritemplate = ">=3.0.1,<5" name = "google-auth" version = "2.22.0" description = "Google Authentication Library" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "google-auth-2.22.0.tar.gz", hash = "sha256:164cba9af4e6e4e40c3a4f90a1a6c12ee56f14c0b4868d1ca91b32826ab334ce"}, + {file = "google_auth-2.22.0-py2.py3-none-any.whl", hash = "sha256:d61d1b40897407b574da67da1a833bdc10d5a11642566e506565d1b1a46ba873"}, +] [package.dependencies] cachetools = ">=2.0.0,<6.0" @@ -617,9 +1098,12 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] name = "google-auth-httplib2" version = "0.1.1" description = "Google Authentication Library: httplib2 transport" -category = "main" optional = false python-versions = "*" +files = [ + {file = "google-auth-httplib2-0.1.1.tar.gz", hash = "sha256:c64bc555fdc6dd788ea62ecf7bccffcf497bf77244887a3f3d7a5a02f8e3fc29"}, + {file = "google_auth_httplib2-0.1.1-py2.py3-none-any.whl", hash = "sha256:42c50900b8e4dcdf8222364d1f0efe32b8421fb6ed72f2613f12f75cc933478c"}, +] [package.dependencies] google-auth = "*" @@ -629,9 +1113,12 @@ httplib2 = ">=0.19.0" name = "google-auth-oauthlib" version = "1.1.0" description = "Google Authentication Library" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "google-auth-oauthlib-1.1.0.tar.gz", hash = "sha256:83ea8c3b0881e453790baff4448e8a6112ac8778d1de9da0b68010b843937afb"}, + {file = "google_auth_oauthlib-1.1.0-py2.py3-none-any.whl", hash = "sha256:089c6e587d36f4803ac7e0720c045c6a8b1fd1790088b8424975b90d0ee61c12"}, +] [package.dependencies] google-auth = ">=2.15.0" @@ -642,57 +1129,64 @@ tool = ["click (>=6.0.0)"] [[package]] name = "google-cloud-bigquery" -version = "3.11.4" +version = "3.14.0" description = "Google BigQuery API client library" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "google-cloud-bigquery-3.14.0.tar.gz", hash = "sha256:76c919f771ac82ba372f5a8d326c032229c5fdab738d03a2b6e73b412c22c9eb"}, + {file = "google_cloud_bigquery-3.14.0-py2.py3-none-any.whl", hash = "sha256:3304f4742546be70e531232f31bbf5b4b257aa63a508101ab7c4582c9503b636"}, +] [package.dependencies] -google-api-core = {version = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev" google-cloud-core = ">=1.6.0,<3.0.0dev" google-resumable-media = ">=0.6.0,<3.0dev" -grpcio = ">=1.47.0,<2.0dev" packaging = ">=20.0.0" -proto-plus = ">=1.15.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" python-dateutil = ">=2.7.2,<3.0dev" requests = ">=2.21.0,<3.0.0dev" [package.extras] -all = ["Shapely (>=1.8.4,<2.0dev)", "db-dtypes (>=0.3.0,<2.0.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)", "ipywidgets (>=7.7.0)", "opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)", "tqdm (>=4.7.4,<5.0.0dev)"] +all = ["Shapely (>=1.8.4,<3.0.0dev)", "db-dtypes (>=0.3.0,<2.0.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "importlib-metadata (>=1.0.0)", "ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)", "ipywidgets (>=7.7.0)", "opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)", "pandas (>=1.1.0)", "proto-plus (>=1.15.0,<2.0.0dev)", "protobuf (>=3.19.5,!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev)", "pyarrow (>=3.0.0)", "tqdm (>=4.7.4,<5.0.0dev)"] +bigquery-v2 = ["proto-plus (>=1.15.0,<2.0.0dev)", "protobuf (>=3.19.5,!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev)"] bqstorage = ["google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] -geopandas = ["Shapely (>=1.8.4,<2.0dev)", "geopandas (>=0.9.0,<1.0dev)"] +geopandas = ["Shapely (>=1.8.4,<3.0.0dev)", "geopandas (>=0.9.0,<1.0dev)"] ipython = ["ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)"] ipywidgets = ["ipykernel (>=6.0.0)", "ipywidgets (>=7.7.0)"] opentelemetry = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] -pandas = ["db-dtypes (>=0.3.0,<2.0.0dev)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)"] +pandas = ["db-dtypes (>=0.3.0,<2.0.0dev)", "importlib-metadata (>=1.0.0)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)"] tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] [[package]] name = "google-cloud-bigquery-connection" -version = "1.13.1" +version = "1.14.0" description = "Google Cloud Bigquery Connection API client library" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "google-cloud-bigquery-connection-1.14.0.tar.gz", hash = "sha256:54a2173a6a81255eac46bdf6bb0ea2f4fb112ff03498c46a7a360eb629adbf0a"}, + {file = "google_cloud_bigquery_connection-1.14.0-py2.py3-none-any.whl", hash = "sha256:19733411c7b5e6bb2de3fcfd42067038dc768fb56116dd718dfed24be8a70389"}, +] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.0,<2.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] name = "google-cloud-bigquery-storage" -version = "2.22.0" +version = "2.23.0" description = "Google Cloud Bigquery Storage API client library" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "google-cloud-bigquery-storage-2.23.0.tar.gz", hash = "sha256:8496c6d30575efb224c18940566f9ac006d3b120ae759002918697c3407997e6"}, + {file = "google_cloud_bigquery_storage-2.23.0-py2.py3-none-any.whl", hash = "sha256:371ff0a86d6166d7a935d6839474e5b5ab04ebd6598ea4b6c12b920719f2e0cb"}, +] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} proto-plus = ">=1.22.0,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" @@ -705,12 +1199,15 @@ pyarrow = ["pyarrow (>=0.15.0)"] name = "google-cloud-core" version = "2.3.3" description = "Google Cloud API client core library" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "google-cloud-core-2.3.3.tar.gz", hash = "sha256:37b80273c8d7eee1ae816b3a20ae43585ea50506cb0e60f3cf5be5f87f1373cb"}, + {file = "google_cloud_core-2.3.3-py2.py3-none-any.whl", hash = "sha256:fbd11cad3e98a7e5b0343dc07cb1039a5ffd7a5bb96e1f1e27cee4bda4a90863"}, +] [package.dependencies] -google-api-core = ">=1.31.6,<2.0.0 || >2.3.0,<3.0.0dev" +google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" google-auth = ">=1.25.0,<3.0dev" [package.extras] @@ -720,12 +1217,15 @@ grpc = ["grpcio (>=1.38.0,<2.0dev)"] name = "google-cloud-storage" version = "2.10.0" description = "Google Cloud Storage API client library" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "google-cloud-storage-2.10.0.tar.gz", hash = "sha256:934b31ead5f3994e5360f9ff5750982c5b6b11604dc072bc452c25965e076dc7"}, + {file = "google_cloud_storage-2.10.0-py2.py3-none-any.whl", hash = "sha256:9433cf28801671de1c80434238fb1e7e4a1ba3087470e90f70c928ea77c2b9d7"}, +] [package.dependencies] -google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev" +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev" google-auth = ">=1.25.0,<3.0dev" google-cloud-core = ">=2.3.0,<3.0dev" google-resumable-media = ">=2.3.2" @@ -738,9 +1238,53 @@ protobuf = ["protobuf (<5.0.0dev)"] name = "google-crc32c" version = "1.3.0" description = "A python wrapper of the C library 'Google CRC32C'" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "google-crc32c-1.3.0.tar.gz", hash = "sha256:276de6273eb074a35bc598f8efbc00c7869c5cf2e29c90748fccc8c898c244df"}, + {file = "google_crc32c-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cb6994fff247987c66a8a4e550ef374671c2b82e3c0d2115e689d21e511a652d"}, + {file = "google_crc32c-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9da0a39b53d2fab3e5467329ed50e951eb91386e9d0d5b12daf593973c3b168"}, + {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:eb0b14523758e37802f27b7f8cd973f5f3d33be7613952c0df904b68c4842f0e"}, + {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:95c68a4b9b7828ba0428f8f7e3109c5d476ca44996ed9a5f8aac6269296e2d59"}, + {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c3cf890c3c0ecfe1510a452a165431b5831e24160c5fcf2071f0f85ca5a47cd"}, + {file = "google_crc32c-1.3.0-cp310-cp310-win32.whl", hash = "sha256:3bbce1be3687bbfebe29abdb7631b83e6b25da3f4e1856a1611eb21854b689ea"}, + {file = "google_crc32c-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:c124b8c8779bf2d35d9b721e52d4adb41c9bfbde45e6a3f25f0820caa9aba73f"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:42ae4781333e331a1743445931b08ebdad73e188fd554259e772556fc4937c48"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ff71073ebf0e42258a42a0b34f2c09ec384977e7f6808999102eedd5b49920e3"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fe31de3002e7b08eb20823b3735b97c86c5926dd0581c7710a680b418a8709d4"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd7760a88a8d3d705ff562aa93f8445ead54f58fd482e4f9e2bafb7e177375d4"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0b9e622c3b2b8d0ce32f77eba617ab0d6768b82836391e4f8f9e2074582bf02"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-win32.whl", hash = "sha256:779cbf1ce375b96111db98fca913c1f5ec11b1d870e529b1dc7354b2681a8c3a"}, + {file = "google_crc32c-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:04e7c220798a72fd0f08242bc8d7a05986b2a08a0573396187fd32c1dcdd58b3"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e7a539b9be7b9c00f11ef16b55486141bc2cdb0c54762f84e3c6fc091917436d"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ca60076c388728d3b6ac3846842474f4250c91efbfe5afa872d3ffd69dd4b318"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05340b60bf05b574159e9bd940152a47d38af3fb43803ffe71f11d704b7696a6"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:318f73f5484b5671f0c7f5f63741ab020a599504ed81d209b5c7129ee4667407"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f58099ad7affc0754ae42e6d87443299f15d739b0ce03c76f515153a5cda06c"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-win32.whl", hash = "sha256:f52a4ad2568314ee713715b1e2d79ab55fab11e8b304fd1462ff5cccf4264b3e"}, + {file = "google_crc32c-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bab4aebd525218bab4ee615786c4581952eadc16b1ff031813a2fd51f0cc7b08"}, + {file = "google_crc32c-1.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dda4d8a3bb0b50f540f6ff4b6033f3a74e8bf0bd5320b70fab2c03e512a62812"}, + {file = "google_crc32c-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fec221a051150eeddfdfcff162e6db92c65ecf46cb0f7bb1bf812a1520ec026b"}, + {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:226f2f9b8e128a6ca6a9af9b9e8384f7b53a801907425c9a292553a3a7218ce0"}, + {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a7f9cbea4245ee36190f85fe1814e2d7b1e5f2186381b082f5d59f99b7f11328"}, + {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a4db36f9721fdf391646685ecffa404eb986cbe007a3289499020daf72e88a2"}, + {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:12674a4c3b56b706153a358eaa1018c4137a5a04635b92b4652440d3d7386206"}, + {file = "google_crc32c-1.3.0-cp38-cp38-win32.whl", hash = "sha256:650e2917660e696041ab3dcd7abac160b4121cd9a484c08406f24c5964099829"}, + {file = "google_crc32c-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:58be56ae0529c664cc04a9c76e68bb92b091e0194d6e3c50bea7e0f266f73713"}, + {file = "google_crc32c-1.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:96a8918a78d5d64e07c8ea4ed2bc44354e3f93f46a4866a40e8db934e4c0d74b"}, + {file = "google_crc32c-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:13af315c3a0eec8bb8b8d80b8b128cb3fcd17d7e4edafc39647846345a3f003a"}, + {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6311853aa2bba4064d0c28ca54e7b50c4d48e3de04f6770f6c60ebda1e975267"}, + {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ed447680ff21c14aaceb6a9f99a5f639f583ccfe4ce1a5e1d48eb41c3d6b3217"}, + {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1c1d6236feab51200272d79b3d3e0f12cf2cbb12b208c835b175a21efdb0a73"}, + {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e0f1ff55dde0ebcfbef027edc21f71c205845585fffe30d4ec4979416613e9b3"}, + {file = "google_crc32c-1.3.0-cp39-cp39-win32.whl", hash = "sha256:fbd60c6aaa07c31d7754edbc2334aef50601b7f1ada67a96eb1eb57c7c72378f"}, + {file = "google_crc32c-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:127f9cc3ac41b6a859bd9dc4321097b1a4f6aa7fdf71b4f9227b9e3ebffb4422"}, + {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fc28e0db232c62ca0c3600884933178f0825c99be4474cdd645e378a10588125"}, + {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1926fd8de0acb9d15ee757175ce7242e235482a783cd4ec711cc999fc103c24e"}, + {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5da2c81575cc3ccf05d9830f9e8d3c70954819ca9a63828210498c0774fda1a3"}, + {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:891f712ce54e0d631370e1f4997b3f182f3368179198efc30d477c75d1f44942"}, + {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:7f6fe42536d9dcd3e2ffb9d3053f5d05221ae3bbcefbe472bdf2c71c793e3183"}, +] [package.extras] testing = ["pytest"] @@ -749,9 +1293,12 @@ testing = ["pytest"] name = "google-resumable-media" version = "2.5.0" description = "Utilities for Google Media Downloads and Resumable Uploads" -category = "main" optional = false python-versions = ">= 3.7" +files = [ + {file = "google-resumable-media-2.5.0.tar.gz", hash = "sha256:218931e8e2b2a73a58eb354a288e03a0fd5fb1c4583261ac6e4c078666468c93"}, + {file = "google_resumable_media-2.5.0-py2.py3-none-any.whl", hash = "sha256:da1bd943e2e114a56d85d6848497ebf9be6a14d3db23e9fc57581e7c3e8170ec"}, +] [package.dependencies] google-crc32c = ">=1.0,<2.0dev" @@ -764,9 +1311,12 @@ requests = ["requests (>=2.18.0,<3.0.0dev)"] name = "googleapis-common-protos" version = "1.59.1" description = "Common protobufs used in Google APIs" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "googleapis-common-protos-1.59.1.tar.gz", hash = "sha256:b35d530fe825fb4227857bc47ad84c33c809ac96f312e13182bdeaa2abe1178a"}, + {file = "googleapis_common_protos-1.59.1-py2.py3-none-any.whl", hash = "sha256:0cbedb6fb68f1c07e18eb4c48256320777707e7d0c55063ae56c15db3224a61e"}, +] [package.dependencies] grpcio = {version = ">=1.44.0,<2.0.0.dev0", optional = true, markers = "extra == \"grpc\""} @@ -779,9 +1329,12 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] name = "gql" version = "3.4.1" description = "GraphQL client for Python" -category = "main" optional = false python-versions = "*" +files = [ + {file = "gql-3.4.1-py2.py3-none-any.whl", hash = "sha256:315624ca0f4d571ef149d455033ebd35e45c1a13f18a059596aeddcea99135cf"}, + {file = "gql-3.4.1.tar.gz", hash = "sha256:11dc5d8715a827f2c2899593439a4f36449db4f0eafa5b1ea63948f8a2f8c545"}, +] [package.dependencies] backoff = ">=1.11.1,<3.0" @@ -802,17 +1355,23 @@ websockets = ["websockets (>=10,<11)", "websockets (>=9,<10)"] name = "graphql-core" version = "3.2.3" description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL." -category = "main" optional = false python-versions = ">=3.6,<4" +files = [ + {file = "graphql-core-3.2.3.tar.gz", hash = "sha256:06d2aad0ac723e35b1cb47885d3e5c45e956a53bc1b209a9fc5369007fe46676"}, + {file = "graphql_core-3.2.3-py3-none-any.whl", hash = "sha256:5766780452bd5ec8ba133f8bf287dc92713e3868ddd83aee4faab9fc3e303dc3"}, +] [[package]] name = "grpc-google-iam-v1" -version = "0.12.6" +version = "0.13.0" description = "IAM API client library" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "grpc-google-iam-v1-0.13.0.tar.gz", hash = "sha256:fad318608b9e093258fbf12529180f400d1c44453698a33509cc6ecf005b294e"}, + {file = "grpc_google_iam_v1-0.13.0-py2.py3-none-any.whl", hash = "sha256:53902e2af7de8df8c1bd91373d9be55b0743ec267a7428ea638db3775becae89"}, +] [package.dependencies] googleapis-common-protos = {version = ">=1.56.0,<2.0.0dev", extras = ["grpc"]} @@ -823,9 +1382,55 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4 name = "grpcio" version = "1.56.2" description = "HTTP/2-based RPC framework" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "grpcio-1.56.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:bf0b9959e673505ee5869950642428046edb91f99942607c2ecf635f8a4b31c9"}, + {file = "grpcio-1.56.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:5144feb20fe76e73e60c7d73ec3bf54f320247d1ebe737d10672480371878b48"}, + {file = "grpcio-1.56.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:a72797549935c9e0b9bc1def1768c8b5a709538fa6ab0678e671aec47ebfd55e"}, + {file = "grpcio-1.56.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3f3237a57e42f79f1e560726576aedb3a7ef931f4e3accb84ebf6acc485d316"}, + {file = "grpcio-1.56.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:900bc0096c2ca2d53f2e5cebf98293a7c32f532c4aeb926345e9747452233950"}, + {file = "grpcio-1.56.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:97e0efaebbfd222bcaac2f1735c010c1d3b167112d9d237daebbeedaaccf3d1d"}, + {file = "grpcio-1.56.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c0c85c5cbe8b30a32fa6d802588d55ffabf720e985abe9590c7c886919d875d4"}, + {file = "grpcio-1.56.2-cp310-cp310-win32.whl", hash = "sha256:06e84ad9ae7668a109e970c7411e7992751a116494cba7c4fb877656527f9a57"}, + {file = "grpcio-1.56.2-cp310-cp310-win_amd64.whl", hash = "sha256:10954662f77dc36c9a1fb5cc4a537f746580d6b5734803be1e587252682cda8d"}, + {file = "grpcio-1.56.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:c435f5ce1705de48e08fcbcfaf8aee660d199c90536e3e06f2016af7d6a938dd"}, + {file = "grpcio-1.56.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:6108e5933eb8c22cd3646e72d5b54772c29f57482fd4c41a0640aab99eb5071d"}, + {file = "grpcio-1.56.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8391cea5ce72f4a12368afd17799474015d5d3dc00c936a907eb7c7eaaea98a5"}, + {file = "grpcio-1.56.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:750de923b456ca8c0f1354d6befca45d1f3b3a789e76efc16741bd4132752d95"}, + {file = "grpcio-1.56.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fda2783c12f553cdca11c08e5af6eecbd717280dc8fbe28a110897af1c15a88c"}, + {file = "grpcio-1.56.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9e04d4e4cfafa7c5264e535b5d28e786f0571bea609c3f0aaab13e891e933e9c"}, + {file = "grpcio-1.56.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:89a49cc5ad08a38b6141af17e00d1dd482dc927c7605bc77af457b5a0fca807c"}, + {file = "grpcio-1.56.2-cp311-cp311-win32.whl", hash = "sha256:6a007a541dff984264981fbafeb052bfe361db63578948d857907df9488d8774"}, + {file = "grpcio-1.56.2-cp311-cp311-win_amd64.whl", hash = "sha256:af4063ef2b11b96d949dccbc5a987272f38d55c23c4c01841ea65a517906397f"}, + {file = "grpcio-1.56.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:a6ff459dac39541e6a2763a4439c4ca6bc9ecb4acc05a99b79246751f9894756"}, + {file = "grpcio-1.56.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:f20fd21f7538f8107451156dd1fe203300b79a9ddceba1ee0ac8132521a008ed"}, + {file = "grpcio-1.56.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:d1fbad1f9077372b6587ec589c1fc120b417b6c8ad72d3e3cc86bbbd0a3cee93"}, + {file = "grpcio-1.56.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ee26e9dfb3996aff7c870f09dc7ad44a5f6732b8bdb5a5f9905737ac6fd4ef1"}, + {file = "grpcio-1.56.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4c60abd950d6de3e4f1ddbc318075654d275c29c846ab6a043d6ed2c52e4c8c"}, + {file = "grpcio-1.56.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1c31e52a04e62c8577a7bf772b3e7bed4df9c9e0dd90f92b6ffa07c16cab63c9"}, + {file = "grpcio-1.56.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:345356b307cce5d14355e8e055b4ca5f99bc857c33a3dc1ddbc544fca9cd0475"}, + {file = "grpcio-1.56.2-cp37-cp37m-win_amd64.whl", hash = "sha256:42e63904ee37ae46aa23de50dac8b145b3596f43598fa33fe1098ab2cbda6ff5"}, + {file = "grpcio-1.56.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:7c5ede2e2558f088c49a1ddda19080e4c23fb5d171de80a726b61b567e3766ed"}, + {file = "grpcio-1.56.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:33971197c47965cc1d97d78d842163c283e998223b151bab0499b951fd2c0b12"}, + {file = "grpcio-1.56.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:d39f5d4af48c138cb146763eda14eb7d8b3ccbbec9fe86fb724cd16e0e914c64"}, + {file = "grpcio-1.56.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ded637176addc1d3eef35331c39acc598bac550d213f0a1bedabfceaa2244c87"}, + {file = "grpcio-1.56.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c90da4b124647547a68cf2f197174ada30c7bb9523cb976665dfd26a9963d328"}, + {file = "grpcio-1.56.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3ccb621749a81dc7755243665a70ce45536ec413ef5818e013fe8dfbf5aa497b"}, + {file = "grpcio-1.56.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4eb37dd8dd1aa40d601212afa27ca5be255ba792e2e0b24d67b8af5e012cdb7d"}, + {file = "grpcio-1.56.2-cp38-cp38-win32.whl", hash = "sha256:ddb4a6061933bd9332b74eac0da25f17f32afa7145a33a0f9711ad74f924b1b8"}, + {file = "grpcio-1.56.2-cp38-cp38-win_amd64.whl", hash = "sha256:8940d6de7068af018dfa9a959a3510e9b7b543f4c405e88463a1cbaa3b2b379a"}, + {file = "grpcio-1.56.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:51173e8fa6d9a2d85c14426bdee5f5c4a0654fd5fddcc21fe9d09ab0f6eb8b35"}, + {file = "grpcio-1.56.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:373b48f210f43327a41e397391715cd11cfce9ded2fe76a5068f9bacf91cc226"}, + {file = "grpcio-1.56.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:42a3bbb2bc07aef72a7d97e71aabecaf3e4eb616d39e5211e2cfe3689de860ca"}, + {file = "grpcio-1.56.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5344be476ac37eb9c9ad09c22f4ea193c1316bf074f1daf85bddb1b31fda5116"}, + {file = "grpcio-1.56.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3fa3ab0fb200a2c66493828ed06ccd1a94b12eddbfb985e7fd3e5723ff156c6"}, + {file = "grpcio-1.56.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b975b85d1d5efc36cf8b237c5f3849b64d1ba33d6282f5e991f28751317504a1"}, + {file = "grpcio-1.56.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cbdf2c498e077282cd427cfd88bdce4668019791deef0be8155385ab2ba7837f"}, + {file = "grpcio-1.56.2-cp39-cp39-win32.whl", hash = "sha256:139f66656a762572ae718fa0d1f2dce47c05e9fbf7a16acd704c354405b97df9"}, + {file = "grpcio-1.56.2-cp39-cp39-win_amd64.whl", hash = "sha256:830215173ad45d670140ff99aac3b461f9be9a6b11bee1a17265aaaa746a641a"}, + {file = "grpcio-1.56.2.tar.gz", hash = "sha256:0ff789ae7d8ddd76d2ac02e7d13bfef6fc4928ac01e1dcaa182be51b6bcc0aaa"}, +] [package.extras] protobuf = ["grpcio-tools (>=1.56.2)"] @@ -834,9 +1439,12 @@ protobuf = ["grpcio-tools (>=1.56.2)"] name = "grpcio-status" version = "1.56.2" description = "Status proto mapping for gRPC" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "grpcio-status-1.56.2.tar.gz", hash = "sha256:a046b2c0118df4a5687f4585cca9d3c3bae5c498c4dff055dcb43fb06a1180c8"}, + {file = "grpcio_status-1.56.2-py3-none-any.whl", hash = "sha256:63f3842867735f59f5d70e723abffd2e8501a6bcd915612a1119e52f10614782"}, +] [package.dependencies] googleapis-common-protos = ">=1.5.5" @@ -847,25 +1455,34 @@ protobuf = ">=4.21.6" name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] [[package]] name = "heapdict" version = "1.0.1" description = "a heap with decrease-key and increase-key operations" -category = "main" optional = false python-versions = "*" +files = [ + {file = "HeapDict-1.0.1-py3-none-any.whl", hash = "sha256:6065f90933ab1bb7e50db403b90cab653c853690c5992e69294c2de2b253fc92"}, + {file = "HeapDict-1.0.1.tar.gz", hash = "sha256:8495f57b3e03d8e46d5f1b2cc62ca881aca392fd5cc048dc0aa2e1a6d23ecdb6"}, +] [[package]] name = "httplib2" version = "0.22.0" description = "A comprehensive HTTP client library." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, + {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, +] [package.dependencies] pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""} @@ -874,9 +1491,12 @@ pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0 name = "hvac" version = "0.11.2" description = "HashiCorp Vault API client" -category = "main" optional = false python-versions = ">=2.7" +files = [ + {file = "hvac-0.11.2-py2.py3-none-any.whl", hash = "sha256:3e8a34804b1e20954a2b4991cc13ed9c09b32e50dadd9d3438224481150f6568"}, + {file = "hvac-0.11.2.tar.gz", hash = "sha256:f905c59d32d88d3f67571fe5a8a78de4659e04798ad809de439f667247d13626"}, +] [package.dependencies] requests = ">=2.21.0" @@ -887,11 +1507,14 @@ parser = ["pyhcl (>=0.3.10)"] [[package]] name = "identify" -version = "2.5.29" +version = "2.5.33" description = "File identification library for Python" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "identify-2.5.33-py2.py3-none-any.whl", hash = "sha256:d40ce5fcd762817627670da8a7d8d8e65f24342d14539c59488dc603bf662e34"}, + {file = "identify-2.5.33.tar.gz", hash = "sha256:161558f9fe4559e1557e1bff323e8631f6a0e4837f7497767c1782832f16b62d"}, +] [package.extras] license = ["ukkonen"] @@ -900,33 +1523,42 @@ license = ["ukkonen"] name = "idna" version = "3.3" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, +] [[package]] name = "importlib-metadata" -version = "6.8.0" +version = "7.0.0" description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-7.0.0-py3-none-any.whl", hash = "sha256:d97503976bb81f40a193d41ee6570868479c69d5068651eb039c40d850c59d67"}, + {file = "importlib_metadata-7.0.0.tar.gz", hash = "sha256:7fc841f8b8332803464e5dc1c63a2e59121f46ca186c0e2e182e80bf8c1319f7"}, +] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "importlib-resources" -version = "6.1.0" +version = "6.1.1" description = "Read resources from Python packages" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, + {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, +] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} @@ -939,17 +1571,23 @@ testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] [[package]] name = "ipeadatapy" version = "0.1.9" description = "An API wrapper for Ipeadata" -category = "main" optional = false python-versions = "*" +files = [ + {file = "ipeadatapy-0.1.9-py3-none-any.whl", hash = "sha256:0bfd5a180599f77106421477d3cc505e4478ac0f4e3d5eb688dd8696fce906e3"}, + {file = "ipeadatapy-0.1.9.tar.gz", hash = "sha256:396c3f7d723a70667fd5a64714d7252f7f234c34c9f63e77751b02123691d8ad"}, +] [package.dependencies] pandas = "*" @@ -959,2371 +1597,12 @@ requests = "*" name = "jinja2" version = "3.0.3" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=3.6" - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "kiwisolver" -version = "1.4.5" -description = "A fast implementation of the Cassowary constraint solver" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "levenshtein" -version = "0.21.1" -description = "Python extension for computing string edit distances and similarities." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -rapidfuzz = ">=2.3.0,<4.0.0" - -[[package]] -name = "locket" -version = "0.2.1" -description = "File-based locks for Python for Linux and Windows" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "loguru" -version = "0.7.2" -description = "Python logging made (stupidly) simple" -category = "main" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} -win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} - -[package.extras] -dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] - -[[package]] -name = "lxml" -version = "4.9.2" -description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" - -[package.extras] -cssselect = ["cssselect (>=0.7)"] -html5 = ["html5lib"] -htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=0.29.7)"] - -[[package]] -name = "markupsafe" -version = "2.0.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "marshmallow" -version = "3.14.1" -description = "A lightweight library for converting complex datatypes to and from native Python datatypes." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.extras] -dev = ["flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] -docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.7)", "sphinx (==4.3.0)", "sphinx-issues (==1.2.0)", "sphinx-version-warning (==1.1.2)"] -lint = ["flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)"] -tests = ["pytest", "pytz", "simplejson"] - -[[package]] -name = "marshmallow-oneofschema" -version = "3.0.1" -description = "marshmallow multiplexing schema" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -marshmallow = ">=3.0.0,<4.0.0" - -[package.extras] -dev = ["flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "mock", "pre-commit (>=2.7,<3.0)", "pytest", "tox"] -lint = ["flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.7,<3.0)"] -tests = ["mock", "pytest"] - -[[package]] -name = "matplotlib" -version = "3.7.3" -description = "Python plotting package" -category = "main" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -contourpy = ">=1.0.1" -cycler = ">=0.10" -fonttools = ">=4.22.0" -importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} -kiwisolver = ">=1.0.1" -numpy = ">=1.20,<2" -packaging = ">=20.0" -pillow = ">=6.2.0" -pyparsing = ">=2.3.1" -python-dateutil = ">=2.7" -setuptools_scm = ">=7" - -[[package]] -name = "msgpack" -version = "1.0.3" -description = "MessagePack (de)serializer." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "multidict" -version = "6.0.4" -description = "multidict implementation" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "nodeenv" -version = "1.8.0" -description = "Node.js virtual environment builder" -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" - -[package.dependencies] -setuptools = "*" - -[[package]] -name = "numpy" -version = "1.21.4" -description = "NumPy is the fundamental package for array computing with Python." -category = "main" -optional = false -python-versions = ">=3.7,<3.11" - -[[package]] -name = "oauth2client" -version = "4.1.3" -description = "OAuth 2.0 client library" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -httplib2 = ">=0.9.1" -pyasn1 = ">=0.1.7" -pyasn1-modules = ">=0.0.5" -rsa = ">=3.1.4" -six = ">=1.6.1" - -[[package]] -name = "oauthlib" -version = "3.1.1" -description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.extras] -rsa = ["cryptography (>=3.0.0,<4)"] -signals = ["blinker (>=1.4.0)"] -signedtoken = ["cryptography (>=3.0.0,<4)", "pyjwt (>=2.0.0,<3)"] - -[[package]] -name = "openpyxl" -version = "3.0.9" -description = "A Python library to read/write Excel 2010 xlsx/xlsm files" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -et-xmlfile = "*" - -[[package]] -name = "outcome" -version = "1.2.0" -description = "Capture the outcome of Python function calls." -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -attrs = ">=19.2.0" - -[[package]] -name = "packaging" -version = "21.3" -description = "Core utilities for Python packages" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" - -[[package]] -name = "pandas" -version = "2.0.3" -description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -numpy = [ - {version = ">=1.20.3", markers = "python_version < \"3.10\""}, - {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, -] -python-dateutil = ">=2.8.2" -pytz = ">=2020.1" -tzdata = ">=2022.1" - -[package.extras] -all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] -aws = ["s3fs (>=2021.08.0)"] -clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] -compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] -computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] -feather = ["pyarrow (>=7.0.0)"] -fss = ["fsspec (>=2021.07.0)"] -gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] -hdf5 = ["tables (>=3.6.1)"] -html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] -mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] -parquet = ["pyarrow (>=7.0.0)"] -performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] -plot = ["matplotlib (>=3.6.1)"] -postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] -spss = ["pyreadstat (>=1.1.2)"] -sql-other = ["SQLAlchemy (>=1.4.16)"] -test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.6.3)"] - -[[package]] -name = "pandas-gbq" -version = "0.19.2" -description = "Google BigQuery connector for pandas" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -db-dtypes = ">=1.0.4,<2.0.0" -google-api-core = ">=2.10.2,<3.0.0dev" -google-auth = ">=2.13.0" -google-auth-oauthlib = ">=0.7.0" -google-cloud-bigquery = ">=3.3.5,<4.0.0dev" -google-cloud-bigquery-storage = ">=2.16.2,<3.0.0dev" -numpy = ">=1.16.6" -pandas = ">=1.1.4" -pyarrow = ">=3.0.0" -pydata-google-auth = ">=1.5.0" -setuptools = "*" - -[package.extras] -tqdm = ["tqdm (>=4.23.0)"] - -[[package]] -name = "pandavro" -version = "1.7.2" -description = "The interface between Avro and pandas DataFrame" -category = "main" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -fastavro = ">=1.5.1,<1.6.0" -numpy = ">=1.15.4" -pandas = ">=1.1" - -[package.extras] -tests = ["pytest (==7.1.2)"] - -[[package]] -name = "partd" -version = "1.2.0" -description = "Appendable key-value storage" -category = "main" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -locket = "*" -toolz = "*" - -[package.extras] -complete = ["blosc", "numpy (>=1.9.0)", "pandas (>=0.19.0)", "pyzmq"] - -[[package]] -name = "pendulum" -version = "2.1.2" -description = "Python datetimes made easy" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -python-dateutil = ">=2.6,<3.0" -pytzdata = ">=2020.1" - -[[package]] -name = "pillow" -version = "10.0.1" -description = "Python Imaging Library (Fork)" -category = "main" -optional = false -python-versions = ">=3.8" - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "platformdirs" -version = "3.10.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] - -[[package]] -name = "pluggy" -version = "1.3.0" -description = "plugin and hook calling mechanisms for python" -category = "dev" -optional = false -python-versions = ">=3.8" - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "pre-commit" -version = "2.21.0" -description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -cfgv = ">=2.0.0" -identify = ">=1.0.0" -nodeenv = ">=0.11.1" -pyyaml = ">=5.1" -virtualenv = ">=20.10.0" - -[[package]] -name = "prefect" -version = "0.15.9" -description = "The Prefect Core automation and scheduling engine." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -click = ">=7.0,<9.0" -cloudpickle = ">=1.3.0" -croniter = ">=0.3.24,<2.0" -dask = {version = ">=2.17.0", markers = "python_version > \"3.6\""} -distributed = {version = ">=2.17.0", markers = "python_version > \"3.6\""} -docker = ">=3.4.1" -marshmallow = ">=3.0.0b19" -marshmallow-oneofschema = ">=2.0.0b2" -msgpack = ">=0.6.0" -mypy-extensions = ">=0.4.0" -pendulum = ">=2.0.4" -python-box = ">=5.1.0" -python-dateutil = ">=2.7.0" -python-slugify = ">=1.2.6" -pytz = ">=2018.7" -pyyaml = ">=3.13" -requests = ">=2.20,<2.27" -tabulate = ">=0.8.0" -toml = ">=0.9.4" -urllib3 = ">=1.24.3" - -[package.extras] -airtable = ["airtable-python-wrapper (>=0.11,<0.12)"] -all-extras = ["PyGithub (>=1.51,<2.0)", "Pygments (>=2.2,<3.0)", "airtable-python-wrapper (>=0.11,<0.12)", "atlassian-python-api (>=2.0.1)", "azure-cosmos (>=3.1.1,<3.2)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "black", "boto3 (>=1.9,<2.0)", "confluent-kafka (>=1.7.0)", "dask-cloudprovider[aws] (>=0.2.0)", "dask-kubernetes (>=0.8.0)", "dropbox (>=9.0,<10.0)", "dulwich (>=0.19.7)", "feedparser (>=5.0.1,<6.0)", "flaky (>=3.0)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "graphviz (>=0.8)", "graphviz (>=0.8.3)", "great-expectations (>=0.11.1)", "gspread (>=3.6.0)", "hvac (>=0.10)", "jinja2 (>=2.0,<4.0)", "jira (>=2.0.0)", "kubernetes (>=9.0.0a1,<=13.0)", "mypy (>=0.600,<0.813)", "nbconvert (>=6.0.7)", "pandas (>=1.0.1)", "papermill (>=2.2.0)", "prometheus-client (>=0.9.0)", "psycopg2-binary (>=2.8.2)", "pushbullet.py (>=0.11.0)", "pyarrow (>=5.0.0)", "pyexasol (>=0.16.1)", "pymysql (>=0.9.3)", "pyodbc (>=4.0.30)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "python-gitlab (>=2.5.0,<3.0)", "redis (>=3.2.1)", "responses (>=0.14.0)", "sendgrid (>=6.7.0)", "snowflake-connector-python (>=1.8.2,<2.5)", "soda-sql (>=2.0.0b25)", "spacy (>=2.0.0,<3.0.0)", "testfixtures (>=6.10.3)", "tweepy (>=3.5,<4.0)"] -all-orchestration-extras = ["PyGithub (>=1.51,<2.0)", "atlassian-python-api (>=2.0.1)", "azure-storage-blob (>=12.1.0,<13.0)", "boto3 (>=1.9,<2.0)", "dulwich (>=0.19.7)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "kubernetes (>=9.0.0a1,<=13.0)", "python-gitlab (>=2.5.0,<3.0)"] -aws = ["boto3 (>=1.9,<2.0)"] -azure = ["azure-cosmos (>=3.1.1,<3.2)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)"] -base-library-ci = ["PyGithub (>=1.51,<2.0)", "Pygments (>=2.2,<3.0)", "atlassian-python-api (>=2.0.1)", "azure-storage-blob (>=12.1.0,<13.0)", "black", "boto3 (>=1.9,<2.0)", "dulwich (>=0.19.7)", "flaky (>=3.0)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "jira (>=2.0.0)", "kubernetes (>=9.0.0a1,<=13.0)", "mypy (>=0.600,<0.813)", "pandas (>=1.0.1)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "python-gitlab (>=2.5.0,<3.0)", "responses (>=0.14.0)", "testfixtures (>=6.10.3)"] -bitbucket = ["atlassian-python-api (>=2.0.1)"] -dask-cloudprovider = ["dask-cloudprovider[aws] (>=0.2.0)"] -dev = ["Pygments (>=2.2,<3.0)", "black", "flaky (>=3.0)", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "mypy (>=0.600,<0.813)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "responses (>=0.14.0)", "testfixtures (>=6.10.3)"] -dremio = ["pyarrow (>=5.0.0)"] -dropbox = ["dropbox (>=9.0,<10.0)"] -exasol = ["pyexasol (>=0.16.1)"] -gcp = ["google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)"] -ge = ["great-expectations (>=0.11.1)"] -git = ["dulwich (>=0.19.7)"] -github = ["PyGithub (>=1.51,<2.0)"] -gitlab = ["python-gitlab (>=2.5.0,<3.0)"] -google = ["google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)"] -gsheets = ["gspread (>=3.6.0)"] -jira = ["jira (>=2.0.0)"] -jupyter = ["nbconvert (>=6.0.7)", "papermill (>=2.2.0)"] -kafka = ["confluent-kafka (>=1.7.0)"] -kubernetes = ["dask-kubernetes (>=0.8.0)", "kubernetes (>=9.0.0a1,<=13.0)"] -mysql = ["pymysql (>=0.9.3)"] -pandas = ["pandas (>=1.0.1)"] -postgres = ["psycopg2-binary (>=2.8.2)"] -prometheus = ["prometheus-client (>=0.9.0)"] -pushbullet = ["pushbullet.py (>=0.11.0)"] -redis = ["redis (>=3.2.1)"] -rss = ["feedparser (>=5.0.1,<6.0)"] -sendgrid = ["sendgrid (>=6.7.0)"] -snowflake = ["snowflake-connector-python (>=1.8.2,<2.5)"] -sodasql = ["soda-sql (>=2.0.0b25)"] -spacy = ["spacy (>=2.0.0,<3.0.0)"] -sql-server = ["pyodbc (>=4.0.30)"] -task-library-ci = ["PyGithub (>=1.51,<2.0)", "Pygments (>=2.2,<3.0)", "airtable-python-wrapper (>=0.11,<0.12)", "atlassian-python-api (>=2.0.1)", "azure-cosmos (>=3.1.1,<3.2)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "black", "boto3 (>=1.9,<2.0)", "confluent-kafka (>=1.7.0)", "dask-kubernetes (>=0.8.0)", "dropbox (>=9.0,<10.0)", "dulwich (>=0.19.7)", "feedparser (>=5.0.1,<6.0)", "flaky (>=3.0)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "graphviz (>=0.8)", "graphviz (>=0.8.3)", "great-expectations (>=0.11.1)", "gspread (>=3.6.0)", "hvac (>=0.10)", "jinja2 (>=2.0,<4.0)", "jira (>=2.0.0)", "kubernetes (>=9.0.0a1,<=13.0)", "mypy (>=0.600,<0.813)", "nbconvert (>=6.0.7)", "pandas (>=1.0.1)", "papermill (>=2.2.0)", "prometheus-client (>=0.9.0)", "psycopg2-binary (>=2.8.2)", "pushbullet.py (>=0.11.0)", "pyarrow (>=5.0.0)", "pyexasol (>=0.16.1)", "pymysql (>=0.9.3)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "python-gitlab (>=2.5.0,<3.0)", "redis (>=3.2.1)", "responses (>=0.14.0)", "sendgrid (>=6.7.0)", "snowflake-connector-python (>=1.8.2,<2.5)", "soda-sql (>=2.0.0b25)", "spacy (>=2.0.0,<3.0.0)", "testfixtures (>=6.10.3)", "tweepy (>=3.5,<4.0)"] -templates = ["jinja2 (>=2.0,<4.0)"] -test = ["flaky (>=3.0)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "responses (>=0.14.0)", "testfixtures (>=6.10.3)"] -twitter = ["tweepy (>=3.5,<4.0)"] -vault = ["hvac (>=0.10)"] -viz = ["graphviz (>=0.8.3)"] - -[[package]] -name = "proto-plus" -version = "1.22.3" -description = "Beautiful, Pythonic protocol buffers." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -protobuf = ">=3.19.0,<5.0.0dev" - -[package.extras] -testing = ["google-api-core[grpc] (>=1.31.5)"] - -[[package]] -name = "protobuf" -version = "4.23.4" -description = "" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "psutil" -version = "5.8.0" -description = "Cross-platform lib for process and system monitoring in Python." -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.extras] -test = ["enum34", "ipaddress", "mock", "pywin32", "unittest2", "wmi"] - -[[package]] -name = "pyaml" -version = "20.4.0" -description = "PyYAML-based module to produce pretty and readable YAML-serialized data" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -PyYAML = "*" - -[[package]] -name = "pyarrow" -version = "6.0.0" -description = "Python library for Apache Arrow" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -numpy = ">=1.16.6" - -[[package]] -name = "pyasn1" -version = "0.4.8" -description = "ASN.1 types and codecs" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pyasn1-modules" -version = "0.2.8" -description = "A collection of ASN.1-based protocols modules." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -pyasn1 = ">=0.4.6,<0.5.0" - -[[package]] -name = "pycparser" -version = "2.21" -description = "C parser in Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pydata-google-auth" -version = "1.8.2" -description = "PyData helpers for authenticating to Google APIs" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -google-auth = {version = ">=1.25.0,<3.0dev", markers = "python_version >= \"3.6\""} -google-auth-oauthlib = {version = ">=0.4.0", markers = "python_version >= \"3.6\""} -setuptools = "*" - -[[package]] -name = "pymssql" -version = "2.2.5" -description = "DB-API interface to Microsoft SQL Server for Python. (new Cython-based version)" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pyparsing" -version = "3.0.6" -description = "Python parsing module" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - -[[package]] -name = "pyproj" -version = "3.5.0" -description = "Python interface to PROJ (cartographic projections and coordinate transformations library)" -category = "main" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -certifi = "*" - -[[package]] -name = "pysocks" -version = "1.7.1" -description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pytest" -version = "7.4.2" -description = "pytest: simple powerful testing with Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} - -[package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "pytest-cov" -version = "3.0.0" -description = "Pytest plugin for measuring coverage." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -coverage = {version = ">=5.2.1", extras = ["toml"]} -pytest = ">=4.6" - -[package.extras] -testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] - -[[package]] -name = "python-box" -version = "5.4.1" -description = "Advanced Python dictionaries with dot notation access" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.extras] -all = ["msgpack", "ruamel.yaml", "toml"] -msgpack = ["msgpack"] -pyyaml = ["PyYAML"] -ruamel-yaml = ["ruamel.yaml"] -toml = ["toml"] -yaml = ["ruamel.yaml"] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-dotenv" -version = "1.0.0" -description = "Read key-value pairs from a .env file and set them as environment variables" -category = "main" -optional = false -python-versions = ">=3.8" - -[package.extras] -cli = ["click (>=5.0)"] - -[[package]] -name = "python-levenshtein" -version = "0.21.1" -description = "Python extension for computing string edit distances and similarities." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -Levenshtein = "0.21.1" - -[[package]] -name = "python-slugify" -version = "5.0.2" -description = "A Python Slugify application that handles Unicode" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -text-unidecode = ">=1.3" - -[package.extras] -unidecode = ["Unidecode (>=1.1.1)"] - -[[package]] -name = "pytz" -version = "2021.3" -description = "World timezone definitions, modern and historical" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pytzdata" -version = "2020.1" -description = "The Olson timezone database for Python." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pywin32" -version = "227" -description = "Python for Window Extensions" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pyyaml" -version = "6.0" -description = "YAML parser and emitter for Python" -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "rapidfuzz" -version = "3.3.1" -description = "rapid fuzzy string matching" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.extras] -full = ["numpy"] - -[[package]] -name = "redis" -version = "4.6.0" -description = "Python client for Redis database and key-value store" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""} - -[package.extras] -hiredis = ["hiredis (>=1.0.0)"] -ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] - -[[package]] -name = "redis-pal" -version = "1.0.0" -description = "Store things in Redis without worrying about types or anything, just do it!" -category = "main" -optional = false -python-versions = ">=3.8,<4.0" - -[package.dependencies] -dill = ">=0.3.5,<0.4.0" -redis = ">=4.0,<5.0" - -[[package]] -name = "requests" -version = "2.26.0" -description = "Python HTTP for Humans." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<5)"] - -[[package]] -name = "requests-oauthlib" -version = "1.3.0" -description = "OAuthlib authentication support for Requests." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -oauthlib = ">=3.0.0" -requests = ">=2.0.0" - -[package.extras] -rsa = ["oauthlib[signedtoken] (>=3.0.0)"] - -[[package]] -name = "requests-toolbelt" -version = "1.0.0" -description = "A utility belt for advanced users of python-requests" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -requests = ">=2.0.1,<3.0.0" - -[[package]] -name = "rpy2" -version = "3.5.14" -description = "Python interface to the R language (embedded R)" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} -cffi = ">=1.10.0" -jinja2 = "*" -packaging = {version = "*", markers = "platform_system == \"Windows\""} -tzlocal = "*" - -[package.extras] -all = ["ipython", "numpy", "pandas (>=1.3.5)", "pytest"] -pandas = ["numpy", "pandas (>=1.3.5)"] -test = ["ipython", "numpy", "pandas (>=1.3.5)", "pytest"] -test-minimal = ["coverage", "pytest", "pytest-cov"] -types = ["mypy", "types-tzlocal"] - -[[package]] -name = "rsa" -version = "4.8" -description = "Pure-Python RSA implementation" -category = "main" -optional = false -python-versions = ">=3.6,<4" - -[package.dependencies] -pyasn1 = ">=0.1.3" - -[[package]] -name = "ruamel-yaml" -version = "0.17.10" -description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" -category = "main" -optional = false -python-versions = ">=3" - -[package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.1.2", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.10\""} - -[package.extras] -docs = ["ryd"] -jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] - -[[package]] -name = "ruamel-yaml-clib" -version = "0.2.6" -description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "scipy" -version = "1.10.1" -description = "Fundamental algorithms for scientific computing in Python" -category = "main" -optional = false -python-versions = "<3.12,>=3.8" - -[package.dependencies] -numpy = ">=1.19.5,<1.27.0" - -[package.extras] -dev = ["click", "doit (>=0.36.0)", "flake8", "mypy", "pycodestyle", "pydevtool", "rich-click", "typing_extensions"] -doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] - -[[package]] -name = "seaborn" -version = "0.11.2" -description = "seaborn: statistical data visualization" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -matplotlib = ">=2.2" -numpy = ">=1.15" -pandas = ">=0.23" -scipy = ">=1.0" - -[[package]] -name = "selenium" -version = "4.13.0" -description = "" -category = "main" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -certifi = ">=2021.10.8" -trio = ">=0.17,<1.0" -trio-websocket = ">=0.9,<1.0" -urllib3 = {version = ">=1.26,<3", extras = ["socks"]} - -[[package]] -name = "setuptools" -version = "68.2.2" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" -optional = false -python-versions = ">=3.8" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "setuptools-scm" -version = "8.0.3" -description = "the blessed package to manage your versions by scm tags" -category = "main" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -packaging = ">=20" -setuptools = "*" -tomli = {version = ">=1", markers = "python_version < \"3.11\""} -typing-extensions = {version = "*", markers = "python_version < \"3.11\""} - -[package.extras] -docs = ["entangled-cli[rich]", "mkdocs", "mkdocs-entangled-plugin", "mkdocs-material", "mkdocstrings[python]", "pygments"] -rich = ["rich"] -test = ["pytest", "rich", "virtualenv (>20)"] - -[[package]] -name = "shapely" -version = "2.0.1" -description = "Manipulation and analysis of geometric objects" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -numpy = ">=1.14" - -[package.extras] -docs = ["matplotlib", "numpydoc (>=1.1.0,<1.2.0)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] -test = ["pytest", "pytest-cov"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "sniffio" -version = "1.3.0" -description = "Sniff out which async library your code is running under" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "sortedcontainers" -version = "2.4.0" -description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "soupsieve" -version = "2.5" -description = "A modern CSS selector implementation for Beautiful Soup." -category = "main" -optional = false -python-versions = ">=3.8" - -[[package]] -name = "tabulate" -version = "0.8.9" -description = "Pretty-print tabular data" -category = "main" -optional = false -python-versions = "*" - -[package.extras] -widechars = ["wcwidth"] - -[[package]] -name = "tblib" -version = "1.7.0" -description = "Traceback serialization library." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "text-unidecode" -version = "1.3" -description = "The most basic Text::Unidecode port" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "tomlkit" -version = "0.11.8" -description = "Style preserving TOML library" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "toolz" -version = "0.11.2" -description = "List processing tools and functional utilities" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "tornado" -version = "6.1" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "main" -optional = false -python-versions = ">= 3.5" - -[[package]] -name = "tqdm" -version = "4.66.1" -description = "Fast, Extensible Progress Meter" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] -notebook = ["ipywidgets (>=6)"] -slack = ["slack-sdk"] -telegram = ["requests"] - -[[package]] -name = "trio" -version = "0.22.2" -description = "A friendly Python library for async concurrency and I/O" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -attrs = ">=20.1.0" -cffi = {version = ">=1.14", markers = "os_name == \"nt\" and implementation_name != \"pypy\""} -exceptiongroup = {version = ">=1.0.0rc9", markers = "python_version < \"3.11\""} -idna = "*" -outcome = "*" -sniffio = "*" -sortedcontainers = "*" - -[[package]] -name = "trio-websocket" -version = "0.11.1" -description = "WebSocket library for Trio" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} -trio = ">=0.11" -wsproto = ">=0.14" - -[[package]] -name = "tweepy" -version = "4.4.0" -description = "Twitter library for Python" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -requests = ">=2.11.1,<3" -requests-oauthlib = ">=1.0.0,<2" - -[package.extras] -async = ["aiohttp (>=3.7.3,<4)", "oauthlib (>=3.1.0,<4)"] -dev = ["coveralls (>=2.1.0)", "tox (>=3.14.0)"] -socks = ["requests[socks] (>=2.11.1,<3)"] -test = ["vcrpy (>=1.10.3)"] - -[[package]] -name = "typing-extensions" -version = "4.8.0" -description = "Backported and Experimental Type Hints for Python 3.8+" -category = "main" -optional = false -python-versions = ">=3.8" - -[[package]] -name = "tzdata" -version = "2023.3" -description = "Provider of IANA time zone data" -category = "main" -optional = false -python-versions = ">=2" - -[[package]] -name = "tzlocal" -version = "5.0.1" -description = "tzinfo object for the local timezone" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} -tzdata = {version = "*", markers = "platform_system == \"Windows\""} - -[package.extras] -devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] - -[[package]] -name = "unidecode" -version = "1.3.7" -description = "ASCII transliterations of Unicode text" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "uritemplate" -version = "4.1.1" -description = "Implementation of RFC 6570 URI Templates" -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "urllib3" -version = "1.26.7" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.dependencies] -PySocks = {version = ">=1.5.6,<1.5.7 || >1.5.7,<2.0", optional = true, markers = "extra == \"socks\""} - -[package.extras] -brotli = ["brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "virtualenv" -version = "20.24.5" -description = "Virtual Python Environment builder" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -distlib = ">=0.3.7,<1" -filelock = ">=3.12.2,<4" -platformdirs = ">=3.9.1,<4" - -[package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] - -[[package]] -name = "webdriver-manager" -version = "4.0.1" -description = "Library provides the way to automatically manage drivers for different browsers" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -packaging = "*" -python-dotenv = "*" -requests = "*" - -[[package]] -name = "websocket-client" -version = "1.2.1" -description = "WebSocket client for Python with low level API options" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.extras] -optional = ["python-socks", "wsaccel"] -test = ["websockets"] - -[[package]] -name = "wget" -version = "3.2" -description = "pure python download utility" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "win32-setctime" -version = "1.1.0" -description = "A small Python utility to set file creation time on Windows" -category = "main" -optional = false -python-versions = ">=3.5" - -[package.extras] -dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] - -[[package]] -name = "wsproto" -version = "1.2.0" -description = "WebSockets state-machine based protocol implementation" -category = "main" -optional = false -python-versions = ">=3.7.0" - -[package.dependencies] -h11 = ">=0.9.0,<1" - -[[package]] -name = "yarl" -version = "1.9.2" -description = "Yet another URL library" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -idna = ">=2.0" -multidict = ">=4.0" - -[[package]] -name = "zict" -version = "2.0.0" -description = "Mutable mapping tools" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -heapdict = "*" - -[[package]] -name = "zipp" -version = "3.17.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" -optional = false -python-versions = ">=3.8" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] - -[metadata] -lock-version = "1.1" -python-versions = ">=3.8,<3.11" -content-hash = "dfb8836fa378de0413575919423061e2756fd2f0edce2a2c47b5f98f4216a7cc" - -[metadata.files] -async-timeout = [ - {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, - {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, -] -attrs = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, -] -backoff = [ - {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, - {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, -] -backports-zoneinfo = [ - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"}, - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"}, - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"}, - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"}, - {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"}, - {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"}, - {file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"}, - {file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"}, -] -basedosdados = [ - {file = "basedosdados-2.0.0b5-py3-none-any.whl", hash = "sha256:a15fdbaa41d621094dabde3f2f14bcc4842b87f59f16a7a6c7a293351f841be5"}, - {file = "basedosdados-2.0.0b5.tar.gz", hash = "sha256:e4bdf3a0018f7208aa57adac9bb9340d07076a3c18d875e80c488cb4b80f0959"}, -] -beautifulsoup4 = [ - {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, - {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, -] -cachetools = [ - {file = "cachetools-4.2.4-py3-none-any.whl", hash = "sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1"}, - {file = "cachetools-4.2.4.tar.gz", hash = "sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693"}, -] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -cffi = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, -] - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "cfgv" -version = "3.4.0" -description = "Validate configuration and produce human readable error messages." -optional = false -python-versions = ">=3.8" -files = [ -cfgv = [ - {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, - {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.8.tar.gz", hash = "sha256:735e240d9a8506778cd7a453d97e817e536bb1fc29f4f6961ce297b9c7a917b0"}, - {file = "charset_normalizer-2.0.8-py3-none-any.whl", hash = "sha256:83fcdeb225499d6344c8f7f34684c2981270beacc32ede2e669e94f7fa544405"}, -] -ckanapi = [ - {file = "ckanapi-4.6.tar.gz", hash = "sha256:35361965bfb38c8e146d7229f2d7c3aaf1c0f2ef547de4239b4d38931bf081d2"}, -] -click = [ - {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, - {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "click-plugins" -version = "1.1.1" -description = "An extension module for click to enable registering CLI commands via setuptools entry-points." -optional = false -python-versions = "*" -files = [ - {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"}, - {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"}, -] - -[package.dependencies] -click = ">=4.0" - -[package.extras] -dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"] - -[[package]] -name = "cligj" -version = "0.7.2" -description = "Click params for commmand line interfaces to GeoJSON" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4" -files = [ - {file = "cligj-0.7.2-py3-none-any.whl", hash = "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df"}, - {file = "cligj-0.7.2.tar.gz", hash = "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27"}, -] - -[package.dependencies] -click = ">=4.0" - -[package.extras] -test = ["pytest-cov"] - -[[package]] -name = "cloudpickle" -version = "2.0.0" -description = "Extended pickling support for Python objects" -optional = false -python-versions = ">=3.6" -files = [ -click-plugins = [ - {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"}, - {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"}, -] -cligj = [ - {file = "cligj-0.7.2-py3-none-any.whl", hash = "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df"}, - {file = "cligj-0.7.2.tar.gz", hash = "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27"}, -] -cloudpickle = [ - {file = "cloudpickle-2.0.0-py3-none-any.whl", hash = "sha256:6b2df9741d06f43839a3275c4e6632f7df6487a1f181f5f46a052d3c917c3d11"}, - {file = "cloudpickle-2.0.0.tar.gz", hash = "sha256:5cd02f3b417a783ba84a4ec3e290ff7929009fe51f6405423cfccfadd43ba4a4"}, -] -colorama = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] -contourpy = [ - {file = "contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b"}, - {file = "contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1"}, - {file = "contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d"}, - {file = "contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431"}, - {file = "contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb"}, - {file = "contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2"}, - {file = "contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5"}, - {file = "contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62"}, - {file = "contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33"}, - {file = "contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45"}, - {file = "contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a"}, - {file = "contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf"}, - {file = "contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d"}, - {file = "contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6"}, - {file = "contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970"}, - {file = "contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d"}, - {file = "contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8"}, - {file = "contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251"}, - {file = "contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7"}, - {file = "contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9"}, - {file = "contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba"}, - {file = "contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85"}, - {file = "contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e"}, - {file = "contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0"}, - {file = "contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887"}, - {file = "contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e"}, - {file = "contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3"}, - {file = "contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23"}, - {file = "contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb"}, - {file = "contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163"}, - {file = "contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c"}, - {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, -] - -[package.dependencies] -numpy = ">=1.16" - -[package.extras] -bokeh = ["bokeh", "selenium"] -docs = ["furo", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.2.0)", "types-Pillow"] -test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] -test-no-images = ["pytest", "pytest-cov", "wurlitzer"] - -[[package]] -name = "coverage" -version = "7.3.1" -description = "Code coverage measurement for Python" -optional = false -python-versions = ">=3.8" -files = [ -coverage = [ - {file = "coverage-7.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cd0f7429ecfd1ff597389907045ff209c8fdb5b013d38cfa7c60728cb484b6e3"}, - {file = "coverage-7.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:966f10df9b2b2115da87f50f6a248e313c72a668248be1b9060ce935c871f276"}, - {file = "coverage-7.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0575c37e207bb9b98b6cf72fdaaa18ac909fb3d153083400c2d48e2e6d28bd8e"}, - {file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:245c5a99254e83875c7fed8b8b2536f040997a9b76ac4c1da5bff398c06e860f"}, - {file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c96dd7798d83b960afc6c1feb9e5af537fc4908852ef025600374ff1a017392"}, - {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:de30c1aa80f30af0f6b2058a91505ea6e36d6535d437520067f525f7df123887"}, - {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:50dd1e2dd13dbbd856ffef69196781edff26c800a74f070d3b3e3389cab2600d"}, - {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9c0c19f70d30219113b18fe07e372b244fb2a773d4afde29d5a2f7930765136"}, - {file = "coverage-7.3.1-cp310-cp310-win32.whl", hash = "sha256:770f143980cc16eb601ccfd571846e89a5fe4c03b4193f2e485268f224ab602f"}, - {file = "coverage-7.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdd088c00c39a27cfa5329349cc763a48761fdc785879220d54eb785c8a38520"}, - {file = "coverage-7.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74bb470399dc1989b535cb41f5ca7ab2af561e40def22d7e188e0a445e7639e3"}, - {file = "coverage-7.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:025ded371f1ca280c035d91b43252adbb04d2aea4c7105252d3cbc227f03b375"}, - {file = "coverage-7.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6191b3a6ad3e09b6cfd75b45c6aeeffe7e3b0ad46b268345d159b8df8d835f9"}, - {file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7eb0b188f30e41ddd659a529e385470aa6782f3b412f860ce22b2491c89b8593"}, - {file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c8f0df9dfd8ff745bccff75867d63ef336e57cc22b2908ee725cc552689ec8"}, - {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7eb3cd48d54b9bd0e73026dedce44773214064be93611deab0b6a43158c3d5a0"}, - {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ac3c5b7e75acac31e490b7851595212ed951889918d398b7afa12736c85e13ce"}, - {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b4ee7080878077af0afa7238df1b967f00dc10763f6e1b66f5cced4abebb0a3"}, - {file = "coverage-7.3.1-cp311-cp311-win32.whl", hash = "sha256:229c0dd2ccf956bf5aeede7e3131ca48b65beacde2029f0361b54bf93d36f45a"}, - {file = "coverage-7.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c6f55d38818ca9596dc9019eae19a47410d5322408140d9a0076001a3dcb938c"}, - {file = "coverage-7.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5289490dd1c3bb86de4730a92261ae66ea8d44b79ed3cc26464f4c2cde581fbc"}, - {file = "coverage-7.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca833941ec701fda15414be400c3259479bfde7ae6d806b69e63b3dc423b1832"}, - {file = "coverage-7.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd694e19c031733e446c8024dedd12a00cda87e1c10bd7b8539a87963685e969"}, - {file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aab8e9464c00da5cb9c536150b7fbcd8850d376d1151741dd0d16dfe1ba4fd26"}, - {file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87d38444efffd5b056fcc026c1e8d862191881143c3aa80bb11fcf9dca9ae204"}, - {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8a07b692129b8a14ad7a37941a3029c291254feb7a4237f245cfae2de78de037"}, - {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2829c65c8faaf55b868ed7af3c7477b76b1c6ebeee99a28f59a2cb5907a45760"}, - {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1f111a7d85658ea52ffad7084088277135ec5f368457275fc57f11cebb15607f"}, - {file = "coverage-7.3.1-cp312-cp312-win32.whl", hash = "sha256:c397c70cd20f6df7d2a52283857af622d5f23300c4ca8e5bd8c7a543825baa5a"}, - {file = "coverage-7.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:5ae4c6da8b3d123500f9525b50bf0168023313963e0e2e814badf9000dd6ef92"}, - {file = "coverage-7.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca70466ca3a17460e8fc9cea7123c8cbef5ada4be3140a1ef8f7b63f2f37108f"}, - {file = "coverage-7.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f2781fd3cabc28278dc982a352f50c81c09a1a500cc2086dc4249853ea96b981"}, - {file = "coverage-7.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6407424621f40205bbe6325686417e5e552f6b2dba3535dd1f90afc88a61d465"}, - {file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04312b036580ec505f2b77cbbdfb15137d5efdfade09156961f5277149f5e344"}, - {file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9ad38204887349853d7c313f53a7b1c210ce138c73859e925bc4e5d8fc18e7"}, - {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:53669b79f3d599da95a0afbef039ac0fadbb236532feb042c534fbb81b1a4e40"}, - {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:614f1f98b84eb256e4f35e726bfe5ca82349f8dfa576faabf8a49ca09e630086"}, - {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f1a317fdf5c122ad642db8a97964733ab7c3cf6009e1a8ae8821089993f175ff"}, - {file = "coverage-7.3.1-cp38-cp38-win32.whl", hash = "sha256:defbbb51121189722420a208957e26e49809feafca6afeef325df66c39c4fdb3"}, - {file = "coverage-7.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:f4f456590eefb6e1b3c9ea6328c1e9fa0f1006e7481179d749b3376fc793478e"}, - {file = "coverage-7.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f12d8b11a54f32688b165fd1a788c408f927b0960984b899be7e4c190ae758f1"}, - {file = "coverage-7.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f09195dda68d94a53123883de75bb97b0e35f5f6f9f3aa5bf6e496da718f0cb6"}, - {file = "coverage-7.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6601a60318f9c3945be6ea0f2a80571f4299b6801716f8a6e4846892737ebe4"}, - {file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07d156269718670d00a3b06db2288b48527fc5f36859425ff7cec07c6b367745"}, - {file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:636a8ac0b044cfeccae76a36f3b18264edcc810a76a49884b96dd744613ec0b7"}, - {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5d991e13ad2ed3aced177f524e4d670f304c8233edad3210e02c465351f785a0"}, - {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:586649ada7cf139445da386ab6f8ef00e6172f11a939fc3b2b7e7c9082052fa0"}, - {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4aba512a15a3e1e4fdbfed2f5392ec221434a614cc68100ca99dcad7af29f3f8"}, - {file = "coverage-7.3.1-cp39-cp39-win32.whl", hash = "sha256:6bc6f3f4692d806831c136c5acad5ccedd0262aa44c087c46b7101c77e139140"}, - {file = "coverage-7.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:553d7094cb27db58ea91332e8b5681bac107e7242c23f7629ab1316ee73c4981"}, - {file = "coverage-7.3.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:220eb51f5fb38dfdb7e5d54284ca4d0cd70ddac047d750111a68ab1798945194"}, - {file = "coverage-7.3.1.tar.gz", hash = "sha256:6cb7fe1581deb67b782c153136541e20901aa312ceedaf1467dcb35255787952"}, -] -cramjam = [ - {file = "cramjam-2.7.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:aac9d49e16f473ceb4eaf74a53180eac3363127f01855c39122b400a988e80bf"}, - {file = "cramjam-2.7.0-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:a08dcb7c7b54f82db4ee9120aaace06326499c0d4108770ee7ac63d7bd1d803d"}, - {file = "cramjam-2.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c411d785cec410d4164e4ecc76b6c152761fbb61325bcc4acbdc8926874c0b"}, - {file = "cramjam-2.7.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d07c5af763501bd23523658aeb535082eaac014746f7973df85f76b0d9b40967"}, - {file = "cramjam-2.7.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7f93316abc1abfd348b04afc6cadbbd4fba44cd91e7b9803c9330045a7a1885"}, - {file = "cramjam-2.7.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d56afb5f278a18743a218514825b6ab176f18a4084d8f6515c64e3acef19478"}, - {file = "cramjam-2.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea1c781d3760df0b6ad80b7b19dc8e038e0638fb1cfabc68da96cedb8d0adca"}, - {file = "cramjam-2.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f3544ea95d0e98ac926d92d652adc417e78091117cbe2ef7733e26c40601604c"}, - {file = "cramjam-2.7.0-cp310-none-win32.whl", hash = "sha256:0ffb891294e77f2a3b0137992ebd6eb9b1f1bc3728d7d4314632e30270855117"}, - {file = "cramjam-2.7.0-cp310-none-win_amd64.whl", hash = "sha256:79c36d95e89b43c29595c889c7a4d30d29aefc55d7c58a26a058b9bbe7abd5cf"}, - {file = "cramjam-2.7.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:71bf6a6632648333c402a8692fe61f45416066eb0d8b7f4530cdf37fee221a11"}, - {file = "cramjam-2.7.0-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:bee04fd1cdd5f2a2e91e4b271f22e228c698fe7b7f8ef209374d717f7889e80c"}, - {file = "cramjam-2.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60951e64d3e05ef2a46d2a92fc4e4563ae5e28bb3b6f231f2dca68a5078a72dc"}, - {file = "cramjam-2.7.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e6231fd3ac680c34c0d8405abfa8c3d12f92e28d0897d960aa905f053cc09e63"}, - {file = "cramjam-2.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2602c42ed101ada634fa37253d40946f0468b2b749689781cba715a7d78038e"}, - {file = "cramjam-2.7.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbc59b223750a901d65d96333461ab17076594fa34448ed2ef911bd4b628f068"}, - {file = "cramjam-2.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fab800ed93fb129d85c63f26660b695fb194efb29765a163f269321778e28a8d"}, - {file = "cramjam-2.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b48b11c328d91250dadc63c00753f5ba26eb9df5fe75ba2ce8a78631260479d"}, - {file = "cramjam-2.7.0-cp311-none-win32.whl", hash = "sha256:bef07e7d4607c4d70627e58eb630fe60e48b80a61ab05b33314e3296eb90af78"}, - {file = "cramjam-2.7.0-cp311-none-win_amd64.whl", hash = "sha256:3f2e41dc8143d0e88ec9ba3ff66c8d2aea486b04931119abe9e394f9961d74bc"}, - {file = "cramjam-2.7.0-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:d143ccb3f5aae640f0c2dd6244d43f5e5e81d847b50c2eb9f08dcc3dc33f367a"}, - {file = "cramjam-2.7.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47ae97247a58d3095be800420bba7e43cc6958e67f9dfddd12decdb4c99c4d6f"}, - {file = "cramjam-2.7.0-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a8f0fd14bd11f2a625e5c554fd93c7775082c31ffd9fbabb4fe9db3031645d0"}, - {file = "cramjam-2.7.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89b683919ffc846b91b405d5f14df8a2ba1167f4ed9277150298fbe91a3d4aae"}, - {file = "cramjam-2.7.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:66d6a7906fbe8c2e46e987d5a3a9cb235e931b3e4721ac7d8573151c419e3f73"}, - {file = "cramjam-2.7.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:272ab041e95e4088321bffd63ead85d32f86f9fc79f37944663abb59e7fecbb1"}, - {file = "cramjam-2.7.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9698ed7fe78b4de81dcee0624311ee93a4436f0b3e3c6b147a6745a3fd210272"}, - {file = "cramjam-2.7.0-cp37-none-win32.whl", hash = "sha256:5e3869a2ecb7764f18e81afa07aa15a6f28921ae4508ab002314aafecfe7a285"}, - {file = "cramjam-2.7.0-cp37-none-win_amd64.whl", hash = "sha256:58bf5b4dd8f1edaa3bd66b51a26790115efa36cebf66a198a60d095739010b36"}, - {file = "cramjam-2.7.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:1bfd9e9f050a4ef82644a5443742bd6e4d41afc201d5142dfbb5ac73a4f96b94"}, - {file = "cramjam-2.7.0-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:e8b8b968db6a6ec03de231ca17536f8cd69d74e36f0e47e68391a22231c0042c"}, - {file = "cramjam-2.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:820421600d395d0e11b9da1e983acde453637090f5a15abb45f5182cd35f9c3a"}, - {file = "cramjam-2.7.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f8d684a8b918e289bd213d55ea5f67dbf6cc379492e2a7e094724ec62846dea"}, - {file = "cramjam-2.7.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f48e35701528beed092d97c5a1a6ba6c8902c3485d7e3a55c463162bb66afa0"}, - {file = "cramjam-2.7.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:241b9853de56524895c17541d34bdcdd316261247253cb9faeb57a21cc2ae28c"}, - {file = "cramjam-2.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0fa1f8600fdf093a4e5eac5dc56084047abec50d589a8121618e3fb1f9de3f"}, - {file = "cramjam-2.7.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:01573d3c05f75845af75f87d9f6d4d995ee48fafc9c9662679d944c71e658c59"}, - {file = "cramjam-2.7.0-cp38-none-win32.whl", hash = "sha256:44e262f083a0d1c19bc7b8bf8aaa54d31653eab67762cdaeb68fb40b844d50b9"}, - {file = "cramjam-2.7.0-cp38-none-win_amd64.whl", hash = "sha256:2645f0e01735231e3c4d1568c95cc00ed477c1c2e2ed45cb123bef2ccbe72282"}, - {file = "cramjam-2.7.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:f52718e1c7aed3d0e3ffbbe5c085d9c449daa726379788ddb27cb62ffc2b6ba1"}, - {file = "cramjam-2.7.0-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ee4bc46e5cf87d6097833bca33a66f2724b4773242a71ed642d13682fedefb71"}, - {file = "cramjam-2.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd77e784289fc44a5e6487b2e263f07cc271f25a8395e97213b6a934fe47a768"}, - {file = "cramjam-2.7.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53ac8df43546d3f70acbc5c17424a8c083418bd6d2cacfbd5108aaa8f3eb26db"}, - {file = "cramjam-2.7.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca6309d06edf29a9a5c22e25d1d7f7609abb8ae7281583bc486afb19fd645898"}, - {file = "cramjam-2.7.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96ff622f0db7f89d7c9aeadd9cc0c9bf61e804841a03a22ca919aa4955640d"}, - {file = "cramjam-2.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebc87176851c50c5aaf6bacafb6bed5a86e3b4ee6a749d6ec13f3d37ae0e951a"}, - {file = "cramjam-2.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f9340c70d95ea102cf51a07ecc09f93f1363e585d97b5276734a5f8c4476e560"}, - {file = "cramjam-2.7.0-cp39-none-win32.whl", hash = "sha256:3d5ed0fa20b42e063ef66ad01d9948e868bbfc327bf86604e078b67f074f76f3"}, - {file = "cramjam-2.7.0-cp39-none-win_amd64.whl", hash = "sha256:7e44dda432a8c8a47cb73869201d2f9777604bd913d859def84c659fb736cfd3"}, - {file = "cramjam-2.7.0-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:22927dbdda85d8719074e061f9ec024c9bf16088e5e4c6c1c134c46e2d9153b7"}, - {file = "cramjam-2.7.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee80ebd85acec1031e7563cce3de3961bd3f2ec8947c5bf84a9356b25af67a75"}, - {file = "cramjam-2.7.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91bb03ca0d3857f319afd13525d5c6214a55aa49778ce46a02c16f0eee37907c"}, - {file = "cramjam-2.7.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:202e4a5a496ea49d0bb5252fbee8b6e421d256968773c7a8b3e86d98eec9228e"}, - {file = "cramjam-2.7.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19c44de9dee2ea0c586a5b12adc9bc28224544717bce88a94c3ee202b9ece25d"}, - {file = "cramjam-2.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03a72a689c93b8a2c7c08b529c1224c47bd469722e559af231016694b90f6442"}, - {file = "cramjam-2.7.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:fbffb1f63edf4cb4272a25de288c2f2e20914bb93e003883656774e61794b960"}, - {file = "cramjam-2.7.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df46019cb999d874ce86e08d71d7d2983c052d6a63f7aa6bce960e4e05e8ea37"}, - {file = "cramjam-2.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44fe99233ef2f42ff03d8395e7d97e0c45306eb356f6f01fa69bdb49783fdb8a"}, - {file = "cramjam-2.7.0.tar.gz", hash = "sha256:579fb724eec048b1a18ca8f7ad9a7ef296dc02eba5f87fd4d5031f0c32c5c9ac"}, -] -croniter = [ - {file = "croniter-1.0.15-py2.py3-none-any.whl", hash = "sha256:0f97b361fe343301a8f66f852e7d84e4fb7f21379948f71e1bbfe10f5d015fbd"}, - {file = "croniter-1.0.15.tar.gz", hash = "sha256:a70dfc9d52de9fc1a886128b9148c89dd9e76b67d55f46516ca94d2d73d58219"}, -] -cycler = [ - {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, - {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, -] -dask = [ - {file = "dask-2021.11.2-py3-none-any.whl", hash = "sha256:2b0ad7beba8950add4fdc7c5cb94fa9444915ddb00c711d5743e2c4bb0a95ef5"}, - {file = "dask-2021.11.2.tar.gz", hash = "sha256:e12bfe272928d62fa99623d98d0e0b0c045b33a47509ef31a22175aa5fd10917"}, -] -db-dtypes = [ - {file = "db-dtypes-1.1.1.tar.gz", hash = "sha256:ab485c85fef2454f3182427def0b0a3ab179b2871542787d33ba519d62078883"}, - {file = "db_dtypes-1.1.1-py2.py3-none-any.whl", hash = "sha256:23be34ea2bc91065447ecea4d5f107e46d1de223d152e69fa73673a62d5bd27d"}, -] -dbt-client = [ - {file = "dbt-client-0.1.3.tar.gz", hash = "sha256:192fff51a51d6d002d4048dd494e601592599e004c0f31f1ea5156aa6d516cf5"}, - {file = "dbt_client-0.1.3-py3-none-any.whl", hash = "sha256:31a0db4844c1559c95c643a6f57d1e39d4e9c3b4d9a8c867f7b3e6ed75cedca0"}, -] -dill = [ - {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, - {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, -] -distlib = [ - {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, - {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, -] -distributed = [ - {file = "distributed-2021.11.2-py3-none-any.whl", hash = "sha256:af1f7b98d85d43886fefe2354379c848c7a5aa6ae4d2313a7aca9ab9081a7e56"}, - {file = "distributed-2021.11.2.tar.gz", hash = "sha256:f86a01a2e1e678865d2e42300c47552b5012cd81a2d354e47827a1fd074cc302"}, -] -docker = [ - {file = "docker-5.0.3-py2.py3-none-any.whl", hash = "sha256:7a79bb439e3df59d0a72621775d600bc8bc8b422d285824cb37103eab91d1ce0"}, - {file = "docker-5.0.3.tar.gz", hash = "sha256:d916a26b62970e7c2f554110ed6af04c7ccff8e9f81ad17d0d40c75637e227fb"}, -] -docopt = [ - {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, -] -et-xmlfile = [ - {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, - {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, -] - -[[package]] -name = "exceptiongroup" -version = "1.1.3" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, - {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "fake-useragent" -version = "1.2.1" -description = "Up-to-date simple useragent faker with real world database" -optional = false -python-versions = "*" -files = [ -exceptiongroup = [ - {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, - {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, -] -fake-useragent = [ - {file = "fake-useragent-1.2.1.tar.gz", hash = "sha256:b411f903331f695e3840ccadcf011f745a405764e97c588f2b8fde9e400a5446"}, - {file = "fake_useragent-1.2.1-py3-none-any.whl", hash = "sha256:ad2b5414d19493d0789572f04200d4f656f84d20b205cc805233212957fe385d"}, -] -fastavro = [ - {file = "fastavro-1.5.4-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:d316cc476b2b24ef06402b8bfa047f8f72a9d6df2de777bb30d9ededda7e3a02"}, - {file = "fastavro-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8459faec46e34f2dfeb9b70ee8c36e935e626cff8608d675724718987a5f9ce5"}, - {file = "fastavro-1.5.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd44636d7ff8365a57b88707b747371fffb676c8c1f68c0d423ec36623888668"}, - {file = "fastavro-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:2402428b26d3c08a58acfa723833e19fb75077872bcb2475a4c81195cdae6a5d"}, - {file = "fastavro-1.5.4-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:5afc14398f4191d1a807aa59d2fba5ed869b31343679ec43dbc289db0a8e35c5"}, - {file = "fastavro-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5217e9713a3ea03205532394fba4d743749155b04b10b12a12fc26d225b89792"}, - {file = "fastavro-1.5.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e93a5eecb28cc35d670c9c4df70223fa9bcd6d9ca21b38b1b7ae13ece60c7fb"}, - {file = "fastavro-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:1a2f2465efd0e7de557c4034e8d4d88a132750cfa51e1582362a1b3a1a9fa911"}, - {file = "fastavro-1.5.4-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f7d5bc76c03c692d9acea0e5d5baceec19e1c059b26cb8ae9f4481e842be95a5"}, - {file = "fastavro-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80fe920229ab1f40eccb1b4918481cdd8a20e5e7dce19308ab38b23732da8a70"}, - {file = "fastavro-1.5.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3d190aee86ab73caa1aa550eba850be2ca5dd29d814b38720f4e300184e01d5"}, - {file = "fastavro-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:b6c30299a49b11f42251cb81c8e15db67750642eac7ba5c194a5ee95c83ebb11"}, - {file = "fastavro-1.5.4-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:1f7685f3a3c38352abab432bad2f9f2229a0e5f5f8548831e887c30f8396f2e9"}, - {file = "fastavro-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd021ec850fd30020b7c4fa868466fb7f95450f1f06eac92bd2204cbd8e45fb8"}, - {file = "fastavro-1.5.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06a7b5602dfa032c92f20ca90b8bde88251573773e501bedf5e8b76b9feb14a3"}, - {file = "fastavro-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:18250aa2ab0f7a095b1865565cf9976ea4605c201129636e6defe24ec3ef112c"}, - {file = "fastavro-1.5.4.tar.gz", hash = "sha256:d86f72c966713fb699570a18f7960cf4110b069c70681d7538be8d671c9db7c8"}, -] - -[package.extras] -codecs = ["lz4", "python-snappy", "zstandard"] -lz4 = ["lz4"] -snappy = ["python-snappy"] -zstandard = ["zstandard"] - -[[package]] -name = "fastparquet" -version = "2023.8.0" -description = "Python support for Parquet file format" -optional = false -python-versions = ">=3.8" -files = [ -fastparquet = [ - {file = "fastparquet-2023.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e374e648bc93d1b499ca29cd16ea09bc7c61b6c60910377b2bbe3d6c4f089b22"}, - {file = "fastparquet-2023.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:31ecf82b3969203ef6aea9458ae9e27387eab80ab9d590031e5bfdff96bad2f1"}, - {file = "fastparquet-2023.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:160ee84241f106a21cf4b0821e95235a47cdd0e1a41c6721380c077af01d07cc"}, - {file = "fastparquet-2023.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3619bb0fb3760038a47fd742ff66acf5b8b19f1a7b9744cb13e4dda43c314e92"}, - {file = "fastparquet-2023.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c23425bd3934971075331113c974929d1362b381bb388825d5a2bf8150568806"}, - {file = "fastparquet-2023.8.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b0f233bd35e2121785b49b461430bb2448ef01a8b8f4196d14580827c24dea67"}, - {file = "fastparquet-2023.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1efa5a140b77ec60fec5d41135cd06ffe6f72b229a971d3756255aeca3c2fa32"}, - {file = "fastparquet-2023.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:a4f7dcd88fc7d58bdefac6b29441766ec3510cf72d4da58354f75d583bd3020d"}, - {file = "fastparquet-2023.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:afe08f3f5b7e8db8a81d765f05a85e05f808118fc981e87edfbc06456c1609b0"}, - {file = "fastparquet-2023.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c4b76d047511949902952d7bb22ab12129efa7ed1ddb30d07bdb087d78914079"}, - {file = "fastparquet-2023.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8eb212e0379cbc01adf904a87868dcfbb5658f71816df812ea49abb42f0d7220"}, - {file = "fastparquet-2023.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7784c2ab4cf7fff28adb2c6b7e88cd90c345f6e4cc1e39aead8b57bc4d001700"}, - {file = "fastparquet-2023.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f8a1381b3272c73f85dfedbdfd7c8538b46382eaaf51f18ca0e0a9afda12cf0"}, - {file = "fastparquet-2023.8.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6648ac0946264159dfadca8ff044d5c12cf0e5587fa2cef1709c4abf84866c06"}, - {file = "fastparquet-2023.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3c3a1cba8c7176690ad7db242f190c9ec6d0ae0fa1d30196db76eabe35536252"}, - {file = "fastparquet-2023.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:c06bdf64512807714d25760c096ea4ac8be5f3dcee6d346a3c7e34ea9622b118"}, - {file = "fastparquet-2023.8.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e11d951450fd0734b9ee1971123c6743f5f44296fbb7258f8c92f722c5878fde"}, - {file = "fastparquet-2023.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23a5b302c1cdbec8450b3ba66db44210dd6b7bbbd298a3a3482588903055347f"}, - {file = "fastparquet-2023.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac6a3a1e157fcb0a89a66d593494f1849d8004a7979bb24aa5b7c01ffb4c5e66"}, - {file = "fastparquet-2023.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dadde182a582313aa8976afc620d73d2f1d995f29d418ecb5fc05dd015e646c"}, - {file = "fastparquet-2023.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12e0fecff7cbf5031944f119c6e11d8a2e578ceb1c2898aa481ddc6d1bc94b6b"}, - {file = "fastparquet-2023.8.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cfe2a49cd8ca612bfbe4a23244d4a25525468b14cc72eb4550d698ec420ed17b"}, - {file = "fastparquet-2023.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b56f048b3b89400e5781093b6160cad8acdeb15f10bc8a0c14d29f96dd5abc56"}, - {file = "fastparquet-2023.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:27be564460e391313ea6c9c0225710abd5c875fa85cab5b89f223961e3065772"}, - {file = "fastparquet-2023.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0c1bed521f149408101e90484e21f74011caa950b3fda2674539d7295f20e5eb"}, - {file = "fastparquet-2023.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cf33f1c9c6f02c94874fa231e28845078a413943684952c19c5b8742be0d1ef0"}, - {file = "fastparquet-2023.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcabba07d2ad07bf07a0d85f3dcc19576c1d5c9bdd781aaa0e8673a4c8552d24"}, - {file = "fastparquet-2023.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c78407941103c8f72270027a287db7e757431f766ce3890d4c16d4773006bd8"}, - {file = "fastparquet-2023.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9814e320fe7040ea440e7fff6aa62cec5e7f0440d9047c7b5316d761f129e956"}, - {file = "fastparquet-2023.8.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8cea82b9260907219ef55db470c891a61bb75f913ccff3f0a9718ab45ceb1856"}, - {file = "fastparquet-2023.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:72a34011217e7c3e5482d03cbee2687732c3b956120fa34666d771e7f5eed4fe"}, - {file = "fastparquet-2023.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:8697a663e1997266bda5cca8107821739bd91a591229d52e3c02ccdc50377577"}, - {file = "fastparquet-2023.8.0.tar.gz", hash = "sha256:2ff39bc20869829ea8fd85bf0336c5006d0ffcc276d0de070030cf8ffd929160"}, -] - -[package.dependencies] -cramjam = ">=2.3" -fsspec = "*" -numpy = ">=1.20.3" -packaging = "*" -pandas = ">=1.5.0" - -[package.extras] -lzo = ["python-lzo"] - -[[package]] -name = "filelock" -version = "3.12.4" -description = "A platform independent file lock." -optional = false -python-versions = ">=3.8" -files = [ - {file = "filelock-3.12.4-py3-none-any.whl", hash = "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4"}, - {file = "filelock-3.12.4.tar.gz", hash = "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd"}, -] - -[package.extras] -docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] -typing = ["typing-extensions (>=4.7.1)"] - -[[package]] -name = "fiona" -version = "1.9.4.post1" -description = "Fiona reads and writes spatial data files" -optional = false -python-versions = ">=3.7" -files = [ -filelock = [ - {file = "filelock-3.12.4-py3-none-any.whl", hash = "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4"}, - {file = "filelock-3.12.4.tar.gz", hash = "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd"}, -] -fiona = [ - {file = "Fiona-1.9.4.post1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:d6483a20037db2209c8e9a0c6f1e552f807d03c8f42ed0c865ab500945a37c4d"}, - {file = "Fiona-1.9.4.post1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dbe158947099a83ad16f9acd3a21f50ff01114c64e2de67805e382e6b6e0083a"}, - {file = "Fiona-1.9.4.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2c7b09eecee3bb074ef8aa518cd6ab30eb663c6fdd0eff3c88d454a9746eaa"}, - {file = "Fiona-1.9.4.post1-cp310-cp310-win_amd64.whl", hash = "sha256:1da8b954f6f222c3c782bc285586ea8dd9d7e55e1bc7861da9cd772bca671660"}, - {file = "Fiona-1.9.4.post1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:c671d8832287cda397621d79c5a635d52e4631f33a8f0e6fdc732a79a93cb96c"}, - {file = "Fiona-1.9.4.post1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b633a2e550e083805c638d2ab8059c283ca112aaea8241e170c012d2ee0aa905"}, - {file = "Fiona-1.9.4.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1faa625d5202b8403471bbc9f9c96b1bf9099cfcb0ee02a80a3641d3d02383e"}, - {file = "Fiona-1.9.4.post1-cp311-cp311-win_amd64.whl", hash = "sha256:39baf11ff0e4318397e2b2197de427b4eebdc49d4a9a7c1366f8a7ed682978a4"}, - {file = "Fiona-1.9.4.post1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d93c993265f6378b23f47708c83bddb3377ca6814a1f0b5a0ae0bee9c8d72cf8"}, - {file = "Fiona-1.9.4.post1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:b0387cae39e27f338fd948b3b50b6e6ce198cc4cec257fc91660849697c69dc3"}, - {file = "Fiona-1.9.4.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:450561d308d3ce7c7e30294822b1de3f4f942033b703ddd4a91a7f7f5f506ca0"}, - {file = "Fiona-1.9.4.post1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:71b023ef5248ebfa5524e7a875033f7db3bbfaf634b1b5c1ae36958d1eb82083"}, - {file = "Fiona-1.9.4.post1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:74511d3755695d75cea0f4ff6f5e0c6c5d5be8e0d46dafff124c6a219e99b1eb"}, - {file = "Fiona-1.9.4.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:285f3dd4f96aa0a3955ed469f0543375b20989731b2dddc85124453f11ac62bc"}, - {file = "Fiona-1.9.4.post1-cp38-cp38-win_amd64.whl", hash = "sha256:a670ea4262cb9140445bcfc97cbfd2f508a058be342f4a97e966b8ce7696601f"}, - {file = "Fiona-1.9.4.post1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:ea7c44c15b3a653452b9b3173181490b7afc5f153b0473c145c43c0fbf90448b"}, - {file = "Fiona-1.9.4.post1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7bfb1f49e0e53f6cd7ad64ae809d72646266b37a7b9881205977408b443a8d79"}, - {file = "Fiona-1.9.4.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a585002a6385cc8ab0f66ddf3caf18711f531901906abd011a67a0cc89ab7b0"}, - {file = "Fiona-1.9.4.post1-cp39-cp39-win_amd64.whl", hash = "sha256:f5da66b723a876142937e683431bbaa5c3d81bb2ed3ec98941271bc99b7f8cd0"}, - {file = "Fiona-1.9.4.post1.tar.gz", hash = "sha256:5679d3f7e0d513035eb72e59527bb90486859af4405755dfc739138633106120"}, -] - -[package.dependencies] -attrs = ">=19.2.0" -certifi = "*" -click = ">=8.0,<9.0" -click-plugins = ">=1.0" -cligj = ">=0.5" -importlib-metadata = {version = "*", markers = "python_version < \"3.10\""} -six = "*" - -[package.extras] -all = ["Fiona[calc,s3,test]"] -calc = ["shapely"] -s3 = ["boto3 (>=1.3.1)"] -test = ["Fiona[s3]", "pytest (>=7)", "pytest-cov", "pytz"] - -[[package]] -name = "fonttools" -version = "4.42.1" -description = "Tools to manipulate font files" -optional = false -python-versions = ">=3.8" -files = [ - {file = "fonttools-4.42.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ed1a13a27f59d1fc1920394a7f596792e9d546c9ca5a044419dca70c37815d7c"}, - {file = "fonttools-4.42.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9b1ce7a45978b821a06d375b83763b27a3a5e8a2e4570b3065abad240a18760"}, - {file = "fonttools-4.42.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f720fa82a11c0f9042376fd509b5ed88dab7e3cd602eee63a1af08883b37342b"}, - {file = "fonttools-4.42.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db55cbaea02a20b49fefbd8e9d62bd481aaabe1f2301dabc575acc6b358874fa"}, - {file = "fonttools-4.42.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a35981d90feebeaef05e46e33e6b9e5b5e618504672ca9cd0ff96b171e4bfff"}, - {file = "fonttools-4.42.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:68a02bbe020dc22ee0540e040117535f06df9358106d3775e8817d826047f3fd"}, - {file = "fonttools-4.42.1-cp310-cp310-win32.whl", hash = "sha256:12a7c247d1b946829bfa2f331107a629ea77dc5391dfd34fdcd78efa61f354ca"}, - {file = "fonttools-4.42.1-cp310-cp310-win_amd64.whl", hash = "sha256:a398bdadb055f8de69f62b0fc70625f7cbdab436bbb31eef5816e28cab083ee8"}, - {file = "fonttools-4.42.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:689508b918332fb40ce117131633647731d098b1b10d092234aa959b4251add5"}, - {file = "fonttools-4.42.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e36344e48af3e3bde867a1ca54f97c308735dd8697005c2d24a86054a114a71"}, - {file = "fonttools-4.42.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19b7db825c8adee96fac0692e6e1ecd858cae9affb3b4812cdb9d934a898b29e"}, - {file = "fonttools-4.42.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:113337c2d29665839b7d90b39f99b3cac731f72a0eda9306165a305c7c31d341"}, - {file = "fonttools-4.42.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:37983b6bdab42c501202500a2be3a572f50d4efe3237e0686ee9d5f794d76b35"}, - {file = "fonttools-4.42.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6ed2662a3d9c832afa36405f8748c250be94ae5dfc5283d668308391f2102861"}, - {file = "fonttools-4.42.1-cp311-cp311-win32.whl", hash = "sha256:179737095eb98332a2744e8f12037b2977f22948cf23ff96656928923ddf560a"}, - {file = "fonttools-4.42.1-cp311-cp311-win_amd64.whl", hash = "sha256:f2b82f46917d8722e6b5eafeefb4fb585d23babd15d8246c664cd88a5bddd19c"}, - {file = "fonttools-4.42.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:62f481ac772fd68901573956231aea3e4b1ad87b9b1089a61613a91e2b50bb9b"}, - {file = "fonttools-4.42.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2f806990160d1ce42d287aa419df3ffc42dfefe60d473695fb048355fe0c6a0"}, - {file = "fonttools-4.42.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db372213d39fa33af667c2aa586a0c1235e88e9c850f5dd5c8e1f17515861868"}, - {file = "fonttools-4.42.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d18fc642fd0ac29236ff88ecfccff229ec0386090a839dd3f1162e9a7944a40"}, - {file = "fonttools-4.42.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8708b98c278012ad267ee8a7433baeb809948855e81922878118464b274c909d"}, - {file = "fonttools-4.42.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c95b0724a6deea2c8c5d3222191783ced0a2f09bd6d33f93e563f6f1a4b3b3a4"}, - {file = "fonttools-4.42.1-cp38-cp38-win32.whl", hash = "sha256:4aa79366e442dbca6e2c8595645a3a605d9eeabdb7a094d745ed6106816bef5d"}, - {file = "fonttools-4.42.1-cp38-cp38-win_amd64.whl", hash = "sha256:acb47f6f8680de24c1ab65ebde39dd035768e2a9b571a07c7b8da95f6c8815fd"}, - {file = "fonttools-4.42.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5fb289b7a815638a7613d46bcf324c9106804725b2bb8ad913c12b6958ffc4ec"}, - {file = "fonttools-4.42.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:53eb5091ddc8b1199330bb7b4a8a2e7995ad5d43376cadce84523d8223ef3136"}, - {file = "fonttools-4.42.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46a0ec8adbc6ff13494eb0c9c2e643b6f009ce7320cf640de106fb614e4d4360"}, - {file = "fonttools-4.42.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cc7d685b8eeca7ae69dc6416833fbfea61660684b7089bca666067cb2937dcf"}, - {file = "fonttools-4.42.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:be24fcb80493b2c94eae21df70017351851652a37de514de553435b256b2f249"}, - {file = "fonttools-4.42.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:515607ec756d7865f23070682622c49d922901943697871fc292277cf1e71967"}, - {file = "fonttools-4.42.1-cp39-cp39-win32.whl", hash = "sha256:0eb79a2da5eb6457a6f8ab904838454accc7d4cccdaff1fd2bd3a0679ea33d64"}, - {file = "fonttools-4.42.1-cp39-cp39-win_amd64.whl", hash = "sha256:7286aed4ea271df9eab8d7a9b29e507094b51397812f7ce051ecd77915a6e26b"}, - {file = "fonttools-4.42.1-py3-none-any.whl", hash = "sha256:9398f244e28e0596e2ee6024f808b06060109e33ed38dcc9bded452fd9bbb853"}, - {file = "fonttools-4.42.1.tar.gz", hash = "sha256:c391cd5af88aacaf41dd7cfb96eeedfad297b5899a39e12f4c2c3706d0a3329d"}, -] -fonttools = [ - {file = "fonttools-4.42.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ed1a13a27f59d1fc1920394a7f596792e9d546c9ca5a044419dca70c37815d7c"}, - {file = "fonttools-4.42.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9b1ce7a45978b821a06d375b83763b27a3a5e8a2e4570b3065abad240a18760"}, - {file = "fonttools-4.42.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f720fa82a11c0f9042376fd509b5ed88dab7e3cd602eee63a1af08883b37342b"}, - {file = "fonttools-4.42.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db55cbaea02a20b49fefbd8e9d62bd481aaabe1f2301dabc575acc6b358874fa"}, - {file = "fonttools-4.42.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a35981d90feebeaef05e46e33e6b9e5b5e618504672ca9cd0ff96b171e4bfff"}, - {file = "fonttools-4.42.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:68a02bbe020dc22ee0540e040117535f06df9358106d3775e8817d826047f3fd"}, - {file = "fonttools-4.42.1-cp310-cp310-win32.whl", hash = "sha256:12a7c247d1b946829bfa2f331107a629ea77dc5391dfd34fdcd78efa61f354ca"}, - {file = "fonttools-4.42.1-cp310-cp310-win_amd64.whl", hash = "sha256:a398bdadb055f8de69f62b0fc70625f7cbdab436bbb31eef5816e28cab083ee8"}, - {file = "fonttools-4.42.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:689508b918332fb40ce117131633647731d098b1b10d092234aa959b4251add5"}, - {file = "fonttools-4.42.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e36344e48af3e3bde867a1ca54f97c308735dd8697005c2d24a86054a114a71"}, - {file = "fonttools-4.42.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19b7db825c8adee96fac0692e6e1ecd858cae9affb3b4812cdb9d934a898b29e"}, - {file = "fonttools-4.42.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:113337c2d29665839b7d90b39f99b3cac731f72a0eda9306165a305c7c31d341"}, - {file = "fonttools-4.42.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:37983b6bdab42c501202500a2be3a572f50d4efe3237e0686ee9d5f794d76b35"}, - {file = "fonttools-4.42.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6ed2662a3d9c832afa36405f8748c250be94ae5dfc5283d668308391f2102861"}, - {file = "fonttools-4.42.1-cp311-cp311-win32.whl", hash = "sha256:179737095eb98332a2744e8f12037b2977f22948cf23ff96656928923ddf560a"}, - {file = "fonttools-4.42.1-cp311-cp311-win_amd64.whl", hash = "sha256:f2b82f46917d8722e6b5eafeefb4fb585d23babd15d8246c664cd88a5bddd19c"}, - {file = "fonttools-4.42.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:62f481ac772fd68901573956231aea3e4b1ad87b9b1089a61613a91e2b50bb9b"}, - {file = "fonttools-4.42.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2f806990160d1ce42d287aa419df3ffc42dfefe60d473695fb048355fe0c6a0"}, - {file = "fonttools-4.42.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db372213d39fa33af667c2aa586a0c1235e88e9c850f5dd5c8e1f17515861868"}, - {file = "fonttools-4.42.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d18fc642fd0ac29236ff88ecfccff229ec0386090a839dd3f1162e9a7944a40"}, - {file = "fonttools-4.42.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8708b98c278012ad267ee8a7433baeb809948855e81922878118464b274c909d"}, - {file = "fonttools-4.42.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c95b0724a6deea2c8c5d3222191783ced0a2f09bd6d33f93e563f6f1a4b3b3a4"}, - {file = "fonttools-4.42.1-cp38-cp38-win32.whl", hash = "sha256:4aa79366e442dbca6e2c8595645a3a605d9eeabdb7a094d745ed6106816bef5d"}, - {file = "fonttools-4.42.1-cp38-cp38-win_amd64.whl", hash = "sha256:acb47f6f8680de24c1ab65ebde39dd035768e2a9b571a07c7b8da95f6c8815fd"}, - {file = "fonttools-4.42.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5fb289b7a815638a7613d46bcf324c9106804725b2bb8ad913c12b6958ffc4ec"}, - {file = "fonttools-4.42.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:53eb5091ddc8b1199330bb7b4a8a2e7995ad5d43376cadce84523d8223ef3136"}, - {file = "fonttools-4.42.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46a0ec8adbc6ff13494eb0c9c2e643b6f009ce7320cf640de106fb614e4d4360"}, - {file = "fonttools-4.42.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cc7d685b8eeca7ae69dc6416833fbfea61660684b7089bca666067cb2937dcf"}, - {file = "fonttools-4.42.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:be24fcb80493b2c94eae21df70017351851652a37de514de553435b256b2f249"}, - {file = "fonttools-4.42.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:515607ec756d7865f23070682622c49d922901943697871fc292277cf1e71967"}, - {file = "fonttools-4.42.1-cp39-cp39-win32.whl", hash = "sha256:0eb79a2da5eb6457a6f8ab904838454accc7d4cccdaff1fd2bd3a0679ea33d64"}, - {file = "fonttools-4.42.1-cp39-cp39-win_amd64.whl", hash = "sha256:7286aed4ea271df9eab8d7a9b29e507094b51397812f7ce051ecd77915a6e26b"}, - {file = "fonttools-4.42.1-py3-none-any.whl", hash = "sha256:9398f244e28e0596e2ee6024f808b06060109e33ed38dcc9bded452fd9bbb853"}, - {file = "fonttools-4.42.1.tar.gz", hash = "sha256:c391cd5af88aacaf41dd7cfb96eeedfad297b5899a39e12f4c2c3706d0a3329d"}, -] -fsspec = [ - {file = "fsspec-2021.11.1-py3-none-any.whl", hash = "sha256:bcb136caa37e1470dd8314a7d3917cb9b25dd9da44c10d36df556ab4ef038185"}, - {file = "fsspec-2021.11.1.tar.gz", hash = "sha256:03683e606651d5e4bd9180525d57477bd5430e5dc68d2e459835dc14cecc3dd4"}, -] - -[package.extras] -abfs = ["adlfs"] -adl = ["adlfs"] -arrow = ["pyarrow (>=1)"] -dask = ["dask", "distributed"] -dropbox = ["dropbox", "dropboxdrivefs", "requests"] -entrypoints = ["importlib-metadata"] -fuse = ["fusepy"] -gcs = ["gcsfs"] -git = ["pygit2"] -github = ["requests"] -gs = ["gcsfs"] -gui = ["panel"] -hdfs = ["pyarrow (>=1)"] -http = ["aiohttp", "requests"] -libarchive = ["libarchive-c"] -oci = ["ocifs"] -s3 = ["s3fs"] -sftp = ["paramiko"] -smb = ["smbprotocol"] -ssh = ["paramiko"] - -[[package]] -name = "geopandas" -version = "0.13.2" -description = "Geographic pandas extensions" -optional = false -python-versions = ">=3.8" -files = [ - {file = "geopandas-0.13.2-py3-none-any.whl", hash = "sha256:101cfd0de54bcf9e287a55b5ea17ebe0db53a5e25a28bacf100143d0507cabd9"}, - {file = "geopandas-0.13.2.tar.gz", hash = "sha256:e5b56d9c20800c77bcc0c914db3f27447a37b23b2cd892be543f5001a694a968"}, -] - -[package.dependencies] -fiona = ">=1.8.19" -packaging = "*" -pandas = ">=1.1.0" -pyproj = ">=3.0.1" -shapely = ">=1.7.1" - -[[package]] -name = "google-analytics-data" -version = "0.17.0" -description = "Google Analytics Data API client library" -optional = false -python-versions = ">=3.7" -files = [ -geopandas = [ - {file = "geopandas-0.13.2-py3-none-any.whl", hash = "sha256:101cfd0de54bcf9e287a55b5ea17ebe0db53a5e25a28bacf100143d0507cabd9"}, - {file = "geopandas-0.13.2.tar.gz", hash = "sha256:e5b56d9c20800c77bcc0c914db3f27447a37b23b2cd892be543f5001a694a968"}, -] -google-analytics-data = [ - {file = "google-analytics-data-0.17.0.tar.gz", hash = "sha256:f7ed38016674f577d20400bcd9efe9951e1a150ea53c24461b5e9eee5d537858"}, - {file = "google_analytics_data-0.17.0-py2.py3-none-any.whl", hash = "sha256:26f0870e857f60c2cd70774d82d02e9751283f54ad33a73d42bd33e950b59fbd"}, -] -google-api-core = [ - {file = "google-api-core-2.11.1.tar.gz", hash = "sha256:25d29e05a0058ed5f19c61c0a78b1b53adea4d9364b464d014fbda941f6d1c9a"}, - {file = "google_api_core-2.11.1-py3-none-any.whl", hash = "sha256:d92a5a92dc36dd4f4b9ee4e55528a90e432b059f93aee6ad857f9de8cc7ae94a"}, -] - -[package.dependencies] -google-auth = ">=2.14.1,<3.0.dev0" -googleapis-common-protos = ">=1.56.2,<2.0.dev0" -grpcio = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} -grpcio-status = {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""} -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" -requests = ">=2.18.0,<3.0.0.dev0" - -[package.extras] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] -grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] - -[[package]] -name = "google-api-python-client" -version = "2.99.0" -description = "Google API Client Library for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-api-python-client-2.99.0.tar.gz", hash = "sha256:e733fd0f2c8793b1a000d5e69ac81b1b9ec0665b445b7ed83bdbbb0038973306"}, - {file = "google_api_python_client-2.99.0-py2.py3-none-any.whl", hash = "sha256:40272131d3a4a7aecab840ebcf3df51c54d49560156f3b9d54a4ef82c795985d"}, -google-api-python-client = [ - {file = "google-api-python-client-2.101.0.tar.gz", hash = "sha256:e9620a809251174818e1fce16604006f10a9c2ac0d3d94a139cdddcd4dbea2d8"}, - {file = "google_api_python_client-2.101.0-py2.py3-none-any.whl", hash = "sha256:71760dcf11d191b65520d1c13757a776f4f43cf87f302097a0d8e491c2ef87b0"}, -] -google-auth = [ - {file = "google-auth-2.22.0.tar.gz", hash = "sha256:164cba9af4e6e4e40c3a4f90a1a6c12ee56f14c0b4868d1ca91b32826ab334ce"}, - {file = "google_auth-2.22.0-py2.py3-none-any.whl", hash = "sha256:d61d1b40897407b574da67da1a833bdc10d5a11642566e506565d1b1a46ba873"}, -] - -[package.dependencies] -cachetools = ">=2.0.0,<6.0" -pyasn1-modules = ">=0.2.1" -rsa = ">=3.1.4,<5" -six = ">=1.9.0" -urllib3 = "<2.0" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] -enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] -pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] -reauth = ["pyu2f (>=0.1.5)"] -requests = ["requests (>=2.20.0,<3.0.0.dev0)"] - -[[package]] -name = "google-auth-httplib2" -version = "0.1.1" -description = "Google Authentication Library: httplib2 transport" -optional = false -python-versions = "*" -files = [ - {file = "google-auth-httplib2-0.1.1.tar.gz", hash = "sha256:c64bc555fdc6dd788ea62ecf7bccffcf497bf77244887a3f3d7a5a02f8e3fc29"}, - {file = "google_auth_httplib2-0.1.1-py2.py3-none-any.whl", hash = "sha256:42c50900b8e4dcdf8222364d1f0efe32b8421fb6ed72f2613f12f75cc933478c"}, -] - -[package.dependencies] -google-auth = "*" -httplib2 = ">=0.19.0" - -[[package]] -name = "google-auth-oauthlib" -version = "1.1.0" -description = "Google Authentication Library" -optional = false -python-versions = ">=3.6" -files = [ -google-auth-httplib2 = [ - {file = "google-auth-httplib2-0.1.1.tar.gz", hash = "sha256:c64bc555fdc6dd788ea62ecf7bccffcf497bf77244887a3f3d7a5a02f8e3fc29"}, - {file = "google_auth_httplib2-0.1.1-py2.py3-none-any.whl", hash = "sha256:42c50900b8e4dcdf8222364d1f0efe32b8421fb6ed72f2613f12f75cc933478c"}, -] -google-auth-oauthlib = [ - {file = "google-auth-oauthlib-1.1.0.tar.gz", hash = "sha256:83ea8c3b0881e453790baff4448e8a6112ac8778d1de9da0b68010b843937afb"}, - {file = "google_auth_oauthlib-1.1.0-py2.py3-none-any.whl", hash = "sha256:089c6e587d36f4803ac7e0720c045c6a8b1fd1790088b8424975b90d0ee61c12"}, -] -google-cloud-bigquery = [ - {file = "google-cloud-bigquery-3.11.4.tar.gz", hash = "sha256:697df117241a2283bcbb93b21e10badc14e51c9a90800d2a7e1a3e1c7d842974"}, - {file = "google_cloud_bigquery-3.11.4-py2.py3-none-any.whl", hash = "sha256:5fa7897743a0ed949ade25a0942fc9e7557d8fce307c6f8a76d1b604cf27f1b1"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} -google-cloud-core = ">=1.6.0,<3.0.0dev" -google-resumable-media = ">=0.6.0,<3.0dev" -grpcio = ">=1.47.0,<2.0dev" -packaging = ">=20.0.0" -proto-plus = ">=1.15.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" -python-dateutil = ">=2.7.2,<3.0dev" -requests = ">=2.21.0,<3.0.0dev" - -[package.extras] -all = ["Shapely (>=1.8.4,<2.0dev)", "db-dtypes (>=0.3.0,<2.0.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)", "ipywidgets (>=7.7.0)", "opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)", "tqdm (>=4.7.4,<5.0.0dev)"] -bqstorage = ["google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] -geopandas = ["Shapely (>=1.8.4,<2.0dev)", "geopandas (>=0.9.0,<1.0dev)"] -ipython = ["ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)"] -ipywidgets = ["ipykernel (>=6.0.0)", "ipywidgets (>=7.7.0)"] -opentelemetry = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] -pandas = ["db-dtypes (>=0.3.0,<2.0.0dev)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)"] -tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] - -[[package]] -name = "google-cloud-bigquery-connection" -version = "1.13.1" -description = "Google Cloud Bigquery Connection API client library" -optional = false -python-versions = ">=3.7" -files = [ -google-cloud-bigquery-connection = [ - {file = "google-cloud-bigquery-connection-1.13.1.tar.gz", hash = "sha256:ca188b12f3acf07718b23adc58a9480e19d80291ebb67497fc6da2fea90c1ae7"}, - {file = "google_cloud_bigquery_connection-1.13.1-py2.py3-none-any.whl", hash = "sha256:ba2e0bbecb94a8cb4af88ba4261bc9d9078acdf2ba1b608db51dcd6439ba4c07"}, -] -google-cloud-bigquery-storage = [ - {file = "google-cloud-bigquery-storage-2.22.0.tar.gz", hash = "sha256:f6d8c7b3ab9b574c66977fcee9d336e334ad1a3843a722be19123640e7808ea3"}, - {file = "google_cloud_bigquery_storage-2.22.0-py2.py3-none-any.whl", hash = "sha256:7f11b2ae590a5b3874fb6ddf705a66a070340db238f971cf7b53349eee9ca317"}, -] -google-cloud-core = [ - {file = "google-cloud-core-2.3.3.tar.gz", hash = "sha256:37b80273c8d7eee1ae816b3a20ae43585ea50506cb0e60f3cf5be5f87f1373cb"}, - {file = "google_cloud_core-2.3.3-py2.py3-none-any.whl", hash = "sha256:fbd11cad3e98a7e5b0343dc07cb1039a5ffd7a5bb96e1f1e27cee4bda4a90863"}, -] -google-cloud-storage = [ - {file = "google-cloud-storage-2.10.0.tar.gz", hash = "sha256:934b31ead5f3994e5360f9ff5750982c5b6b11604dc072bc452c25965e076dc7"}, - {file = "google_cloud_storage-2.10.0-py2.py3-none-any.whl", hash = "sha256:9433cf28801671de1c80434238fb1e7e4a1ba3087470e90f70c928ea77c2b9d7"}, -] -google-crc32c = [ - {file = "google-crc32c-1.3.0.tar.gz", hash = "sha256:276de6273eb074a35bc598f8efbc00c7869c5cf2e29c90748fccc8c898c244df"}, - {file = "google_crc32c-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cb6994fff247987c66a8a4e550ef374671c2b82e3c0d2115e689d21e511a652d"}, - {file = "google_crc32c-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9da0a39b53d2fab3e5467329ed50e951eb91386e9d0d5b12daf593973c3b168"}, - {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:eb0b14523758e37802f27b7f8cd973f5f3d33be7613952c0df904b68c4842f0e"}, - {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:95c68a4b9b7828ba0428f8f7e3109c5d476ca44996ed9a5f8aac6269296e2d59"}, - {file = "google_crc32c-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c3cf890c3c0ecfe1510a452a165431b5831e24160c5fcf2071f0f85ca5a47cd"}, - {file = "google_crc32c-1.3.0-cp310-cp310-win32.whl", hash = "sha256:3bbce1be3687bbfebe29abdb7631b83e6b25da3f4e1856a1611eb21854b689ea"}, - {file = "google_crc32c-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:c124b8c8779bf2d35d9b721e52d4adb41c9bfbde45e6a3f25f0820caa9aba73f"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:42ae4781333e331a1743445931b08ebdad73e188fd554259e772556fc4937c48"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ff71073ebf0e42258a42a0b34f2c09ec384977e7f6808999102eedd5b49920e3"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fe31de3002e7b08eb20823b3735b97c86c5926dd0581c7710a680b418a8709d4"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd7760a88a8d3d705ff562aa93f8445ead54f58fd482e4f9e2bafb7e177375d4"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0b9e622c3b2b8d0ce32f77eba617ab0d6768b82836391e4f8f9e2074582bf02"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-win32.whl", hash = "sha256:779cbf1ce375b96111db98fca913c1f5ec11b1d870e529b1dc7354b2681a8c3a"}, - {file = "google_crc32c-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:04e7c220798a72fd0f08242bc8d7a05986b2a08a0573396187fd32c1dcdd58b3"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e7a539b9be7b9c00f11ef16b55486141bc2cdb0c54762f84e3c6fc091917436d"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ca60076c388728d3b6ac3846842474f4250c91efbfe5afa872d3ffd69dd4b318"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05340b60bf05b574159e9bd940152a47d38af3fb43803ffe71f11d704b7696a6"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:318f73f5484b5671f0c7f5f63741ab020a599504ed81d209b5c7129ee4667407"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f58099ad7affc0754ae42e6d87443299f15d739b0ce03c76f515153a5cda06c"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-win32.whl", hash = "sha256:f52a4ad2568314ee713715b1e2d79ab55fab11e8b304fd1462ff5cccf4264b3e"}, - {file = "google_crc32c-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bab4aebd525218bab4ee615786c4581952eadc16b1ff031813a2fd51f0cc7b08"}, - {file = "google_crc32c-1.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dda4d8a3bb0b50f540f6ff4b6033f3a74e8bf0bd5320b70fab2c03e512a62812"}, - {file = "google_crc32c-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fec221a051150eeddfdfcff162e6db92c65ecf46cb0f7bb1bf812a1520ec026b"}, - {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:226f2f9b8e128a6ca6a9af9b9e8384f7b53a801907425c9a292553a3a7218ce0"}, - {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a7f9cbea4245ee36190f85fe1814e2d7b1e5f2186381b082f5d59f99b7f11328"}, - {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a4db36f9721fdf391646685ecffa404eb986cbe007a3289499020daf72e88a2"}, - {file = "google_crc32c-1.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:12674a4c3b56b706153a358eaa1018c4137a5a04635b92b4652440d3d7386206"}, - {file = "google_crc32c-1.3.0-cp38-cp38-win32.whl", hash = "sha256:650e2917660e696041ab3dcd7abac160b4121cd9a484c08406f24c5964099829"}, - {file = "google_crc32c-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:58be56ae0529c664cc04a9c76e68bb92b091e0194d6e3c50bea7e0f266f73713"}, - {file = "google_crc32c-1.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:96a8918a78d5d64e07c8ea4ed2bc44354e3f93f46a4866a40e8db934e4c0d74b"}, - {file = "google_crc32c-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:13af315c3a0eec8bb8b8d80b8b128cb3fcd17d7e4edafc39647846345a3f003a"}, - {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6311853aa2bba4064d0c28ca54e7b50c4d48e3de04f6770f6c60ebda1e975267"}, - {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ed447680ff21c14aaceb6a9f99a5f639f583ccfe4ce1a5e1d48eb41c3d6b3217"}, - {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1c1d6236feab51200272d79b3d3e0f12cf2cbb12b208c835b175a21efdb0a73"}, - {file = "google_crc32c-1.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e0f1ff55dde0ebcfbef027edc21f71c205845585fffe30d4ec4979416613e9b3"}, - {file = "google_crc32c-1.3.0-cp39-cp39-win32.whl", hash = "sha256:fbd60c6aaa07c31d7754edbc2334aef50601b7f1ada67a96eb1eb57c7c72378f"}, - {file = "google_crc32c-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:127f9cc3ac41b6a859bd9dc4321097b1a4f6aa7fdf71b4f9227b9e3ebffb4422"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fc28e0db232c62ca0c3600884933178f0825c99be4474cdd645e378a10588125"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1926fd8de0acb9d15ee757175ce7242e235482a783cd4ec711cc999fc103c24e"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5da2c81575cc3ccf05d9830f9e8d3c70954819ca9a63828210498c0774fda1a3"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:891f712ce54e0d631370e1f4997b3f182f3368179198efc30d477c75d1f44942"}, - {file = "google_crc32c-1.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:7f6fe42536d9dcd3e2ffb9d3053f5d05221ae3bbcefbe472bdf2c71c793e3183"}, -] -google-resumable-media = [ - {file = "google-resumable-media-2.5.0.tar.gz", hash = "sha256:218931e8e2b2a73a58eb354a288e03a0fd5fb1c4583261ac6e4c078666468c93"}, - {file = "google_resumable_media-2.5.0-py2.py3-none-any.whl", hash = "sha256:da1bd943e2e114a56d85d6848497ebf9be6a14d3db23e9fc57581e7c3e8170ec"}, -] -googleapis-common-protos = [ - {file = "googleapis-common-protos-1.59.1.tar.gz", hash = "sha256:b35d530fe825fb4227857bc47ad84c33c809ac96f312e13182bdeaa2abe1178a"}, - {file = "googleapis_common_protos-1.59.1-py2.py3-none-any.whl", hash = "sha256:0cbedb6fb68f1c07e18eb4c48256320777707e7d0c55063ae56c15db3224a61e"}, -] -gql = [ - {file = "gql-3.4.1-py2.py3-none-any.whl", hash = "sha256:315624ca0f4d571ef149d455033ebd35e45c1a13f18a059596aeddcea99135cf"}, - {file = "gql-3.4.1.tar.gz", hash = "sha256:11dc5d8715a827f2c2899593439a4f36449db4f0eafa5b1ea63948f8a2f8c545"}, -] -graphql-core = [ - {file = "graphql-core-3.2.3.tar.gz", hash = "sha256:06d2aad0ac723e35b1cb47885d3e5c45e956a53bc1b209a9fc5369007fe46676"}, - {file = "graphql_core-3.2.3-py3-none-any.whl", hash = "sha256:5766780452bd5ec8ba133f8bf287dc92713e3868ddd83aee4faab9fc3e303dc3"}, -] -grpc-google-iam-v1 = [ - {file = "grpc-google-iam-v1-0.12.6.tar.gz", hash = "sha256:2bc4b8fdf22115a65d751c9317329322602c39b7c86a289c9b72d228d960ef5f"}, - {file = "grpc_google_iam_v1-0.12.6-py2.py3-none-any.whl", hash = "sha256:5c10f3d8dc2d88678ab1a9b0cb5482735c5efee71e6c0cd59f872eef22913f5c"}, -] -grpcio = [ - {file = "grpcio-1.56.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:bf0b9959e673505ee5869950642428046edb91f99942607c2ecf635f8a4b31c9"}, - {file = "grpcio-1.56.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:5144feb20fe76e73e60c7d73ec3bf54f320247d1ebe737d10672480371878b48"}, - {file = "grpcio-1.56.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:a72797549935c9e0b9bc1def1768c8b5a709538fa6ab0678e671aec47ebfd55e"}, - {file = "grpcio-1.56.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3f3237a57e42f79f1e560726576aedb3a7ef931f4e3accb84ebf6acc485d316"}, - {file = "grpcio-1.56.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:900bc0096c2ca2d53f2e5cebf98293a7c32f532c4aeb926345e9747452233950"}, - {file = "grpcio-1.56.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:97e0efaebbfd222bcaac2f1735c010c1d3b167112d9d237daebbeedaaccf3d1d"}, - {file = "grpcio-1.56.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c0c85c5cbe8b30a32fa6d802588d55ffabf720e985abe9590c7c886919d875d4"}, - {file = "grpcio-1.56.2-cp310-cp310-win32.whl", hash = "sha256:06e84ad9ae7668a109e970c7411e7992751a116494cba7c4fb877656527f9a57"}, - {file = "grpcio-1.56.2-cp310-cp310-win_amd64.whl", hash = "sha256:10954662f77dc36c9a1fb5cc4a537f746580d6b5734803be1e587252682cda8d"}, - {file = "grpcio-1.56.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:c435f5ce1705de48e08fcbcfaf8aee660d199c90536e3e06f2016af7d6a938dd"}, - {file = "grpcio-1.56.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:6108e5933eb8c22cd3646e72d5b54772c29f57482fd4c41a0640aab99eb5071d"}, - {file = "grpcio-1.56.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8391cea5ce72f4a12368afd17799474015d5d3dc00c936a907eb7c7eaaea98a5"}, - {file = "grpcio-1.56.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:750de923b456ca8c0f1354d6befca45d1f3b3a789e76efc16741bd4132752d95"}, - {file = "grpcio-1.56.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fda2783c12f553cdca11c08e5af6eecbd717280dc8fbe28a110897af1c15a88c"}, - {file = "grpcio-1.56.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9e04d4e4cfafa7c5264e535b5d28e786f0571bea609c3f0aaab13e891e933e9c"}, - {file = "grpcio-1.56.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:89a49cc5ad08a38b6141af17e00d1dd482dc927c7605bc77af457b5a0fca807c"}, - {file = "grpcio-1.56.2-cp311-cp311-win32.whl", hash = "sha256:6a007a541dff984264981fbafeb052bfe361db63578948d857907df9488d8774"}, - {file = "grpcio-1.56.2-cp311-cp311-win_amd64.whl", hash = "sha256:af4063ef2b11b96d949dccbc5a987272f38d55c23c4c01841ea65a517906397f"}, - {file = "grpcio-1.56.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:a6ff459dac39541e6a2763a4439c4ca6bc9ecb4acc05a99b79246751f9894756"}, - {file = "grpcio-1.56.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:f20fd21f7538f8107451156dd1fe203300b79a9ddceba1ee0ac8132521a008ed"}, - {file = "grpcio-1.56.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:d1fbad1f9077372b6587ec589c1fc120b417b6c8ad72d3e3cc86bbbd0a3cee93"}, - {file = "grpcio-1.56.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ee26e9dfb3996aff7c870f09dc7ad44a5f6732b8bdb5a5f9905737ac6fd4ef1"}, - {file = "grpcio-1.56.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4c60abd950d6de3e4f1ddbc318075654d275c29c846ab6a043d6ed2c52e4c8c"}, - {file = "grpcio-1.56.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1c31e52a04e62c8577a7bf772b3e7bed4df9c9e0dd90f92b6ffa07c16cab63c9"}, - {file = "grpcio-1.56.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:345356b307cce5d14355e8e055b4ca5f99bc857c33a3dc1ddbc544fca9cd0475"}, - {file = "grpcio-1.56.2-cp37-cp37m-win_amd64.whl", hash = "sha256:42e63904ee37ae46aa23de50dac8b145b3596f43598fa33fe1098ab2cbda6ff5"}, - {file = "grpcio-1.56.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:7c5ede2e2558f088c49a1ddda19080e4c23fb5d171de80a726b61b567e3766ed"}, - {file = "grpcio-1.56.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:33971197c47965cc1d97d78d842163c283e998223b151bab0499b951fd2c0b12"}, - {file = "grpcio-1.56.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:d39f5d4af48c138cb146763eda14eb7d8b3ccbbec9fe86fb724cd16e0e914c64"}, - {file = "grpcio-1.56.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ded637176addc1d3eef35331c39acc598bac550d213f0a1bedabfceaa2244c87"}, - {file = "grpcio-1.56.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c90da4b124647547a68cf2f197174ada30c7bb9523cb976665dfd26a9963d328"}, - {file = "grpcio-1.56.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3ccb621749a81dc7755243665a70ce45536ec413ef5818e013fe8dfbf5aa497b"}, - {file = "grpcio-1.56.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4eb37dd8dd1aa40d601212afa27ca5be255ba792e2e0b24d67b8af5e012cdb7d"}, - {file = "grpcio-1.56.2-cp38-cp38-win32.whl", hash = "sha256:ddb4a6061933bd9332b74eac0da25f17f32afa7145a33a0f9711ad74f924b1b8"}, - {file = "grpcio-1.56.2-cp38-cp38-win_amd64.whl", hash = "sha256:8940d6de7068af018dfa9a959a3510e9b7b543f4c405e88463a1cbaa3b2b379a"}, - {file = "grpcio-1.56.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:51173e8fa6d9a2d85c14426bdee5f5c4a0654fd5fddcc21fe9d09ab0f6eb8b35"}, - {file = "grpcio-1.56.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:373b48f210f43327a41e397391715cd11cfce9ded2fe76a5068f9bacf91cc226"}, - {file = "grpcio-1.56.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:42a3bbb2bc07aef72a7d97e71aabecaf3e4eb616d39e5211e2cfe3689de860ca"}, - {file = "grpcio-1.56.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5344be476ac37eb9c9ad09c22f4ea193c1316bf074f1daf85bddb1b31fda5116"}, - {file = "grpcio-1.56.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3fa3ab0fb200a2c66493828ed06ccd1a94b12eddbfb985e7fd3e5723ff156c6"}, - {file = "grpcio-1.56.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b975b85d1d5efc36cf8b237c5f3849b64d1ba33d6282f5e991f28751317504a1"}, - {file = "grpcio-1.56.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cbdf2c498e077282cd427cfd88bdce4668019791deef0be8155385ab2ba7837f"}, - {file = "grpcio-1.56.2-cp39-cp39-win32.whl", hash = "sha256:139f66656a762572ae718fa0d1f2dce47c05e9fbf7a16acd704c354405b97df9"}, - {file = "grpcio-1.56.2-cp39-cp39-win_amd64.whl", hash = "sha256:830215173ad45d670140ff99aac3b461f9be9a6b11bee1a17265aaaa746a641a"}, - {file = "grpcio-1.56.2.tar.gz", hash = "sha256:0ff789ae7d8ddd76d2ac02e7d13bfef6fc4928ac01e1dcaa182be51b6bcc0aaa"}, -] -grpcio-status = [ - {file = "grpcio-status-1.56.2.tar.gz", hash = "sha256:a046b2c0118df4a5687f4585cca9d3c3bae5c498c4dff055dcb43fb06a1180c8"}, - {file = "grpcio_status-1.56.2-py3-none-any.whl", hash = "sha256:63f3842867735f59f5d70e723abffd2e8501a6bcd915612a1119e52f10614782"}, -] -h11 = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] -heapdict = [ - {file = "HeapDict-1.0.1-py3-none-any.whl", hash = "sha256:6065f90933ab1bb7e50db403b90cab653c853690c5992e69294c2de2b253fc92"}, - {file = "HeapDict-1.0.1.tar.gz", hash = "sha256:8495f57b3e03d8e46d5f1b2cc62ca881aca392fd5cc048dc0aa2e1a6d23ecdb6"}, -] -httplib2 = [ - {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, - {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, -] -hvac = [ - {file = "hvac-0.11.2-py2.py3-none-any.whl", hash = "sha256:3e8a34804b1e20954a2b4991cc13ed9c09b32e50dadd9d3438224481150f6568"}, - {file = "hvac-0.11.2.tar.gz", hash = "sha256:f905c59d32d88d3f67571fe5a8a78de4659e04798ad809de439f667247d13626"}, -] - -[package.dependencies] -requests = ">=2.21.0" -six = ">=1.5.0" - -[package.extras] -parser = ["pyhcl (>=0.3.10)"] - -[[package]] -name = "identify" -version = "2.5.29" -description = "File identification library for Python" -optional = false -python-versions = ">=3.8" -files = [ -identify = [ - {file = "identify-2.5.29-py2.py3-none-any.whl", hash = "sha256:24437fbf6f4d3fe6efd0eb9d67e24dd9106db99af5ceb27996a5f7895f24bf1b"}, - {file = "identify-2.5.29.tar.gz", hash = "sha256:d43d52b86b15918c137e3a74fff5224f60385cd0e9c38e99d07c257f02f151a5"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] - -[[package]] -name = "importlib-metadata" -version = "6.8.0" -description = "Read metadata from Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, - {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, -] - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] - -[[package]] -name = "importlib-resources" -version = "6.0.1" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"}, - {file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"}, -importlib-metadata = [ - {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, - {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, -] -importlib-resources = [ - {file = "importlib_resources-6.1.0-py3-none-any.whl", hash = "sha256:aa50258bbfa56d4e33fbd8aa3ef48ded10d1735f11532b8df95388cc6bdb7e83"}, - {file = "importlib_resources-6.1.0.tar.gz", hash = "sha256:9d48dcccc213325e810fd723e7fbb45ccb39f6cf5c31f00cf2b965f5f10f3cb9"}, -] -iniconfig = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] -ipeadatapy = [ - {file = "ipeadatapy-0.1.9-py3-none-any.whl", hash = "sha256:0bfd5a180599f77106421477d3cc505e4478ac0f4e3d5eb688dd8696fce906e3"}, - {file = "ipeadatapy-0.1.9.tar.gz", hash = "sha256:396c3f7d723a70667fd5a64714d7252f7f234c34c9f63e77751b02123691d8ad"}, -] -jinja2 = [ - {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, - {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, -] +files = [ + {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, + {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -3338,7 +1617,6 @@ description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.7" files = [ -kiwisolver = [ {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, @@ -3444,7 +1722,14 @@ kiwisolver = [ {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, ] -levenshtein = [ + +[[package]] +name = "levenshtein" +version = "0.21.1" +description = "Python extension for computing string edit distances and similarities." +optional = false +python-versions = ">=3.6" +files = [ {file = "Levenshtein-0.21.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:59e5054c9dea821840af4623a4059c8f0ae56548a5eae8b9c7aaa0b3f1e33340"}, {file = "Levenshtein-0.21.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:11694c6f7119d68cc199ff3b1407560c0efb0cc49f288169f28b2e032ee03cda"}, {file = "Levenshtein-0.21.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f5f7ce639bea0f5e95a1f71963624b85521a39928a2a1bb0e66f6180facf5969"}, @@ -3548,7 +1833,17 @@ levenshtein = [ {file = "Levenshtein-0.21.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b2410469cc8fd0f42aa00e63063c42f8aff501996cd5424a5c904739bdaaf4fe"}, {file = "Levenshtein-0.21.1.tar.gz", hash = "sha256:2e4fc4522f9bf73c6ab4cedec834783999b247312ec9e3d1435a5424ad5bc908"}, ] -locket = [ + +[package.dependencies] +rapidfuzz = ">=2.3.0,<4.0.0" + +[[package]] +name = "locket" +version = "0.2.1" +description = "File-based locks for Python for Linux and Windows" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ {file = "locket-0.2.1-py2.py3-none-any.whl", hash = "sha256:12b6ada59d1f50710bca9704dbadd3f447dbf8dac6664575c1281cadab8e6449"}, {file = "locket-0.2.1.tar.gz", hash = "sha256:3e1faba403619fe201552f083f1ecbf23f550941bc51985ac6ed4d02d25056dd"}, ] @@ -3578,11 +1873,6 @@ description = "Powerful and Pythonic XML processing library combining libxml2/li optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" files = [ -loguru = [ - {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, - {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, -] -lxml = [ {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, @@ -3661,7 +1951,20 @@ lxml = [ {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, ] -markupsafe = [ + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=0.29.7)"] + +[[package]] +name = "markupsafe" +version = "2.0.1" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.6" +files = [ {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, @@ -3732,11 +2035,31 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, ] -marshmallow = [ + +[[package]] +name = "marshmallow" +version = "3.14.1" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.6" +files = [ {file = "marshmallow-3.14.1-py3-none-any.whl", hash = "sha256:04438610bc6dadbdddb22a4a55bcc7f6f8099e69580b2e67f5a681933a1f4400"}, {file = "marshmallow-3.14.1.tar.gz", hash = "sha256:4c05c1684e0e97fe779c62b91878f173b937fe097b356cd82f793464f5bc6138"}, ] -marshmallow-oneofschema = [ + +[package.extras] +dev = ["flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.7)", "sphinx (==4.3.0)", "sphinx-issues (==1.2.0)", "sphinx-version-warning (==1.1.2)"] +lint = ["flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)"] +tests = ["pytest", "pytz", "simplejson"] + +[[package]] +name = "marshmallow-oneofschema" +version = "3.0.1" +description = "marshmallow multiplexing schema" +optional = false +python-versions = ">=3.6" +files = [ {file = "marshmallow-oneofschema-3.0.1.tar.gz", hash = "sha256:62cd2099b29188c92493c2940ee79d1bf2f2619a71721664e5a98ec2faa58237"}, {file = "marshmallow_oneofschema-3.0.1-py2.py3-none-any.whl", hash = "sha256:bd29410a9f2f7457a2b428286e2a80ef76b8ddc3701527dc1f935a88914b02f2"}, ] @@ -3751,59 +2074,58 @@ tests = ["mock", "pytest"] [[package]] name = "matplotlib" -version = "3.7.3" +version = "3.7.4" description = "Python plotting package" optional = false python-versions = ">=3.8" files = [ -matplotlib = [ - {file = "matplotlib-3.7.3-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:085c33b27561d9c04386789d5aa5eb4a932ddef43cfcdd0e01735f9a6e85ce0c"}, - {file = "matplotlib-3.7.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c568e80e1c17f68a727f30f591926751b97b98314d8e59804f54f86ae6fa6a22"}, - {file = "matplotlib-3.7.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7baf98c5ad59c5c4743ea884bb025cbffa52dacdfdac0da3e6021a285a90377e"}, - {file = "matplotlib-3.7.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:236024f582e40dac39bca592258888b38ae47a9fed7b8de652d68d3d02d47d2b"}, - {file = "matplotlib-3.7.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12b4f6795efea037ce2d41e7c417ad8bd02d5719c6ad4a8450a0708f4a1cfb89"}, - {file = "matplotlib-3.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b2136cc6c5415b78977e0e8c608647d597204b05b1d9089ccf513c7d913733"}, - {file = "matplotlib-3.7.3-cp310-cp310-win32.whl", hash = "sha256:122dcbf9be0086e2a95d9e5e0632dbf3bd5b65eaa68c369363310a6c87753059"}, - {file = "matplotlib-3.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:4aab27d9e33293389e3c1d7c881d414a72bdfda0fedc3a6bf46c6fa88d9b8015"}, - {file = "matplotlib-3.7.3-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:d5adc743de91e8e0b13df60deb1b1c285b8effea3d66223afceb14b63c9b05de"}, - {file = "matplotlib-3.7.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:55de4cf7cd0071b8ebf203981b53ab64f988a0a1f897a2dff300a1124e8bcd8b"}, - {file = "matplotlib-3.7.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ac03377fd908aaee2312d0b11735753e907adb6f4d1d102de5e2425249693f6c"}, - {file = "matplotlib-3.7.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:755bafc10a46918ce9a39980009b54b02dd249594e5adf52f9c56acfddb5d0b7"}, - {file = "matplotlib-3.7.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a6094c6f8e8d18db631754df4fe9a34dec3caf074f6869a7db09f18f9b1d6b2"}, - {file = "matplotlib-3.7.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:272dba2f1b107790ed78ebf5385b8d14b27ad9e90419de340364b49fe549a993"}, - {file = "matplotlib-3.7.3-cp311-cp311-win32.whl", hash = "sha256:591c123bed1cb4b9996fb60b41a6d89c2ec4943244540776c5f1283fb6960a53"}, - {file = "matplotlib-3.7.3-cp311-cp311-win_amd64.whl", hash = "sha256:3bf3a178c6504694cee8b88b353df0051583f2f6f8faa146f67115c27c856881"}, - {file = "matplotlib-3.7.3-cp312-cp312-macosx_10_12_universal2.whl", hash = "sha256:edf54cac8ee3603f3093616b40a931e8c063969756a4d78a86e82c2fea9659f7"}, - {file = "matplotlib-3.7.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:91e36a85ea639a1ba9f91427041eac064b04829945fe331a92617b6cb21d27e5"}, - {file = "matplotlib-3.7.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:caf5eaaf7c68f8d7df269dfbcaf46f48a70ff482bfcebdcc97519671023f2a7d"}, - {file = "matplotlib-3.7.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74bf57f505efea376097e948b7cdd87191a7ce8180616390aef496639edf601f"}, - {file = "matplotlib-3.7.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee152a88a0da527840a426535514b6ed8ac4240eb856b1da92cf48124320e346"}, - {file = "matplotlib-3.7.3-cp312-cp312-win_amd64.whl", hash = "sha256:67a410a9c9e07cbc83581eeea144bbe298870bf0ac0ee2f2e10a015ab7efee19"}, - {file = "matplotlib-3.7.3-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:259999c05285cb993d7f2a419cea547863fa215379eda81f7254c9e932963729"}, - {file = "matplotlib-3.7.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:3f4e7fd5a6157e1d018ce2166ec8e531a481dd4a36f035b5c23edfe05a25419a"}, - {file = "matplotlib-3.7.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:faa3d12d8811d08d14080a8b7b9caea9a457dc495350166b56df0db4b9909ef5"}, - {file = "matplotlib-3.7.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:336e88900c11441e458da01c8414fc57e04e17f9d3bb94958a76faa2652bcf6b"}, - {file = "matplotlib-3.7.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:12f4c0dd8aa280d796c8772ea8265a14f11a04319baa3a16daa5556065e8baea"}, - {file = "matplotlib-3.7.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1990955b11e7918d256cf3b956b10997f405b7917a3f1c7d8e69c1d15c7b1930"}, - {file = "matplotlib-3.7.3-cp38-cp38-win32.whl", hash = "sha256:e78707b751260b42b721507ad7aa60fe4026d7f51c74cca6b9cd8b123ebb633a"}, - {file = "matplotlib-3.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:e594ee43c59ea39ca5c6244667cac9d017a3527febc31f5532ad9135cf7469ec"}, - {file = "matplotlib-3.7.3-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:6eaa1cf0e94c936a26b78f6d756c5fbc12e0a58c8a68b7248a2a31456ce4e234"}, - {file = "matplotlib-3.7.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0a97af9d22e8ebedc9f00b043d9bbd29a375e9e10b656982012dded44c10fd77"}, - {file = "matplotlib-3.7.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f9c6c16597af660433ab330b59ee2934b832ee1fabcaf5cbde7b2add840f31e"}, - {file = "matplotlib-3.7.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7240259b4b9cbc62381f6378cff4d57af539162a18e832c1e48042fabc40b6b"}, - {file = "matplotlib-3.7.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:747c6191d2e88ae854809e69aa358dbf852ff1a5738401b85c1cc9012309897a"}, - {file = "matplotlib-3.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec726b08a5275d827aa91bb951e68234a4423adb91cf65bc0fcdc0f2777663f7"}, - {file = "matplotlib-3.7.3-cp39-cp39-win32.whl", hash = "sha256:40e3b9b450c6534f07278310c4e34caff41c2a42377e4b9d47b0f8d3ac1083a2"}, - {file = "matplotlib-3.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfc118642903a23e309b1da32886bb39a4314147d013e820c86b5fb4cb2e36d0"}, - {file = "matplotlib-3.7.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:165c8082bf8fc0360c24aa4724a22eaadbfd8c28bf1ccf7e94d685cad48261e4"}, - {file = "matplotlib-3.7.3-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebd8470cc2a3594746ff0513aecbfa2c55ff6f58e6cef2efb1a54eb87c88ffa2"}, - {file = "matplotlib-3.7.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7153453669c9672b52095119fd21dd032d19225d48413a2871519b17db4b0fde"}, - {file = "matplotlib-3.7.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:498a08267dc69dd8f24c4b5d7423fa584d7ce0027ba71f7881df05fc09b89bb7"}, - {file = "matplotlib-3.7.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48999c4b19b5a0c058c9cd828ff6fc7748390679f6cf9a2ad653a3e802c87d3"}, - {file = "matplotlib-3.7.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22d65d18b4ee8070a5fea5761d59293f1f9e2fac37ec9ce090463b0e629432fd"}, - {file = "matplotlib-3.7.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c40cde976c36693cc0767e27cf5f443f91c23520060bd9496678364adfafe9c"}, - {file = "matplotlib-3.7.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:39018a2b17592448fbfdf4b8352955e6c3905359939791d4ff429296494d1a0c"}, - {file = "matplotlib-3.7.3.tar.gz", hash = "sha256:f09b3dd6bdeb588de91f853bbb2d6f0ff8ab693485b0c49035eaa510cb4f142e"}, + {file = "matplotlib-3.7.4-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:b71079239bd866bf56df023e5146de159cb0c7294e508830901f4d79e2d89385"}, + {file = "matplotlib-3.7.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:bf91a42f6274a64cb41189120b620c02e574535ff6671fa836cade7701b06fbd"}, + {file = "matplotlib-3.7.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f757e8b42841d6add0cb69b42497667f0d25a404dcd50bd923ec9904e38414c4"}, + {file = "matplotlib-3.7.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4dfee00aa4bd291e08bb9461831c26ce0da85ca9781bb8794f2025c6e925281"}, + {file = "matplotlib-3.7.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3640f33632beb3993b698b1be9d1c262b742761d6101f3c27b87b2185d25c875"}, + {file = "matplotlib-3.7.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff539c4a17ecdf076ed808ee271ffae4a30dcb7e157b99ccae2c837262c07db6"}, + {file = "matplotlib-3.7.4-cp310-cp310-win32.whl", hash = "sha256:24b8f28af3e766195c09b780b15aa9f6710192b415ae7866b9c03dee7ec86370"}, + {file = "matplotlib-3.7.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fa193286712c3b6c3cfa5fe8a6bb563f8c52cc750006c782296e0807ce5e799"}, + {file = "matplotlib-3.7.4-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:b167f54cb4654b210c9624ec7b54e2b3b8de68c93a14668937e7e53df60770ec"}, + {file = "matplotlib-3.7.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7dfe6821f1944cb35603ff22e21510941bbcce7ccf96095beffaac890d39ce77"}, + {file = "matplotlib-3.7.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3c557d9165320dff3c5f2bb99bfa0b6813d3e626423ff71c40d6bc23b83c3339"}, + {file = "matplotlib-3.7.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08372696b3bb45c563472a552a705bfa0942f0a8ffe084db8a4e8f9153fbdf9d"}, + {file = "matplotlib-3.7.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81e1a7ac818000e8ac3ca696c3fdc501bc2d3adc89005e7b4e22ee5e9d51de98"}, + {file = "matplotlib-3.7.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:390920a3949906bc4b0216198d378f2a640c36c622e3584dd0c79a7c59ae9f50"}, + {file = "matplotlib-3.7.4-cp311-cp311-win32.whl", hash = "sha256:62e094d8da26294634da9e7f1856beee3978752b1b530c8e1763d2faed60cc10"}, + {file = "matplotlib-3.7.4-cp311-cp311-win_amd64.whl", hash = "sha256:f8fc2df756105784e650605e024d36dc2d048d68e5c1b26df97ee25d1bd41f9f"}, + {file = "matplotlib-3.7.4-cp312-cp312-macosx_10_12_universal2.whl", hash = "sha256:568574756127791903604e315c11aef9f255151e4cfe20ec603a70f9dda8e259"}, + {file = "matplotlib-3.7.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7d479aac338195e2199a8cfc03c4f2f55914e6a120177edae79e0340a6406457"}, + {file = "matplotlib-3.7.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:32183d4be84189a4c52b4b8861434d427d9118db2cec32986f98ed6c02dcfbb6"}, + {file = "matplotlib-3.7.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0037d066cca1f4bda626c507cddeb6f7da8283bc6a214da2db13ff2162933c52"}, + {file = "matplotlib-3.7.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44856632ebce88abd8efdc0a0dceec600418dcac06b72ae77af0019d260aa243"}, + {file = "matplotlib-3.7.4-cp312-cp312-win_amd64.whl", hash = "sha256:632fc938c22117d4241411191cfb88ac264a4c0a9ac702244641ddf30f0d739c"}, + {file = "matplotlib-3.7.4-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:ce163be048613b9d1962273708cc97e09ca05d37312e670d166cf332b80bbaff"}, + {file = "matplotlib-3.7.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:e680f49bb8052ba3b2698e370155d2b4afb49f9af1cc611a26579d5981e2852a"}, + {file = "matplotlib-3.7.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0604880e4327114054199108b7390f987f4f40ee5ce728985836889e11a780ba"}, + {file = "matplotlib-3.7.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1e6abcde6fc52475f9d6a12b9f1792aee171ce7818ef6df5d61cb0b82816e6e8"}, + {file = "matplotlib-3.7.4-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f59a70e2ec3212033ef6633ed07682da03f5249379722512a3a2a26a7d9a738e"}, + {file = "matplotlib-3.7.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a9981b2a2dd9da06eca4ab5855d09b54b8ce7377c3e0e3957767b83219d652d"}, + {file = "matplotlib-3.7.4-cp38-cp38-win32.whl", hash = "sha256:83859ac26839660ecd164ee8311272074250b915ac300f9b2eccc84410f8953b"}, + {file = "matplotlib-3.7.4-cp38-cp38-win_amd64.whl", hash = "sha256:7a7709796ac59fe8debde68272388be6ed449c8971362eb5b60d280eac8dadde"}, + {file = "matplotlib-3.7.4-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:b1d70bc1ea1bf110bec64f4578de3e14947909a8887df4c1fd44492eca487955"}, + {file = "matplotlib-3.7.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c83f49e795a5de6c168876eea723f5b88355202f9603c55977f5356213aa8280"}, + {file = "matplotlib-3.7.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5c9133f230945fe10652eb33e43642e933896194ef6a4f8d5e79bb722bdb2000"}, + {file = "matplotlib-3.7.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:798ff59022eeb276380ce9a73ba35d13c3d1499ab9b73d194fd07f1b0a41c304"}, + {file = "matplotlib-3.7.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1707b20b25e90538c2ce8d4409e30f0ef1df4017cc65ad0439633492a973635b"}, + {file = "matplotlib-3.7.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e6227ca8492baeef873cdd8e169a318efb5c3a25ce94e69727e7f964995b0b1"}, + {file = "matplotlib-3.7.4-cp39-cp39-win32.whl", hash = "sha256:5661c8639aded7d1bbf781373a359011cb1dd09199dee49043e9e68dd16f07ba"}, + {file = "matplotlib-3.7.4-cp39-cp39-win_amd64.whl", hash = "sha256:55eec941a4743f0bd3e5b8ee180e36b7ea8e62f867bf2613937c9f01b9ac06a2"}, + {file = "matplotlib-3.7.4-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ab16868714e5cc90ec8f7ff5d83d23bcd6559224d8e9cb5227c9f58748889fe8"}, + {file = "matplotlib-3.7.4-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c698b33f9a3f0b127a8e614c8fb4087563bb3caa9c9d95298722fa2400cdd3f"}, + {file = "matplotlib-3.7.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be3493bbcb4d255cb71de1f9050ac71682fce21a56089eadbcc8e21784cb12ee"}, + {file = "matplotlib-3.7.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f8c725d1dd2901b2e7ec6cd64165e00da2978cc23d4143cb9ef745bec88e6b04"}, + {file = "matplotlib-3.7.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:286332f8f45f8ffde2d2119b9fdd42153dccd5025fa9f451b4a3b5c086e26da5"}, + {file = "matplotlib-3.7.4-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:116ef0b43aa00ff69260b4cce39c571e4b8c6f893795b708303fa27d9b9d7548"}, + {file = "matplotlib-3.7.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c90590d4b46458677d80bc3218f3f1ac11fc122baa9134e0cb5b3e8fc3714052"}, + {file = "matplotlib-3.7.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:de7c07069687be64fd9d119da3122ba13a8d399eccd3f844815f0dc78a870b2c"}, + {file = "matplotlib-3.7.4.tar.gz", hash = "sha256:7cd4fef8187d1dd0d9dcfdbaa06ac326d396fb8c71c647129f0bf56835d77026"}, ] [package.dependencies] @@ -3817,7 +2139,6 @@ packaging = ">=20.0" pillow = ">=6.2.0" pyparsing = ">=2.3.1" python-dateutil = ">=2.7" -setuptools_scm = ">=7" [[package]] name = "msgpack" @@ -3826,7 +2147,6 @@ description = "MessagePack (de)serializer." optional = false python-versions = "*" files = [ -msgpack = [ {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:96acc674bb9c9be63fa8b6dabc3248fdc575c4adc005c440ad02f87ca7edd079"}, {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c3ca57c96c8e69c1a0d2926a6acf2d9a522b41dc4253a8945c4c6cd4981a4e3"}, {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0a792c091bac433dfe0a70ac17fc2087d4595ab835b47b89defc8bbabcf5c73"}, @@ -3862,7 +2182,14 @@ msgpack = [ {file = "msgpack-1.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:f01b26c2290cbd74316990ba84a14ac3d599af9cebefc543d241a66e785cf17d"}, {file = "msgpack-1.0.3.tar.gz", hash = "sha256:51fdc7fb93615286428ee7758cecc2f374d5ff363bdd884c7ea622a7a327a81e"}, ] -multidict = [ + +[[package]] +name = "multidict" +version = "6.0.4" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, @@ -3938,15 +2265,39 @@ multidict = [ {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, ] -mypy-extensions = [ + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +optional = false +python-versions = "*" +files = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] -nodeenv = [ + +[[package]] +name = "nodeenv" +version = "1.8.0" +description = "Node.js virtual environment builder" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, ] -numpy = [ + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "numpy" +version = "1.21.4" +description = "NumPy is the fundamental package for array computing with Python." +optional = false +python-versions = ">=3.7,<3.11" +files = [ {file = "numpy-1.21.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8890b3360f345e8360133bc078d2dacc2843b6ee6059b568781b15b97acbe39f"}, {file = "numpy-1.21.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:69077388c5a4b997442b843dbdc3a85b420fb693ec8e33020bb24d647c164fa5"}, {file = "numpy-1.21.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e89717274b41ebd568cd7943fc9418eeb49b1785b66031bc8a7f6300463c5898"}, @@ -3978,27 +2329,90 @@ numpy = [ {file = "numpy-1.21.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a3deb31bc84f2b42584b8c4001c85d1934dbfb4030827110bc36bfd11509b7bf"}, {file = "numpy-1.21.4.zip", hash = "sha256:e6c76a87633aa3fa16614b61ccedfae45b91df2767cf097aa9c933932a7ed1e0"}, ] -oauth2client = [ + +[[package]] +name = "oauth2client" +version = "4.1.3" +description = "OAuth 2.0 client library" +optional = false +python-versions = "*" +files = [ {file = "oauth2client-4.1.3-py2.py3-none-any.whl", hash = "sha256:b8a81cc5d60e2d364f0b1b98f958dbd472887acaf1a5b05e21c28c31a2d6d3ac"}, {file = "oauth2client-4.1.3.tar.gz", hash = "sha256:d486741e451287f69568a4d26d70d9acd73a2bbfa275746c535b4209891cccc6"}, ] -oauthlib = [ + +[package.dependencies] +httplib2 = ">=0.9.1" +pyasn1 = ">=0.1.7" +pyasn1-modules = ">=0.0.5" +rsa = ">=3.1.4" +six = ">=1.6.1" + +[[package]] +name = "oauthlib" +version = "3.1.1" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +optional = false +python-versions = ">=3.6" +files = [ {file = "oauthlib-3.1.1-py2.py3-none-any.whl", hash = "sha256:42bf6354c2ed8c6acb54d971fce6f88193d97297e18602a3a886603f9d7730cc"}, {file = "oauthlib-3.1.1.tar.gz", hash = "sha256:8f0215fcc533dd8dd1bee6f4c412d4f0cd7297307d43ac61666389e3bc3198a3"}, ] -openpyxl = [ + +[package.extras] +rsa = ["cryptography (>=3.0.0,<4)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0,<4)", "pyjwt (>=2.0.0,<3)"] + +[[package]] +name = "openpyxl" +version = "3.0.9" +description = "A Python library to read/write Excel 2010 xlsx/xlsm files" +optional = false +python-versions = ">=3.6" +files = [ {file = "openpyxl-3.0.9-py2.py3-none-any.whl", hash = "sha256:8f3b11bd896a95468a4ab162fc4fcd260d46157155d1f8bfaabb99d88cfcf79f"}, {file = "openpyxl-3.0.9.tar.gz", hash = "sha256:40f568b9829bf9e446acfffce30250ac1fa39035124d55fc024025c41481c90f"}, ] -outcome = [ - {file = "outcome-1.2.0-py2.py3-none-any.whl", hash = "sha256:c4ab89a56575d6d38a05aa16daeaa333109c1f96167aba8901ab18b6b5e0f7f5"}, - {file = "outcome-1.2.0.tar.gz", hash = "sha256:6f82bd3de45da303cf1f771ecafa1633750a358436a8bb60e06a1ceb745d2672"}, + +[package.dependencies] +et-xmlfile = "*" + +[[package]] +name = "outcome" +version = "1.3.0.post0" +description = "Capture the outcome of Python function calls." +optional = false +python-versions = ">=3.7" +files = [ + {file = "outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b"}, + {file = "outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8"}, ] -packaging = [ + +[package.dependencies] +attrs = ">=19.2.0" + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.6" +files = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] -pandas = [ + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "pandas" +version = "2.0.3" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.8" +files = [ {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, @@ -4025,19 +2439,110 @@ pandas = [ {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, ] -pandas-gbq = [ + +[package.dependencies] +numpy = [ + {version = ">=1.20.3", markers = "python_version < \"3.10\""}, + {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.1" + +[package.extras] +all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] +aws = ["s3fs (>=2021.08.0)"] +clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] +compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] +computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2021.07.0)"] +gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] +hdf5 = ["tables (>=3.6.1)"] +html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] +mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] +spss = ["pyreadstat (>=1.1.2)"] +sql-other = ["SQLAlchemy (>=1.4.16)"] +test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.6.3)"] + +[[package]] +name = "pandas-gbq" +version = "0.19.2" +description = "Google BigQuery connector for pandas" +optional = false +python-versions = ">=3.7" +files = [ {file = "pandas-gbq-0.19.2.tar.gz", hash = "sha256:b0f7fa84a2be0fe767e33a008ca7e4ad9a9e3ac67255fd0a41fc19b503138447"}, {file = "pandas_gbq-0.19.2-py2.py3-none-any.whl", hash = "sha256:0ef8da3e4088053a2bea069ed688992a44b52af67dadb97eee494b32a2147563"}, ] -pandavro = [ - {file = "pandavro-1.7.2-py3-none-any.whl", hash = "sha256:5b4a2fbc86fb2b102e5b2b24490084e4775a5ac546fc8981931abecf6bb4a34b"}, - {file = "pandavro-1.7.2.tar.gz", hash = "sha256:4f2b7b6823522f54e8bfe33c091fb29898349892b70634f46c928e6a42a76e69"}, + +[package.dependencies] +db-dtypes = ">=1.0.4,<2.0.0" +google-api-core = ">=2.10.2,<3.0.0dev" +google-auth = ">=2.13.0" +google-auth-oauthlib = ">=0.7.0" +google-cloud-bigquery = ">=3.3.5,<4.0.0dev" +google-cloud-bigquery-storage = ">=2.16.2,<3.0.0dev" +numpy = ">=1.16.6" +pandas = ">=1.1.4" +pyarrow = ">=3.0.0" +pydata-google-auth = ">=1.5.0" +setuptools = "*" + +[package.extras] +tqdm = ["tqdm (>=4.23.0)"] + +[[package]] +name = "pandavro" +version = "1.8.0" +description = "The interface between Avro and pandas DataFrame" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "pandavro-1.8.0-py3-none-any.whl", hash = "sha256:0e4e29520b63484ae1f1bc3021857929d446180b52f986500ee916a08b8e28a2"}, + {file = "pandavro-1.8.0.tar.gz", hash = "sha256:d99102e93b45f9a2d52a284fb4c1055ad6c32ba1569cb21a71c02eceb8a7393b"}, ] -partd = [ + +[package.dependencies] +fastavro = ">=1.5.1,<2.0.0" +numpy = ">=1.15.4" +pandas = ">=1.1" + +[package.extras] +tests = ["pytest (==7.3.2)", "tox (==4.6.0)"] + +[[package]] +name = "partd" +version = "1.2.0" +description = "Appendable key-value storage" +optional = false +python-versions = ">=3.5" +files = [ {file = "partd-1.2.0-py3-none-any.whl", hash = "sha256:5c3a5d70da89485c27916328dc1e26232d0e270771bd4caef4a5124b6a457288"}, {file = "partd-1.2.0.tar.gz", hash = "sha256:aa67897b84d522dcbc86a98b942afab8c6aa2f7f677d904a616b74ef5ddbc3eb"}, ] -pendulum = [ + +[package.dependencies] +locket = "*" +toolz = "*" + +[package.extras] +complete = ["blosc", "numpy (>=1.9.0)", "pandas (>=0.19.0)", "pyzmq"] + +[[package]] +name = "pendulum" +version = "2.1.2" +description = "Python datetimes made easy" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, @@ -4067,66 +2572,65 @@ pytzdata = ">=2020.1" [[package]] name = "pillow" -version = "10.0.1" +version = "10.1.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ -pillow = [ - {file = "Pillow-10.0.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a"}, - {file = "Pillow-10.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff"}, - {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf"}, - {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd"}, - {file = "Pillow-10.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0"}, - {file = "Pillow-10.0.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1"}, - {file = "Pillow-10.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2"}, - {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b"}, - {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1"}, - {file = "Pillow-10.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088"}, - {file = "Pillow-10.0.1-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b"}, - {file = "Pillow-10.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91"}, - {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4"}, - {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08"}, - {file = "Pillow-10.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08"}, - {file = "Pillow-10.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a"}, - {file = "Pillow-10.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7"}, - {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a"}, - {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7"}, - {file = "Pillow-10.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3"}, - {file = "Pillow-10.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849"}, - {file = "Pillow-10.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145"}, - {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2"}, - {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf"}, - {file = "Pillow-10.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d"}, - {file = "Pillow-10.0.1.tar.gz", hash = "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d"}, + {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, + {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, + {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, + {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, + {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, + {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, + {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, + {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, ] [package.extras] @@ -4135,13 +2639,13 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa [[package]] name = "platformdirs" -version = "3.10.0" +version = "4.1.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, - {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, + {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, + {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, ] [package.extras] @@ -4165,25 +2669,25 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "polars" -version = "0.19.3" +version = "0.19.19" description = "Blazingly fast DataFrame library" optional = false python-versions = ">=3.8" files = [ - {file = "polars-0.19.3-cp38-abi3-macosx_10_7_x86_64.whl", hash = "sha256:cd407a847fe581af35dc4144420b9e6d6a639ddce4b5d2c6396719ad74140c40"}, - {file = "polars-0.19.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:2f033e8e4686bf02f923c18b679769bb5871f49b7c1e47a7c7071f272280477a"}, - {file = "polars-0.19.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43340deb657b8398ed2d972577756fb2431d64155cb9647881a35310d05be016"}, - {file = "polars-0.19.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d62122dca315e9ee0fcc52e58284c6d9d8c3163a420fd5a97441d5877746d76b"}, - {file = "polars-0.19.3-cp38-abi3-win_amd64.whl", hash = "sha256:e0990d8df05be5ff0ba2facd8ad7f33968e875f71aaf82d4924c23982434bd65"}, - {file = "polars-0.19.3.tar.gz", hash = "sha256:bef79f1742e6d1e7def1a4e664cafad7c406ff598c2b2b5867eff682920b2e7c"}, + {file = "polars-0.19.19-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:812dbb0cc7027fd41ce6b3eaf100b94828fc082fab026409d48792e3e7014095"}, + {file = "polars-0.19.19-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:21a334e18c83a259211ca6ec182498f3a89297fde9b8f75021c6881ff4411201"}, + {file = "polars-0.19.19-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d383fac392b08a6d5830c99f6e735a48e390c1535c8f1e67707fcaab6863ade5"}, + {file = "polars-0.19.19-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:eec0e72dce84b85c427bbf395d2e181f33e60677695b95ee2e87fed51043bdea"}, + {file = "polars-0.19.19-cp38-abi3-win_amd64.whl", hash = "sha256:6c9e597efac74f00ef9cdfd9ba8a9128ed24276916bd3d60adc6e604530e4b37"}, + {file = "polars-0.19.19.tar.gz", hash = "sha256:3e904d197aabf36e37fda263470eaf51ec92fb865cdea4f93947713480199303"}, ] [package.extras] adbc = ["adbc_driver_sqlite"] -all = ["polars[adbc,cloudpickle,connectorx,deltalake,fsspec,gevent,matplotlib,numpy,pandas,pyarrow,pydantic,sqlalchemy,timezone,xlsx2csv,xlsxwriter]"] +all = ["polars[adbc,cloudpickle,connectorx,deltalake,fsspec,gevent,matplotlib,numpy,pandas,pyarrow,pydantic,pyiceberg,sqlalchemy,timezone,xlsx2csv,xlsxwriter]"] cloudpickle = ["cloudpickle"] -connectorx = ["connectorx"] -deltalake = ["deltalake (>=0.10.0)"] +connectorx = ["connectorx (>=0.3.2)"] +deltalake = ["deltalake (>=0.13.0)"] fsspec = ["fsspec"] gevent = ["gevent"] matplotlib = ["matplotlib"] @@ -4192,6 +2696,8 @@ openpyxl = ["openpyxl (>=3.0.0)"] pandas = ["pandas", "pyarrow (>=7.0.0)"] pyarrow = ["pyarrow (>=7.0.0)"] pydantic = ["pydantic"] +pyiceberg = ["pyiceberg (>=0.5.0)"] +pyxlsb = ["pyxlsb (>=1.0)"] sqlalchemy = ["pandas", "sqlalchemy"] timezone = ["backports.zoneinfo", "tzdata"] xlsx2csv = ["xlsx2csv (>=0.8.0)"] @@ -4204,27 +2710,117 @@ description = "A framework for managing and maintaining multi-language pre-commi optional = false python-versions = ">=3.7" files = [ -platformdirs = [ - {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, - {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, -] -pluggy = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, -] -pre-commit = [ {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, ] -prefect = [ + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + +[[package]] +name = "prefect" +version = "0.15.9" +description = "The Prefect Core automation and scheduling engine." +optional = false +python-versions = ">=3.6" +files = [ {file = "prefect-0.15.9-py3-none-any.whl", hash = "sha256:595c9f229349528f7bcd2aa866c9c10dcfbf059a20803526924339d45604ec76"}, {file = "prefect-0.15.9.tar.gz", hash = "sha256:52d4d28493cd1a90e1acf96b5a92b2902950849b481a49f762998448a41cf127"}, ] -proto-plus = [ + +[package.dependencies] +click = ">=7.0,<9.0" +cloudpickle = ">=1.3.0" +croniter = ">=0.3.24,<2.0" +dask = {version = ">=2.17.0", markers = "python_version > \"3.6\""} +distributed = {version = ">=2.17.0", markers = "python_version > \"3.6\""} +docker = ">=3.4.1" +marshmallow = ">=3.0.0b19" +marshmallow-oneofschema = ">=2.0.0b2" +msgpack = ">=0.6.0" +mypy-extensions = ">=0.4.0" +pendulum = ">=2.0.4" +python-box = ">=5.1.0" +python-dateutil = ">=2.7.0" +python-slugify = ">=1.2.6" +pytz = ">=2018.7" +pyyaml = ">=3.13" +requests = ">=2.20,<2.27" +tabulate = ">=0.8.0" +toml = ">=0.9.4" +urllib3 = ">=1.24.3" + +[package.extras] +airtable = ["airtable-python-wrapper (>=0.11,<0.12)"] +all-extras = ["PyGithub (>=1.51,<2.0)", "Pygments (>=2.2,<3.0)", "airtable-python-wrapper (>=0.11,<0.12)", "atlassian-python-api (>=2.0.1)", "azure-cosmos (>=3.1.1,<3.2)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "black", "boto3 (>=1.9,<2.0)", "confluent-kafka (>=1.7.0)", "dask-cloudprovider[aws] (>=0.2.0)", "dask-kubernetes (>=0.8.0)", "dropbox (>=9.0,<10.0)", "dulwich (>=0.19.7)", "feedparser (>=5.0.1,<6.0)", "flaky (>=3.0)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "graphviz (>=0.8)", "graphviz (>=0.8.3)", "great-expectations (>=0.11.1)", "gspread (>=3.6.0)", "hvac (>=0.10)", "jinja2 (>=2.0,<4.0)", "jira (>=2.0.0)", "kubernetes (>=9.0.0a1,<=13.0)", "mypy (>=0.600,<0.813)", "nbconvert (>=6.0.7)", "pandas (>=1.0.1)", "papermill (>=2.2.0)", "prometheus-client (>=0.9.0)", "psycopg2-binary (>=2.8.2)", "pushbullet.py (>=0.11.0)", "pyarrow (>=5.0.0)", "pyexasol (>=0.16.1)", "pymysql (>=0.9.3)", "pyodbc (>=4.0.30)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "python-gitlab (>=2.5.0,<3.0)", "redis (>=3.2.1)", "responses (>=0.14.0)", "sendgrid (>=6.7.0)", "snowflake-connector-python (>=1.8.2,<2.5)", "soda-sql (>=2.0.0b25)", "spacy (>=2.0.0,<3.0.0)", "testfixtures (>=6.10.3)", "tweepy (>=3.5,<4.0)"] +all-orchestration-extras = ["PyGithub (>=1.51,<2.0)", "atlassian-python-api (>=2.0.1)", "azure-storage-blob (>=12.1.0,<13.0)", "boto3 (>=1.9,<2.0)", "dulwich (>=0.19.7)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "kubernetes (>=9.0.0a1,<=13.0)", "python-gitlab (>=2.5.0,<3.0)"] +aws = ["boto3 (>=1.9,<2.0)"] +azure = ["azure-cosmos (>=3.1.1,<3.2)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)"] +base-library-ci = ["PyGithub (>=1.51,<2.0)", "Pygments (>=2.2,<3.0)", "atlassian-python-api (>=2.0.1)", "azure-storage-blob (>=12.1.0,<13.0)", "black", "boto3 (>=1.9,<2.0)", "dulwich (>=0.19.7)", "flaky (>=3.0)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "jira (>=2.0.0)", "kubernetes (>=9.0.0a1,<=13.0)", "mypy (>=0.600,<0.813)", "pandas (>=1.0.1)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "python-gitlab (>=2.5.0,<3.0)", "responses (>=0.14.0)", "testfixtures (>=6.10.3)"] +bitbucket = ["atlassian-python-api (>=2.0.1)"] +dask-cloudprovider = ["dask-cloudprovider[aws] (>=0.2.0)"] +dev = ["Pygments (>=2.2,<3.0)", "black", "flaky (>=3.0)", "graphviz (>=0.8)", "jinja2 (>=2.0,<4.0)", "mypy (>=0.600,<0.813)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "responses (>=0.14.0)", "testfixtures (>=6.10.3)"] +dremio = ["pyarrow (>=5.0.0)"] +dropbox = ["dropbox (>=9.0,<10.0)"] +exasol = ["pyexasol (>=0.16.1)"] +gcp = ["google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)"] +ge = ["great-expectations (>=0.11.1)"] +git = ["dulwich (>=0.19.7)"] +github = ["PyGithub (>=1.51,<2.0)"] +gitlab = ["python-gitlab (>=2.5.0,<3.0)"] +google = ["google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)"] +gsheets = ["gspread (>=3.6.0)"] +jira = ["jira (>=2.0.0)"] +jupyter = ["nbconvert (>=6.0.7)", "papermill (>=2.2.0)"] +kafka = ["confluent-kafka (>=1.7.0)"] +kubernetes = ["dask-kubernetes (>=0.8.0)", "kubernetes (>=9.0.0a1,<=13.0)"] +mysql = ["pymysql (>=0.9.3)"] +pandas = ["pandas (>=1.0.1)"] +postgres = ["psycopg2-binary (>=2.8.2)"] +prometheus = ["prometheus-client (>=0.9.0)"] +pushbullet = ["pushbullet.py (>=0.11.0)"] +redis = ["redis (>=3.2.1)"] +rss = ["feedparser (>=5.0.1,<6.0)"] +sendgrid = ["sendgrid (>=6.7.0)"] +snowflake = ["snowflake-connector-python (>=1.8.2,<2.5)"] +sodasql = ["soda-sql (>=2.0.0b25)"] +spacy = ["spacy (>=2.0.0,<3.0.0)"] +sql-server = ["pyodbc (>=4.0.30)"] +task-library-ci = ["PyGithub (>=1.51,<2.0)", "Pygments (>=2.2,<3.0)", "airtable-python-wrapper (>=0.11,<0.12)", "atlassian-python-api (>=2.0.1)", "azure-cosmos (>=3.1.1,<3.2)", "azure-storage-blob (>=12.1.0,<13.0)", "azureml-sdk (>=1.0.65,<1.1)", "black", "boto3 (>=1.9,<2.0)", "confluent-kafka (>=1.7.0)", "dask-kubernetes (>=0.8.0)", "dropbox (>=9.0,<10.0)", "dulwich (>=0.19.7)", "feedparser (>=5.0.1,<6.0)", "flaky (>=3.0)", "google-auth (>=2.0,<3.0)", "google-cloud-aiplatform (>=1.4.0,<2.0)", "google-cloud-bigquery (>=1.6.0,<3.0)", "google-cloud-secret-manager (>=2.4.0)", "google-cloud-storage (>=1.13,<2.0)", "graphviz (>=0.8)", "graphviz (>=0.8.3)", "great-expectations (>=0.11.1)", "gspread (>=3.6.0)", "hvac (>=0.10)", "jinja2 (>=2.0,<4.0)", "jira (>=2.0.0)", "kubernetes (>=9.0.0a1,<=13.0)", "mypy (>=0.600,<0.813)", "nbconvert (>=6.0.7)", "pandas (>=1.0.1)", "papermill (>=2.2.0)", "prometheus-client (>=0.9.0)", "psycopg2-binary (>=2.8.2)", "pushbullet.py (>=0.11.0)", "pyarrow (>=5.0.0)", "pyexasol (>=0.16.1)", "pymysql (>=0.9.3)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "python-gitlab (>=2.5.0,<3.0)", "redis (>=3.2.1)", "responses (>=0.14.0)", "sendgrid (>=6.7.0)", "snowflake-connector-python (>=1.8.2,<2.5)", "soda-sql (>=2.0.0b25)", "spacy (>=2.0.0,<3.0.0)", "testfixtures (>=6.10.3)", "tweepy (>=3.5,<4.0)"] +templates = ["jinja2 (>=2.0,<4.0)"] +test = ["flaky (>=3.0)", "pytest (>=6.0)", "pytest-env (>=0.6.0)", "pytest-xdist (>=2.0)", "responses (>=0.14.0)", "testfixtures (>=6.10.3)"] +twitter = ["tweepy (>=3.5,<4.0)"] +vault = ["hvac (>=0.10)"] +viz = ["graphviz (>=0.8.3)"] + +[[package]] +name = "proto-plus" +version = "1.22.3" +description = "Beautiful, Pythonic protocol buffers." +optional = false +python-versions = ">=3.6" +files = [ {file = "proto-plus-1.22.3.tar.gz", hash = "sha256:fdcd09713cbd42480740d2fe29c990f7fbd885a67efc328aa8be6ee3e9f76a6b"}, {file = "proto_plus-1.22.3-py3-none-any.whl", hash = "sha256:a49cd903bc0b6ab41f76bf65510439d56ca76f868adf0274e738bfdd096894df"}, ] -protobuf = [ + +[package.dependencies] +protobuf = ">=3.19.0,<5.0.0dev" + +[package.extras] +testing = ["google-api-core[grpc] (>=1.31.5)"] + +[[package]] +name = "protobuf" +version = "4.23.4" +description = "" +optional = false +python-versions = ">=3.7" +files = [ {file = "protobuf-4.23.4-cp310-abi3-win32.whl", hash = "sha256:5fea3c64d41ea5ecf5697b83e41d09b9589e6f20b677ab3c48e5f242d9b7897b"}, {file = "protobuf-4.23.4-cp310-abi3-win_amd64.whl", hash = "sha256:7b19b6266d92ca6a2a87effa88ecc4af73ebc5cfde194dc737cf8ef23a9a3b12"}, {file = "protobuf-4.23.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8547bf44fe8cec3c69e3042f5c4fb3e36eb2a7a013bb0a44c018fc1e427aafbd"}, @@ -4239,7 +2835,14 @@ protobuf = [ {file = "protobuf-4.23.4-py3-none-any.whl", hash = "sha256:e9d0be5bf34b275b9f87ba7407796556abeeba635455d036c7351f7c183ef8ff"}, {file = "protobuf-4.23.4.tar.gz", hash = "sha256:ccd9430c0719dce806b93f89c91de7977304729e55377f872a92465d548329a9"}, ] -psutil = [ + +[[package]] +name = "psutil" +version = "5.8.0" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ {file = "psutil-5.8.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64"}, {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0ae6f386d8d297177fd288be6e8d1afc05966878704dad9847719650e44fc49c"}, {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:12d844996d6c2b1d3881cfa6fa201fd635971869a9da945cf6756105af73d2df"}, @@ -4269,11 +2872,31 @@ psutil = [ {file = "psutil-5.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3"}, {file = "psutil-5.8.0.tar.gz", hash = "sha256:0c9ccb99ab76025f2f0bbecf341d4656e9c1351db8cc8a03ccd62e318ab4b5c6"}, ] -pyaml = [ + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "unittest2", "wmi"] + +[[package]] +name = "pyaml" +version = "20.4.0" +description = "PyYAML-based module to produce pretty and readable YAML-serialized data" +optional = false +python-versions = "*" +files = [ {file = "pyaml-20.4.0-py2.py3-none-any.whl", hash = "sha256:67081749a82b72c45e5f7f812ee3a14a03b3f5c25ff36ec3b290514f8c4c4b99"}, {file = "pyaml-20.4.0.tar.gz", hash = "sha256:29a5c2a68660a799103d6949167bd6c7953d031449d08802386372de1db6ad71"}, ] -pyarrow = [ + +[package.dependencies] +PyYAML = "*" + +[[package]] +name = "pyarrow" +version = "6.0.0" +description = "Python library for Apache Arrow" +optional = false +python-versions = ">=3.6" +files = [ {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_13_universal2.whl", hash = "sha256:c7a6e7e0bf8779e9c3428ced85507541f3da9a0675e2f4781d4eb2c7042cbf81"}, {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:7a683f71b848eb6310b4ec48c0def55dac839e9994c1ac874c9b2d3d5625def1"}, {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5144bd9db2920c7cb566c96462d62443cc239104f94771d110f74393f2fb42a2"}, @@ -4311,15 +2934,42 @@ pyarrow = [ {file = "pyarrow-6.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:376c4b5f248ae63df21fe15c194e9013753164be2d38f4b3fb8bde63ac5a1958"}, {file = "pyarrow-6.0.0.tar.gz", hash = "sha256:5be62679201c441356d3f2a739895dcc8d4d299f2a6eabcd2163bfb6a898abba"}, ] -pyasn1 = [ + +[package.dependencies] +numpy = ">=1.16.6" + +[[package]] +name = "pyasn1" +version = "0.4.8" +description = "ASN.1 types and codecs" +optional = false +python-versions = "*" +files = [ {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, ] -pyasn1-modules = [ + +[[package]] +name = "pyasn1-modules" +version = "0.2.8" +description = "A collection of ASN.1-based protocols modules." +optional = false +python-versions = "*" +files = [ {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, ] -pycparser = [ + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.5.0" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] @@ -4331,11 +2981,22 @@ description = "PyData helpers for authenticating to Google APIs" optional = false python-versions = "*" files = [ -pydata-google-auth = [ {file = "pydata-google-auth-1.8.2.tar.gz", hash = "sha256:547b6c0fbea657dcecd50887c5db8640ebec062a59a2b88e8ff8e53a04818303"}, {file = "pydata_google_auth-1.8.2-py2.py3-none-any.whl", hash = "sha256:a9dce59af4a170ea60c4b2ebbc83ee1f74d34255a4f97b2469ae9a4a0dc98e99"}, ] -pymssql = [ + +[package.dependencies] +google-auth = {version = ">=1.25.0,<3.0dev", markers = "python_version >= \"3.6\""} +google-auth-oauthlib = {version = ">=0.4.0", markers = "python_version >= \"3.6\""} +setuptools = "*" + +[[package]] +name = "pymssql" +version = "2.2.5" +description = "DB-API interface to Microsoft SQL Server for Python. (new Cython-based version)" +optional = false +python-versions = "*" +files = [ {file = "pymssql-2.2.5-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:6462017183f05ae231c3f84efce4e9a8d085b4a2e9e3ed5c407ee643494a0842"}, {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6a013c82f7320c92039ac20db935e897a3fcd7423435705cef177f863dbb32e4"}, {file = "pymssql-2.2.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:45e9bba4870103363c865d2b867de8de082745dd753083f27927ded3d15df587"}, @@ -4388,7 +3049,14 @@ pymssql = [ {file = "pymssql-2.2.5-cp39-cp39-win_amd64.whl", hash = "sha256:e9cce9c47e6d550992936f91f8f2e97a8f5132749bad1cd4f5f7923bf8732d1f"}, {file = "pymssql-2.2.5.tar.gz", hash = "sha256:857411c308ecb584a3ca633be30f1971d2a8cc0bcd978709b1abf96ff43767ad"}, ] -pyparsing = [ + +[[package]] +name = "pyparsing" +version = "3.0.6" +description = "Python parsing module" +optional = false +python-versions = ">=3.6" +files = [ {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, ] @@ -4403,7 +3071,6 @@ description = "Python interface to PROJ (cartographic projections and coordinate optional = false python-versions = ">=3.8" files = [ -pyproj = [ {file = "pyproj-3.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6475ce653880938468a1a1b7321267243909e34b972ba9e53d5982c41d555918"}, {file = "pyproj-3.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61e4ad57d89b03a7b173793b31bca8ee110112cde1937ef0f42a70b9120c827d"}, {file = "pyproj-3.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdd2021bb6f7f346bfe1d2a358aa109da017d22c4704af2d994e7c7ee0a7a53"}, @@ -4451,7 +3118,6 @@ description = "A Python SOCKS client module. See https://github.com/Anorov/PySoc optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ -pysocks = [ {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"}, {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"}, {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"}, @@ -4459,36 +3125,112 @@ pysocks = [ [[package]] name = "pytest" -version = "7.4.2" +version = "7.4.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ -pytest = [ - {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, - {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, + {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, + {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, ] -pytest-cov = [ + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "3.0.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.6" +files = [ {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, ] -python-box = [ + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] + +[[package]] +name = "python-box" +version = "5.4.1" +description = "Advanced Python dictionaries with dot notation access" +optional = false +python-versions = ">=3.6" +files = [ {file = "python-box-5.4.1.tar.gz", hash = "sha256:b68e0f8abc86f3deda751b3390f64df64a0989459de51ba4db949662a7b4d8ac"}, {file = "python_box-5.4.1-py3-none-any.whl", hash = "sha256:60ae9156de34cf92b899bd099580950df70a5b0813e67a3310a1cdd1976457fa"}, ] -python-dateutil = [ + +[package.extras] +all = ["msgpack", "ruamel.yaml", "toml"] +msgpack = ["msgpack"] +pyyaml = ["PyYAML"] +ruamel-yaml = ["ruamel.yaml"] +toml = ["toml"] +yaml = ["ruamel.yaml"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, ] -python-dotenv = [ + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.0" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, ] -python-levenshtein = [ + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-levenshtein" +version = "0.21.1" +description = "Python extension for computing string edit distances and similarities." +optional = false +python-versions = ">=3.6" +files = [ {file = "python-Levenshtein-0.21.1.tar.gz", hash = "sha256:01ea6828c03738a475ee18ea8b86a674eb45ce80e9cce88376d132cf3ab26060"}, {file = "python_Levenshtein-0.21.1-py3-none-any.whl", hash = "sha256:5f49ebb4772a274aac4aeb190fc23ad537ebe778dec15a8f17975f746478c691"}, ] -python-slugify = [ + +[package.dependencies] +Levenshtein = "0.21.1" + +[[package]] +name = "python-slugify" +version = "5.0.2" +description = "A Python Slugify application that handles Unicode" +optional = false +python-versions = ">=3.6" +files = [ {file = "python-slugify-5.0.2.tar.gz", hash = "sha256:f13383a0b9fcbe649a1892b9c8eb4f8eab1d6d84b84bb7a624317afa98159cab"}, {file = "python_slugify-5.0.2-py2.py3-none-any.whl", hash = "sha256:6d8c5df75cd4a7c3a2d21e257633de53f52ab0265cd2d1dc62a730e8194a7380"}, ] @@ -4517,15 +3259,28 @@ description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ -pytz = [ {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, ] -pytzdata = [ + +[[package]] +name = "pytzdata" +version = "2020.1" +description = "The Olson timezone database for Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, ] -pywin32 = [ + +[[package]] +name = "pywin32" +version = "227" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ {file = "pywin32-227-cp27-cp27m-win32.whl", hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"}, {file = "pywin32-227-cp27-cp27m-win_amd64.whl", hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"}, {file = "pywin32-227-cp35-cp35m-win32.whl", hash = "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"}, @@ -4539,7 +3294,14 @@ pywin32 = [ {file = "pywin32-227-cp39-cp39-win32.whl", hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"}, {file = "pywin32-227-cp39-cp39-win_amd64.whl", hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"}, ] -pyyaml = [ + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, @@ -4584,119 +3346,101 @@ pyyaml = [ [[package]] name = "rapidfuzz" -version = "3.3.0" +version = "3.5.2" description = "rapid fuzzy string matching" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "rapidfuzz-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6bec4903d4127d1eaa20a62105a03b38184ddaef40e18393caa1d98ae3de6a0c"}, - {file = "rapidfuzz-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2e6c4580b0de835156671390959efad13741d0fb35cc355bc546d1dbf399db5e"}, - {file = "rapidfuzz-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66b92484cc5ea1b546d2adef50407aa011df8c92fcc22ec9b9803eff2d917dcc"}, - {file = "rapidfuzz-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5103c8f4aca404d1db4ba65c393d85d8a78f2547ce7d4a434921a4a1383aa67"}, - {file = "rapidfuzz-3.3.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cf3d37e38e7a205758269cd8c8a2ae506214732ef2a82bb1ef01c695963b3f5"}, - {file = "rapidfuzz-3.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:efb8cc7da41926e4e68773afcdb2fa9bb6a32caefbc297c818526232a58ad5d7"}, - {file = "rapidfuzz-3.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8b22e1973009e89ac0e1ad157ff978a15021c2acddfa15371456ef58156aa47"}, - {file = "rapidfuzz-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:307c6b9e1e47afe9dc274e2e5bccb81be0941f90f395a38f77405f1d7216bc0a"}, - {file = "rapidfuzz-3.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:404b6bf53ac0b2b0b1f901f51953e04b758bf6905e1ee1cc29001b1cdfa55316"}, - {file = "rapidfuzz-3.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:dfccefebbda76796164f8ec6ec04999d635be2d86d83b09d703b8a1f312234c7"}, - {file = "rapidfuzz-3.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:4f77055d29ab2af3d3be16d50ecabb3ade6ea61bb1768b578f84cf558be5ef1a"}, - {file = "rapidfuzz-3.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7ea934a589a7b3d522cbc358e9f8bdf6fae38c65d35596b12616f78c1c3089ec"}, - {file = "rapidfuzz-3.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:536238d37c9918b235899cc0e330a45304ab3c25be963912b7a969b61bbb309f"}, - {file = "rapidfuzz-3.3.0-cp310-cp310-win32.whl", hash = "sha256:c7070a163017739bfaf4c8c31d66d347d7ab401c4bdb136b268508c24410aa58"}, - {file = "rapidfuzz-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:e45e5930d9f4f78f8d4b34baf4700f150b845cf8ed31bb2fb9149e29e07c6bb8"}, - {file = "rapidfuzz-3.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:783d082341785a832c65010a5dbba3f0c3d500f919edb25f076ddd5991fc8fba"}, - {file = "rapidfuzz-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:12fd4e7c7d8a58fc43a9fbbe76b577c599403174740160937f852be4e78734e7"}, - {file = "rapidfuzz-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a661302b2a93afd3cbeed7a2c43d671d65de1f503c129e745255507c8a91a24"}, - {file = "rapidfuzz-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ba3421dd0f5048403acdad536b451d59bccda7b050144928c07d5830af1fb127"}, - {file = "rapidfuzz-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b047aca009e7978a39b85f36a2ab3dbea2bec773d0cab739caa5c6c3e51fe051"}, - {file = "rapidfuzz-3.3.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed199d15bfac7a9692bba218f63d117b558f5e08d44c678e2bc9bb43931a701b"}, - {file = "rapidfuzz-3.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d91e0d03dce17d5e80fc3f12c0c1d1b304f1ad7c26e79e9378236772ab5de393"}, - {file = "rapidfuzz-3.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c72aafd9f4a83d504c898473e084548ddd3fb2b2eb56121513a13807544a8d6"}, - {file = "rapidfuzz-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:324bc1b508a32972bcf267d1fbf5fddf831da0bbb9c052ffaf733d0be30819f4"}, - {file = "rapidfuzz-3.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b8fd22c2fc3218614991abff75989a55ca9d99c50f69376457246515ce95e27d"}, - {file = "rapidfuzz-3.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8f5793a577570211f5dc9b08a9c53d9b7e649372a6dcb8756f3eb823504778eb"}, - {file = "rapidfuzz-3.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1370bb6decb505b7fee362ffd2f111ca0c369e62a35eac35386b87a8c8f29a38"}, - {file = "rapidfuzz-3.3.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:906ddf3902ac4537bf21b2140c9b089c5cf4b203fdba72b447d89d6e8137132b"}, - {file = "rapidfuzz-3.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb60f7d2bbdabcd41059ccb68a8aea2353f96147a8402fac6581391e7edf809a"}, - {file = "rapidfuzz-3.3.0-cp311-cp311-win32.whl", hash = "sha256:ab7b2c2cb65075d68a9c0f28513ce5154c6e7520fe13b76755971eb135138e74"}, - {file = "rapidfuzz-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:cae783ac3830a20fe32e80c53a406654d3a75b9b5d3351e81ac75ce470f24ad2"}, - {file = "rapidfuzz-3.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:f4b8fd0acbbddaf0d96c1f01e949d645073ad54f8fee1a59af6aa914340ae331"}, - {file = "rapidfuzz-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9558411d11dfcf85d4b080e0bc005114868e217c41f0a36cc13dc2c8ec91eacc"}, - {file = "rapidfuzz-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0965b30b84687107658cb6dc0852d1e14e2a80a93036320264128c8940643db7"}, - {file = "rapidfuzz-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5724ba0f4ac93ad43cc80407cbca2c598a36daf7f65c14279deaf3ad159f00ac"}, - {file = "rapidfuzz-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6467e0adfcb43b4d5bdd92a009cf7c8b952189b943c55050a9f1a8cd8180865"}, - {file = "rapidfuzz-3.3.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da5d006f329518eb797c9ed12e05bb8332663c3afa5d2a508032f64f7232766c"}, - {file = "rapidfuzz-3.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:343f863df7000f212156ed030196ed20215f5231ca54749228a5d6a317b626e8"}, - {file = "rapidfuzz-3.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:113fb1020be6f4727ecbd4fb29a510e14effe85910edf22cafb6c5d1eea75694"}, - {file = "rapidfuzz-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78e0d6d061835b16ad42df98fe826e4a0a3380621568f80c6ee2fa230d8d7020"}, - {file = "rapidfuzz-3.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:47ddf5d075e09d0baccc3d499c5eba36e2605771da65a6d95fcc72e22c5e36b9"}, - {file = "rapidfuzz-3.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bc354de84a2a56890a68a526b0d689dd010df1003794d24f222ee5ba6405d39d"}, - {file = "rapidfuzz-3.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:2a58279ee1595838dfc2b80562e0a89f6cb98b427c738b57ea146318604dba11"}, - {file = "rapidfuzz-3.3.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:f3b40aa31c7a970696967ff43d6d5bf3be4f6c008c9ad661cf8721af9c7c81fc"}, - {file = "rapidfuzz-3.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7437bfcef4b2b1417731293b97343cb45f1ca46ced381d511cd601ea41b8ab49"}, - {file = "rapidfuzz-3.3.0-cp312-cp312-win32.whl", hash = "sha256:bd6ec3ad3fa5a490dfce534bb87429c122faf6239c97d6c2763353ef61ddab08"}, - {file = "rapidfuzz-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:3ef0cf46d84bc307100f48212966e58f7a55c6045cb4ce9fb3e386313e0fc3a1"}, - {file = "rapidfuzz-3.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:cfa1345d5007efc1bdad6f40d2bbdc42fc83bb6b9fcb8cd3cc830180ccf360b9"}, - {file = "rapidfuzz-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fbafe4e45086b9245e12d97d0c4232e866a52469221acef05192bdb2a9b96a21"}, - {file = "rapidfuzz-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e053d10f01f06d0e10a8a229f2d82845f6d5ec13d67b6a6c11910f49f6e46b2"}, - {file = "rapidfuzz-3.3.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b2ca9583c9e0361144138f4884b59e7165daa56b5983f15bbc1441de3d548a9"}, - {file = "rapidfuzz-3.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1441d18aa459e72c5aeacf6ec140878c2ec6debdbbabfd68cd5968ac07ac9b2b"}, - {file = "rapidfuzz-3.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2de666fb4d3558847b229b4a06909557628a6a1fe5ccdc68e522eed90f442e6f"}, - {file = "rapidfuzz-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b632178ac063e8ad5b8d8bf051bd2436170c3822e865eab63e45a3289b80683"}, - {file = "rapidfuzz-3.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7f3da8741463e0345480e49d8bc89b83713d802c5c2851d590bd7ba1aaeace87"}, - {file = "rapidfuzz-3.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4839f1760c7d5e1f1d01230065a111773f2f78277df5d66a55902bdef77f3f93"}, - {file = "rapidfuzz-3.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:78641fecf74571d0f693cda9aaeb70db581c1df4f0ce6a9077b05558e7c5b6f5"}, - {file = "rapidfuzz-3.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5df1d384283aa2491ecdc23d00d3b2c2f1ed745f9ca42813b3e51e39a180f9b2"}, - {file = "rapidfuzz-3.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b13dc341f4deb2f599db3fe0ad52ab87f7bb1fc09911b4823ac618925fa400e0"}, - {file = "rapidfuzz-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:ca3c582e57df2407c5e07db26edb4ef19c2a7882ce2bf0fc1c5a6394986f84e5"}, - {file = "rapidfuzz-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:483299d57306c29a2bb1eb5d978f4d25a5e8d67ffee18b4155847bf9fc422b82"}, - {file = "rapidfuzz-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4671cd2e0d7e861b7c7aea8ed529b93e7ebec9ec4f6858cd72c395a99074826b"}, - {file = "rapidfuzz-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9bb2690f0d760ebfb4a943f51deb7b3d689b1fa7f87f8de1f005b19574f59259"}, - {file = "rapidfuzz-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8a1bba2aa6af58ff04e9fdde40747dfdb3f1bc836bbb86533e317f9a4b6a607d"}, - {file = "rapidfuzz-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a6f8edd755d29ac7a9804382780d4b383f494fed894514819932b9a484fa117"}, - {file = "rapidfuzz-3.3.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1eb377265e4d2f9e6c21a0adc865dddd52b1cd90ecd2552e99b386bb1effe38a"}, - {file = "rapidfuzz-3.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:319e67f8c1d7b9b45386821ace33edd289ec0995d80361775f5d6d15d684c6a6"}, - {file = "rapidfuzz-3.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9837f4528071e5dc695fb30098d9b49341e62fab32ef5c15094be260df1a48e4"}, - {file = "rapidfuzz-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29acfc446d091e723caa65e2a7e1b2d7669ac927d02effc5cc636bcd2f41bba5"}, - {file = "rapidfuzz-3.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:25704f21afa6fc767902e9d0b840623c008d28f58022904c282e26e4f38b770d"}, - {file = "rapidfuzz-3.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e5051c47a2a00b10c62b51bf1c4aefd2adb34d837b56fe16cfe505db7b7cc2be"}, - {file = "rapidfuzz-3.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a441e90ec5ac09746d3960221df1268e7a7f0b47978c388e7dcae83e23ae3462"}, - {file = "rapidfuzz-3.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e7f8056826ba8342f6d9c199750cddce70d1d90254320494115c26480fac44cc"}, - {file = "rapidfuzz-3.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:78c73efada660cc548d166f08970aeff0ee4dd0a66fa4f27bd24ac6c31551503"}, - {file = "rapidfuzz-3.3.0-cp38-cp38-win32.whl", hash = "sha256:9acd9cd547089b8835ac36223888a43bdfd2492064a8c5ee00cdaf6ef010de4b"}, - {file = "rapidfuzz-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:93bdb512798f8226cd4b785a73c70efa582f26a7287d55337b9216b384946494"}, - {file = "rapidfuzz-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5b8cdcf915c7058815321f2c0c30d20097722459bbb1fd2e1cae574bd03a39db"}, - {file = "rapidfuzz-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:376b87d6b7c83b6b2923f0916fea6fb7288ab66b1b1f3b0cc39e601bb09488cf"}, - {file = "rapidfuzz-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3363beb1da090be877e8a22ac6daefe8e0a6f6aeec10cebc4ec39db3abece897"}, - {file = "rapidfuzz-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1dbf0b3dcb5b9615ea5b90619eb5d7756c2d377770d53c4101ce728de53a8e"}, - {file = "rapidfuzz-3.3.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5c4628e165910aeb96099dd42822ad32819511c2a4061dbf62169302d7299f6e"}, - {file = "rapidfuzz-3.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f25757cb21df937daed9727b628435390ce86af7734cbb3b5c055a1c57ffb434"}, - {file = "rapidfuzz-3.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4aad090c40474f26578a968e4fbcc9418a4292201a3a0f96a2290465f5aaeec"}, - {file = "rapidfuzz-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ddf7a03740420bfae76ca5d86f934389729cc231285b669fd3d1c913b84005"}, - {file = "rapidfuzz-3.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:888c096f29f1dbfa6614ffc2780d2c766033e6c2906413d4d6d1f04e5cda05d7"}, - {file = "rapidfuzz-3.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2a62d1435ef7d897ac37c5975d1f672f5e73857eb183bec821a174ed937f53fb"}, - {file = "rapidfuzz-3.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ecc437ad773d40217e0a4704ee60002f7e699383dffbf576f41ed7ae6f4a8acc"}, - {file = "rapidfuzz-3.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e59462ea2f94c809fdea2426a7cd2fe219f171cc7d0dfdbc5681176f86884da4"}, - {file = "rapidfuzz-3.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:68484409517617feccac3092ec879d5630253890e6895ffbe7880f063329d114"}, - {file = "rapidfuzz-3.3.0-cp39-cp39-win32.whl", hash = "sha256:78abf9f6e3e60d4004f66085bf4618cb5480ca6155d39d17277db7d29388e49d"}, - {file = "rapidfuzz-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:56dec09e716fb12c9fa10649b5980e4bad9563b2b7dc74776618b84603740f6c"}, - {file = "rapidfuzz-3.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:3dfe9f4cdd9f9087f7bdd7c9f4e9304557ca8c44d4a1b1eca69230535e9ab2df"}, - {file = "rapidfuzz-3.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c089bf351657a16a31b911ddab3e2f19b04062f7c8244cea1ec5a40f490e0829"}, - {file = "rapidfuzz-3.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e737bd4f30917643c50694df1486ce1a5f869bbf523f38b867076a775ca1a00"}, - {file = "rapidfuzz-3.3.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68800fe792718b5b2a5ff7febbb6e4cc551ef767704873ec04062f642c9f5901"}, - {file = "rapidfuzz-3.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:557a736c8c6e01e2d844211eb4f6f7913f54a912f6578fdf8d72312ae906929c"}, - {file = "rapidfuzz-3.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e809367f75b1d65ea5524a6acfcc4dcced79f4f2d19dbad8f17175ad4864515b"}, - {file = "rapidfuzz-3.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2cc8ea602e030dd5a220e537cc6bbb241ecfe293614415076d8045dd198acd8"}, - {file = "rapidfuzz-3.3.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0861477cb2d21ed3e3a96a98adba6b24ecaaf50021991fdd72794f963a8f8e9"}, - {file = "rapidfuzz-3.3.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7fa079737a22e5b098545476be428a90635bf7c89bf3ea5587fa2d07645b1569"}, - {file = "rapidfuzz-3.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada0258e3d23518b74af2363bb4062cfe492ec0c7c4c752aff6cd084d6917830"}, - {file = "rapidfuzz-3.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:50b2b2b96b9c7841f6e2ab001153cd0bfcf707c427f20fed2f1f3849a99bd3fc"}, - {file = "rapidfuzz-3.3.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:062a5ed305a6d45798cf5548c780d4a434d1f188cc10b971c5c389d11fa356e7"}, - {file = "rapidfuzz-3.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18b51a2858e7adc950407bdb21382256d499472ba5c5d870eada0fa880d854eb"}, - {file = "rapidfuzz-3.3.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0f0b3587ee7dd0f8d96078c33ba88e583dab8834dd658b18df29cfced360cc6"}, - {file = "rapidfuzz-3.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f9a40cc64ef814ae60d567c3c9ad01ce92243a9ed6746b31bcddebc1ecc2284"}, - {file = "rapidfuzz-3.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cd254dc3436347a12e683c9d1984230228270009ff0985a38cbf5cbd25e8bc8c"}, - {file = "rapidfuzz-3.3.0.tar.gz", hash = "sha256:5e71bc5829f41e78b2d009431aedeb308ee3699d2bbbc68b7739db9b40bd1465"}, + {file = "rapidfuzz-3.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1a047d6e58833919d742bbc0dfa66d1de4f79e8562ee195007d3eae96635df39"}, + {file = "rapidfuzz-3.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22877c027c492b7dc7e3387a576a33ed5aad891104aa90da2e0844c83c5493ef"}, + {file = "rapidfuzz-3.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e0f448b0eacbcc416feb634e1232a48d1cbde5e60f269c84e4fb0912f7bbb001"}, + {file = "rapidfuzz-3.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05146497672f869baf41147d5ec1222788c70e5b8b0cfcd6e95597c75b5b96b"}, + {file = "rapidfuzz-3.5.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f2df3968738a38d2a0058b5e721753f5d3d602346a1027b0dde31b0476418f3"}, + {file = "rapidfuzz-3.5.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5afc1fcf1830f9bb87d3b490ba03691081b9948a794ea851befd2643069a30c1"}, + {file = "rapidfuzz-3.5.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84be69ea65f64fa01e5c4976be9826a5aa949f037508887add42da07420d65d6"}, + {file = "rapidfuzz-3.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8658c1045766e87e0038323aa38b4a9f49b7f366563271f973c8890a98aa24b5"}, + {file = "rapidfuzz-3.5.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:852b3f93c15fce58b8dc668bd54123713bfdbbb0796ba905ea5df99cfd083132"}, + {file = "rapidfuzz-3.5.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:12424a06ad9bd0cbf5f7cea1015e78d924a0034a0e75a5a7b39c0703dcd94095"}, + {file = "rapidfuzz-3.5.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b4e9ded8e80530bd7205a7a2b01802f934a4695ca9e9fbe1ce9644f5e0697864"}, + {file = "rapidfuzz-3.5.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:affb8fe36157c2dc8a7bc45b6a1875eb03e2c49167a1d52789144bdcb7ab3b8c"}, + {file = "rapidfuzz-3.5.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1d33a622572d384f4c90b5f7a139328246ab5600141e90032b521c2127bd605"}, + {file = "rapidfuzz-3.5.2-cp310-cp310-win32.whl", hash = "sha256:2cf9f2ed4a97b388cffd48d534452a564c2491f68f4fd5bc140306f774ceb63a"}, + {file = "rapidfuzz-3.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:6541ffb70097885f7302cd73e2efd77be99841103023c2f9408551f27f45f7a5"}, + {file = "rapidfuzz-3.5.2-cp310-cp310-win_arm64.whl", hash = "sha256:1dd2542e5103fb8ca46500a979ae14d1609dcba11d2f9fe01e99eec03420e193"}, + {file = "rapidfuzz-3.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bff7d3127ebc5cd908f3a72f6517f31f5247b84666137556a8fcc5177c560939"}, + {file = "rapidfuzz-3.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fdfdb3685b631d8efbb6d6d3d86eb631be2b408d9adafcadc11e63e3f9c96dec"}, + {file = "rapidfuzz-3.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:97b043fe8185ec53bb3ff0e59deb89425c0fc6ece6e118939963aab473505801"}, + {file = "rapidfuzz-3.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a4a7832737f87583f3863dc62e6f56dd4a9fefc5f04a7bdcb4c433a0f36bb1b"}, + {file = "rapidfuzz-3.5.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d876dba9a11fcf60dcf1562c5a84ef559db14c2ceb41e1ad2d93cd1dc085889"}, + {file = "rapidfuzz-3.5.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa4c0612893716bbb6595066ca9ecb517c982355abe39ba9d1f4ab834ace91ad"}, + {file = "rapidfuzz-3.5.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:120316824333e376b88b284724cfd394c6ccfcb9818519eab5d58a502e5533f0"}, + {file = "rapidfuzz-3.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cdbe8e80cc186d55f748a34393533a052d855357d5398a1ccb71a5021b58e8d"}, + {file = "rapidfuzz-3.5.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1062425c8358a547ae5ebad148f2e0f02417716a571b803b0c68e4d552e99d32"}, + {file = "rapidfuzz-3.5.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:66be181965aff13301dd5f9b94b646ce39d99c7fe2fd5de1656f4ca7fafcb38c"}, + {file = "rapidfuzz-3.5.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:53df7aea3cf301633cfa2b4b2c2d2441a87dfc878ef810e5b4eddcd3e68723ad"}, + {file = "rapidfuzz-3.5.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:76639dca5eb0afc6424ac5f42d43d3bd342ac710e06f38a8c877d5b96de09589"}, + {file = "rapidfuzz-3.5.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:27689361c747b5f7b8a26056bc60979875323f1c3dcaaa9e2fec88f03b20a365"}, + {file = "rapidfuzz-3.5.2-cp311-cp311-win32.whl", hash = "sha256:99c9fc5265566fb94731dc6826f43c5109e797078264e6389a36d47814473692"}, + {file = "rapidfuzz-3.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:666928ee735562a909d81bd2f63207b3214afd4ca41f790ab3025d066975c814"}, + {file = "rapidfuzz-3.5.2-cp311-cp311-win_arm64.whl", hash = "sha256:d55de67c48f06b7772541e8d4c062a2679205799ce904236e2836cb04c106442"}, + {file = "rapidfuzz-3.5.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:04e1e02b182283c43c866e215317735e91d22f5d34e65400121c04d5ed7ed859"}, + {file = "rapidfuzz-3.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:365e544aba3ac13acf1a62cb2e5909ad2ba078d0bfc7d69b1f801dfd673b9782"}, + {file = "rapidfuzz-3.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b61f77d834f94b0099fa9ed35c189b7829759d4e9c2743697a130dd7ba62259f"}, + {file = "rapidfuzz-3.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43fb368998b9703fa8c63db292a8ab9e988bf6da0c8a635754be8e69da1e7c1d"}, + {file = "rapidfuzz-3.5.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25510b5d142c47786dbd27cfd9da7cae5bdea28d458379377a3644d8460a3404"}, + {file = "rapidfuzz-3.5.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf3093443751e5a419834162af358d1e31dec75f84747a91dbbc47b2c04fc085"}, + {file = "rapidfuzz-3.5.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2fbaf546f15a924613f89d609ff66b85b4f4c2307ac14d93b80fe1025b713138"}, + {file = "rapidfuzz-3.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32d580df0e130ed85400ff77e1c32d965e9bc7be29ac4072ab637f57e26d29fb"}, + {file = "rapidfuzz-3.5.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:358a0fbc49343de20fee8ebdb33c7fa8f55a9ff93ff42d1ffe097d2caa248f1b"}, + {file = "rapidfuzz-3.5.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fb379ac0ddfc86c5542a225d194f76ed468b071b6f79ff57c4b72e635605ad7d"}, + {file = "rapidfuzz-3.5.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7fb21e182dc6d83617e88dea002963d5cf99cf5eabbdbf04094f503d8fe8d723"}, + {file = "rapidfuzz-3.5.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:c04f9f1310ce414ab00bdcbf26d0906755094bfc59402cb66a7722c6f06d70b2"}, + {file = "rapidfuzz-3.5.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f6da61cc38c1a95efc5edcedf258759e6dbab73191651a28c5719587f32a56ad"}, + {file = "rapidfuzz-3.5.2-cp312-cp312-win32.whl", hash = "sha256:f823fd1977071486739f484e27092765d693da6beedaceece54edce1dfeec9b2"}, + {file = "rapidfuzz-3.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:a8162d81486de85ab1606e48e076431b66d44cf431b2b678e9cae458832e7147"}, + {file = "rapidfuzz-3.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:dfc63fabb7d8da8483ca836bae7e55766fe39c63253571e103c034ba8ea80950"}, + {file = "rapidfuzz-3.5.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:df8fae2515a1e4936affccac3e7d506dd904de5ff82bc0b1433b4574a51b9bfb"}, + {file = "rapidfuzz-3.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dd6384780c2a16097d47588844cd677316a90e0f41ef96ff485b62d58de79dcf"}, + {file = "rapidfuzz-3.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:467a4d730ae3bade87dba6bd769e837ab97e176968ce20591fe8f7bf819115b1"}, + {file = "rapidfuzz-3.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54576669c1502b751b534bd76a4aeaaf838ed88b30af5d5c1b7d0a3ca5d4f7b5"}, + {file = "rapidfuzz-3.5.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abafeb82f85a651a9d6d642a33dc021606bc459c33e250925b25d6b9e7105a2e"}, + {file = "rapidfuzz-3.5.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73e14617a520c0f1bc15eb78c215383477e5ca70922ecaff1d29c63c060e04ca"}, + {file = "rapidfuzz-3.5.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7cdf92116e9dfe40da17f921cdbfa0039dde9eb158914fa5f01b1e67a20b19cb"}, + {file = "rapidfuzz-3.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1962d5ccf8602589dbf8e85246a0ee2b4050d82fade1568fb76f8a4419257704"}, + {file = "rapidfuzz-3.5.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:db45028eae2fda7a24759c69ebeb2a7fbcc1a326606556448ed43ee480237a3c"}, + {file = "rapidfuzz-3.5.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b685abb8b6d97989f6c69556d7934e0e533aa8822f50b9517ff2da06a1d29f23"}, + {file = "rapidfuzz-3.5.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:40139552961018216b8cd88f6df4ecbbe984f907a62a5c823ccd907132c29a14"}, + {file = "rapidfuzz-3.5.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0fef4705459842ef8f79746d6f6a0b5d2b6a61a145d7d8bbe10b2e756ea337c8"}, + {file = "rapidfuzz-3.5.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6b2ad5516f7068c7d9cbcda8ac5906c589e99bc427df2e1050282ee2d8bc2d58"}, + {file = "rapidfuzz-3.5.2-cp38-cp38-win32.whl", hash = "sha256:2da3a24c2f7dfca7f26ba04966b848e3bbeb93e54d899908ff88dfe3e1def9dc"}, + {file = "rapidfuzz-3.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:e3f2be79d4114d01f383096dbee51b57df141cb8b209c19d0cf65f23a24e75ba"}, + {file = "rapidfuzz-3.5.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:089a7e96e5032821af5964d8457fcb38877cc321cdd06ad7c5d6e3d852264cb9"}, + {file = "rapidfuzz-3.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:75d8a52bf8d1aa2ac968ae4b21b83b94fc7e5ea3dfbab34811fc60f32df505b2"}, + {file = "rapidfuzz-3.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2bacce6bbc0362f0789253424269cc742b1f45e982430387db3abe1d0496e371"}, + {file = "rapidfuzz-3.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5fd627e604ddc02db2ddb9ddc4a91dd92b7a6d6378fcf30bb37b49229072b89"}, + {file = "rapidfuzz-3.5.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2e8b369f23f00678f6e673572209a5d3b0832f4991888e3df97af7b8b9decf3"}, + {file = "rapidfuzz-3.5.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c29958265e4c2b937269e804b8a160c027ee1c2627d6152655008a8b8083630e"}, + {file = "rapidfuzz-3.5.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00be97f9219355945c46f37ac9fa447046e6f7930f7c901e5d881120d1695458"}, + {file = "rapidfuzz-3.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada0d8d57e0f556ef38c24fee71bfe8d0db29c678bff2acd1819fc1b74f331c2"}, + {file = "rapidfuzz-3.5.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:de89585268ed8ee44e80126814cae63ff6b00d08416481f31b784570ef07ec59"}, + {file = "rapidfuzz-3.5.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:908ff2de9c442b379143d1da3c886c63119d4eba22986806e2533cee603fe64b"}, + {file = "rapidfuzz-3.5.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:54f0061028723c026020f5bb20649c22bc8a0d9f5363c283bdc5901d4d3bff01"}, + {file = "rapidfuzz-3.5.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b581107ec0c610cdea48b25f52030770be390db4a9a73ca58b8d70fa8a5ec32e"}, + {file = "rapidfuzz-3.5.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1d5a686ea258931aaa38019204bdc670bbe14b389a230b1363d84d6cf4b9dc38"}, + {file = "rapidfuzz-3.5.2-cp39-cp39-win32.whl", hash = "sha256:97f811ca7709c6ee8c0b55830f63b3d87086f4abbcbb189b4067e1cd7014db7b"}, + {file = "rapidfuzz-3.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:58ee34350f8c292dd24a050186c0e18301d80da904ef572cf5fda7be6a954929"}, + {file = "rapidfuzz-3.5.2-cp39-cp39-win_arm64.whl", hash = "sha256:c5075ce7b9286624cafcf36720ef1cfb2946d75430b87cb4d1f006e82cd71244"}, + {file = "rapidfuzz-3.5.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:af5221e4f7800db3e84c46b79dba4112e3b3cc2678f808bdff4fcd2487073846"}, + {file = "rapidfuzz-3.5.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8501d7875b176930e6ed9dbc1bc35adb37ef312f6106bd6bb5c204adb90160ac"}, + {file = "rapidfuzz-3.5.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e414e1ca40386deda4291aa2d45062fea0fbaa14f95015738f8bb75c4d27f862"}, + {file = "rapidfuzz-3.5.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2059cd73b7ea779a9307d7a78ed743f0e3d33b88ccdcd84569abd2953cd859f"}, + {file = "rapidfuzz-3.5.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:58e3e21f6f13a7cca265cce492bc797425bd4cb2025fdd161a9e86a824ad65ce"}, + {file = "rapidfuzz-3.5.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b847a49377e64e92e11ef3d0a793de75451526c83af015bdafdd5d04de8a058a"}, + {file = "rapidfuzz-3.5.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a42c7a8c62b29c4810e39da22b42524295fcb793f41c395c2cb07c126b729e83"}, + {file = "rapidfuzz-3.5.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51b5166be86e09e011e92d9862b1fe64c4c7b9385f443fb535024e646d890460"}, + {file = "rapidfuzz-3.5.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f808dcb0088a7a496cc9895e66a7b8de55ffea0eb9b547c75dfb216dd5f76ed"}, + {file = "rapidfuzz-3.5.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d4b05a8f4ab7e7344459394094587b033fe259eea3a8720035e8ba30e79ab39b"}, + {file = "rapidfuzz-3.5.2.tar.gz", hash = "sha256:9e9b395743e12c36a3167a3a9fd1b4e11d92fb0aa21ec98017ee6df639ed385e"}, ] [package.extras] @@ -4704,13 +3448,13 @@ full = ["numpy"] [[package]] name = "rarfile" -version = "4.0" +version = "4.1" description = "RAR archive reader for Python" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "rarfile-4.0-py3-none-any.whl", hash = "sha256:1094869119012f95c31a6f22cc3a9edbdca61861b805241116adbe2d737b68f8"}, - {file = "rarfile-4.0.tar.gz", hash = "sha256:67548769229c5bda0827c1663dce3f54644f9dbfba4ae86d4da2b2afd3e602a1"}, + {file = "rarfile-4.1-py3-none-any.whl", hash = "sha256:17d7554c93c776ceae677e9d927051267d4c5eba38bf64b9cc89a415d9a5f901"}, + {file = "rarfile-4.1.tar.gz", hash = "sha256:db60b3b5bc1c4bdeb941427d50b606d51df677353385255583847639473eda48"}, ] [[package]] @@ -4720,133 +3464,78 @@ description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.7" files = [ -rapidfuzz = [ - {file = "rapidfuzz-3.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:411b189af7451ba6bffbfc23fa7f971892cf5c7ff5b1fe2ec309bf7694bb290f"}, - {file = "rapidfuzz-3.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:55b6faf830bfcf8bdb92d33ae4b3d660c2aa7e510486173aecaf495b6229253d"}, - {file = "rapidfuzz-3.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:38d6f7be45267698011aa0e50376bd1a039392edd6bc99ad2e9bdd1791e3ce97"}, - {file = "rapidfuzz-3.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f154304cd26959361d773d2d9872f8439cb77fe6fad6da9710e39f97f17760b"}, - {file = "rapidfuzz-3.3.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54a07f9545affb1b4c9bb419a17648a470e1436acc60a80cafa125886860a113"}, - {file = "rapidfuzz-3.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2a0e684b54e6dbf62e77cc311b501aad6520f596c8313905848a7f876d7f27b"}, - {file = "rapidfuzz-3.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ccb8b22b71a500f9a2b800abb8237ee335b2fd44107b4483c945581eb4e8c4d"}, - {file = "rapidfuzz-3.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b25eb9b0cc5135a1e43e2bff9fa2acc20bb12c21904ed588bcb140c05a2d459"}, - {file = "rapidfuzz-3.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8f5b8fd82d240e482fc2f30eb6dd85d26e486ceddc8537fb1b7274d62e227784"}, - {file = "rapidfuzz-3.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b43bd6aa31903770f5661b6c0ac21e90a1b76ac13034617e9dbd3b90442b1406"}, - {file = "rapidfuzz-3.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:db13dbc14c05050ccb5e2ee2528135170b1a38d0b6bf8c41996fd4b2e9490f86"}, - {file = "rapidfuzz-3.3.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2b314e809c200042a4f61ab6b44c41b3bae335f8a21ebaccebc3500964672946"}, - {file = "rapidfuzz-3.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0763b5d4e53613fbbbc9dff610a3f4a0aa91e1426d629d5a25b6450a682c0e1d"}, - {file = "rapidfuzz-3.3.1-cp310-cp310-win32.whl", hash = "sha256:911b86d0fb12b7d467fa977a2eab091a9671836368154c359a0955c3640d50bf"}, - {file = "rapidfuzz-3.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:a3a722491aeea07ab7cd4b320f9df7f0be90020ca9161315fc8c1eebdd3073d1"}, - {file = "rapidfuzz-3.3.1-cp310-cp310-win_arm64.whl", hash = "sha256:fb67eeb91942fbb19f020c2ea41bbdc69a242987e6a1abb8a161580c5b1ca5fa"}, - {file = "rapidfuzz-3.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:54517a6ccce1cf612435010a45411408cba7d7697eb5208ec3b6ac90ed4cba53"}, - {file = "rapidfuzz-3.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fec991fa6b4e7da6e7ac9aecfb90b03c37e275ec0241fec654473889f2aaf3bd"}, - {file = "rapidfuzz-3.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f3d9d498c1ae218dbb7419b54bfb2a02aa1ed454701409cd2f4e690437358871"}, - {file = "rapidfuzz-3.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee68c3befc07917a71dd3a4c75ba11e5cb58ba0888240e7c393c1c2c51696d88"}, - {file = "rapidfuzz-3.3.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad1dac1325eb2e3f9c6cd64df6eb65424ebf410fd115d16c48839dde69b7cd37"}, - {file = "rapidfuzz-3.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cc1cabace9998f2877ee039ce165e3e622209fa347f00cb8a276576f6ffd4e90"}, - {file = "rapidfuzz-3.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ded1b412c2bde3f1a072735bf1f551b7dc4bc9d1ba98abac2561b4b4b88c3568"}, - {file = "rapidfuzz-3.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0bdf0b5f52019b3b025a1542eb672554dd88721d5bc8dcc9537ac80442b0171e"}, - {file = "rapidfuzz-3.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4e99e7fe0ab51a32db3a1fa6d7c9950ad66c5f379560698acb6377ecb4092b2"}, - {file = "rapidfuzz-3.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48e9b3369d99ec2250dd622afbf5a332974f72289e8e13f2739b3edd2260370d"}, - {file = "rapidfuzz-3.3.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e4e298f0577d06f8116d0304de2b9f5db8c12c6c05e605307f0f6d8a959491d8"}, - {file = "rapidfuzz-3.3.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:332b6b734beadc710e81582e09b67684d170b351886d7ea76ccd306e94f95511"}, - {file = "rapidfuzz-3.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16883ad18be670cdc824ef8f5f65979b68025d08e20e597a0edf98dfa6d2dcb6"}, - {file = "rapidfuzz-3.3.1-cp311-cp311-win32.whl", hash = "sha256:d334369fa0201f5929ca4e9d4090ba2856ae6172db756e8fa7e326b6c09f9f13"}, - {file = "rapidfuzz-3.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b292eeced85c081cebe9fac389fd026a3818238a2f8676269e3dabecd25a4b9e"}, - {file = "rapidfuzz-3.3.1-cp311-cp311-win_arm64.whl", hash = "sha256:517cda15951860f33899b6c1f7df82710fd059a243e62b5a9dc8f8a305da5b27"}, - {file = "rapidfuzz-3.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3c273ac9c53d0f7718e183035c94b7c468fc38de92d12a0128d201a5d2700cfe"}, - {file = "rapidfuzz-3.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3112ebe083ca561c78c354ffcea33719fb5801ffead0b39243d31e0ea5c61735"}, - {file = "rapidfuzz-3.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5a26038d2c6eab28aa2da998e0bffa2054a26920e11349ba8c12b85b6031ab85"}, - {file = "rapidfuzz-3.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:410b4b1b4552de1ef8c70dceac553c46d701b78d733854b60b0ec65eaf7b0917"}, - {file = "rapidfuzz-3.3.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1410d98d43743958c69391b38fc600f86315120b30cd73767e7faa19df3c533"}, - {file = "rapidfuzz-3.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5d55e35420c8105eff6b3fe1d7718713d7fac3474c8f3da2ccac371c15d0b33"}, - {file = "rapidfuzz-3.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cffbe592da86a8912174ebed79859ab03fc76348ec1e8450673bce206eb3a3a4"}, - {file = "rapidfuzz-3.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04644984e61b151d96a1dfb5a2b10a405b2cd021b8b6fb3b7ab7ae0117d31e3d"}, - {file = "rapidfuzz-3.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e8f4593f4f6ffcac3946f22ad1d546cd0ca5048fecc771da0b6bd9424b8330d7"}, - {file = "rapidfuzz-3.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6461cba315db61c37f26a871c4d44d6e6cea752ec4caec335367a94635aefb3b"}, - {file = "rapidfuzz-3.3.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:138a99230963a3d6b982d332f0338ae61d9102dce5a362d2cfd7db7201b080fc"}, - {file = "rapidfuzz-3.3.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:4b3292f41c952eadcdccbd8b57cc87f6eefbaa39584c8846244ee9d65ae4e9c2"}, - {file = "rapidfuzz-3.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:367281049ebb964af97cbe66a91ad759f44ac75855427f8e9f30194743b3d30b"}, - {file = "rapidfuzz-3.3.1-cp312-cp312-win32.whl", hash = "sha256:b9f5bb52c2d5be4775afb34dbc336afe99d82e62154ed1d4a6d9e09b6a11e60c"}, - {file = "rapidfuzz-3.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:7263beaf5a4f0eeaec521e417a783b9442dd4972d7b4536d48979b63285b5e03"}, - {file = "rapidfuzz-3.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:84e3abc53ce2125337665f33d26bb1b3eeea391d57d826f4e3dae795b2c552a6"}, - {file = "rapidfuzz-3.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:13db29a8ab077376bf096ef6e339dbbc3aaccae3b23cc034c0cc3149856b116d"}, - {file = "rapidfuzz-3.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ecf81490bd01a376b09d0d0f4ddf0cea93047145ec8e016cdb7354d8cd66219"}, - {file = "rapidfuzz-3.3.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fa10eebd70754614375c21a0e06e8a64e0d33b785d78a22dc9dfbaea8e53cd3"}, - {file = "rapidfuzz-3.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5533038cf5082e13bb8137741d15625ad30e475ee4da811c0d83f7bcc6fb3d22"}, - {file = "rapidfuzz-3.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e50c12d0620428d14c45598491b1f6fb62bfd8b064c087bb1c205b10d09b33b"}, - {file = "rapidfuzz-3.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83f3dd875162707548fcbf80c59137ea226a87ef421d119b483afc22cd590911"}, - {file = "rapidfuzz-3.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8e7edd355e159a077796107116356e528024a1fd7e7d822a51600930681d98b4"}, - {file = "rapidfuzz-3.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:8d0622807b9ebc0e71e4bc48cbd61d26aa73c0dbf18d8cd995de4e6e1bf1f25b"}, - {file = "rapidfuzz-3.3.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:fa7787655432478a4d4e20b410fa38c2e56146c5a1a948aeb03e90282f999b2d"}, - {file = "rapidfuzz-3.3.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:658a206302ac38efec87e5989899a61948c8d41cdd4c4b5ed650744fe0627b84"}, - {file = "rapidfuzz-3.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e3331534c475e152bb4508f8bdf810814666aa061a5835a7fdde1c722088ebd7"}, - {file = "rapidfuzz-3.3.1-cp37-cp37m-win32.whl", hash = "sha256:3fa0b231b5932f0e3f77d5a893e3cb49b3af1dd5de2a9412c8a975beeb319b9f"}, - {file = "rapidfuzz-3.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:b758f7a6b2eb03264fc45ed3bbbf7f47e871e8843ff2a49bbeeb8bdf4bd9b435"}, - {file = "rapidfuzz-3.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6fb7a1180e4067fc226d85d622711667dd7bf7ad54e7520eda0197fe01795ee6"}, - {file = "rapidfuzz-3.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:376d599c592a2bcb75ed2c0cc2ec3f4d08e9df6bcc59456f5b5f73eda3387a11"}, - {file = "rapidfuzz-3.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:34bc0f1b212458780b1263772741906838bb78a229be34b6edd5fcb87525e55f"}, - {file = "rapidfuzz-3.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75ecdfa7715ad139ae3a30c3d6c5fd8ed7d72b2cef6a27b8818c0256783cac75"}, - {file = "rapidfuzz-3.3.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3a952022b2f7529b6ca3c86146f75daa183acb656b851c394feaf1586fb64be"}, - {file = "rapidfuzz-3.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e515b62a58f9846e6be9b8e543dc850de4bc6a5ab3cebf0183648e06e16e72e1"}, - {file = "rapidfuzz-3.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3163a01436708447330cbf59bfeb491137809db4528d32453ebf230f952e10ed"}, - {file = "rapidfuzz-3.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cdba516d49798f3b3bc645ba72c740cb4bcfb5865f4f9de3ccf526c94f85044"}, - {file = "rapidfuzz-3.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a9a2bd94b7162054fbdf257ee847f0c98ef9b697ef7f9398f5c9a39e9bc537b5"}, - {file = "rapidfuzz-3.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4750f67e530c1ea793d3764bec14914ace2320c90564a89823e3c49f74dc2b98"}, - {file = "rapidfuzz-3.3.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:0f36304dfc5226c985f6ee399cf840035945fd947c5e47b8418e98e58f913b84"}, - {file = "rapidfuzz-3.3.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:cf97b47a42f0419504b0d099f39408c3ac693150f6abcbfd69c59816d2c5a35a"}, - {file = "rapidfuzz-3.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0f07fb259e9839b1708428a4a3ae0aa8e7919aa69b86bf670f105bb35cde042f"}, - {file = "rapidfuzz-3.3.1-cp38-cp38-win32.whl", hash = "sha256:5eec1540f15bbd9755210de05d363b4023cbd06ce7ee215b636c2061e823446e"}, - {file = "rapidfuzz-3.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:3dd193960ebf93c5a27022863c37fab66a8459636a1c3ea221fefba1e56d5f4d"}, - {file = "rapidfuzz-3.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9a9d2511368973c7f7760baeff7b5c6a4bfdd90dd22fbee3775f32ff2440173d"}, - {file = "rapidfuzz-3.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9736b634b23abcfa23ba6d6f91c92706772a4b146d05eafd52afafa9afdc0600"}, - {file = "rapidfuzz-3.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7038fd90def8971cae57104cb4079ed8dae06dd8a9e640a8a0a1aa0f0aad103"}, - {file = "rapidfuzz-3.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4ab55786e034a55d15110c65dd0b25894fc2098488b0ba2eab445afd134a7c3"}, - {file = "rapidfuzz-3.3.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ef2a2b95090d945d682506816bec0fdf5ad4f711618830c7f80e69260317929"}, - {file = "rapidfuzz-3.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f0a8476d74a8d585fa0dbc3ff88028051976438ff58cb11ca903ac5ee725c718"}, - {file = "rapidfuzz-3.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2944ccfac731da1e7685289754cb43ba7b7dacfb43e5e229eb17eded9c457b1f"}, - {file = "rapidfuzz-3.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcbe35ef42ddca0602b4ebcb2ef9f23a4336595a3ed92a2ad70edb1ba17e2670"}, - {file = "rapidfuzz-3.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2bb0540a29e2616e2ee99ed2e3398344114cf28632e7d662281a2487612ed87f"}, - {file = "rapidfuzz-3.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e3dab2098bc66add2ce5738b4a962a16673925158fe264298512cbc3063ca398"}, - {file = "rapidfuzz-3.3.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:052e107a7da8db68bc650181ae3dd787d582fffed1831c677c26dc09881dd76f"}, - {file = "rapidfuzz-3.3.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:5fa3c364c0dc04c10b5ac843527a977fb627023c4e4afc20af44ba3135c5da74"}, - {file = "rapidfuzz-3.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:430144a0f03b2c182be2014dd505cb55f5e8f62806520f14406a03e299ddb5a5"}, - {file = "rapidfuzz-3.3.1-cp39-cp39-win32.whl", hash = "sha256:349f0db802b77f28bf167d7fa6f713d1daa023287a54f966db55cdfefaef4ff4"}, - {file = "rapidfuzz-3.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:76632c85227306d3d9af2764942f30ed3599d13733d7b8aea6e37e97372d803c"}, - {file = "rapidfuzz-3.3.1-cp39-cp39-win_arm64.whl", hash = "sha256:8ddb50b03a2ab4d48905e9857ff3d58c5e18ba6f5970292731b627dfe05edd57"}, - {file = "rapidfuzz-3.3.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:78fc4d37b67ba808aa50cfcbb906eb75034b38a02beb63fafe8f25cf2344c5f8"}, - {file = "rapidfuzz-3.3.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e50e8b9c95f14ca845a014839afda96e6be3d593fb01f41dbc00a460c443519"}, - {file = "rapidfuzz-3.3.1-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe0a5bc9046aae59cb0d2ea8dc281bf92b4c3a0137354753cc47629a840498ee"}, - {file = "rapidfuzz-3.3.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95ef1e72e0f071200cdcebccac7a9c0b008dfc01c30c280053e37bfef740bfa7"}, - {file = "rapidfuzz-3.3.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:eed25c4a9adf4ea7b16dd1836be180e259fd1172a9771faddb1aeeec9fb1e813"}, - {file = "rapidfuzz-3.3.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28272f5dc9ecb921ea0e25c054b59368ff919e739166e4d065e9a95a3ae0b81d"}, - {file = "rapidfuzz-3.3.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5721ca93a3085db225a4edc7225b1e7ab06d9a0d1d7722c07e9b1a625d704f46"}, - {file = "rapidfuzz-3.3.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f8f999d87cb71baa20b6bf7204bd5f82361de872447e892020be8effdae74df"}, - {file = "rapidfuzz-3.3.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:feb62d6db50455f5bde4468d85f92b4e06fab42adac29c53df3506cd41fed5ec"}, - {file = "rapidfuzz-3.3.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8639f6c800d1bafc004083d735a0977098ca142511150b5084b3b70dee199ab"}, - {file = "rapidfuzz-3.3.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d63def4d0e494e9fc9127567dbb82419686fa43ce96fa4dd63f3688a86c17ab0"}, - {file = "rapidfuzz-3.3.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cad943889da89228bb93b0054252e48e49d6ce82c9851e78ad983902b7012c2d"}, - {file = "rapidfuzz-3.3.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87efcad5c292fd62ebd5734d1758b44d9f664a0cef0802a11f924ad7468a1d8d"}, - {file = "rapidfuzz-3.3.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae0b21be06811cb546f24beada663b9d96dd81423cd353a8f6fa971e88ad210d"}, - {file = "rapidfuzz-3.3.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6409621e49a8f0ec271a571ae363857a0c3600a656ebc5530f12937691ce73fb"}, - {file = "rapidfuzz-3.3.1.tar.gz", hash = "sha256:6783b3852f15ed7567688e2e358757a7b4f38683a915ba5edc6c64f1a3f0b450"}, -] -redis = [ {file = "redis-4.6.0-py3-none-any.whl", hash = "sha256:e2b03db868160ee4591de3cb90d40ebb50a90dd302138775937f6a42b7ed183c"}, {file = "redis-4.6.0.tar.gz", hash = "sha256:585dc516b9eb042a619ef0a39c3d7d55fe81bdb4df09a52c9cdde0d07bf1aa7d"}, ] -redis-pal = [ + +[package.dependencies] +async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""} + +[package.extras] +hiredis = ["hiredis (>=1.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] + +[[package]] +name = "redis-pal" +version = "1.0.0" +description = "Store things in Redis without worrying about types or anything, just do it!" +optional = false +python-versions = ">=3.8,<4.0" +files = [ {file = "redis-pal-1.0.0.tar.gz", hash = "sha256:8e20caf8127056a2d1208d6dd0873643efb8357602193e26c1ada8ed6737fa88"}, {file = "redis_pal-1.0.0-py3-none-any.whl", hash = "sha256:8cbf55c926c761ce9d60803ed66ef2575f351b43c9554fd66f6458d323430bf0"}, ] -requests = [ + +[package.dependencies] +dill = ">=0.3.5,<0.4.0" +redis = ">=4.0,<5.0" + +[[package]] +name = "requests" +version = "2.26.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, ] -requests-oauthlib = [ + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<5)"] + +[[package]] +name = "requests-oauthlib" +version = "1.3.0" +description = "OAuthlib authentication support for Requests." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ {file = "requests-oauthlib-1.3.0.tar.gz", hash = "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a"}, {file = "requests_oauthlib-1.3.0-py2.py3-none-any.whl", hash = "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d"}, ] -requests-toolbelt = [ + +[package.dependencies] +oauthlib = ">=3.0.0" +requests = ">=2.0.0" + +[package.extras] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, ] @@ -4861,22 +3550,66 @@ description = "Python interface to the R language (embedded R)" optional = false python-versions = ">=3.7" files = [ -rpy2 = [ {file = "rpy2-3.5.14-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cb7398adfcb6ca4faefbe856fb7af95eb11722ad18fbfcb4a79dbea1cf71c7c"}, {file = "rpy2-3.5.14-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f35910208e5945b5108b7668bcb58127742f47fc0e8df8b2f4889c86be6f6519"}, {file = "rpy2-3.5.14-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:adbd8e08f67f807fcca8e47473340e233a55c25fffd418081e6719316e03dbd7"}, {file = "rpy2-3.5.14-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:ca95dee528d0a8032913de5fa85b8252b925f389aa2e2219d5314dcf43beeb1e"}, {file = "rpy2-3.5.14.tar.gz", hash = "sha256:5f46ae31d36e117be366ad4ae02493c015ac6ba59ebe3b4cd7200075332fc481"}, ] -rsa = [ + +[package.dependencies] +"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} +cffi = ">=1.10.0" +jinja2 = "*" +packaging = {version = "*", markers = "platform_system == \"Windows\""} +tzlocal = "*" + +[package.extras] +all = ["ipython", "numpy", "pandas (>=1.3.5)", "pytest"] +pandas = ["numpy", "pandas (>=1.3.5)"] +test = ["ipython", "numpy", "pandas (>=1.3.5)", "pytest"] +test-minimal = ["coverage", "pytest", "pytest-cov"] +types = ["mypy", "types-tzlocal"] + +[[package]] +name = "rsa" +version = "4.8" +description = "Pure-Python RSA implementation" +optional = false +python-versions = ">=3.6,<4" +files = [ {file = "rsa-4.8-py3-none-any.whl", hash = "sha256:95c5d300c4e879ee69708c428ba566c59478fd653cc3a22243eeb8ed846950bb"}, {file = "rsa-4.8.tar.gz", hash = "sha256:5c6bd9dc7a543b7fe4304a631f8a8a3b674e2bbfc49c2ae96200cdbe55df6b17"}, ] -ruamel-yaml = [ + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "ruamel-yaml" +version = "0.17.10" +description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +optional = false +python-versions = ">=3" +files = [ {file = "ruamel.yaml-0.17.10-py3-none-any.whl", hash = "sha256:ffb9b703853e9e8b7861606dfdab1026cf02505bade0653d1880f4b2db47f815"}, {file = "ruamel.yaml-0.17.10.tar.gz", hash = "sha256:106bc8d6dc6a0ff7c9196a47570432036f41d556b779c6b4e618085f57e39e67"}, ] -ruamel-yaml-clib = [ + +[package.dependencies] +"ruamel.yaml.clib" = {version = ">=0.1.2", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.10\""} + +[package.extras] +docs = ["ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.6" +description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" +optional = false +python-versions = ">=3.5" +files = [ {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e7be2c5bcb297f5b82fee9c665eb2eb7001d1050deaba8471842979293a80b0"}, {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:066f886bc90cc2ce44df8b5f7acfc6a7e2b2e672713f027136464492b0c34d7c"}, {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:221eca6f35076c6ae472a531afa1c223b9c29377e62936f61bc8e6e8bdc5f9e7"}, @@ -4908,7 +3641,14 @@ ruamel-yaml-clib = [ {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win_amd64.whl", hash = "sha256:825d5fccef6da42f3c8eccd4281af399f21c02b32d98e113dbc631ea6a6ecbc7"}, {file = "ruamel.yaml.clib-0.2.6.tar.gz", hash = "sha256:4ff604ce439abb20794f05613c374759ce10e3595d1867764dd1ae675b85acbd"}, ] -scipy = [ + +[[package]] +name = "scipy" +version = "1.10.1" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = "<3.12,>=3.8" +files = [ {file = "scipy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7354fd7527a4b0377ce55f286805b34e8c54b91be865bac273f527e1b839019"}, {file = "scipy-1.10.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4b3f429188c66603a1a5c549fb414e4d3bdc2a24792e061ffbd607d3d75fd84e"}, {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1553b5dcddd64ba9a0d95355e63fe6c3fc303a8fd77c7bc91e77d61363f7433f"}, @@ -4931,7 +3671,22 @@ scipy = [ {file = "scipy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ff7f37b1bf4417baca958d254e8e2875d0cc23aaadbe65b3d5b3077b0eb23ea"}, {file = "scipy-1.10.1.tar.gz", hash = "sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5"}, ] -seaborn = [ + +[package.dependencies] +numpy = ">=1.19.5,<1.27.0" + +[package.extras] +dev = ["click", "doit (>=0.36.0)", "flake8", "mypy", "pycodestyle", "pydevtool", "rich-click", "typing_extensions"] +doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "seaborn" +version = "0.11.2" +description = "seaborn: statistical data visualization" +optional = false +python-versions = ">=3.6" +files = [ {file = "seaborn-0.11.2-py3-none-any.whl", hash = "sha256:85a6baa9b55f81a0623abddc4a26b334653ff4c6b18c418361de19dbba0ef283"}, {file = "seaborn-0.11.2.tar.gz", hash = "sha256:cf45e9286d40826864be0e3c066f98536982baf701a7caa386511792d61ff4f6"}, ] @@ -4944,13 +3699,13 @@ scipy = ">=1.0" [[package]] name = "selenium" -version = "4.12.0" +version = "4.16.0" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "selenium-4.12.0-py3-none-any.whl", hash = "sha256:b2c48b1440db54a0653300d9955f5421390723d53b36ec835e18de8e13bbd401"}, - {file = "selenium-4.12.0.tar.gz", hash = "sha256:95be6aa449a0ab4ac1198bb9de71bbe9170405e04b9752f4b450dc7292a21828"}, + {file = "selenium-4.16.0-py3-none-any.whl", hash = "sha256:aec71f4e6ed6cb3ec25c9c1b5ed56ae31b6da0a7f17474c7566d303f84e6219f"}, + {file = "selenium-4.16.0.tar.gz", hash = "sha256:b2e987a445306151f7be0e6dfe2aa72a479c2ac6a91b9d5ef2d6dd4e49ad0435"}, ] [package.dependencies] @@ -4975,27 +3730,6 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] -[[package]] -name = "setuptools-scm" -version = "7.1.0" -description = "the blessed package to manage your versions by scm tags" -optional = false -python-versions = ">=3.7" -files = [ - {file = "setuptools_scm-7.1.0-py3-none-any.whl", hash = "sha256:73988b6d848709e2af142aa48c986ea29592bbcfca5375678064708205253d8e"}, - {file = "setuptools_scm-7.1.0.tar.gz", hash = "sha256:6c508345a771aad7d56ebff0e70628bf2b0ec7573762be9960214730de278f27"}, -] - -[package.dependencies] -packaging = ">=20.0" -setuptools = "*" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} -typing-extensions = "*" - -[package.extras] -test = ["pytest (>=6.2)", "virtualenv (>20)"] -toml = ["setuptools (>=42)"] - [[package]] name = "shapely" version = "2.0.1" @@ -5003,19 +3737,6 @@ description = "Manipulation and analysis of geometric objects" optional = false python-versions = ">=3.7" files = [ -selenium = [ - {file = "selenium-4.13.0-py3-none-any.whl", hash = "sha256:f0f9185c01ae249a321529c4e3aa0edc2a900642e61fdbb76988cd72d2762ece"}, - {file = "selenium-4.13.0.tar.gz", hash = "sha256:3c413a4f1b8af67824703195e3b1c19cfb1c3186c799efa035d55fd59d6dd59f"}, -] -setuptools = [ - {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, - {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, -] -setuptools-scm = [ - {file = "setuptools-scm-8.0.3.tar.gz", hash = "sha256:0169fd70197efda2f8c4d0b2a7a3d614431b488116f37b79d031e9e7ec884d8c"}, - {file = "setuptools_scm-8.0.3-py3-none-any.whl", hash = "sha256:813822234453438a13c78d05c8af29918fbc06f88efb33d38f065340bbb48c39"}, -] -shapely = [ {file = "shapely-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b06d031bc64149e340448fea25eee01360a58936c89985cf584134171e05863f"}, {file = "shapely-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9a6ac34c16f4d5d3c174c76c9d7614ec8fe735f8f82b6cc97a46b54f386a86bf"}, {file = "shapely-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:865bc3d7cc0ea63189d11a0b1120d1307ed7a64720a8bfa5be2fde5fc6d0d33f"}, @@ -5070,15 +3791,28 @@ description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ -six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -sniffio = [ + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, ] -sortedcontainers = [ + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +optional = false +python-versions = "*" +files = [ {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, ] @@ -5090,39 +3824,97 @@ description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.8" files = [ -soupsieve = [ {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, ] -tabulate = [ + +[[package]] +name = "tabulate" +version = "0.8.9" +description = "Pretty-print tabular data" +optional = false +python-versions = "*" +files = [ {file = "tabulate-0.8.9-py3-none-any.whl", hash = "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4"}, {file = "tabulate-0.8.9.tar.gz", hash = "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7"}, ] -tblib = [ + +[package.extras] +widechars = ["wcwidth"] + +[[package]] +name = "tblib" +version = "1.7.0" +description = "Traceback serialization library." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ {file = "tblib-1.7.0-py2.py3-none-any.whl", hash = "sha256:289fa7359e580950e7d9743eab36b0691f0310fce64dee7d9c31065b8f723e23"}, {file = "tblib-1.7.0.tar.gz", hash = "sha256:059bd77306ea7b419d4f76016aef6d7027cc8a0785579b5aad198803435f882c"}, ] -text-unidecode = [ + +[[package]] +name = "text-unidecode" +version = "1.3" +description = "The most basic Text::Unidecode port" +optional = false +python-versions = "*" +files = [ {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, ] -toml = [ + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] -tomli = [ + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] -tomlkit = [ + +[[package]] +name = "tomlkit" +version = "0.11.8" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.7" +files = [ {file = "tomlkit-0.11.8-py3-none-any.whl", hash = "sha256:8c726c4c202bdb148667835f68d68780b9a003a9ec34167b6c673b38eff2a171"}, {file = "tomlkit-0.11.8.tar.gz", hash = "sha256:9330fc7faa1db67b541b28e62018c17d20be733177d290a13b24c62d1614e0c3"}, ] -toolz = [ + +[[package]] +name = "toolz" +version = "0.11.2" +description = "List processing tools and functional utilities" +optional = false +python-versions = ">=3.5" +files = [ {file = "toolz-0.11.2-py3-none-any.whl", hash = "sha256:a5700ce83414c64514d82d60bcda8aabfde092d1c1a8663f9200c07fdcc6da8f"}, {file = "toolz-0.11.2.tar.gz", hash = "sha256:6b312d5e15138552f1bda8a4e66c30e236c831b612b2bf0005f8a1df10a4bc33"}, ] -tornado = [ + +[[package]] +name = "tornado" +version = "6.1" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">= 3.5" +files = [ {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, @@ -5188,13 +3980,13 @@ telegram = ["requests"] [[package]] name = "trio" -version = "0.22.2" +version = "0.23.1" description = "A friendly Python library for async concurrency and I/O" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "trio-0.22.2-py3-none-any.whl", hash = "sha256:f43da357620e5872b3d940a2e3589aa251fd3f881b65a608d742e00809b1ec38"}, - {file = "trio-0.22.2.tar.gz", hash = "sha256:3887cf18c8bcc894433420305468388dac76932e9668afa1c49aa3806b6accb3"}, + {file = "trio-0.23.1-py3-none-any.whl", hash = "sha256:bb4abb3f4af23f96679e7c8cdabb8b234520f2498550d2cf63ebfd95f2ce27fe"}, + {file = "trio-0.23.1.tar.gz", hash = "sha256:16f89f7dcc8f7b9dcdec1fcd863e0c039af6d0f9a22f8dfd56f75d75ec73fd48"}, ] [package.dependencies] @@ -5203,31 +3995,32 @@ cffi = {version = ">=1.14", markers = "os_name == \"nt\" and implementation_name exceptiongroup = {version = ">=1.0.0rc9", markers = "python_version < \"3.11\""} idna = "*" outcome = "*" -sniffio = "*" +sniffio = ">=1.3.0" sortedcontainers = "*" [[package]] name = "trio-websocket" -version = "0.10.4" +version = "0.11.1" description = "WebSocket library for Trio" optional = false python-versions = ">=3.7" files = [ - {file = "trio-websocket-0.10.4.tar.gz", hash = "sha256:e66b3db3e2453017431dfbd352081006654e1241c2a6800dc2f43d7df54d55c5"}, - {file = "trio_websocket-0.10.4-py3-none-any.whl", hash = "sha256:c7a620c4013c34b7e4477d89fe76695da1e455e4510a8d7ae13f81c632bdce1d"}, -tqdm = [ - {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, - {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, -] -trio = [ - {file = "trio-0.22.2-py3-none-any.whl", hash = "sha256:f43da357620e5872b3d940a2e3589aa251fd3f881b65a608d742e00809b1ec38"}, - {file = "trio-0.22.2.tar.gz", hash = "sha256:3887cf18c8bcc894433420305468388dac76932e9668afa1c49aa3806b6accb3"}, -] -trio-websocket = [ {file = "trio-websocket-0.11.1.tar.gz", hash = "sha256:18c11793647703c158b1f6e62de638acada927344d534e3c7628eedcb746839f"}, {file = "trio_websocket-0.11.1-py3-none-any.whl", hash = "sha256:520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638"}, ] -tweepy = [ + +[package.dependencies] +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +trio = ">=0.11" +wsproto = ">=0.14" + +[[package]] +name = "tweepy" +version = "4.4.0" +description = "Twitter library for Python" +optional = false +python-versions = ">=3.6" +files = [ {file = "tweepy-4.4.0-py2.py3-none-any.whl", hash = "sha256:cf02c4fbbd027fbc7172c24d03f53f061329ac040b22d201e59592a1cff86364"}, {file = "tweepy-4.4.0.tar.gz", hash = "sha256:8d4b4520271b796fa7efc4c5d5ef3228af4d79f6a4d3ace3900b2778ed8f6f1c"}, ] @@ -5242,17 +4035,6 @@ dev = ["coveralls (>=2.1.0)", "tox (>=3.14.0)"] socks = ["requests[socks] (>=2.11.1,<3)"] test = ["vcrpy (>=1.10.3)"] -[[package]] -name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" -optional = false -python-versions = ">=3.7" -files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, -] - [[package]] name = "tzdata" version = "2023.3" @@ -5260,27 +4042,57 @@ description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ -typing-extensions = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, -] -tzdata = [ {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, ] -tzlocal = [ - {file = "tzlocal-5.0.1-py3-none-any.whl", hash = "sha256:f3596e180296aaf2dbd97d124fe76ae3a0e3d32b258447de7b939b3fd4be992f"}, - {file = "tzlocal-5.0.1.tar.gz", hash = "sha256:46eb99ad4bdb71f3f72b7d24f4267753e240944ecfc16f25d2719ba89827a803"}, + +[[package]] +name = "tzlocal" +version = "5.2" +description = "tzinfo object for the local timezone" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tzlocal-5.2-py3-none-any.whl", hash = "sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8"}, + {file = "tzlocal-5.2.tar.gz", hash = "sha256:8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e"}, ] -unidecode = [ + +[package.dependencies] +"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} +tzdata = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] + +[[package]] +name = "unidecode" +version = "1.3.7" +description = "ASCII transliterations of Unicode text" +optional = false +python-versions = ">=3.5" +files = [ {file = "Unidecode-1.3.7-py3-none-any.whl", hash = "sha256:663a537f506834ed836af26a81b210d90cbde044c47bfbdc0fbbc9f94c86a6e4"}, {file = "Unidecode-1.3.7.tar.gz", hash = "sha256:3c90b4662aa0de0cb591884b934ead8d2225f1800d8da675a7750cbc3bd94610"}, ] -uritemplate = [ + +[[package]] +name = "uritemplate" +version = "4.1.1" +description = "Implementation of RFC 6570 URI Templates" +optional = false +python-versions = ">=3.6" +files = [ {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, ] -urllib3 = [ + +[[package]] +name = "urllib3" +version = "1.26.7" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +files = [ {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, ] @@ -5295,24 +4107,40 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.24.5" +version = "20.25.0" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.5-py3-none-any.whl", hash = "sha256:b80039f280f4919c77b30f1c23294ae357c4c8701042086e3fc005963e4e537b"}, - {file = "virtualenv-20.24.5.tar.gz", hash = "sha256:e8361967f6da6fbdf1426483bfe9fca8287c242ac0bc30429905721cefbff752"}, + {file = "virtualenv-20.25.0-py3-none-any.whl", hash = "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3"}, + {file = "virtualenv-20.25.0.tar.gz", hash = "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b"}, ] [package.dependencies] distlib = ">=0.3.7,<1" filelock = ">=3.12.2,<4" -platformdirs = ">=3.9.1,<4" +platformdirs = ">=3.9.1,<5" [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] +[[package]] +name = "webdriver-manager" +version = "4.0.1" +description = "Library provides the way to automatically manage drivers for different browsers" +optional = false +python-versions = ">=3.7" +files = [ + {file = "webdriver_manager-4.0.1-py2.py3-none-any.whl", hash = "sha256:d7970052295bb9cda2c1a24cf0b872dd2c41ababcc78f7b6b8dc37a41e979a7e"}, + {file = "webdriver_manager-4.0.1.tar.gz", hash = "sha256:25ec177c6a2ce9c02fb8046f1b2732701a9418d6a977967bb065d840a3175d87"}, +] + +[package.dependencies] +packaging = "*" +python-dotenv = "*" +requests = "*" + [[package]] name = "websocket-client" version = "1.2.1" @@ -5320,26 +4148,45 @@ description = "WebSocket client for Python with low level API options" optional = false python-versions = ">=3.6" files = [ -virtualenv = [ - {file = "virtualenv-20.24.5-py3-none-any.whl", hash = "sha256:b80039f280f4919c77b30f1c23294ae357c4c8701042086e3fc005963e4e537b"}, - {file = "virtualenv-20.24.5.tar.gz", hash = "sha256:e8361967f6da6fbdf1426483bfe9fca8287c242ac0bc30429905721cefbff752"}, -] -webdriver-manager = [ - {file = "webdriver_manager-4.0.1-py2.py3-none-any.whl", hash = "sha256:d7970052295bb9cda2c1a24cf0b872dd2c41ababcc78f7b6b8dc37a41e979a7e"}, - {file = "webdriver_manager-4.0.1.tar.gz", hash = "sha256:25ec177c6a2ce9c02fb8046f1b2732701a9418d6a977967bb065d840a3175d87"}, -] -websocket-client = [ {file = "websocket-client-1.2.1.tar.gz", hash = "sha256:8dfb715d8a992f5712fff8c843adae94e22b22a99b2c5e6b0ec4a1a981cc4e0d"}, {file = "websocket_client-1.2.1-py2.py3-none-any.whl", hash = "sha256:0133d2f784858e59959ce82ddac316634229da55b498aac311f1620567a710ec"}, ] -wget = [ + +[package.extras] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + +[[package]] +name = "wget" +version = "3.2" +description = "pure python download utility" +optional = false +python-versions = "*" +files = [ {file = "wget-3.2.zip", hash = "sha256:35e630eca2aa50ce998b9b1a127bb26b30dfee573702782aa982f875e3f16061"}, ] -win32-setctime = [ + +[[package]] +name = "win32-setctime" +version = "1.1.0" +description = "A small Python utility to set file creation time on Windows" +optional = false +python-versions = ">=3.5" +files = [ {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, ] -wsproto = [ + +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + +[[package]] +name = "wsproto" +version = "1.2.0" +description = "WebSockets state-machine based protocol implementation" +optional = false +python-versions = ">=3.7.0" +files = [ {file = "wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736"}, {file = "wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"}, ] @@ -5365,101 +4212,137 @@ test = ["pytest", "pytest-cov"] [[package]] name = "yarl" -version = "1.9.2" +version = "1.9.4" description = "Yet another URL library" optional = false python-versions = ">=3.7" files = [ -yarl = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, - {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, - {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, - {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, - {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, - {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, - {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, -] -zict = [ + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[[package]] +name = "zict" +version = "2.0.0" +description = "Mutable mapping tools" +optional = false +python-versions = "*" +files = [ {file = "zict-2.0.0-py3-none-any.whl", hash = "sha256:26aa1adda8250a78dfc6a78d200bfb2ea43a34752cf58980bca75dde0ba0c6e9"}, {file = "zict-2.0.0.tar.gz", hash = "sha256:8e2969797627c8a663575c2fc6fcb53a05e37cdb83ee65f341fc6e0c3d0ced16"}, ] -zipp = [ + +[package.dependencies] +heapdict = "*" + +[[package]] +name = "zipp" +version = "3.17.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "5bfd6f1711f3ff26b94f4f7eaa9256c08c3dc4e9e3c0717367474a390545c644" +content-hash = "83f1629402d30c3dfa6de1d5a6df7f6f8e5b2e93770dd85c79d200b1876776ee" From aec9ee8490eecbd36df66865d60922a65abd7a23 Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Thu, 14 Dec 2023 12:35:00 -0300 Subject: [PATCH 249/265] feat: add new get_data task --- pipelines/datasets/br_denatran_frota/flows.py | 9 ++- .../datasets/br_denatran_frota/handlers.py | 73 ++++++++++++------- pipelines/datasets/br_denatran_frota/tasks.py | 4 +- pipelines/datasets/br_denatran_frota/utils.py | 4 +- 4 files changed, 56 insertions(+), 34 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index b3a9282d4..90b25fd7e 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -47,7 +47,7 @@ ], ) as br_denatran_frota_uf_tipo: dataset_id = Parameter("dataset_id", default="br_denatran_frota") - table_id = Parameter("table_id", default="uf_tipo") + table_id = Parameter("table_id", default="uf_tipo2") # Materialization mode materialization_mode = Parameter( @@ -65,7 +65,7 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - year_to_fetch = get_latest_data_task("uf_tipo") + year_to_fetch = get_latest_data_task(table_id=table_id, dataset_id=dataset_id) crawled = crawl_task( month=year_to_fetch[1], year=year_to_fetch[0], @@ -159,7 +159,7 @@ ], ) as br_denatran_frota_municipio_tipo: dataset_id = Parameter("dataset_id", default="br_denatran_frota") - table_id = Parameter("table_id", default="municipio_tipo") + table_id = Parameter("table_id", default="municipio_tipo2") # Materialization mode materialization_mode = Parameter( @@ -180,7 +180,7 @@ # inserir get_api_most_recente_date # na função get_latest_data - year_to_fetch = get_latest_data_task("municipio_tipo") + year_to_fetch = get_latest_data_task(table_id=table_id, dataset_id=dataset_id) crawled = crawl_task( month=year_to_fetch[1], @@ -197,6 +197,7 @@ ) # We need to see the year, month from the file to decide on updating extracted_date = get_denatran_date(desired_file, upstream_tasks=[desired_file]) + decision = check_if_data_is_outdated( dataset_id=dataset_id, table_id=table_id, diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index ab8eaa6fb..1dbd34625 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -30,6 +30,7 @@ treat_uf, verify_total, ) +from pipelines.utils.metadata.utils import get_api_most_recent_date from pipelines.utils.utils import clean_dataframe, log, to_partitions MONTHS = constants.MONTHS.value @@ -146,40 +147,58 @@ def get_desired_file(year: int, download_directory: str, filetype: str) -> str: raise ValueError("No files found buckaroo") -def get_latest_data(table_name: str): - denatran_data: pd.DataFrame = get_data_from_prod( - table_id=table_name, dataset_id="br_denatran_frota" - ) +def get_latest_data(table_id: str, dataset_id: str): + # denatran_data: pd.DataFrame = get_data_from_prod( + # table_id=table_name, dataset_id="br_denatran_frota" + # ) # substituir por get_api_most_recente_date aqui # pipelines.utils.metadata.utils.get_api_most_recente_date # ela vai retonar a data mais recente da tabela extraida da api - if not isinstance(denatran_data, pd.DataFrame): - return 2003, 1 - if not denatran_data.empty: - log(denatran_data.head(2)) - year = denatran_data["ano"].max() - month = denatran_data.loc[denatran_data["ano"] == year]["mes"].max() - year = int(year) - month = int(month) - log(year) - log(type(year)) - log(month) - log(type(month)) - if month == 12: - year += 1 - month = 1 - else: - month += 1 - log(f"Ano: {year}, mês: {month}") - return year, month + denatran_data = get_api_most_recent_date( + table_id=table_id, dataset_id=dataset_id, date_format="%Y-%m" + ) + + log(f"{denatran_data}") + year = denatran_data.year + month = denatran_data.month + log(f"Ano: {year}, mês: {month}") + if month == 12: + year += 1 + month = 1 else: - log("Não achei ano não mané") - return 2003, 1 + month += 1 + log(f"Ano: {year}, mês: {month}") + return year, month + + # if not isinstance(denatran_data, pd.DataFrame): + # return 2003, 1 + # if not denatran_data.empty: + # log(denatran_data.head(2)) + # year = denatran_data["ano"].max() + # month = denatran_data.loc[denatran_data["ano"] == year]["mes"].max() + # year = int(year) + # month = int(month) + # log(year) + # log(type(year)) + # log(month) + # log(type(month)) + # if month == 12: + # year += 1 + # month = 1 + # else: + # month += 1 + # log(f"Ano: {year}, mês: {month}") + # return year, month + # else: + # log("Não achei ano não mané") + # return 2003, 1 def treat_municipio_tipo(file: str) -> pl.DataFrame: - bd_municipios = get_data_from_prod( - table_id="municipio", dataset_id="br_bd_diretorios_brasil" + bd_municipios = bd.read_sql( + "select * from `basedosdados.br_bd_diretorios_brasil.municipio`", + billing_project_id="basedosdados-dev", + # from_file=True, ) bd_municipios = pl.from_pandas(bd_municipios) diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 9d97203df..1ace90099 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -53,8 +53,8 @@ def treat_municipio_tipo_task(file: str) -> pl.DataFrame: @task() -def get_latest_data_task(table_name: str) -> tuple[int, int]: - return get_latest_data(table_name) +def get_latest_data_task(table_id: str, dataset_id: str) -> tuple[int, int]: + return get_latest_data(table_id=table_id, dataset_id=dataset_id) @task() diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index d320567ca..c83e84642 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -22,6 +22,7 @@ from string_utils import asciify from pipelines.datasets.br_denatran_frota.constants import constants +from pipelines.utils.utils import log DICT_UFS = constants.DICT_UFS.value SUBSTITUTIONS = constants.SUBSTITUTIONS.value @@ -136,7 +137,8 @@ def get_year_month_from_filename(filename: str) -> tuple[int, int]: if match: month = match.group(2) year = match.group(3) - return month, year + log(f"{year} && {month}") + return int(year), int(month) else: raise ValueError("No match found") From f5685b6b7e1421be590bba943c5b5b525c042b73 Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Thu, 14 Dec 2023 14:41:53 -0300 Subject: [PATCH 250/265] feat: update branch --- .github/workflows/ci.yaml | 4 + .gitignore | 1 + .pre-commit-config.yaml | 2 +- pipelines/datasets/__init__.py | 1 + .../br_anp_precos_combustiveis/flows.py | 25 +- .../br_anp_precos_combustiveis/tasks.py | 43 +- .../br_anp_precos_combustiveis/utils.py | 6 +- pipelines/datasets/br_bcb_agencia/flows.py | 7 +- .../datasets/br_bcb_agencia/schedules.py | 2 +- pipelines/datasets/br_bcb_agencia/tasks.py | 33 +- pipelines/datasets/br_bcb_agencia/utils.py | 105 +--- pipelines/datasets/br_bcb_estban/constants.py | 24 +- pipelines/datasets/br_bcb_estban/flows.py | 40 +- pipelines/datasets/br_bcb_estban/tasks.py | 302 +++++++-- pipelines/datasets/br_bcb_estban/utils.py | 149 +---- .../br_camara_dados_abertos/__init__.py | 0 .../br_camara_dados_abertos/constants.py | 55 ++ .../datasets/br_camara_dados_abertos/flows.py | 586 ++++++++++++++++++ .../br_camara_dados_abertos/schedules.py | 54 ++ .../datasets/br_camara_dados_abertos/tasks.py | 89 +++ .../datasets/br_camara_dados_abertos/utils.py | 157 +++++ .../br_cgu_beneficios_cidadao/flows.py | 22 +- .../br_cgu_beneficios_cidadao/tasks.py | 48 +- .../br_cgu_beneficios_cidadao/utils.py | 74 +-- .../flows.py | 2 +- .../tasks.py | 16 +- .../br_cvm_administradores_carteira/tasks.py | 44 -- pipelines/datasets/br_me_cnpj/tasks.py | 5 +- .../br_mg_belohorizonte_smfa_iptu/flows.py | 28 +- .../schedules.py | 2 +- .../br_mg_belohorizonte_smfa_iptu/tasks.py | 24 +- .../br_mp_pep_cargos_funcoes/tasks.py | 12 +- pipelines/datasets/br_ms_cnes/flows.py | 15 +- pipelines/datasets/br_ms_cnes/tasks.py | 13 +- pipelines/datasets/br_ms_cnes/utils.py | 37 -- .../br_ons_avaliacao_operacao/flows.py | 42 +- .../br_ons_avaliacao_operacao/tasks.py | 89 +-- .../br_ons_avaliacao_operacao/utils.py | 4 +- .../br_ons_estimativa_custos/flows.py | 39 +- .../br_ons_estimativa_custos/tasks.py | 89 +-- .../br_ons_estimativa_custos/utils.py | 7 +- pipelines/datasets/br_rf_cafir/tasks.py | 2 - pipelines/datasets/br_rf_cafir/utils.py | 42 -- .../br_rj_isp_estatisticas_seguranca/flows.py | 16 +- .../schedules.py | 16 +- .../br_rj_isp_estatisticas_seguranca/tasks.py | 14 +- .../datasets/br_stf_corte_aberta/flows.py | 25 +- .../datasets/br_stf_corte_aberta/tasks.py | 21 +- .../datasets/br_stf_corte_aberta/utils.py | 63 -- pipelines/datasets/cross_update/flows.py | 134 +++- pipelines/datasets/cross_update/schedules.py | 18 +- pipelines/datasets/cross_update/tasks.py | 306 ++++----- pipelines/datasets/cross_update/utils.py | 180 +++++- .../constants.py | 24 + .../mundo_transfermarkt_competicoes/utils.py | 128 ++-- .../flows.py | 19 +- .../tasks.py | 30 +- .../apply_architecture_to_dataframe/utils.py | 2 + .../utils/crawler_ibge_inflacao/tasks.py | 24 +- .../utils/crawler_ibge_inflacao/utils.py | 40 -- pipelines/utils/dump_to_gcs/flows.py | 2 +- pipelines/utils/dump_to_gcs/tasks.py | 53 +- pipelines/utils/execute_dbt_model/tasks.py | 6 +- pipelines/utils/metadata/tasks.py | 13 +- pipelines/utils/metadata/utils.py | 25 +- poetry.lock | 146 ++--- pyproject.toml | 1 + 67 files changed, 2121 insertions(+), 1526 deletions(-) create mode 100644 pipelines/datasets/br_camara_dados_abertos/__init__.py create mode 100644 pipelines/datasets/br_camara_dados_abertos/constants.py create mode 100644 pipelines/datasets/br_camara_dados_abertos/flows.py create mode 100644 pipelines/datasets/br_camara_dados_abertos/schedules.py create mode 100644 pipelines/datasets/br_camara_dados_abertos/tasks.py create mode 100644 pipelines/datasets/br_camara_dados_abertos/utils.py diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 9963281e4..d5bd3cb3b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -2,6 +2,10 @@ name: CI on: pull_request: + types: + - opened + - synchronize + - reopened jobs: test: diff --git a/.gitignore b/.gitignore index 0c847e57d..789b6851a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # User defined **/data/ test.py +test.ipynb test_local.py pylint.txt diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 776fb49e4..293896665 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,7 +18,7 @@ repos: - id: black exclude: 'pipelines\/\{\{cookiecutter\.project_name\}\}.*' - repo: https://github.com/pycqa/isort - rev: 5.12.0 + rev: 5.13.0 hooks: - id: isort args: [--profile, black, --skip, "pipelines/{{cookiecutter.project_name}}"] diff --git a/pipelines/datasets/__init__.py b/pipelines/datasets/__init__.py index 1441b7df4..85816ef03 100644 --- a/pipelines/datasets/__init__.py +++ b/pipelines/datasets/__init__.py @@ -18,6 +18,7 @@ from pipelines.datasets.br_bcb_taxa_selic.flows import * from pipelines.datasets.br_bd_indicadores.flows import * from pipelines.datasets.br_bd_metadados.flows import * +from pipelines.datasets.br_camara_dados_abertos.flows import * from pipelines.datasets.br_cgu_beneficios_cidadao.flows import * from pipelines.datasets.br_cgu_pessoal_executivo_federal.flows import * from pipelines.datasets.br_cgu_servidores_executivo_federal.flows import * diff --git a/pipelines/datasets/br_anp_precos_combustiveis/flows.py b/pipelines/datasets/br_anp_precos_combustiveis/flows.py index 886a8661d..d5cc2a0c8 100644 --- a/pipelines/datasets/br_anp_precos_combustiveis/flows.py +++ b/pipelines/datasets/br_anp_precos_combustiveis/flows.py @@ -15,19 +15,20 @@ every_week_anp_microdados, ) from pipelines.datasets.br_anp_precos_combustiveis.tasks import ( - check_for_updates, download_and_transform, + get_data_source_anp_max_date, make_partitions, ) -from pipelines.datasets.br_anp_precos_combustiveis.utils import download_files from pipelines.utils.constants import constants as utils_constants from pipelines.utils.decorators import Flow from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants -from pipelines.utils.metadata.tasks import update_django_metadata +from pipelines.utils.metadata.tasks import ( + check_if_data_is_outdated, + update_django_metadata, +) from pipelines.utils.tasks import ( create_table_and_upload_to_gcs, get_current_flow_labels, - log_task, rename_current_flow_run_dataset_table, ) @@ -54,13 +55,15 @@ ) update_metadata = Parameter("update_metadata", default=True, required=False) - dados_desatualizados = check_for_updates(dataset_id=dataset_id, table_id=table_id) - log_task(f"Checando se os dados estão desatualizados: {dados_desatualizados}") - with case(dados_desatualizados, False): - log_task( - "Dados atualizados, não é necessário fazer o download", - upstream_tasks=[dados_desatualizados], - ) + data_source_max_date = get_data_source_anp_max_date() + + dados_desatualizados = check_if_data_is_outdated( + dataset_id=dataset_id, + table_id=table_id, + data_source_max_date=data_source_max_date, + date_format="%Y-%m-%d", + upstream_tasks=[data_source_max_date], + ) with case(dados_desatualizados, True): df = download_and_transform(upstream_tasks=[rename_flow_run]) diff --git a/pipelines/datasets/br_anp_precos_combustiveis/tasks.py b/pipelines/datasets/br_anp_precos_combustiveis/tasks.py index bdaed6213..fd6a403a2 100644 --- a/pipelines/datasets/br_anp_precos_combustiveis/tasks.py +++ b/pipelines/datasets/br_anp_precos_combustiveis/tasks.py @@ -5,13 +5,12 @@ from datetime import timedelta -import numpy as np import pandas as pd from prefect import task from pipelines.constants import constants from pipelines.datasets.br_anp_precos_combustiveis.constants import ( - constants as anatel_constants, + constants as anp_constants, ) from pipelines.datasets.br_anp_precos_combustiveis.utils import ( creating_column_ano, @@ -26,20 +25,13 @@ rename_and_to_create_endereco, rename_columns, ) -from pipelines.utils.utils import extract_last_date, log @task -def check_for_updates(dataset_id, table_id): - """ - Checks if there are available updates for a specific dataset and table. - - Returns: - bool: Returns True if updates are available, otherwise returns False. - """ +def get_data_source_anp_max_date(): # Obtém a data mais recente do site - download_files(anatel_constants.URLS_DATA.value, anatel_constants.PATH_INPUT.value) - df = pd.read_csv(anatel_constants.URL_GLP.value, sep=";", encoding="utf-8") + download_files(anp_constants.URLS_DATA.value, anp_constants.PATH_INPUT.value) + df = pd.read_csv(anp_constants.URL_GLP.value, sep=";", encoding="utf-8") data_obj = ( df["Data da Coleta"].str[6:10] + "-" @@ -50,20 +42,7 @@ def check_for_updates(dataset_id, table_id): data_obj = data_obj.apply(lambda x: pd.to_datetime(x).strftime("%Y-%m-%d")) data_obj = pd.to_datetime(data_obj, format="%Y-%m-%d").dt.date data_obj = data_obj.max() - # Obtém a última data no site BD - data_bq_obj = extract_last_date( - dataset_id, table_id, "yy-mm-dd", "basedosdados", data="data_coleta" - ) - - # Registra a data mais recente do site - log(f"Última data no site do ANP: {data_obj}") - log(f"Última data no site da BD: {data_bq_obj}") - - # Compara as datas para verificar se há atualizações - if data_obj > data_bq_obj: - return True # Há atualizações disponíveis - else: - return False # Não há novas atualizações disponíveis + return data_obj @task( @@ -71,12 +50,12 @@ def check_for_updates(dataset_id, table_id): retry_delay=timedelta(seconds=constants.TASK_RETRY_DELAY.value), ) def download_and_transform(): - download_files(anatel_constants.URLS.value, anatel_constants.PATH_INPUT.value) + download_files(anp_constants.URLS.value, anp_constants.PATH_INPUT.value) precos_combustiveis = open_csvs( - anatel_constants.URL_DIESEL_GNV.value, - anatel_constants.URL_GASOLINA_ETANOL.value, - anatel_constants.URL_GLP.value, + anp_constants.URL_DIESEL_GNV.value, + anp_constants.URL_GASOLINA_ETANOL.value, + anp_constants.URL_GLP.value, ) df = get_id_municipio(id_municipio=precos_combustiveis) @@ -108,6 +87,6 @@ def make_partitions(df): partition_data( df, column_name="data_coleta", - output_directory=anatel_constants.PATH_OUTPUT.value, + output_directory=anp_constants.PATH_OUTPUT.value, ) - return anatel_constants.PATH_OUTPUT.value + return anp_constants.PATH_OUTPUT.value diff --git a/pipelines/datasets/br_anp_precos_combustiveis/utils.py b/pipelines/datasets/br_anp_precos_combustiveis/utils.py index 7a4b2a970..00ab47d88 100644 --- a/pipelines/datasets/br_anp_precos_combustiveis/utils.py +++ b/pipelines/datasets/br_anp_precos_combustiveis/utils.py @@ -12,7 +12,7 @@ import unidecode from pipelines.datasets.br_anp_precos_combustiveis.constants import ( - constants as anatel_constants, + constants as anp_constants, ) from pipelines.utils.utils import log @@ -190,8 +190,8 @@ def creating_column_ano(precos_combustiveis: pd.DataFrame): def rename_and_reordening(precos_combustiveis: pd.DataFrame): - precos_combustiveis.rename(columns=anatel_constants.RENAME.value, inplace=True) - precos_combustiveis = precos_combustiveis[anatel_constants.ORDEM.value] + precos_combustiveis.rename(columns=anp_constants.RENAME.value, inplace=True) + precos_combustiveis = precos_combustiveis[anp_constants.ORDEM.value] return precos_combustiveis diff --git a/pipelines/datasets/br_bcb_agencia/flows.py b/pipelines/datasets/br_bcb_agencia/flows.py index bc0bbc94a..fa3c1d226 100644 --- a/pipelines/datasets/br_bcb_agencia/flows.py +++ b/pipelines/datasets/br_bcb_agencia/flows.py @@ -73,12 +73,13 @@ with case(check_if_outdated, True): log_task("Existem atualizações! A run será inciada") - temxpes = download_data( - link=agencia_constants.AGENCIA_URL.value, upstream_tasks=[check_if_outdated] + donwload_files = download_data( + dowload_url=data_source_max_date[0], + upstream_tasks=[check_if_outdated], ) filepath = clean_data( - upstream_tasks=[temxpes], + upstream_tasks=[donwload_files], ) wait_upload_table = create_table_and_upload_to_gcs( diff --git a/pipelines/datasets/br_bcb_agencia/schedules.py b/pipelines/datasets/br_bcb_agencia/schedules.py index adefec15b..9c4c19ebd 100644 --- a/pipelines/datasets/br_bcb_agencia/schedules.py +++ b/pipelines/datasets/br_bcb_agencia/schedules.py @@ -14,7 +14,7 @@ clocks=[ CronClock( cron="45 23 10-30 * *", # At 23:45 on every day-of-month from 10 through 30. - start_date=datetime(2023, 11, 28, 0, 0), + start_date=datetime(2023, 11, 30, 0, 0), labels=[ constants.BASEDOSDADOS_PROD_AGENT_LABEL.value, ], diff --git a/pipelines/datasets/br_bcb_agencia/tasks.py b/pipelines/datasets/br_bcb_agencia/tasks.py index 31aaaf76c..7f48126fe 100644 --- a/pipelines/datasets/br_bcb_agencia/tasks.py +++ b/pipelines/datasets/br_bcb_agencia/tasks.py @@ -5,6 +5,7 @@ import os +import time as tm from datetime import timedelta import basedosdados as bd @@ -45,19 +46,23 @@ def extract_most_recent_date(xpath, url): dicionario_data_url = {parse_date(url): url for url in url_list} tupla_data_maxima_url = max(dicionario_data_url.items(), key=lambda x: x[0]) data_maxima = tupla_data_maxima_url[0] - link_data_maxima = tupla_data_maxima_url[1] + url = tupla_data_maxima_url[1] + log(f"---- the most recent date is ->> {data_maxima}") + log(f"---- the select URL is ->> {url}") - return link_data_maxima, data_maxima + return url, data_maxima @task( max_retries=constants.TASK_MAX_RETRIES.value, retry_delay=timedelta(seconds=constants.TASK_RETRY_DELAY.value), ) -def download_data(link: str): +def download_data(dowload_url: str): # select the most recent link - current_link = "https://www.bcb.gov.br" + link + base_url = "https://www.bcb.gov.br" + + current_link = base_url + dowload_url log(f"Downloading file from: {current_link} ") download_and_unzip( @@ -67,6 +72,7 @@ def download_data(link: str): log( f"The file: {os.listdir(agencia_constants.DOWNLOAD_PATH_AGENCIA.value)} was downloaded" ) + tm.sleep(1.5) @task( @@ -84,7 +90,6 @@ def clean_data(): files = os.listdir(path) log(f"file is: {files}") # file = file[1] - log(f"file is: {files}") for file in files: # the files format change across the year @@ -95,7 +100,7 @@ def clean_data(): df = clean_column_names(df) # rename columns df.rename(columns=rename_cols(), inplace=True) - log(df.columns) + # fill left zeros with field range df["id_compe_bcb_agencia"] = ( df["id_compe_bcb_agencia"].astype(str).str.zfill(4) @@ -116,12 +121,12 @@ def clean_data(): # drop ddd column thats going to be added later df.drop(columns=["ddd"], inplace=True) log("ddd removed") - log(df.columns) + # some files doesnt have 'id_municipio', just 'nome'. # to add new ids is necessary to join by name # clean nome municipio - - df = clean_nome_municipio(df) + log("limpando nome muncipio") + df = clean_nome_municipio(df, "nome") municipio = bd.read_sql( query="select * from `basedosdados.br_bd_diretorios_brasil.municipio`", @@ -129,14 +134,12 @@ def clean_data(): ) municipio = municipio[["nome", "sigla_uf", "id_municipio", "ddd"]] - log("municipio dataset successfully downloaded!") - - municipio = clean_nome_municipio(municipio) + municipio = clean_nome_municipio(municipio, "nome") # check if id_municipio already exists + df["sigla_uf"] = df["sigla_uf"].str.strip() if "id_municipio" not in df.columns: # read municipio from bd datalake - # join id_municipio to df df = pd.merge( df, @@ -148,9 +151,6 @@ def clean_data(): # check if ddd already exists, if it doesnt, add it if "ddd" not in df.columns: - # - # read municipio from bd datalake - df = pd.merge( df, municipio[["id_municipio", "ddd"]], @@ -162,7 +162,6 @@ def clean_data(): # clean cep column df["cep"] = df["cep"].astype(str) df["cep"] = df["cep"].apply(remove_non_numeric_chars) - log("cep ok") # cnpj cleaning working df = create_cnpj_col(df) diff --git a/pipelines/datasets/br_bcb_agencia/utils.py b/pipelines/datasets/br_bcb_agencia/utils.py index 67bdcfaa3..65f74cd7a 100644 --- a/pipelines/datasets/br_bcb_agencia/utils.py +++ b/pipelines/datasets/br_bcb_agencia/utils.py @@ -21,8 +21,16 @@ # ---- functions to download data -# todo:colocar check no ano e mes def parse_date(url: str) -> datetime: + """This function parse the date of a br_bcb_agencia url + + Args: + url (str): URL of br_bcb_agencia extracted from https://www.bcb.gov.br/fis/info/agencias.asp?frame=1 + + Returns: + datetime: a date object + """ + padrao = re.compile(r"\d+") numeros = padrao.findall(url) @@ -91,10 +99,6 @@ def find_cnpj_row_number(file_path: str) -> int: return cnpj_row_number -# ! get_column_names deleted; -# ! count_list_values - - def get_conv_names(file_path: str, skiprows: str) -> dict: """get column names from a file to be used as a converter @@ -146,14 +150,14 @@ def read_file(file_path: str, file_name: str) -> pd.DataFrame: skiprows = find_cnpj_row_number(file_path=file_path) + 1 conv = get_conv_names(file_path=file_path, skiprows=skiprows) - df = pd.read_excel(file_path, skiprows=skiprows, converters=conv, skipfooter=1) + df = pd.read_excel(file_path, skiprows=skiprows, converters=conv, skipfooter=2) # todo: rethink logic. file_name param feeds another function create_year_month_cols df = create_year_month_cols(df=df, file=file_name) except Exception as e: log(e) conv = get_conv_names(file_path=file_path, skiprows=9) - df = pd.read_excel(file_path, skiprows=9, converters=conv) + df = pd.read_excel(file_path, skiprows=9, converters=conv, skipfooter=2) df = create_year_month_cols(df=df, file=file_name) return df @@ -169,21 +173,20 @@ def clean_column_names(df: pd.DataFrame) -> pd.DataFrame: DataFrame: a dataframe with cleaned columns """ # Remove leading and trailing whitespaces from column names + log("---- cleaning col names ----") df.columns = df.columns.str.strip() - print("colnames striped") + # Remove accents and special characters from column names df.columns = df.columns.map( lambda x: unicodedata.normalize("NFKD", x) .encode("ascii", "ignore") .decode("utf-8") ) - print("colnames cleaned 1") # Replace remaining special characters with underscores df.columns = df.columns.str.replace(r"[^\w\s]+", "_", regex=True) - print("colnames cleaned 2") # Lowercase all column names df.columns = df.columns.str.lower() - print("colnames to lower") + return df @@ -201,10 +204,12 @@ def create_year_month_cols(df: pd.DataFrame, file: str) -> pd.DataFrame: Returns: pd.DataFrame: a dataframe with month and year columns """ - print(f"{file}") + df["ano"] = file[0:4] df["mes"] = file[4:6] - print(f"year {file[0:4]} and month {file[4:6]} cols created") + log( + f" ---- creating ano and mes columns ----- ano {file[0:4]} mes {file[4:6]} cols created" + ) return df @@ -268,6 +273,7 @@ def order_cols(): "ano", "mes", "sigla_uf", + "nome", "id_municipio", "data_inicio", "cnpj", @@ -287,7 +293,7 @@ def order_cols(): return cols_order -def clean_nome_municipio(df: pd.DataFrame) -> pd.DataFrame: +def clean_nome_municipio(df: pd.DataFrame, col_name: str) -> pd.DataFrame: """perform cleaning operations on the municipio column Args: @@ -296,36 +302,17 @@ def clean_nome_municipio(df: pd.DataFrame) -> pd.DataFrame: Returns: pd.DataFrame: dataframe with municipio cleaned column """ - df["nome"] = df["nome"].apply( + df[col_name] = df[col_name].apply( lambda x: unicodedata.normalize("NFKD", str(x)) .encode("ascii", "ignore") .decode("utf-8") ) - df["nome"] = df["nome"].apply(lambda x: re.sub(r"[^\w\s]", "", x)) - df["nome"] = df["nome"].str.lower() - df["nome"] = df["nome"].str.strip() + df[col_name] = df[col_name].apply(lambda x: re.sub(r"[^\w\s]", "", x)) + df[col_name] = df[col_name].str.lower() + df[col_name] = df[col_name].str.strip() return df -def read_brazilian_municipallity_ids_from_base_dos_dados( - billing_id: str, -) -> pd.DataFrame: - """Download municipio table from base dos dados - - Args: - billing_id (str): BQ billing project id - - Returns: - pd.DataFrame: municipio table from base dos dados - """ - municipio = bd.read_table( - dataset_id="br_bd_diretorios_brasil", - table_id="municipio", - billing_project_id=billing_id, - ) - return municipio - - def remove_latin1_accents_from_df(df): for col in df.columns: df[col] = df[col].apply( @@ -414,51 +401,9 @@ def replace_nan_with_empty_set_coltypes_str(df: pd.DataFrame) -> pd.DataFrame: df (pd.DataFrame): a dataframe Returns: - pd.DataFrame: a datrafaame with all columns as strings and nan values as empty cels + pd.DataFrame: a datrafaame with all columns as strings and nan values representing null values """ for col in df.columns: df[col] = df[col].astype(str) df[col] = df[col].replace("nan", "") return df - - -# function copied from datasets.br_tse_eleicoes.utils -def get_data_from_prod(dataset_id: str, table_id: str, columns: list) -> list: - """ - Get select columns from a table in prod. - """ - - storage = bd.Storage(dataset_id=dataset_id, table_id=table_id) - blobs = list( - storage.client["storage_staging"] - .bucket("basedosdados-dev") - .list_blobs(prefix=f"staging/{storage.dataset_id}/{storage.table_id}/") - ) - - dfs = [] - - for blob in blobs: - partitions = re.findall(r"\w+(?==)", blob.name) - if len(set(partitions) & set(columns)) == 0: - df = pd.read_csv( - blob.public_url, - usecols=columns, - dtype={"id_municipio": str, "id_municipio_bcb": str, "ddd": str}, - ) - dfs.append(df) - else: - columns2add = list(set(partitions) & set(columns)) - for column in columns2add: - columns.remove(column) - df = pd.read_csv( - blob.public_url, - usecols=columns, - dtype={"id_municipio": str, "id_municipio_bcb": str}, - ) - for column in columns2add: - df[column] = blob.name.split(column + "=")[1].split("/")[0] - dfs.append(df) - - df = pd.concat(dfs) - - return df diff --git a/pipelines/datasets/br_bcb_estban/constants.py b/pipelines/datasets/br_bcb_estban/constants.py index 91a4585a7..6ede61f1e 100644 --- a/pipelines/datasets/br_bcb_estban/constants.py +++ b/pipelines/datasets/br_bcb_estban/constants.py @@ -8,9 +8,21 @@ class constants(Enum): # pylint: disable=c0103 ESTBAN_URL = "https://www4.bcb.gov.br/fis/cosif/estban.asp?frame=1" - AGENCIA_XPATH = '//*[@id="ESTBAN_AGENCIA"]' - MUNICIPIO_XPATH = '//*[@id="ESTBAN_MUNICIPIO"]' - DOWNLOAD_PATH_MUNICIPIO = "/tmp/input/municipio/" - DOWNLOAD_PATH_AGENCIA = "/tmp/input/agencia/" - CLEANED_FILES_PATH_MUNICIPIO = "/tmp/output/municipio/" - CLEANED_FILES_PATH_AGENCIA = "/tmp/output/agencia/" + ESTBAN_NEW_URL = "https://www.bcb.gov.br/estatisticas/estatisticabancariamunicipios" + + CSS_INPUT_FIELD_DICT = { + "municipio": "body > app-root > app-root > div > div > main > dynamic-comp > div > div:nth-child(5) > div:nth-child(1) > div > bcb-download-filter > div > ng-select > div > div > div.ng-input > input[type=text]", + "agencia": "body > app-root > app-root > div > div > main > dynamic-comp > div > div:nth-child(5) > div:nth-child(2) > div > bcb-download-filter > div > ng-select > div > div > div.ng-input > input[type=text]", + } + + CSS_DOWNLOAD_BUTTON = { + "municipio": "body > app-root > app-root > div > div > main > dynamic-comp > div > div:nth-child(5) > div:nth-child(1) > div > bcb-download-filter > div > button", + "agencia": "body > app-root > app-root > div > div > main > dynamic-comp > div > div:nth-child(5) > div:nth-child(2) > div > bcb-download-filter > div > button", + } + + ZIPFILE_PATH_MUNICIPIO = "/tmp/br_bcb_estban/municipio/zipfile" + ZIPFILE_PATH_AGENCIA = "/tmp/br_bcb_estban/agencia/zipfile" + INPUT_PATH_MUNICIPIO = "/tmp/br_bcb_estban/municipio/input" + INPUT_PATH_AGENCIA = "/tmp/br_bcb_estban/agencia/input" + OUTPUT_PATH_MUNICIPIO = "/tmp/br_bcb_estban/municipio/output/" + OUTPUT_PATH_AGENCIA = "/tmp/br_bcb_estban/agencia/output/" diff --git a/pipelines/datasets/br_bcb_estban/flows.py b/pipelines/datasets/br_bcb_estban/flows.py index d03ec06f4..692dc426b 100644 --- a/pipelines/datasets/br_bcb_estban/flows.py +++ b/pipelines/datasets/br_bcb_estban/flows.py @@ -21,8 +21,8 @@ from pipelines.datasets.br_bcb_estban.tasks import ( cleaning_agencias_data, cleaning_municipios_data, - download_estban_files, - extract_most_recent_date, + download_estban_selenium, + extract_last_date, get_id_municipio, ) from pipelines.utils.constants import constants as utils_constants @@ -64,16 +64,12 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - data_source_max_date = extract_most_recent_date( - url=br_bcb_estban_constants.ESTBAN_URL.value, - xpath=br_bcb_estban_constants.MUNICIPIO_XPATH.value, - ) + data_source_max_date = extract_last_date(table_id=table_id) - # task check if is outdated check_if_outdated = check_if_data_is_outdated( dataset_id=dataset_id, table_id=table_id, - data_source_max_date=data_source_max_date[1], + data_source_max_date=data_source_max_date[0], date_format="%Y-%m", upstream_tasks=[data_source_max_date], ) @@ -83,15 +79,16 @@ with case(check_if_outdated, True): log_task("Existem atualizações! A run será inciada") - donwload_files = download_estban_files( - link=data_source_max_date[0], - save_path=br_bcb_estban_constants.DOWNLOAD_PATH_MUNICIPIO.value, + + donwload_files = download_estban_selenium( + save_path=br_bcb_estban_constants.ZIPFILE_PATH_MUNICIPIO.value, + table_id=table_id, + date=data_source_max_date[1], ) - municipio = get_id_municipio() + municipio = get_id_municipio(upstream_tasks=[donwload_files]) filepath = cleaning_municipios_data( - path=br_bcb_estban_constants.DOWNLOAD_PATH_MUNICIPIO.value, municipio=municipio, upstream_tasks=[donwload_files, municipio], ) @@ -177,16 +174,13 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - data_source_max_date = extract_most_recent_date( - url=br_bcb_estban_constants.ESTBAN_URL.value, - xpath=br_bcb_estban_constants.AGENCIA_XPATH.value, - ) + data_source_max_date = extract_last_date(table_id=table_id) # task check if is outdated check_if_outdated = check_if_data_is_outdated( dataset_id=dataset_id, table_id=table_id, - data_source_max_date=data_source_max_date[1], + data_source_max_date=data_source_max_date[0], date_format="%Y-%m", upstream_tasks=[data_source_max_date], ) @@ -197,20 +191,20 @@ with case(check_if_outdated, True): log_task("Existem atualizações! A run será inciada") - donwload_files = download_estban_files( - link=data_source_max_date[0], - save_path=br_bcb_estban_constants.DOWNLOAD_PATH_MUNICIPIO.value, + donwload_files = download_estban_selenium( + save_path=br_bcb_estban_constants.ZIPFILE_PATH_AGENCIA.value, + table_id=table_id, + date=data_source_max_date[1], ) # read_file municipio = get_id_municipio() filepath = cleaning_agencias_data( - path=br_bcb_estban_constants.DOWNLOAD_PATH_AGENCIA.value, municipio=municipio, upstream_tasks=[donwload_files, municipio], ) - # 15/16/19/20 sao files problematicos + wait_upload_table = create_table_and_upload_to_gcs( data_path=filepath, dataset_id=dataset_id, diff --git a/pipelines/datasets/br_bcb_estban/tasks.py b/pipelines/datasets/br_bcb_estban/tasks.py index 1c5c0d287..b34d7950d 100644 --- a/pipelines/datasets/br_bcb_estban/tasks.py +++ b/pipelines/datasets/br_bcb_estban/tasks.py @@ -3,12 +3,23 @@ Tasks for br_bcb_estban """ +import datetime as dt import os +import zipfile from datetime import timedelta +from time import sleep import basedosdados as bd import pandas as pd +from bs4 import BeautifulSoup from prefect import task +from selenium import webdriver +from selenium.webdriver.chrome.service import Service as ChromeService +from selenium.webdriver.common.by import By +from selenium.webdriver.common.keys import Keys +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait +from webdriver_manager.chrome import ChromeDriverManager from pipelines.constants import constants from pipelines.datasets.br_bcb_estban.constants import ( @@ -19,14 +30,9 @@ create_id_municipio, create_id_verbete_column, create_month_year_columns, - download_and_unzip, - extract_download_links, - get_data_from_prod, order_cols_municipio, - parse_date, pre_cleaning_for_pivot_long_agencia, pre_cleaning_for_pivot_long_municipio, - read_files, rename_columns_agencia, rename_columns_municipio, standardize_monetary_units, @@ -36,29 +42,94 @@ from pipelines.utils.utils import clean_dataframe, log, to_partitions -@task( - max_retries=constants.TASK_MAX_RETRIES.value, - retry_delay=timedelta(seconds=constants.TASK_RETRY_DELAY.value), -) -def extract_most_recent_date(xpath, url): - # table date - url_list = extract_download_links(url=url, xpath=xpath) +@task +def extract_last_date(table_id: str) -> str: + """This task will extract the last date of agencias or municipios ESTBAN table from + BACEN website using selenium webdriver - dicionario_data_url = {parse_date(url): url for url in url_list} - tupla_data_maxima_url = max(dicionario_data_url.items(), key=lambda x: x[0]) - data_maxima = tupla_data_maxima_url[0] - link_data_maxima = tupla_data_maxima_url[1] + Args: + table_id (str): Table identifier (agencia or municipio) - return link_data_maxima, data_maxima + Returns: + str: The last release date of the table (Y%-m%) and the raw version (m%/%Y) + """ + options = webdriver.ChromeOptions() -@task( - max_retries=constants.TASK_MAX_RETRIES.value, - retry_delay=timedelta(seconds=constants.TASK_RETRY_DELAY.value), -) -def download_estban_files(save_path: str, link: str) -> str: - """This function downloads ESTBAN data from BACEN url, - unzip the csv files and return a path for the raw files + # https://github.com/SeleniumHQ/selenium/issues/11637 + prefs = { + "download.prompt_for_download": False, + "download.directory_upgrade": True, + "safebrowsing.enabled": True, + } + + options.add_experimental_option( + "prefs", + prefs, + ) + + options.add_argument("--headless=new") + # NOTE: The traditional --headless, and since version 96, Chrome has a new headless mode that allows users to get the full browser functionality (even run extensions). Between versions 96 to 108 it was --headless=chrome, after version 109 --headless=new + options.add_argument("--test-type") + options.add_argument("--disable-gpu") + options.add_argument("--no-first-run") + options.add_argument("--no-sandbox") + options.add_argument("--disable-dev-shm-usage") + options.add_argument("--no-default-browser-check") + options.add_argument("--ignore-certificate-errors") + options.add_argument("--start-maximized") + options.add_argument( + "user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" + ) + + driver = webdriver.Chrome( + service=ChromeService(ChromeDriverManager().install()), options=options + ) + + log("iniatilizing drivermanager") + log(f"using url {br_bcb_estban_constants.ESTBAN_NEW_URL.value}") + driver.get(br_bcb_estban_constants.ESTBAN_NEW_URL.value) + + # select input field and click on it + log( + f"searching for ---- {br_bcb_estban_constants.CSS_INPUT_FIELD_DICT.value[table_id]} to click on" + ) + input_field = WebDriverWait(driver, 20).until( + EC.element_to_be_clickable( + ( + By.CSS_SELECTOR, + br_bcb_estban_constants.CSS_INPUT_FIELD_DICT.value[table_id], + ) + ) + ) + + assert input_field.is_displayed() + + input_field.click() + + # parse source code + page_source = driver.page_source + + # find class ng-option ng-option-marked + soup = BeautifulSoup(page_source, "html.parser") + raw_date = soup.find("div", class_="ng-option ng-option-marked").get_text() + + # format it to %Y-%m + date = dt.datetime.strptime(raw_date, "%m/%Y").strftime("%Y-%m") + + log(f"The most recent file date is ->>>> {date}") + + # quit driver session + driver.quit() + + # return date, raw_date + return date, raw_date + + +@task +def download_estban_selenium(save_path: str, table_id: str, date: str) -> str: + """This function downloads ESTBAN data from BACEN url using selenium webdriver + and downloads it Args: @@ -68,12 +139,81 @@ def download_estban_files(save_path: str, link: str) -> str: str: The path to the estban files """ - file = "https://www4.bcb.gov.br" + link + if not os.path.exists(save_path): + os.makedirs(save_path, exist_ok=True) + + options = webdriver.ChromeOptions() - download_and_unzip(file, path=save_path) + # https://github.com/SeleniumHQ/selenium/issues/11637 + prefs = { + "download.default_directory": save_path, + "download.prompt_for_download": False, + "download.directory_upgrade": True, + "safebrowsing.enabled": True, + } + + options.add_experimental_option( + "prefs", + prefs, + ) + + options.add_argument("--headless=new") + options.add_argument("--test-type") + options.add_argument("--disable-gpu") + options.add_argument("--no-first-run") + options.add_argument("--no-sandbox") + options.add_argument("--disable-dev-shm-usage") + options.add_argument("--no-default-browser-check") + options.add_argument("--ignore-certificate-errors") + options.add_argument("--start-maximized") + options.add_argument( + "user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" + ) + log("iniatilizing drivermanager") + log(f"using url {br_bcb_estban_constants.ESTBAN_NEW_URL.value}") + + driver = webdriver.Chrome( + service=ChromeService(ChromeDriverManager().install()), options=options + ) + + driver.get(br_bcb_estban_constants.ESTBAN_NEW_URL.value) + driver.implicitly_wait(2) + + # select input field and send keys + log("looking for input field and sending keys") + input_field = WebDriverWait(driver, 20).until( + EC.element_to_be_clickable( + ( + By.CSS_SELECTOR, + br_bcb_estban_constants.CSS_INPUT_FIELD_DICT.value[table_id], + ) + ) + ) + + assert input_field.is_displayed() + + driver.execute_script("arguments[0].scrollIntoView();", input_field) + input_field.click() + input_field.send_keys(date) + input_field.send_keys(Keys.ENTER) + + log("looking for input field and sending keys") + # click button to download file + sleep(2) + download_button = WebDriverWait(driver, 20).until( + EC.element_to_be_clickable( + ( + By.CSS_SELECTOR, + br_bcb_estban_constants.CSS_DOWNLOAD_BUTTON.value[table_id], + ) + ) + ) + download_button.click() + # Sleep time to wait the download + sleep(12) log("download task successfully !") - log(f"files {os.listdir(save_path)} were downloaded and unzipped") + log(f"files {os.listdir(save_path)} were downloaded") return save_path @@ -98,30 +238,53 @@ def get_id_municipio() -> pd.DataFrame: # 2. clean data -@task( - max_retries=constants.TASK_MAX_RETRIES.value, - retry_delay=timedelta(seconds=constants.TASK_RETRY_DELAY.value), -) -def cleaning_municipios_data(path, municipio): +@task +def cleaning_municipios_data(municipio: pd.DataFrame) -> str: """Perform data cleaning operations with estban municipios data Args: df: a raw municipios estban dataset Returns: - df: a standardized partitioned estban dataset + str: file path to a standardized partitioned estban dataset """ + ZIP_PATH = br_bcb_estban_constants.ZIPFILE_PATH_MUNICIPIO.value + INPUT_PATH = br_bcb_estban_constants.INPUT_PATH_MUNICIPIO.value + OUTPUT_PATH = br_bcb_estban_constants.OUTPUT_PATH_MUNICIPIO.value + + log("building paths") + if not os.path.exists(INPUT_PATH): + os.makedirs(INPUT_PATH, exist_ok=True) - files = os.listdir(path) - log(f"the following files will be cleaned: {files}") + if not os.path.exists(OUTPUT_PATH): + os.makedirs(OUTPUT_PATH, exist_ok=True) - for file in files: + zip_files = os.listdir(ZIP_PATH) + log(f"unziping files ----> {zip_files}") + for file in zip_files: + if file.endswith(".csv.zip"): + log(f"Unziping file ----> : {file}") + with zipfile.ZipFile(os.path.join(ZIP_PATH, file), "r") as z: + z.extractall(INPUT_PATH) + + csv_files = os.listdir(INPUT_PATH) + + for file in csv_files: log(f"the file being cleaned is:{file}") - build_complete_file_path = os.path.join(path, file) + file_path = os.path.join(INPUT_PATH, file) - log(f"building {build_complete_file_path}") - df = read_files(build_complete_file_path) + log(f"building {file_path}") + + df = pd.read_csv( + file_path, + sep=";", + index_col=None, + encoding="latin-1", + skipfooter=2, + skiprows=2, + dtype={"CNPJ": str, "CODMUN": str}, + ) log("reading file") df = rename_columns_municipio(df) @@ -158,40 +321,61 @@ def cleaning_municipios_data(path, municipio): to_partitions( df, partition_columns=["ano", "mes", "sigla_uf"], - savepath=br_bcb_estban_constants.CLEANED_FILES_PATH_MUNICIPIO.value, + savepath=OUTPUT_PATH, ) del df - return br_bcb_estban_constants.CLEANED_FILES_PATH_MUNICIPIO.value + return OUTPUT_PATH -# 2. clean data -@task( - max_retries=constants.TASK_MAX_RETRIES.value, - retry_delay=timedelta(seconds=constants.TASK_RETRY_DELAY.value), -) -def cleaning_agencias_data(path, municipio): +@task +def cleaning_agencias_data(municipio: pd.DataFrame) -> str: """Perform data cleaning operations with estban municipios data Args: df: a raw municipios estban dataset Returns: - df: a standardized partitioned estban dataset + str: file path to a standardized partitioned estban dataset """ - # limit to 10 for testing purposes - # be aware, relie only in .csv files its not that good - # cause bacen can change file format - files = os.listdir(path) - log(f"the following files will be cleaned: {files}") + ZIP_PATH = br_bcb_estban_constants.ZIPFILE_PATH_AGENCIA.value + INPUT_PATH = br_bcb_estban_constants.INPUT_PATH_AGENCIA.value + OUTPUT_PATH = br_bcb_estban_constants.OUTPUT_PATH_AGENCIA.value + + log("building paths") + if not os.path.exists(INPUT_PATH): + os.makedirs(INPUT_PATH, exist_ok=True) + + if not os.path.exists(OUTPUT_PATH): + os.makedirs(OUTPUT_PATH, exist_ok=True) + + zip_files = os.listdir(ZIP_PATH) + log(f"unziping files ----> {zip_files}") + for file in zip_files: + if file.endswith(".csv.zip"): + log(f"Unziping file ----> : {file}") + with zipfile.ZipFile(os.path.join(ZIP_PATH, file), "r") as z: + z.extractall(INPUT_PATH) - for file in files: + csv_files = os.listdir(INPUT_PATH) + + for file in csv_files: log(f"the file being cleaned is:{file}") - build_complete_file_path = os.path.join(path, file) - log(f"building {build_complete_file_path}") - df = read_files(build_complete_file_path) + file_path = os.path.join(INPUT_PATH, file) + + log(f"building {file_path}") + + df = pd.read_csv( + file_path, + sep=";", + index_col=None, + encoding="latin-1", + skipfooter=2, + skiprows=2, + dtype={"CNPJ": str, "CODMUN": str}, + ) log("reading file") df = rename_columns_agencia(df) @@ -225,9 +409,9 @@ def cleaning_agencias_data(path, municipio): to_partitions( df, partition_columns=["ano", "mes", "sigla_uf"], - savepath=br_bcb_estban_constants.CLEANED_FILES_PATH_AGENCIA.value, + savepath=OUTPUT_PATH, ) del df - return br_bcb_estban_constants.CLEANED_FILES_PATH_AGENCIA.value + return OUTPUT_PATH diff --git a/pipelines/datasets/br_bcb_estban/utils.py b/pipelines/datasets/br_bcb_estban/utils.py index e8cb12b89..794d8a545 100644 --- a/pipelines/datasets/br_bcb_estban/utils.py +++ b/pipelines/datasets/br_bcb_estban/utils.py @@ -2,103 +2,13 @@ """ General purpose functions for the br_bcb_estban project """ -import os + import re -import unicodedata -from datetime import datetime -from io import BytesIO -from urllib.request import urlopen -from zipfile import ZipFile -import basedosdados as bd import numpy as np import pandas as pd -import requests -from lxml import html - -from pipelines.utils.utils import log - -# ------- macro etapa 1 download de dados -###### - - -# todo:colocar check no ano e mes -def parse_date(url: str) -> datetime: - padrao = re.compile(r"\d+") - - numeros = padrao.findall(url) - data = datetime(int(numeros[0][0:4]), int(numeros[0][4:6]), 1) - - return data - - -def extract_download_links(url, xpath): - """extract all download links from bcb agencias website - - Args: - url (str): bcb url https://www.bcb.gov.br/fis/info/agencias.asp?frame=1 - xpath (str): xpath which contais donwload links - - Returns: - list: a list of file links - """ - # Send a GET request to the URL - response = requests.get(url) - - # Parse the HTML content of the response using lxml - tree = html.fromstring(response.content) - - # Extract all the values from the given XPath - values = tree.xpath(xpath + "/option/@value") - - return values - - -def download_and_unzip(url, path): - """download and unzip a zip file - - Args: - url (str): a url - - - Returns: - list: unziped files in a given folder - """ - os.system(f"mkdir -p {path}") - http_response = urlopen(url) - zipfile = ZipFile(BytesIO(http_response.read())) - zipfile.extractall(path=path) - - return path - - -# ------- macro etapa 2 tratamento de dados -# --- read files -def read_files(path: str) -> pd.DataFrame: - """This function read a file from a given path - - Args: - path (str): a path to a file - - Returns: - pd.DataFrame: a dataframe with the file data - """ - df = pd.read_csv( - path, - sep=";", - index_col=None, - encoding="latin-1", - skipfooter=2, - skiprows=2, - dtype={"CNPJ": str, "CODMUN": str}, - ) - - return df - - -# ---1. rename columns def rename_columns_municipio(df: pd.DataFrame) -> pd.DataFrame: """this function rename columns from municipio dataframe @@ -138,12 +48,6 @@ def rename_columns_agencia(df: pd.DataFrame) -> pd.DataFrame: return df -# ---2 remove accents from a string -# clean_dataframe and remove_columns_accents from pipelines.utils.utils -# will be used -# change inputs - - def pre_cleaning_for_pivot_long_municipio(df: pd.DataFrame) -> pd.DataFrame: """This function drop and rename columns before the pivoting operation performed by the wide_to_long function. @@ -269,8 +173,7 @@ def wide_to_long_agencia(df: pd.DataFrame) -> pd.DataFrame: return df -# todo: to func:corrige unidades monetárias -def condicoes(database, valor) -> None: +def condicoes(database: str, valor: float) -> None: # cruzado if database <= 198812: return round(valor / (1000**2 * 2750), 6) @@ -288,7 +191,6 @@ def condicoes(database, valor) -> None: return round(valor, 0) -# todo: not str types. they're arrays i think def standardize_monetary_units( df: pd.DataFrame, date_column, value_column ) -> pd.DataFrame: @@ -308,7 +210,6 @@ def standardize_monetary_units( return df -# todo: to func:extrai os ids dos verbetes def create_id_verbete_column(df: pd.DataFrame, column_name: str) -> pd.DataFrame: """This function creates id_verbete column from a verbete column. It parses numeric digitis from the verbete column strings. @@ -327,13 +228,11 @@ def create_id_verbete_column(df: pd.DataFrame, column_name: str) -> pd.DataFrame return df -# todo: to func:criar ano e mes -# criar ano e mes def create_month_year_columns(df: pd.DataFrame, date_column: str) -> pd.DataFrame: """This function creates month and year columns from a date column. It Relies on the date column being a string in the format YYYYMM, where YYYY is the year and MM is the month. - # todo: introduce some kind of check to the date column from estban files + Args: df (pd.DataFrame): a ESTBAN municipios or agencia file @@ -393,45 +292,3 @@ def cols_order_agencia(df: pd.DataFrame) -> pd.DataFrame: df = df[order] return df - - -# function copied from datasets.br_tse_eleicoes.utils -def get_data_from_prod(dataset_id: str, table_id: str, columns: list) -> list: - """ - Get select columns from a table in prod. - """ - - storage = bd.Storage(dataset_id=dataset_id, table_id=table_id) - blobs = list( - storage.client["storage_staging"] - .bucket("basedosdados-dev") - .list_blobs(prefix=f"staging/{storage.dataset_id}/{storage.table_id}/") - ) - - dfs = [] - - for blob in blobs: - partitions = re.findall(r"\w+(?==)", blob.name) - if len(set(partitions) & set(columns)) == 0: - df = pd.read_csv( - blob.public_url, - usecols=columns, - dtype={"id_municipio": str, "id_municipio_bcb": str}, - ) - dfs.append(df) - else: - columns2add = list(set(partitions) & set(columns)) - for column in columns2add: - columns.remove(column) - df = pd.read_csv( - blob.public_url, - usecols=columns, - dtype={"id_municipio": str, "id_municipio_bcb": str}, - ) - for column in columns2add: - df[column] = blob.name.split(column + "=")[1].split("/")[0] - dfs.append(df) - - df = pd.concat(dfs) - - return df diff --git a/pipelines/datasets/br_camara_dados_abertos/__init__.py b/pipelines/datasets/br_camara_dados_abertos/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pipelines/datasets/br_camara_dados_abertos/constants.py b/pipelines/datasets/br_camara_dados_abertos/constants.py new file mode 100644 index 000000000..f83d71d73 --- /dev/null +++ b/pipelines/datasets/br_camara_dados_abertos/constants.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +from enum import Enum + + +class constants(Enum): + TABLE_NAME_ARCHITECTURE = { + "votacao_proposicao_afetada": "https://docs.google.com/spreadsheets/d/1sHBdS7dgGAWlegMs1rEy6OwUVDwTLcZy92pFX6U5rXM/edit#gid=0", + "voto_parlamentar": "https://docs.google.com/spreadsheets/d/171Mykmg5qz54Kp35XgSD_IshngQHYE3jfGZ8yL-wEpE/edit#gid=0", + "votacao_microdados": "https://docs.google.com/spreadsheets/d/1GZjzBqAQ5RqaB6kyOjD7iZeKSPxB07lAkZnvaGjREIY/edit#gid=0", + "votacao_objeto": "https://docs.google.com/spreadsheets/d/1w2r5eK8jx3SwMTo83LKiI-wK_UE26SlTrJFqe_GZw4E/edit#gid=0", + "votacao_orientacao_bancada": "https://docs.google.com/spreadsheets/d/1_gl5llaGw5Mr0A6Q8AUoHHiOiEGl7Ht8Yf3p2n4k8uA/edit#gid=0", + } + + INPUT_PATH = "/tmp/input/" + OUTPUT_PATH = "/tmp/output/" + + ANOS = [2023] + + TABLE_LIST = { + "votacao_microdados": "votacoes", + "votacao_orientacao_bancada": "votacoesOrientacoes", + "voto_parlamentar": "votacoesVotos", + "votacao_objeto": "votacoesObjetos", + "votacao_proposicao_afetada": "votacoesProposicoes", + } + + RENAME_COLUMNS_OBJETO = { + "ano": "ano", + "idVotacao": "id_votacao", + "uriVotacao": "uriVotacao", + "data": "data", + "descricao": "descricao", + "proposicao_id": "id_proposicao", + "proposicao_uri": "proposicao_uri", + "proposicao_ementa": "ementa", + "proposicao_codTipo": "codigo_tipo", + "proposicao_siglaTipo": "sigla_tipo", + "proposicao_numero": "numero", + "proposicao_ano": "ano_proposicao", + "proposicao_titulo": "titulo", + } + + # ------------------------------------------------------------> DEPUTADOS + + TABLE_LIST_DEPUTADOS = { + "deputados": "deputados", + "deputado_ocupacao": "deputadosOcupacoes", + "deputado_profissao": "deputadosProfissoes", + } + + TABLE_NAME_ARCHITECTURE_DEPUTADOS = { + "deputados": "https://docs.google.com/spreadsheets/d/1qfcR5CyUxwa4423mtA8q_XAbgDOEFcPHtKmsg7ZpgyU/edit#gid=0", + "deputado_ocupacao": "https://docs.google.com/spreadsheets/d/1Cj6WE3jk63p21IjrINeaYKoMSOGoDDf1XpY3UH8sct4/edit#gid=0", + "deputado_profissao": "https://docs.google.com/spreadsheets/d/12R2OY7eqUKxuojcpYYBsCiHyzUOLBBdObnkuv2JUMNI/edit#gid=0", + } diff --git a/pipelines/datasets/br_camara_dados_abertos/flows.py b/pipelines/datasets/br_camara_dados_abertos/flows.py new file mode 100644 index 000000000..09c9a2afd --- /dev/null +++ b/pipelines/datasets/br_camara_dados_abertos/flows.py @@ -0,0 +1,586 @@ +# -*- coding: utf-8 -*- + +# register flow in prefect + +from datetime import timedelta + +from prefect import Parameter, case +from prefect.run_configs import KubernetesRun +from prefect.storage import GCS +from prefect.tasks.prefect import create_flow_run, wait_for_flow_run + +from pipelines.constants import constants +from pipelines.datasets.br_camara_dados_abertos.schedules import ( + every_day_camara_dados_abertos, + every_day_camara_dados_abertos_deputados, +) +from pipelines.datasets.br_camara_dados_abertos.tasks import ( + download_files_and_get_max_date, + download_files_and_get_max_date_deputados, + make_partitions, + treat_and_save_table, +) +from pipelines.utils.constants import constants as utils_constants +from pipelines.utils.decorators import Flow +from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants +from pipelines.utils.metadata.tasks import ( + check_if_data_is_outdated, + update_django_metadata, +) +from pipelines.utils.tasks import ( + create_table_and_upload_to_gcs, + get_current_flow_labels, + log_task, + rename_current_flow_run_dataset_table, +) + +with Flow(name="br_camara_dados_abertos.votacao", code_owners=["trick"]) as br_camara: + # Parameters + dataset_id = Parameter( + "dataset_id", default="br_camara_dados_abertos", required=True + ) + table_id = Parameter( + "table_id", + default=[ + "votacao_microdados", + "votacao_objeto", + "votacao_orientacao_bancada", + "voto_parlamentar", + "votacao_proposicao_afetada", + ], + required=True, + ) + + materialization_mode = Parameter( + "materialization_mode", default="prod", required=False + ) + materialize_after_dump = Parameter( + "materialize_after_dump", default=True, required=False + ) + dbt_alias = Parameter("dbt_alias", default=True, required=False) + + rename_flow_run = rename_current_flow_run_dataset_table( + prefix="Dump: ", + dataset_id=dataset_id, + table_id=table_id[0], + wait=table_id[0], + ) + + update_metadata = Parameter("update_metadata", default=True, required=False) + data_source_max_date = download_files_and_get_max_date() + + dados_desatualizados = check_if_data_is_outdated( + dataset_id=dataset_id, + table_id=table_id[0], + data_source_max_date=data_source_max_date, + date_format="%Y-%m-%d", + upstream_tasks=[data_source_max_date], + ) + + with case(dados_desatualizados, False): + log_task("Não há atualizações!") + + with case(dados_desatualizados, True): + # ! ---------------------------------------- > Votacao - Microdados + + filepath_microdados = make_partitions( + table_id="votacao_microdados", + date_column="data", + upstream_tasks=[rename_flow_run], + ) + wait_upload_table = create_table_and_upload_to_gcs( + data_path=filepath_microdados, + dataset_id=dataset_id, + table_id=table_id[0], + dump_mode="append", + wait=filepath_microdados, + ) + with case(materialize_after_dump, True): + # Trigger DBT flow run + current_flow_labels = get_current_flow_labels() + materialization_flow = create_flow_run( + flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, + project_name=constants.PREFECT_DEFAULT_PROJECT.value, + parameters={ + "dataset_id": dataset_id, + "table_id": table_id[0], + "mode": materialization_mode, + "dbt_alias": dbt_alias, + }, + labels=current_flow_labels, + run_name=f"Materialize {dataset_id}.{table_id[0]}", + ) + + wait_for_materialization = wait_for_flow_run( + materialization_flow, + stream_states=True, + stream_logs=True, + raise_final_state=True, + ) + wait_for_materialization.max_retries = ( + dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value + ) + wait_for_materialization.retry_delay = timedelta( + seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value + ) + + with case(update_metadata, True): + update_django_metadata( + dataset_id, + table_id[0], + date_column_name={"date": "data"}, + date_format="%Y-%m-%d", + coverage_type="part_bdpro", + time_delta={"months": 6}, + prefect_mode=materialization_mode, + bq_project="basedosdados", + upstream_tasks=[wait_for_materialization], + ) + + # ! ---------------------------------------- > Votacao - objeto + + filepath_objeto = make_partitions( + table_id="votacao_objeto", + date_column="data", + upstream_tasks=[rename_flow_run], + ) + wait_upload_table = create_table_and_upload_to_gcs( + data_path=filepath_objeto, + dataset_id=dataset_id, + table_id=table_id[1], + dump_mode="append", + wait=filepath_objeto, + ) + with case(materialize_after_dump, True): + # Trigger DBT flow run + current_flow_labels = get_current_flow_labels() + materialization_flow = create_flow_run( + flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, + project_name=constants.PREFECT_DEFAULT_PROJECT.value, + parameters={ + "dataset_id": dataset_id, + "table_id": table_id[1], + "mode": materialization_mode, + "dbt_alias": dbt_alias, + }, + labels=current_flow_labels, + run_name=f"Materialize {dataset_id}.{table_id[1]}", + ) + + wait_for_materialization = wait_for_flow_run( + materialization_flow, + stream_states=True, + stream_logs=True, + raise_final_state=True, + ) + wait_for_materialization.max_retries = ( + dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value + ) + wait_for_materialization.retry_delay = timedelta( + seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value + ) + + with case(update_metadata, True): + update_django_metadata( + dataset_id, + table_id[1], + date_column_name={"date": "data"}, + date_format="%Y-%m-%d", + coverage_type="part_bdpro", + time_delta={"months": 6}, + prefect_mode=materialization_mode, + bq_project="basedosdados", + upstream_tasks=[wait_for_materialization], + ) + + # ! ---------------------------------------- > Votacao - Parlamentar + + filepath_parlamentar = make_partitions( + table_id="voto_parlamentar", + date_column="dataHoraVoto", + upstream_tasks=[rename_flow_run], + ) + wait_upload_table = create_table_and_upload_to_gcs( + data_path=filepath_parlamentar, + dataset_id=dataset_id, + table_id=table_id[3], + dump_mode="append", + wait=filepath_parlamentar, + ) + with case(materialize_after_dump, True): + # Trigger DBT flow run + current_flow_labels = get_current_flow_labels() + materialization_flow = create_flow_run( + flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, + project_name=constants.PREFECT_DEFAULT_PROJECT.value, + parameters={ + "dataset_id": dataset_id, + "table_id": table_id[3], + "mode": materialization_mode, + "dbt_alias": dbt_alias, + }, + labels=current_flow_labels, + run_name=f"Materialize {dataset_id}.{table_id[3]}", + ) + + wait_for_materialization = wait_for_flow_run( + materialization_flow, + stream_states=True, + stream_logs=True, + raise_final_state=True, + ) + wait_for_materialization.max_retries = ( + dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value + ) + wait_for_materialization.retry_delay = timedelta( + seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value + ) + + with case(update_metadata, True): + update_django_metadata( + dataset_id, + table_id[3], + date_column_name={"date": "data"}, + date_format="%Y-%m-%d", + coverage_type="part_bdpro", + time_delta={"months": 6}, + prefect_mode=materialization_mode, + bq_project="basedosdados", + upstream_tasks=[wait_for_materialization], + ) + + # ! ---------------------------------------- > Votacao - Proposicao + + filepath_proposicao = make_partitions( + table_id="votacao_proposicao_afetada", + date_column="data", + upstream_tasks=[rename_flow_run], + ) + wait_upload_table = create_table_and_upload_to_gcs( + data_path=filepath_proposicao, + dataset_id=dataset_id, + table_id=table_id[4], + dump_mode="append", + wait=filepath_proposicao, + ) + with case(materialize_after_dump, True): + # Trigger DBT flow run + current_flow_labels = get_current_flow_labels() + materialization_flow = create_flow_run( + flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, + project_name=constants.PREFECT_DEFAULT_PROJECT.value, + parameters={ + "dataset_id": dataset_id, + "table_id": table_id[4], + "mode": materialization_mode, + "dbt_alias": dbt_alias, + }, + labels=current_flow_labels, + run_name=f"Materialize {dataset_id}.{table_id[4]}", + ) + + wait_for_materialization = wait_for_flow_run( + materialization_flow, + stream_states=True, + stream_logs=True, + raise_final_state=True, + ) + wait_for_materialization.max_retries = ( + dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value + ) + wait_for_materialization.retry_delay = timedelta( + seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value + ) + + with case(update_metadata, True): + update_django_metadata( + dataset_id, + table_id[4], + date_column_name={"date": "data"}, + date_format="%Y-%m-%d", + coverage_type="part_bdpro", + time_delta={"months": 6}, + prefect_mode=materialization_mode, + bq_project="basedosdados", + upstream_tasks=[wait_for_materialization], + ) + + # ! ---------------------------------------- > Votacao - Orientacao -- Não tem data + + filepath_orientacao = make_partitions( + table_id="votacao_orientacao_bancada", + date_column="data", + upstream_tasks=[rename_flow_run], + ) + wait_upload_table = create_table_and_upload_to_gcs( + data_path=filepath_orientacao, + dataset_id=dataset_id, + table_id=table_id[2], + dump_mode="append", + wait=filepath_orientacao, + ) + with case(materialize_after_dump, True): + # Trigger DBT flow run + current_flow_labels = get_current_flow_labels() + materialization_flow = create_flow_run( + flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, + project_name=constants.PREFECT_DEFAULT_PROJECT.value, + parameters={ + "dataset_id": dataset_id, + "table_id": table_id[2], + "mode": materialization_mode, + "dbt_alias": dbt_alias, + }, + labels=current_flow_labels, + run_name=f"Materialize {dataset_id}.{table_id[2]}", + ) + + wait_for_materialization = wait_for_flow_run( + materialization_flow, + stream_states=True, + stream_logs=True, + raise_final_state=True, + ) + wait_for_materialization.max_retries = ( + dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value + ) + wait_for_materialization.retry_delay = timedelta( + seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value + ) + + # ! ---------------------------------------------------> Não tem data. Precisaremos usar o historical_database + with case(update_metadata, True): + update_django_metadata( + dataset_id, + table_id[2], + date_format="%Y-%m", + coverage_type="all_free", + time_delta={"months": 6}, + prefect_mode=materialization_mode, + bq_project="basedosdados", + historical_database=False, + upstream_tasks=[wait_for_materialization], + ) + +br_camara.storage = GCS(constants.GCS_FLOWS_BUCKET.value) +br_camara.run_config = KubernetesRun(image=constants.DOCKER_IMAGE.value) +br_camara.schedule = every_day_camara_dados_abertos + + +# --------------------------------------------------------------------------------------- +# --------------------------------------------------------------------------------------- +# --------------------------------------------------------------------------------------- + +# ------------------------------ TABLES DEPUTADOS --------------------------------------- + +with Flow( + name="br_camara_dados_abertos.deputado", code_owners=["trick"] +) as br_camara_deputado: + # Parameters + dataset_id = Parameter( + "dataset_id", default="br_camara_dados_abertos", required=True + ) + table_id = Parameter( + "table_id", + default=[ + "deputado", + "deputado_ocupacao", + "deputado_profissao", + ], + required=True, + ) + + materialization_mode = Parameter( + "materialization_mode", default="prod", required=False + ) + materialize_after_dump = Parameter( + "materialize_after_dump", default=True, required=False + ) + dbt_alias = Parameter("dbt_alias", default=True, required=False) + + rename_flow_run = rename_current_flow_run_dataset_table( + prefix="Dump: ", + dataset_id=dataset_id, + table_id=table_id[0], + wait=table_id[0], + ) + + update_metadata = Parameter("update_metadata", default=True, required=False) + data_source_max_date_deputado = download_files_and_get_max_date_deputados() + + dados_desatualizados = check_if_data_is_outdated( + dataset_id=dataset_id, + table_id=table_id[2], + data_source_max_date=data_source_max_date_deputado, + date_format="%Y-%m-%d", + upstream_tasks=[data_source_max_date_deputado], + ) + + with case(dados_desatualizados, False): + log_task("Não há atualizações!") + + with case(dados_desatualizados, True): + # --------------------------------------- > Deputados + + filepath_deputados = treat_and_save_table( + table_id="deputados", upstream_tasks=[rename_flow_run] + ) + wait_upload_table = create_table_and_upload_to_gcs( + data_path=filepath_deputados, + dataset_id=dataset_id, + table_id=table_id[0], + dump_mode="append", + wait=filepath_deputados, + ) + + with case(materialize_after_dump, True): + # Trigger DBT flow run + current_flow_labels = get_current_flow_labels() + materialization_flow = create_flow_run( + flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, + project_name=constants.PREFECT_DEFAULT_PROJECT.value, + parameters={ + "dataset_id": dataset_id, + "table_id": table_id[0], + "mode": materialization_mode, + "dbt_alias": dbt_alias, + }, + labels=current_flow_labels, + run_name=f"Materialize {dataset_id}.{table_id[0]}", + ) + + wait_for_materialization = wait_for_flow_run( + materialization_flow, + stream_states=True, + stream_logs=True, + raise_final_state=True, + ) + wait_for_materialization.max_retries = ( + dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value + ) + wait_for_materialization.retry_delay = timedelta( + seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value + ) + + with case(update_metadata, True): + update_django_metadata( + dataset_id, + table_id[0], + coverage_type="all_free", + prefect_mode=materialization_mode, + bq_project="basedosdados", + historical_database=False, + upstream_tasks=[wait_for_materialization], + ) + + # ----------------------------------------------> Deputados - Ocupacao + + filepath_deputados_ocupacao = treat_and_save_table( + table_id="deputado_ocupacao", upstream_tasks=[filepath_deputados] + ) + wait_upload_table = create_table_and_upload_to_gcs( + data_path=filepath_deputados_ocupacao, + dataset_id=dataset_id, + table_id=table_id[1], + dump_mode="append", + wait=filepath_deputados_ocupacao, + ) + + with case(materialize_after_dump, True): + # Trigger DBT flow run + current_flow_labels = get_current_flow_labels() + materialization_flow = create_flow_run( + flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, + project_name=constants.PREFECT_DEFAULT_PROJECT.value, + parameters={ + "dataset_id": dataset_id, + "table_id": table_id[1], + "mode": materialization_mode, + "dbt_alias": dbt_alias, + }, + labels=current_flow_labels, + run_name=f"Materialize {dataset_id}.{table_id[1]}", + ) + + wait_for_materialization = wait_for_flow_run( + materialization_flow, + stream_states=True, + stream_logs=True, + raise_final_state=True, + ) + wait_for_materialization.max_retries = ( + dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value + ) + wait_for_materialization.retry_delay = timedelta( + seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value + ) + + with case(update_metadata, True): + update_django_metadata( + dataset_id, + table_id[1], + coverage_type="all_free", + prefect_mode=materialization_mode, + bq_project="basedosdados", + historical_database=False, + upstream_tasks=[wait_for_materialization], + ) + + # ----------------------------------------------> Deputados - Profissão + + filepath_deputados_profissao = treat_and_save_table( + table_id="deputado_profissao", upstream_tasks=[filepath_deputados_ocupacao] + ) + wait_upload_table = create_table_and_upload_to_gcs( + data_path=filepath_deputados_profissao, + dataset_id=dataset_id, + table_id=table_id[2], + dump_mode="append", + wait=filepath_deputados_profissao, + ) + + with case(materialize_after_dump, True): + # Trigger DBT flow run + current_flow_labels = get_current_flow_labels() + materialization_flow = create_flow_run( + flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, + project_name=constants.PREFECT_DEFAULT_PROJECT.value, + parameters={ + "dataset_id": dataset_id, + "table_id": table_id[2], + "mode": materialization_mode, + "dbt_alias": dbt_alias, + }, + labels=current_flow_labels, + run_name=f"Materialize {dataset_id}.{table_id[2]}", + ) + + wait_for_materialization = wait_for_flow_run( + materialization_flow, + stream_states=True, + stream_logs=True, + raise_final_state=True, + ) + wait_for_materialization.max_retries = ( + dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value + ) + wait_for_materialization.retry_delay = timedelta( + seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value + ) + + with case(update_metadata, True): + update_django_metadata( + dataset_id, + table_id[2], + date_format="%Y-%m-%d", + date_column_name={"date": "data"}, + coverage_type="all_free", + prefect_mode=materialization_mode, + bq_project="basedosdados", + historical_database=True, + upstream_tasks=[wait_for_materialization], + ) + +br_camara_deputado.storage = GCS(constants.GCS_FLOWS_BUCKET.value) +br_camara_deputado.run_config = KubernetesRun(image=constants.DOCKER_IMAGE.value) +br_camara_deputado.schedule = every_day_camara_dados_abertos_deputados diff --git a/pipelines/datasets/br_camara_dados_abertos/schedules.py b/pipelines/datasets/br_camara_dados_abertos/schedules.py new file mode 100644 index 000000000..252544482 --- /dev/null +++ b/pipelines/datasets/br_camara_dados_abertos/schedules.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +from datetime import datetime + +from prefect.schedules import Schedule +from prefect.schedules.clocks import CronClock + +from pipelines.constants import constants + +every_day_camara_dados_abertos = Schedule( + clocks=[ + CronClock( + cron="0 9 * * *", # every day at 9:00 UTC + start_date=datetime(2021, 1, 1), + labels=[constants.BASEDOSDADOS_PROD_AGENT_LABEL.value], + parameter_defaults={ + "update_metadata": True, + "dbt_alias": True, + "materialize_after_dump": True, + "materialization_mode": "prod", + "table_id": [ + "votacao_microdados", + "votacao_objeto", + "votacao_orientacao_bancada", + "voto_parlamentar", + "votacao_proposicao_afetada", + ], + "dataset_id": "br_camara_dados_abertos", + }, + ), + ], +) + + +every_day_camara_dados_abertos_deputados = Schedule( + clocks=[ + CronClock( + cron="30 9 * * *", # every day at 9:00 UTC + start_date=datetime(2021, 1, 1), + labels=[constants.BASEDOSDADOS_PROD_AGENT_LABEL.value], + parameter_defaults={ + "update_metadata": True, + "dbt_alias": True, + "materialize_after_dump": True, + "materialization_mode": "prod", + "table_id": [ + "deputado", + "deputado_ocupacao", + "deputado_profissao", + ], + "dataset_id": "br_camara_dados_abertos", + }, + ), + ], +) diff --git a/pipelines/datasets/br_camara_dados_abertos/tasks.py b/pipelines/datasets/br_camara_dados_abertos/tasks.py new file mode 100644 index 000000000..f3502bcf6 --- /dev/null +++ b/pipelines/datasets/br_camara_dados_abertos/tasks.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +import os +from datetime import timedelta + +import pandas as pd +from prefect import task + +from pipelines.constants import constants +from pipelines.datasets.br_camara_dados_abertos.constants import ( + constants as constants_camara, +) +from pipelines.datasets.br_camara_dados_abertos.utils import ( + get_data, + get_data_deputados, + read_and_clean_camara_dados_abertos, + read_and_clean_data_deputados, +) +from pipelines.utils.utils import log, to_partitions + + +# ! Microdados +@task +def make_partitions(table_id, date_column) -> str: + """ + Make partitions for a given table based on a date column. + + Args: + table_id (str): The ID of the table. + date_column (str): The name of the date column. + + Returns: + str: The path where the partitions are saved. + """ + df = read_and_clean_camara_dados_abertos( + path=constants_camara.INPUT_PATH.value, + table_id=f"{table_id}", + date_column=date_column, + ) + log(f"particionando {table_id}") + to_partitions( + data=df, + partition_columns=["ano"], + savepath=f"{constants_camara.OUTPUT_PATH.value}/{table_id}/", + ) + + return f"{constants_camara.OUTPUT_PATH.value}/{table_id}/" + + +# ! Obtendo a data máxima. +@task +def download_files_and_get_max_date(): + df = get_data() + data_max = df["data"].max() + + return data_max + + +# -------------------------------------------------------------------> Deputados +@task +def download_files_and_get_max_date_deputados(): + df = get_data_deputados() + + df["dataHora"] = pd.to_datetime(df["dataHora"]) + + data_max = df["dataHora"].max() + + return data_max + + +@task( + max_retries=constants.TASK_MAX_RETRIES.value, + retry_delay=timedelta(seconds=constants.TASK_RETRY_DELAY.value), +) +def treat_and_save_table(table_id): + log(f"------------- TRATANDO {table_id} --------------") + df = read_and_clean_data_deputados(table_id=table_id) + + if not os.path.exists(f"{constants_camara.OUTPUT_PATH.value}{table_id}"): + os.makedirs(f"{constants_camara.OUTPUT_PATH.value}{table_id}") + + log(f"Saving {table_id} to {constants_camara.OUTPUT_PATH.value}{table_id}/data.csv") + + df.to_csv( + f"{constants_camara.OUTPUT_PATH.value}{table_id}/data.csv", sep=",", index=False + ) + + log(f"{constants_camara.OUTPUT_PATH.value}{table_id}/data.csv") + + return f"{constants_camara.OUTPUT_PATH.value}{table_id}/data.csv" diff --git a/pipelines/datasets/br_camara_dados_abertos/utils.py b/pipelines/datasets/br_camara_dados_abertos/utils.py new file mode 100644 index 000000000..6fb677dce --- /dev/null +++ b/pipelines/datasets/br_camara_dados_abertos/utils.py @@ -0,0 +1,157 @@ +# -*- coding: utf-8 -*- +import os + +import pandas as pd +import requests + +from pipelines.datasets.br_camara_dados_abertos.constants import constants +from pipelines.utils.apply_architecture_to_dataframe.utils import ( + apply_architecture_to_dataframe, +) +from pipelines.utils.utils import log + + +# -------------------------------------------------------------------------------------> VOTACAO +def download_csvs_camara() -> None: + """ + Docs: + This function does download all csvs from archives of camara dos deputados. + The csvs saved in conteiners of docker. + + return: + None + """ + log("Downloading csvs from camara dos deputados") + if not os.path.exists(constants.INPUT_PATH.value): + os.makedirs(constants.INPUT_PATH.value) + + for ano in constants.ANOS.value: + for chave, valor in constants.TABLE_LIST.value.items(): + url = f"http://dadosabertos.camara.leg.br/arquivos/{valor}/csv/{valor}-{ano}.csv" + + response = requests.get(url) + + if response.status_code == 200: + with open(f"{constants.INPUT_PATH.value}{valor}.csv", "wb") as f: + f.write(response.content) + elif response.status_code >= 400 and response.status_code <= 599: + raise Exception( + f"Erro de requisição: status code {response.status_code}" + ) + + log("------------- archive inside in container --------------") + log(os.listdir(constants.INPUT_PATH.value)) + + +def get_data(): + download_csvs_camara() + df = pd.read_csv( + f'{constants.INPUT_PATH.value}{constants.TABLE_LIST.value["votacao_microdados"]}.csv', + sep=";", + ) + + return df + + +def read_and_clean_camara_dados_abertos( + table_id=str, path=constants.INPUT_PATH.value, date_column=str +) -> pd.DataFrame: + """ + Lê e limpa os dados abertos da câmara. + + Esta função lê um arquivo CSV de um caminho específico, adiciona uma coluna "ano" ao DataFrame e aplica uma arquitetura específica ao DataFrame com base no ID da tabela. + + Parâmetros: + table_id (str): ID da tabela para determinar a arquitetura a ser aplicada. + path (str): Caminho para o arquivo CSV a ser lido. + date_column (str): Nome da coluna que contém a data. + + Retorna: + pd.DataFrame: DataFrame após a aplicação da arquitetura. + """ + df = pd.read_csv(f"{path}{constants.TABLE_LIST.value[table_id]}.csv", sep=";") + + if table_id == "votacao_orientacao_bancada": + df["ano"] = constants.ANOS.value[0] + else: + df["ano"] = df[date_column].str[0:4] + + log("------------- columns before apply architecture --------------") + log(f"------------- TABLE ---------------- {table_id} --------------") + log(df.columns) + if table_id == "votacao_objeto": + df.rename(columns=constants.RENAME_COLUMNS_OBJETO.value, inplace=True) + df = df[constants.RENAME_COLUMNS_OBJETO.value.values()] + + else: + df = apply_architecture_to_dataframe( + df, + url_architecture=constants.TABLE_NAME_ARCHITECTURE.value[table_id], + apply_include_missing_columns=False, + apply_column_order_and_selection=True, + apply_rename_columns=True, + ) + log("------------- columns after apply architecture --------------") + log(f"------------- TABLE ---------------- {table_id} ------------") + log(df.columns) + return df + + +# ------------------------------------------------------------> DEPUTADOS + + +def download_csvs_camara_deputado() -> None: + """ + Docs: + This function does download all csvs from archives of camara dos deputados. + The csvs saved in conteiners of docker. + + return: + None + """ + print("Downloading csvs from camara dos deputados") + if not os.path.exists(constants.INPUT_PATH.value): + os.makedirs(constants.INPUT_PATH.value) + + for key, valor in constants.TABLE_LIST_DEPUTADOS.value.items(): + url = f"http://dadosabertos.camara.leg.br/arquivos/{valor}/csv/{valor}.csv" + + response = requests.get(url) + + if response.status_code == 200: + with open(f"{constants.INPUT_PATH.value}{valor}.csv", "wb") as f: + f.write(response.content) + + elif response.status_code >= 400 and response.status_code <= 599: + raise Exception(f"Erro de requisição: status code {response.status_code}") + + log(os.listdir(constants.INPUT_PATH.value)) + + +def read_and_clean_data_deputados(table_id): + df = pd.read_csv( + f"{constants.INPUT_PATH.value}{constants.TABLE_LIST_DEPUTADOS.value[table_id]}.csv", + sep=";", + ) + + df = apply_architecture_to_dataframe( + df, + url_architecture=constants.TABLE_NAME_ARCHITECTURE_DEPUTADOS.value[table_id], + apply_include_missing_columns=False, + apply_rename_columns=True, + apply_column_order_and_selection=True, + ) + + log(df.columns) + + return df + + +def get_data_deputados(): + download_csvs_camara_deputado() + df = pd.read_csv( + f'{constants.INPUT_PATH.value}{constants.TABLE_LIST_DEPUTADOS.value["deputado_profissao"]}.csv', + sep=";", + ) + + return df diff --git a/pipelines/datasets/br_cgu_beneficios_cidadao/flows.py b/pipelines/datasets/br_cgu_beneficios_cidadao/flows.py index e0aa19ecb..14acb8421 100644 --- a/pipelines/datasets/br_cgu_beneficios_cidadao/flows.py +++ b/pipelines/datasets/br_cgu_beneficios_cidadao/flows.py @@ -16,7 +16,6 @@ every_day_novo_bolsa_familia, ) from pipelines.datasets.br_cgu_beneficios_cidadao.tasks import ( - check_for_updates, crawl_last_date, crawler_bolsa_familia, crawler_bpc, @@ -26,11 +25,13 @@ from pipelines.utils.constants import constants as utils_constants from pipelines.utils.decorators import Flow from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants -from pipelines.utils.metadata.flows import update_django_metadata +from pipelines.utils.metadata.tasks import ( + check_if_data_is_outdated, + update_django_metadata, +) from pipelines.utils.tasks import ( # update_django_metadata, create_table_and_upload_to_gcs, get_current_flow_labels, - log_task, rename_current_flow_run_dataset_table, ) @@ -63,10 +64,11 @@ ) data = crawl_last_date(table_id=table_id) - update = check_for_updates( + update = check_if_data_is_outdated( dataset_id=dataset_id, table_id=table_id, - max_date=data[0], + data_source_max_date=data[0], + date_format="%Y-%m", upstream_tasks=[data], ) @@ -166,10 +168,11 @@ ) data = crawl_last_date(table_id=table_id) - update = check_for_updates( + update = check_if_data_is_outdated( dataset_id=dataset_id, table_id=table_id, - max_date=data[0], + data_source_max_date=data[0], + date_format="%Y-%m", upstream_tasks=[data], ) with case(update, True): @@ -263,10 +266,11 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) data = crawl_last_date(table_id=table_id) - update = check_for_updates( + update = check_if_data_is_outdated( dataset_id=dataset_id, table_id=table_id, - max_date=data[0], + date_format="%Y-%m", + data_source_max_date=data[0], upstream_tasks=[data], ) with case(update, True): diff --git a/pipelines/datasets/br_cgu_beneficios_cidadao/tasks.py b/pipelines/datasets/br_cgu_beneficios_cidadao/tasks.py index 56782a134..154886feb 100644 --- a/pipelines/datasets/br_cgu_beneficios_cidadao/tasks.py +++ b/pipelines/datasets/br_cgu_beneficios_cidadao/tasks.py @@ -3,18 +3,15 @@ Tasks for br_cgu_beneficios_cidadao """ -from datetime import datetime, timedelta +from datetime import timedelta import pandas as pd -import requests from prefect import task -from pipelines.constants import constants as main_constants from pipelines.datasets.br_cgu_beneficios_cidadao.constants import constants from pipelines.datasets.br_cgu_beneficios_cidadao.utils import ( download_unzip_csv, extract_dates, - extract_last_date, parquet_partition, ) from pipelines.utils.utils import log @@ -53,49 +50,6 @@ def crawl_last_date(table_id: str) -> list: return [max_date, max_row["urls"].iloc[0]] -@task( - max_retries=constants.TASK_MAX_RETRIES.value, - retry_delay=timedelta(seconds=constants.TASK_RETRY_DELAY.value), -) -def check_for_updates(dataset_id: str, table_id: str, max_date: datetime) -> bool: - """ - Verifica se há atualizações disponíveis em um conjunto de dados (dataset). - - Parâmetros: - - dataset_id (str): O identificador do conjunto de dados no site. - - table_id (str): O identificador da tabela dentro do conjunto de dados. - - max_date (datetime): A data mais recente a ser comparada com a última data na BD. - - Retorna: - - True se houver atualizações disponíveis, False caso contrário. - - Exemplo de uso: - if check_for_updates("meu_dataset", "minha_tabela", datetime(2023, 11, 10)): - print("Há atualizações disponíveis.") - else: - print("Não há novas atualizações disponíveis.") - """ - - # Obtém a última data no site BD - bd_date = extract_last_date( - dataset_id, - table_id, - billing_project_id=main_constants.BASEDOSDADOS_PROD_AGENT_LABEL.value, - ) - bd_date = datetime.strptime(bd_date, "%Y-%m") - # Registra a data mais recente do site - log(f"Última data no Portal da Transferência: {max_date}") - log(f"Última data na BD: {bd_date}") - - # Compara as datas para verificar se há atualizações - if max_date > bd_date: - log("Há atualizações disponíveis") - return True # Há atualizações disponíveis - else: - log("Não há novas atualizações disponíveis") - return False # Não há novas atualizações disponíveis - - @task( max_retries=constants.TASK_MAX_RETRIES.value, retry_delay=timedelta(seconds=constants.TASK_RETRY_DELAY.value), diff --git a/pipelines/datasets/br_cgu_beneficios_cidadao/utils.py b/pipelines/datasets/br_cgu_beneficios_cidadao/utils.py index c69f09b9f..0c411db2a 100644 --- a/pipelines/datasets/br_cgu_beneficios_cidadao/utils.py +++ b/pipelines/datasets/br_cgu_beneficios_cidadao/utils.py @@ -1,15 +1,11 @@ # -*- coding: utf-8 -*- import os import zipfile -from datetime import datetime -import basedosdados as bd -import numpy as np import pandas as pd import requests from bs4 import BeautifulSoup from selenium import webdriver -from selenium.common.exceptions import ElementNotInteractableException from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select @@ -17,7 +13,7 @@ from webdriver_manager.chrome import ChromeDriverManager from pipelines.datasets.br_cgu_beneficios_cidadao.constants import constants -from pipelines.utils.utils import get_credentials_from_secret, log, to_partitions +from pipelines.utils.utils import log, to_partitions def download_unzip_csv( @@ -389,71 +385,3 @@ def parquet_partition(path: str, table: str) -> str: log("Partição feita.") return output_directory - - -def extract_last_date( - dataset_id, table_id, billing_project_id: str, data: str = "data" -): - """ - Extracts the last update date of a given dataset table. - - Args: - dataset_id (str): The ID of the dataset. - table_id (str): The ID of the table. - - Returns: - str: The last update date in the format 'yyyy-mm' or 'yyyy-mm-dd'. - - Raises: - Exception: If an error occurs while extracting the last update date. - """ - if table_id == "garantia_safra": - try: - query_bd = f""" - SELECT - MAX(CONCAT(ano_referencia,"-",mes_referencia)) as max_date - FROM - `{billing_project_id}.{dataset_id}.{table_id}` - """ - - t = bd.read_sql( - query=query_bd, - billing_project_id=billing_project_id, - from_file=True, - ) - input_date_str = t["max_date"][0] - - date_obj = datetime.strptime(input_date_str, "%Y-%m") - - last_date = date_obj.strftime("%Y-%m") - log(f"Última data YYYY-MM: {last_date}") - - return last_date - except Exception as e: - log(f"An error occurred while extracting the last update date: {str(e)}") - raise - else: - try: - query_bd = f""" - SELECT - MAX(CONCAT(ano_competencia,"-",mes_competencia)) as max_date - FROM - `{billing_project_id}.{dataset_id}.{table_id}` - """ - - t = bd.read_sql( - query=query_bd, - billing_project_id=billing_project_id, - from_file=True, - ) - input_date_str = t["max_date"][0] - - date_obj = datetime.strptime(input_date_str, "%Y-%m") - - last_date = date_obj.strftime("%Y-%m") - log(f"Última data YYYY-MM: {last_date}") - - return last_date - except Exception as e: - log(f"An error occurred while extracting the last update date: {str(e)}") - raise diff --git a/pipelines/datasets/br_cgu_servidores_executivo_federal/flows.py b/pipelines/datasets/br_cgu_servidores_executivo_federal/flows.py index 673dca8a4..491869cea 100644 --- a/pipelines/datasets/br_cgu_servidores_executivo_federal/flows.py +++ b/pipelines/datasets/br_cgu_servidores_executivo_federal/flows.py @@ -53,7 +53,7 @@ "materialization_mode", default="prod", required=False ) materialize_after_dump = Parameter( - "materialize after dump", default=True, required=False + "materialize_after_dump", default=True, required=False ) dbt_alias = Parameter("dbt_alias", default=True, required=False) diff --git a/pipelines/datasets/br_cgu_servidores_executivo_federal/tasks.py b/pipelines/datasets/br_cgu_servidores_executivo_federal/tasks.py index a68f3fdc9..424fbb684 100644 --- a/pipelines/datasets/br_cgu_servidores_executivo_federal/tasks.py +++ b/pipelines/datasets/br_cgu_servidores_executivo_federal/tasks.py @@ -18,7 +18,8 @@ make_url, process_table, ) -from pipelines.utils.utils import extract_last_date, log, to_partitions +from pipelines.utils.metadata.utils import get_api_most_recent_date +from pipelines.utils.utils import log, to_partitions @task # noqa @@ -148,14 +149,11 @@ def is_up_to_date(next_date: datetime.date) -> bool: @task def get_next_date() -> datetime.date: - last_date_in_bq = extract_last_date( - "br_cgu_servidores_executivo_federal", - "cadastro_servidores", - "yy-mm", - "basedosdados", + last_date_in_api = get_api_most_recent_date( + dataset_id="br_cgu_servidores_executivo_federal", + table_id="cadastro_servidores", + date_format="%Y-%m", ) - year, month = last_date_in_bq.split("-") - - next_date = datetime.date(int(year), int(month), 1) + relativedelta(months=1) + next_date = last_date_in_api + relativedelta(months=1) return next_date diff --git a/pipelines/datasets/br_cvm_administradores_carteira/tasks.py b/pipelines/datasets/br_cvm_administradores_carteira/tasks.py index 62716e2af..8a3dc2cbf 100644 --- a/pipelines/datasets/br_cvm_administradores_carteira/tasks.py +++ b/pipelines/datasets/br_cvm_administradores_carteira/tasks.py @@ -7,15 +7,12 @@ import os import shutil -import basedosdados as bd import pandas as pd import requests from pandas.api.types import is_string_dtype from prefect import task from unidecode import unidecode -from pipelines.utils.utils import log - @task def crawl(root: str, url: str, chunk_size=128) -> None: @@ -153,44 +150,3 @@ def clean_table_pessoa_juridica(root: str) -> str: dataframe.to_csv(ou_filepath, index=False) return ou_filepath - - -@task -def extract_last_date( - dataset_id: str, - table_id: str, - billing_project_id: str, - var_name: str, -) -> str: - """ - Extracts the last update date of a given dataset table. - - Args: - dataset_id (str): The ID of the dataset. - table_id (str): The ID of the table. - billing_project_id (str): The billing project ID. - - Returns: - str: The last update date in the format 'yyyy-mm-dd'. - - Raises: - Exception: If an error occurs while extracting the last update date. - """ - - query_bd = f""" - SELECT MAX({var_name}) as max_date - FROM - `{billing_project_id}.{dataset_id}.{table_id}` - """ - - t = bd.read_sql( - query=query_bd, - billing_project_id=billing_project_id, - from_file=True, - ) - - data = t["max_date"][0] - - log(f"A data mais recente da tabela é: {data}") - - return str(data) diff --git a/pipelines/datasets/br_me_cnpj/tasks.py b/pipelines/datasets/br_me_cnpj/tasks.py index c950fd20b..0d78bbb46 100644 --- a/pipelines/datasets/br_me_cnpj/tasks.py +++ b/pipelines/datasets/br_me_cnpj/tasks.py @@ -5,10 +5,7 @@ import os from datetime import datetime -import pandas as pd -import requests from prefect import task -from tqdm import tqdm from pipelines.datasets.br_me_cnpj.constants import constants as constants_cnpj from pipelines.datasets.br_me_cnpj.utils import ( @@ -20,7 +17,7 @@ process_csv_simples, process_csv_socios, ) -from pipelines.utils.utils import extract_last_date, log +from pipelines.utils.utils import log ufs = constants_cnpj.UFS.value url = constants_cnpj.URL.value diff --git a/pipelines/datasets/br_mg_belohorizonte_smfa_iptu/flows.py b/pipelines/datasets/br_mg_belohorizonte_smfa_iptu/flows.py index c8d446232..5416bd1d6 100644 --- a/pipelines/datasets/br_mg_belohorizonte_smfa_iptu/flows.py +++ b/pipelines/datasets/br_mg_belohorizonte_smfa_iptu/flows.py @@ -10,23 +10,22 @@ from prefect.tasks.prefect import create_flow_run, wait_for_flow_run from pipelines.constants import constants -from pipelines.datasets.br_mg_belohorizonte_smfa_iptu.constants import ( - constants as constants_iptu, -) from pipelines.datasets.br_mg_belohorizonte_smfa_iptu.schedules import every_weeks_iptu from pipelines.datasets.br_mg_belohorizonte_smfa_iptu.tasks import ( - check_for_updates, download_and_transform, + get_data_source_sfma_iptu_max_date, make_partitions, ) from pipelines.utils.constants import constants as utils_constants from pipelines.utils.decorators import Flow from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants -from pipelines.utils.metadata.tasks import update_django_metadata +from pipelines.utils.metadata.tasks import ( + check_if_data_is_outdated, + update_django_metadata, +) from pipelines.utils.tasks import ( create_table_and_upload_to_gcs, get_current_flow_labels, - log_task, rename_current_flow_run_dataset_table, ) @@ -50,13 +49,16 @@ rename_flow_run = rename_current_flow_run_dataset_table( prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - dados_desatualizados = check_for_updates(dataset_id=dataset_id, table_id=table_id) - log_task(f"Checando se os dados estão desatualizados: {dados_desatualizados}") - with case(dados_desatualizados, False): - log_task( - "Dados atualizados, não é necessário fazer o download", - upstream_tasks=[dados_desatualizados], - ) + + data_source_max_date = get_data_source_sfma_iptu_max_date() + + dados_desatualizados = check_if_data_is_outdated( + dataset_id=dataset_id, + table_id=table_id, + data_source_max_date=data_source_max_date, + date_format="%Y-%m", + upstream_tasks=[data_source_max_date], + ) with case(dados_desatualizados, True): df = download_and_transform() diff --git a/pipelines/datasets/br_mg_belohorizonte_smfa_iptu/schedules.py b/pipelines/datasets/br_mg_belohorizonte_smfa_iptu/schedules.py index 34b841bd7..25cc7cbbc 100644 --- a/pipelines/datasets/br_mg_belohorizonte_smfa_iptu/schedules.py +++ b/pipelines/datasets/br_mg_belohorizonte_smfa_iptu/schedules.py @@ -22,7 +22,7 @@ "materialization_mode": "prod", "materialize_after_dump": True, "dbt_alias": True, - "update_metadata": "True", + "update_metadata": True, }, ), ] diff --git a/pipelines/datasets/br_mg_belohorizonte_smfa_iptu/tasks.py b/pipelines/datasets/br_mg_belohorizonte_smfa_iptu/tasks.py index 671de9245..c97683ff2 100644 --- a/pipelines/datasets/br_mg_belohorizonte_smfa_iptu/tasks.py +++ b/pipelines/datasets/br_mg_belohorizonte_smfa_iptu/tasks.py @@ -18,7 +18,7 @@ reorder_and_fix_nan, scrapping_download_csv, ) -from pipelines.utils.utils import extract_last_date, log, to_partitions +from pipelines.utils.utils import log, to_partitions @task # noqa @@ -76,25 +76,7 @@ def data_url(url, headers): @task -def check_for_updates(dataset_id, table_id): - """ - Checks if there are available updates for a specific dataset and table. - - Returns: - bool: Returns True if updates are available, otherwise returns False. - """ +def get_data_source_sfma_iptu_max_date(): # Obtém a data mais recente do site data_obj = data_url(constants.URLS.value[0], constants.HEADERS.value) - - # Obtém a última data no site BD - data_bq_obj = extract_last_date(dataset_id, table_id, "yy-mm", "basedosdados") - - # Registra a data mais recente do site - log(f"Última data no site do SMFA: {data_obj}") - log(f"Última data no site da BD: {data_bq_obj}") - - # Compara as datas para verificar se há atualizações - if data_obj > data_bq_obj: - return True # Há atualizações disponíveis - else: - return False # Não há novas atualizações disponíveis + return data_obj diff --git a/pipelines/datasets/br_mp_pep_cargos_funcoes/tasks.py b/pipelines/datasets/br_mp_pep_cargos_funcoes/tasks.py index 64f32dbc6..80cd1c7e8 100644 --- a/pipelines/datasets/br_mp_pep_cargos_funcoes/tasks.py +++ b/pipelines/datasets/br_mp_pep_cargos_funcoes/tasks.py @@ -22,7 +22,8 @@ move_from_tmp_dir, wait_file_download, ) -from pipelines.utils.utils import extract_last_date, log, to_partitions +from pipelines.utils.metadata.utils import get_api_most_recent_date +from pipelines.utils.utils import log, to_partitions @task @@ -399,11 +400,10 @@ def is_up_to_date() -> bool: log(f"Last date website: {text}, parsed as {date_website}") - last_date_in_bq = extract_last_date( - "br_mp_pep", "cargos_funcoes", "yy-mm", "basedosdados" + last_date_in_api = get_api_most_recent_date( + dataset_id="br_mp_pep", table_id="cargos_funcoes", date_format="%Y-%m" ) - date_in_bq = datetime.datetime.strptime(last_date_in_bq, "%Y-%m") - log(f"Last date BQ: {date_in_bq}") + log(f"Last date API: {last_date_in_api}") - return date_in_bq == date_website + return last_date_in_api == date_website diff --git a/pipelines/datasets/br_ms_cnes/flows.py b/pipelines/datasets/br_ms_cnes/flows.py index 980658e7f..63d3b4c1a 100644 --- a/pipelines/datasets/br_ms_cnes/flows.py +++ b/pipelines/datasets/br_ms_cnes/flows.py @@ -66,7 +66,6 @@ files_path = check_files_to_parse( dataset_id=dataset_id, table_id=table_id, - billing_project_id="basedosdados", cnes_database="CNES", cnes_group_file=br_ms_cnes_constants.DATABASE_GROUPS.value["CNES"][0], ) @@ -173,7 +172,6 @@ files_path = check_files_to_parse( dataset_id=dataset_id, table_id=table_id, - billing_project_id="basedosdados", cnes_database="CNES", cnes_group_file=br_ms_cnes_constants.DATABASE_GROUPS.value["CNES"][1], ) @@ -274,7 +272,6 @@ files_path = check_files_to_parse( dataset_id=dataset_id, table_id=table_id, - billing_project_id="basedosdados", cnes_database="CNES", cnes_group_file=br_ms_cnes_constants.DATABASE_GROUPS.value["CNES"][4], ) @@ -375,7 +372,6 @@ files_path = check_files_to_parse( dataset_id=dataset_id, table_id=table_id, - billing_project_id="basedosdados", cnes_database="CNES", cnes_group_file=br_ms_cnes_constants.DATABASE_GROUPS.value["CNES"][3], ) @@ -478,7 +474,6 @@ files_path = check_files_to_parse( dataset_id=dataset_id, table_id=table_id, - billing_project_id="basedosdados", cnes_database="CNES", # mudar no aqui pra 1 cnes_group_file=br_ms_cnes_constants.DATABASE_GROUPS.value["CNES"][2], @@ -582,7 +577,6 @@ files_path = check_files_to_parse( dataset_id=dataset_id, table_id=table_id, - billing_project_id="basedosdados", cnes_database="CNES", cnes_group_file=br_ms_cnes_constants.DATABASE_GROUPS.value["CNES"][5], ) @@ -684,7 +678,6 @@ files_path = check_files_to_parse( dataset_id=dataset_id, table_id=table_id, - billing_project_id="basedosdados", cnes_database="CNES", cnes_group_file=br_ms_cnes_constants.DATABASE_GROUPS.value["CNES"][6], ) @@ -788,7 +781,6 @@ files_path = check_files_to_parse( dataset_id=dataset_id, table_id=table_id, - billing_project_id="basedosdados", cnes_database="CNES", cnes_group_file=br_ms_cnes_constants.DATABASE_GROUPS.value["CNES"][7], ) @@ -894,7 +886,6 @@ files_path = check_files_to_parse( dataset_id=dataset_id, table_id=table_id, - billing_project_id="basedosdados", cnes_database="CNES", cnes_group_file=br_ms_cnes_constants.DATABASE_GROUPS.value["CNES"][8], ) @@ -995,7 +986,6 @@ files_path = check_files_to_parse( dataset_id=dataset_id, table_id=table_id, - billing_project_id="basedosdados", cnes_database="CNES", cnes_group_file=br_ms_cnes_constants.DATABASE_GROUPS.value["CNES"][9], ) @@ -1098,7 +1088,6 @@ files_path = check_files_to_parse( dataset_id=dataset_id, table_id=table_id, - billing_project_id="basedosdados", cnes_database="CNES", cnes_group_file=br_ms_cnes_constants.DATABASE_GROUPS.value["CNES"][10], ) @@ -1200,7 +1189,6 @@ files_path = check_files_to_parse( dataset_id=dataset_id, table_id=table_id, - billing_project_id="basedosdados", cnes_database="CNES", cnes_group_file=br_ms_cnes_constants.DATABASE_GROUPS.value["CNES"][11], ) @@ -1279,7 +1267,7 @@ br_ms_cnes_regra_contratual.run_config = KubernetesRun( image=constants.DOCKER_IMAGE.value ) -br_ms_cnes_regra_contratual.schedule = schedule_br_ms_cnes_regra_contratual +# br_ms_cnes_regra_contratual.schedule = schedule_br_ms_cnes_regra_contratual # regra_contratual with Flow( @@ -1304,7 +1292,6 @@ files_path = check_files_to_parse( dataset_id=dataset_id, table_id=table_id, - billing_project_id="basedosdados", cnes_database="CNES", cnes_group_file=br_ms_cnes_constants.DATABASE_GROUPS.value["CNES"][12], ) diff --git a/pipelines/datasets/br_ms_cnes/tasks.py b/pipelines/datasets/br_ms_cnes/tasks.py index 0a1a2a3c4..8428b8a9b 100644 --- a/pipelines/datasets/br_ms_cnes/tasks.py +++ b/pipelines/datasets/br_ms_cnes/tasks.py @@ -8,23 +8,21 @@ from datetime import timedelta import pandas as pd -import rpy2.robjects as ro import rpy2.robjects.packages as rpackages import wget from prefect import task -from rpy2.robjects import pandas2ri from rpy2.robjects.packages import importr from pipelines.constants import constants from pipelines.datasets.br_ms_cnes.constants import constants as cnes_constants from pipelines.datasets.br_ms_cnes.utils import ( check_and_create_column, - extract_last_date, if_column_exist_delete, list_all_cnes_dbc_files, pre_cleaning_to_utf8, year_month_sigla_uf_parser, ) +from pipelines.utils.metadata.utils import get_api_most_recent_date from pipelines.utils.utils import log @@ -32,16 +30,15 @@ def check_files_to_parse( dataset_id: str, table_id: str, - billing_project_id, cnes_database: str, cnes_group_file: str, ) -> list[str]: - log(f"extracting last date from bq for {dataset_id}.{table_id}") - # 1. extrair data mais atual do bq - last_date = extract_last_date( + log(f"extracting last date from api for {dataset_id}.{table_id}") + # 1. extrair data mais atual da api + last_date = get_api_most_recent_date( dataset_id=dataset_id, table_id=table_id, - billing_project_id=billing_project_id, + date_format="%Y-%m", ) log("building next year/month to parse") # 2. adicionar mais um no mes ou transformar pra 1 se for 12 diff --git a/pipelines/datasets/br_ms_cnes/utils.py b/pipelines/datasets/br_ms_cnes/utils.py index a07d3da9d..902da1d95 100644 --- a/pipelines/datasets/br_ms_cnes/utils.py +++ b/pipelines/datasets/br_ms_cnes/utils.py @@ -5,11 +5,8 @@ from ftplib import FTP -import basedosdados as bd import pandas as pd -from pipelines.utils.utils import log - def list_all_cnes_dbc_files( database: str, @@ -135,37 +132,3 @@ def if_column_exist_delete(df: pd.DataFrame, col_list: str): del df[col] return df - - -def extract_last_date(dataset_id, table_id, billing_project_id: str): - """ - Extracts the last update date of a given dataset table. - - Args: - dataset_id (str): The ID of the dataset. - table_id (str): The ID of the table. - billing_project_id (str): The billing project ID. - - Returns: - str: The last update date in the format 'yyyy-mm' or 'yyyy-mm-dd'. - - Raises: - Exception: If an error occurs while extracting the last update date. - """ - - query_bd = f""" - SELECT MAX(DATE(CAST(ano AS INT64),CAST(mes AS INT64),1)) as max_date - FROM - `{billing_project_id}.{dataset_id}.{table_id}` - """ - - t = bd.read_sql( - query=query_bd, - billing_project_id=billing_project_id, - from_file=True, - ) - year_month = t["max_date"][0] - - log(f"O Ano/Mês mais recente da tabela é: {year_month}") - - return year_month diff --git a/pipelines/datasets/br_ons_avaliacao_operacao/flows.py b/pipelines/datasets/br_ons_avaliacao_operacao/flows.py index dfee6fc08..e0e7f65e9 100644 --- a/pipelines/datasets/br_ons_avaliacao_operacao/flows.py +++ b/pipelines/datasets/br_ons_avaliacao_operacao/flows.py @@ -5,7 +5,6 @@ # pylint: disable=invalid-name from datetime import timedelta -# TODO: extract_last_date_from_bq colocar billing de prod antes de fechar PR from prefect import Parameter, case from prefect.run_configs import KubernetesRun from prefect.storage import GCS @@ -23,15 +22,14 @@ schedule_br_ons_avaliacao_operacao_reservatorio, schedule_br_ons_avaliacao_operacao_restricao_operacao_usinas_eolicas, ) -from pipelines.datasets.br_ons_avaliacao_operacao.tasks import ( - download_data, - extract_last_date_from_bq, - wrang_data, -) +from pipelines.datasets.br_ons_avaliacao_operacao.tasks import download_data, wrang_data from pipelines.utils.constants import constants as utils_constants from pipelines.utils.decorators import Flow from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants -from pipelines.utils.metadata.tasks import update_django_metadata +from pipelines.utils.metadata.tasks import ( + task_get_api_most_recent_date, + update_django_metadata, +) from pipelines.utils.tasks import ( create_table_and_upload_to_gcs, get_current_flow_labels, @@ -60,11 +58,10 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - data_mais_recente_do_bq = extract_last_date_from_bq( + data_mais_recente_do_bq = task_get_api_most_recent_date( table_id=table_id, dataset_id=dataset_id, - # vai ser retirado virar from file - billing_project_id="basedosdados", + date_format="%Y-%m-%d", ) dow_data = download_data( @@ -157,11 +154,10 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - data_mais_recente_do_bq = extract_last_date_from_bq( + data_mais_recente_do_bq = task_get_api_most_recent_date( table_id=table_id, dataset_id=dataset_id, - # vai ser retirado virar from file - billing_project_id="basedosdados", + date_format="%Y-%m-%d", ) dow_data = download_data( @@ -257,11 +253,10 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - data_mais_recente_do_bq = extract_last_date_from_bq( + data_mais_recente_do_bq = task_get_api_most_recent_date( table_id=table_id, dataset_id=dataset_id, - # vai ser retirado virar from file - billing_project_id="basedosdados", + date_format="%Y-%m-%d", ) dow_data = download_data( @@ -358,11 +353,10 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - data_mais_recente_do_bq = extract_last_date_from_bq( + data_mais_recente_do_bq = task_get_api_most_recent_date( table_id=table_id, dataset_id=dataset_id, - # vai ser retirado virar from file - billing_project_id="basedosdados", + date_format="%Y-%m-%d", ) dow_data = download_data( @@ -460,11 +454,10 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - data_mais_recente_do_bq = extract_last_date_from_bq( + data_mais_recente_do_bq = task_get_api_most_recent_date( table_id=table_id, dataset_id=dataset_id, - # vai ser retirado virar from file - billing_project_id="basedosdados", + date_format="%Y-%m-%d", ) dow_data = download_data( @@ -560,11 +553,10 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - data_mais_recente_do_bq = extract_last_date_from_bq( + data_mais_recente_do_bq = task_get_api_most_recent_date( table_id=table_id, dataset_id=dataset_id, - # vai ser retirado virar from file - billing_project_id="basedosdados", + date_format="%Y-%m-%d", ) dow_data = download_data( diff --git a/pipelines/datasets/br_ons_avaliacao_operacao/tasks.py b/pipelines/datasets/br_ons_avaliacao_operacao/tasks.py index bf551c387..be745e645 100644 --- a/pipelines/datasets/br_ons_avaliacao_operacao/tasks.py +++ b/pipelines/datasets/br_ons_avaliacao_operacao/tasks.py @@ -7,7 +7,6 @@ from datetime import date, datetime from typing import Union -import basedosdados as bd import pandas as pd from prefect import task @@ -30,91 +29,6 @@ from pipelines.utils.utils import log, to_partitions -@task -def extract_last_date_from_bq( - dataset_id, table_id, billing_project_id: str -) -> Union[datetime, date]: - """Extrai a data mais recente de uma dada tabela dos conjuntos br_ons_avaliacao_operacao e br_ons_estimativa_custos do BQ - Args: - dataset_id (str): The ID of the dataset. - table_id (str): The ID of the table. - billing_project_id (str): The billing project ID. - - Returns: - Union[datetime, date]: data máxima da tabela - """ - - date_dict = { - "reservatorio": "yyyy-mm-dd", - "geracao_usina": "yyyy-mm-dd hh:mm:ss", - "geracao_termica_motivo_despacho": "yyyy-mm-dd hh:mm:ss", - "energia_natural_afluente": "yyyy-mm-dd", - "energia_armazenada_reservatorio": "yyyy-mm-dd", - "restricao_operacao_usinas_eolicas": "yyyy-mm-dd hh:mm:ss", - "custo_marginal_operacao_semi_horario": "yyyy-mm-dd hh:mm:ss", - "custo_marginal_operacao_semanal": "yyyy-mm-dd", - "balanco_energia_subsistemas": "yyyy-mm-dd hh:mm:ss", - "balanco_energia_subsistemas_dessem": "yyyy-mm-dd hh:mm:ss", - "custo_variavel_unitario_usinas_termicas": "yyyy-mm-dd", - } - - if date_dict[table_id] == "yyyy-mm-dd hh:mm:ss": - query_bd = f""" SELECT - MAX(FORMAT_TIMESTAMP('%F %T', TIMESTAMP(CONCAT(data, ' ', hora)))) AS max_data_hora - FROM - `{billing_project_id}.{dataset_id}.{table_id}` - """ - - t = bd.read_sql( - query=query_bd, - billing_project_id=billing_project_id, - from_file=True, - ) - - data = t["max_data_hora"][0] - data = pd.to_datetime(data, format="%Y-%m-%d %H:%M:%S") - - if ( - date_dict[table_id] == "yyyy-mm-dd" - and table_id != "custo_variavel_unitario_usinas_termicas" - ): - query_bd = f""" - SELECT MAX(data) as max_date - FROM - `{billing_project_id}.{dataset_id}.{table_id}` - """ - - t = bd.read_sql( - query=query_bd, - billing_project_id=billing_project_id, - from_file=True, - ) - - data = t["max_date"][0] - - print(f"A data mais recente da tabela no BQ é {data}") - - if ( - date_dict[table_id] == "yyyy-mm-dd" - and table_id == "custo_variavel_unitario_usinas_termicas" - ): - query_bd = f""" - SELECT MAX(data_inicio) as max_date - FROM - `{billing_project_id}.{dataset_id}.{table_id}` - """ - - t = bd.read_sql( - query=query_bd, - billing_project_id=billing_project_id, - from_file=True, - ) - - data = t["max_date"][0] - - return data - - @task def download_data( table_name: str, @@ -197,8 +111,7 @@ def wrang_data( Args: table_name (str): nome da tabela, equivale ao table_id - data_mais_recente_do_bq (Union[date,datetime]): Data mais recente da tabela no BQ extraida - com com a task extract_last_date_from_bq + data_mais_recente_do_bq (Union[date,datetime]): Data mais recente da tabela no BQ extraida da api Returns: tuple[bool,str,Union[date,datetime]]: Retorna uma Tupla com 3 elementos: diff --git a/pipelines/datasets/br_ons_avaliacao_operacao/utils.py b/pipelines/datasets/br_ons_avaliacao_operacao/utils.py index 907298ac5..3a1be58f4 100644 --- a/pipelines/datasets/br_ons_avaliacao_operacao/utils.py +++ b/pipelines/datasets/br_ons_avaliacao_operacao/utils.py @@ -53,7 +53,9 @@ def extrai_data_recente(df: pd.DataFrame, table_name: str) -> Union[datetime, da if date_dict[table_name] == "yyyy-mm-dd hh:mm:ss": df["data_hora"] = df["data"] + " " + df["hora"] - df["data_hora"] = pd.to_datetime(df["data_hora"], format="%Y-%m-%d %H:%M:%S") + df["data_hora"] = pd.to_datetime( + df["data_hora"], format="%Y-%m-%d %H:%M:%S" + ).dt.date data = df["data_hora"].max() if ( diff --git a/pipelines/datasets/br_ons_estimativa_custos/flows.py b/pipelines/datasets/br_ons_estimativa_custos/flows.py index d0dbdf762..0db0c3cbb 100644 --- a/pipelines/datasets/br_ons_estimativa_custos/flows.py +++ b/pipelines/datasets/br_ons_estimativa_custos/flows.py @@ -21,24 +21,20 @@ schedule_br_ons_estimativa_custos_custo_marginal_operacao_semi_horario, schedule_br_ons_estimativa_custos_custo_variavel_unitario_usinas_termicas, ) -from pipelines.datasets.br_ons_estimativa_custos.tasks import ( - download_data, - extract_last_date_from_bq, - wrang_data, -) +from pipelines.datasets.br_ons_estimativa_custos.tasks import download_data, wrang_data from pipelines.utils.constants import constants as utils_constants from pipelines.utils.decorators import Flow from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants -from pipelines.utils.metadata.tasks import update_django_metadata +from pipelines.utils.metadata.tasks import ( + task_get_api_most_recent_date, + update_django_metadata, +) from pipelines.utils.tasks import ( create_table_and_upload_to_gcs, get_current_flow_labels, rename_current_flow_run_dataset_table, ) -# TODO: extract_last_date_from_bq colocar billing de prod antes de fechar PR - - with Flow( name="br_ons_estimativa_custos.custo_marginal_operacao_semi_horario", code_owners=["Gabriel Pisa"], @@ -63,11 +59,10 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - data_mais_recente_do_bq = extract_last_date_from_bq( + data_mais_recente_do_bq = task_get_api_most_recent_date( table_id=table_id, dataset_id=dataset_id, - # vai ser retirado virar from file - billing_project_id="basedosdados", + date_format="%Y-%m-%d", ) dow_data = download_data( @@ -165,11 +160,10 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - data_mais_recente_do_bq = extract_last_date_from_bq( + data_mais_recente_do_bq = task_get_api_most_recent_date( table_id=table_id, dataset_id=dataset_id, - # vai ser retirado virar from file - billing_project_id="basedosdados", + date_format="%Y-%m-%d", ) dow_data = download_data( @@ -268,11 +262,10 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - data_mais_recente_do_bq = extract_last_date_from_bq( + data_mais_recente_do_bq = task_get_api_most_recent_date( table_id=table_id, dataset_id=dataset_id, - # vai ser retirado virar from file - billing_project_id="basedosdados", + date_format="%Y-%m-%d", ) dow_data = download_data( @@ -371,11 +364,10 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - data_mais_recente_do_bq = extract_last_date_from_bq( + data_mais_recente_do_bq = task_get_api_most_recent_date( table_id=table_id, dataset_id=dataset_id, - # vai ser retirado virar from file - billing_project_id="basedosdados", + date_format="%Y-%m-%d", ) dow_data = download_data( @@ -474,11 +466,10 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - data_mais_recente_do_bq = extract_last_date_from_bq( + data_mais_recente_do_bq = task_get_api_most_recent_date( table_id=table_id, dataset_id=dataset_id, - # vai ser retirado virar from file - billing_project_id="basedosdados", + date_format="%Y-%m-%d", ) dow_data = download_data( diff --git a/pipelines/datasets/br_ons_estimativa_custos/tasks.py b/pipelines/datasets/br_ons_estimativa_custos/tasks.py index c8fe38ed7..520446576 100644 --- a/pipelines/datasets/br_ons_estimativa_custos/tasks.py +++ b/pipelines/datasets/br_ons_estimativa_custos/tasks.py @@ -7,7 +7,6 @@ from datetime import date, datetime from typing import Union -import basedosdados as bd import pandas as pd from prefect import task @@ -29,91 +28,6 @@ from pipelines.utils.utils import log, to_partitions -@task -def extract_last_date_from_bq( - dataset_id, table_id, billing_project_id: str -) -> Union[datetime, date]: - """Extrai a data mais recente de uma dada tabela dos conjuntos br_ons_avaliacao_operacao e br_ons_estimativa_custos do BQ - Args: - dataset_id (str): The ID of the dataset. - table_id (str): The ID of the table. - billing_project_id (str): The billing project ID. - - Returns: - Union[datetime, date]: data máxima da tabela - """ - - date_dict = { - "reservatorio": "yyyy-mm-dd", - "geracao_usina": "yyyy-mm-dd hh:mm:ss", - "geracao_termica_motivo_despacho": "yyyy-mm-dd hh:mm:ss", - "energia_natural_afluente": "yyyy-mm-dd", - "energia_armazenada_reservatorio": "yyyy-mm-dd", - "restricao_operacao_usinas_eolicas": "yyyy-mm-dd hh:mm:ss", - "custo_marginal_operacao_semi_horario": "yyyy-mm-dd hh:mm:ss", - "custo_marginal_operacao_semanal": "yyyy-mm-dd", - "balanco_energia_subsistemas": "yyyy-mm-dd hh:mm:ss", - "balanco_energia_subsistemas_dessem": "yyyy-mm-dd hh:mm:ss", - "custo_variavel_unitario_usinas_termicas": "yyyy-mm-dd", - } - - if date_dict[table_id] == "yyyy-mm-dd hh:mm:ss": - query_bd = f""" SELECT - MAX(FORMAT_TIMESTAMP('%F %T', TIMESTAMP(CONCAT(data, ' ', hora)))) AS max_data_hora - FROM - `{billing_project_id}.{dataset_id}.{table_id}` - """ - - t = bd.read_sql( - query=query_bd, - billing_project_id=billing_project_id, - from_file=True, - ) - - data = t["max_data_hora"][0] - data = pd.to_datetime(data, format="%Y-%m-%d %H:%M:%S") - - if ( - date_dict[table_id] == "yyyy-mm-dd" - and table_id != "custo_variavel_unitario_usinas_termicas" - ): - query_bd = f""" - SELECT MAX(data) as max_date - FROM - `{billing_project_id}.{dataset_id}.{table_id}` - """ - - t = bd.read_sql( - query=query_bd, - billing_project_id=billing_project_id, - from_file=True, - ) - - data = t["max_date"][0] - - print(f"A data mais recente da tabela no BQ é {data}") - - if ( - date_dict[table_id] == "yyyy-mm-dd" - and table_id == "custo_variavel_unitario_usinas_termicas" - ): - query_bd = f""" - SELECT MAX(data_inicio) as max_date - FROM - `{billing_project_id}.{dataset_id}.{table_id}` - """ - - t = bd.read_sql( - query=query_bd, - billing_project_id=billing_project_id, - from_file=True, - ) - - data = t["max_date"][0] - - return data - - @task def download_data( table_name: str, @@ -189,8 +103,7 @@ def wrang_data( Args: table_name (str): nome da tabela, equivale ao table_id data_mais_recente_do_bq (Union[date,datetime]): Data mais recente da tabela no BQ extraida - com com a task extract_last_date_from_bq - + com com a task task_get_api_most_recent_date Returns: tuple[bool,str,Union[date,datetime]]: Retorna uma Tupla com 3 elementos: 1. um valor booleano -> usado para parar o flow caso não haja atualização. diff --git a/pipelines/datasets/br_ons_estimativa_custos/utils.py b/pipelines/datasets/br_ons_estimativa_custos/utils.py index 1bba2b3e2..81bbca7c8 100644 --- a/pipelines/datasets/br_ons_estimativa_custos/utils.py +++ b/pipelines/datasets/br_ons_estimativa_custos/utils.py @@ -54,7 +54,9 @@ def extrai_data_recente(df: pd.DataFrame, table_name: str) -> Union[datetime, da if date_dict[table_name] == "yyyy-mm-dd hh:mm:ss": df["data_hora"] = df["data"] + " " + df["hora"] - df["data_hora"] = pd.to_datetime(df["data_hora"], format="%Y-%m-%d %H:%M:%S") + df["data_hora"] = pd.to_datetime( + df["data_hora"], format="%Y-%m-%d %H:%M:%S" + ).dt.date data = df["data_hora"].max() if ( @@ -64,6 +66,9 @@ def extrai_data_recente(df: pd.DataFrame, table_name: str) -> Union[datetime, da df["data_inicio"] = pd.to_datetime(df["data_inicio"], format="%Y-%m-%d").dt.date data = df["data_inicio"].max() + if isinstance(data, pd.Timestamp): + data = data.date() + return data diff --git a/pipelines/datasets/br_rf_cafir/tasks.py b/pipelines/datasets/br_rf_cafir/tasks.py index e383bff59..092dab94a 100644 --- a/pipelines/datasets/br_rf_cafir/tasks.py +++ b/pipelines/datasets/br_rf_cafir/tasks.py @@ -10,11 +10,9 @@ import pandas as pd from prefect import task -from pipelines.constants import constants from pipelines.datasets.br_rf_cafir.constants import constants as br_rf_cafir_constants from pipelines.datasets.br_rf_cafir.utils import ( download_csv_files, - extract_last_date, parse_date_parse_files, preserve_zeros, remove_accent, diff --git a/pipelines/datasets/br_rf_cafir/utils.py b/pipelines/datasets/br_rf_cafir/utils.py index 397886be9..d6de29728 100644 --- a/pipelines/datasets/br_rf_cafir/utils.py +++ b/pipelines/datasets/br_rf_cafir/utils.py @@ -7,54 +7,12 @@ import unicodedata from datetime import datetime -import basedosdados as bd import pandas as pd import requests from bs4 import BeautifulSoup from pipelines.utils.utils import log -# função para extrair datas -# valor usado para o check de atualização do site além de ser usado para update do coverage -# tambem será usado para criar uma coluna - - -def extract_last_date( - dataset_id: str, table_id: str, billing_project_id: str -) -> datetime: - """ - Extracts the last update date of a given dataset table. - - Args: - dataset_id (str): The ID of the dataset. - table_id (str): The ID of the table. - billing_project_id (str): The billing project ID. - - Returns: - str: The last update date in the format 'yyyy-mm-dd'. - - Raises: - Exception: If an error occurs while extracting the last update date. - """ - - query_bd = f""" - SELECT MAX(data_referencia) as max_date - FROM - `{billing_project_id}.{dataset_id}.{table_id}` - """ - - t = bd.read_sql( - query=query_bd, - billing_project_id=billing_project_id, - from_file=True, - ) - - data = t["max_date"][0] - - log(f"A data mais recente da tabela é: {data}") - - return data - def strip_string(x: pd.DataFrame) -> pd.DataFrame: """Aplica o strip em uma coluna de um dataframe, caso seja string. diff --git a/pipelines/datasets/br_rj_isp_estatisticas_seguranca/flows.py b/pipelines/datasets/br_rj_isp_estatisticas_seguranca/flows.py index 893daeeae..3fe0abad5 100644 --- a/pipelines/datasets/br_rj_isp_estatisticas_seguranca/flows.py +++ b/pipelines/datasets/br_rj_isp_estatisticas_seguranca/flows.py @@ -57,7 +57,7 @@ "materialize_after_dump", default=True, required=False ) - dbt_alias = Parameter("dbt_alias", default=False, required=False) + dbt_alias = Parameter("dbt_alias", default=True, required=False) rename_flow_run = rename_current_flow_run_dataset_table( prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id @@ -148,7 +148,7 @@ materialize_after_dump = Parameter( "materialize_after_dump", default=True, required=False ) - dbt_alias = Parameter("dbt_alias", default=False, required=False) + dbt_alias = Parameter("dbt_alias", default=True, required=False) rename_flow_run = rename_current_flow_run_dataset_table( prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id @@ -241,7 +241,7 @@ materialize_after_dump = Parameter( "materialize_after_dump", default=True, required=False ) - dbt_alias = Parameter("dbt_alias", default=False, required=False) + dbt_alias = Parameter("dbt_alias", default=True, required=False) rename_flow_run = rename_current_flow_run_dataset_table( prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id @@ -334,7 +334,7 @@ materialize_after_dump = Parameter( "materialize_after_dump", default=True, required=False ) - dbt_alias = Parameter("dbt_alias", default=False, required=False) + dbt_alias = Parameter("dbt_alias", default=True, required=False) update_metadata = Parameter("update_metadata", default=True, required=False) @@ -428,7 +428,7 @@ materialize_after_dump = Parameter( "materialize_after_dump", default=True, required=False ) - dbt_alias = Parameter("dbt_alias", default=False, required=False) + dbt_alias = Parameter("dbt_alias", default=True, required=False) update_metadata = Parameter("update_metadata", default=True, required=False) @@ -523,7 +523,7 @@ materialize_after_dump = Parameter( "materialize_after_dump", default=True, required=False ) - dbt_alias = Parameter("dbt_alias", default=False, required=False) + dbt_alias = Parameter("dbt_alias", default=True, required=False) update_metadata = Parameter("update_metadata", default=True, required=False) @@ -614,7 +614,7 @@ materialize_after_dump = Parameter( "materialize_after_dump", default=True, required=False ) - dbt_alias = Parameter("dbt_alias", default=False, required=False) + dbt_alias = Parameter("dbt_alias", default=True, required=False) update_metadata = Parameter("update_metadata", default=True, required=False) @@ -705,7 +705,7 @@ materialize_after_dump = Parameter( "materialize_after_dump", default=True, required=False ) - dbt_alias = Parameter("dbt_alias", default=False, required=False) + dbt_alias = Parameter("dbt_alias", default=True, required=False) update_metadata = Parameter("update_metadata", default=True, required=False) diff --git a/pipelines/datasets/br_rj_isp_estatisticas_seguranca/schedules.py b/pipelines/datasets/br_rj_isp_estatisticas_seguranca/schedules.py index b52e281a4..a30e8d430 100644 --- a/pipelines/datasets/br_rj_isp_estatisticas_seguranca/schedules.py +++ b/pipelines/datasets/br_rj_isp_estatisticas_seguranca/schedules.py @@ -24,7 +24,7 @@ "table_id": "evolucao_mensal_cisp", # ! table_id do dataset que será executado "materialization_mode": "prod", # ! Aonde o dataset será materializado (dev, prod ou prod-staging) "materialize_after_dump": True, # ! Se o dataset será materializado após o dump - "dbt_alias": False, + "dbt_alias": True, }, ), ] @@ -44,7 +44,7 @@ "table_id": "taxa_evolucao_mensal_uf", # ! table_id do dataset que será executado "materialization_mode": "prod", # ! Aonde o dataset será materializado (dev, prod ou prod-staging) "materialize_after_dump": True, # ! Se o dataset será materializado após o dump - "dbt_alias": False, + "dbt_alias": True, }, ), ] @@ -64,7 +64,7 @@ "table_id": "taxa_evolucao_mensal_municipio", # ! table_id do dataset que será executado "materialization_mode": "prod", # ! Aonde o dataset será materializado (dev, prod ou prod-staging) "materialize_after_dump": True, # ! Se o dataset será materializado após o dump - "dbt_alias": False, + "dbt_alias": True, }, ), ] @@ -84,7 +84,7 @@ "table_id": "feminicidio_mensal_cisp", # ! table_id do dataset que será executado "materialization_mode": "prod", # ! Aonde o dataset será materializado (dev, prod ou prod-staging) "materialize_after_dump": True, # ! Se o dataset será materializado após o dump - "dbt_alias": False, + "dbt_alias": True, }, ), ] @@ -104,7 +104,7 @@ "table_id": "evolucao_policial_morto_servico_mensal", # ! table_id do dataset que será executado "materialization_mode": "prod", # ! Aonde o dataset será materializado (dev, prod ou prod-staging) "materialize_after_dump": True, # ! Se o dataset será materializado após o dump - "dbt_alias": False, + "dbt_alias": True, }, ), ] @@ -125,7 +125,7 @@ "table_id": "armas_apreendidas_mensal", # ! table_id do dataset que será executado "materialization_mode": "prod", # ! Aonde o dataset será materializado (dev, prod ou prod-staging) "materialize_after_dump": True, # ! Se o dataset será materializado após o dump - "dbt_alias": False, + "dbt_alias": True, }, ), ] @@ -146,7 +146,7 @@ "table_id": "evolucao_mensal_municipio", # ! table_id do dataset que será executado "materialization_mode": "prod", # ! Aonde o dataset será materializado (dev, prod ou prod-staging) "materialize_after_dump": True, # ! Se o dataset será materializado após o dump - "dbt_alias": False, + "dbt_alias": True, }, ), ] @@ -166,7 +166,7 @@ "table_id": "evolucao_mensal_uf", # ! table_id do dataset que será executado "materialization_mode": "prod", # ! Aonde o dataset será materializado (dev, prod ou prod-staging) "materialize_after_dump": True, # ! Se o dataset será materializado após o dump - "dbt_alias": False, + "dbt_alias": True, }, ), ] diff --git a/pipelines/datasets/br_rj_isp_estatisticas_seguranca/tasks.py b/pipelines/datasets/br_rj_isp_estatisticas_seguranca/tasks.py index 629691445..568731f04 100644 --- a/pipelines/datasets/br_rj_isp_estatisticas_seguranca/tasks.py +++ b/pipelines/datasets/br_rj_isp_estatisticas_seguranca/tasks.py @@ -73,8 +73,15 @@ def clean_data( sep=";", thousands=".", decimal=",", + dtype=str, ) log(f"file -> {file_name} read") + if ( + file_name == isp_constants.TAXA_EVOLUCAO_MENSAL_UF.value + or file_name == isp_constants.TAXA_EVOLUCAO_MENSAL_MUNICIPIO.value + ): + df = df.apply(lambda x: x.str.replace(",", ".")) + log(df.head()) else: df = pd.read_excel( @@ -96,12 +103,13 @@ def clean_data( log("creating columns order") ordem_colunas = create_columns_order(nomes_colunas) - log("checking tipo_fase col") - df = check_tipo_fase(df) - log("ordering columns") df = df[ordem_colunas] + log(df.columns) + log("checking tipo_fase col") + df = check_tipo_fase(df) + log("building dir") os.system(f"mkdir -p {isp_constants.OUTPUT_PATH.value}") diff --git a/pipelines/datasets/br_stf_corte_aberta/flows.py b/pipelines/datasets/br_stf_corte_aberta/flows.py index 2e58c7333..256d04f4b 100644 --- a/pipelines/datasets/br_stf_corte_aberta/flows.py +++ b/pipelines/datasets/br_stf_corte_aberta/flows.py @@ -12,18 +12,20 @@ from pipelines.constants import constants from pipelines.datasets.br_stf_corte_aberta.schedules import every_day_stf from pipelines.datasets.br_stf_corte_aberta.tasks import ( - check_for_updates, download_and_transform, + get_data_source_stf_max_date, make_partitions, ) from pipelines.utils.constants import constants as utils_constants from pipelines.utils.decorators import Flow from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants -from pipelines.utils.metadata.tasks import update_django_metadata +from pipelines.utils.metadata.tasks import ( + check_if_data_is_outdated, + update_django_metadata, +) from pipelines.utils.tasks import ( create_table_and_upload_to_gcs, get_current_flow_labels, - log_task, rename_current_flow_run_dataset_table, ) @@ -44,15 +46,16 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - dados_desatualizados = check_for_updates( - dataset_id=dataset_id, table_id=table_id, upstream_tasks=[rename_flow_run] + data_source_max_date = get_data_source_stf_max_date() + + dados_desatualizados = check_if_data_is_outdated( + dataset_id=dataset_id, + table_id=table_id, + data_source_max_date=data_source_max_date, + date_format="%Y-%m-%d", + upstream_tasks=[data_source_max_date], ) - log_task(f"Checando se os dados estão desatualizados: {dados_desatualizados}") - with case(dados_desatualizados, False): - log_task( - "Dados atualizados, não é necessário fazer o download", - upstream_tasks=[dados_desatualizados, rename_flow_run], - ) + with case(dados_desatualizados, True): df = download_and_transform(upstream_tasks=[rename_flow_run]) output_path = make_partitions(df=df, upstream_tasks=[df]) diff --git a/pipelines/datasets/br_stf_corte_aberta/tasks.py b/pipelines/datasets/br_stf_corte_aberta/tasks.py index f4c16542f..01eb5d585 100644 --- a/pipelines/datasets/br_stf_corte_aberta/tasks.py +++ b/pipelines/datasets/br_stf_corte_aberta/tasks.py @@ -4,7 +4,6 @@ """ from datetime import datetime, timedelta -import pandas as pd from prefect import task from pipelines.constants import constants @@ -12,7 +11,6 @@ from pipelines.datasets.br_stf_corte_aberta.utils import ( check_for_data, column_bool, - extract_last_date, fix_columns_data, partition_data, read_csv, @@ -26,25 +24,10 @@ max_retries=constants.TASK_MAX_RETRIES.value, retry_delay=timedelta(seconds=constants.TASK_RETRY_DELAY.value), ) -def check_for_updates(dataset_id, table_id): +def get_data_source_stf_max_date(): data_obj = check_for_data() data_obj = datetime.strptime(data_obj, "%Y-%m-%d").date() - # Obtém a última data no site BD - data_bq_obj = extract_last_date( - dataset_id=dataset_id, - table_id=table_id, - date_format="yy-mm-dd", - billing_project_id="basedosdados", - data="data_decisao", - ) - # Registra a data mais recente do site - log(f"Última data no site do STF: {data_obj}") - log(f"Última data no site da BD: {data_bq_obj}") - # Compara as datas para verificar se há atualizações - if data_obj > data_bq_obj: - return True # Há atualizações disponíveis - else: - return False # Não há novas atualizações disponíveis + return data_obj @task( diff --git a/pipelines/datasets/br_stf_corte_aberta/utils.py b/pipelines/datasets/br_stf_corte_aberta/utils.py index 941d03530..adac225c7 100644 --- a/pipelines/datasets/br_stf_corte_aberta/utils.py +++ b/pipelines/datasets/br_stf_corte_aberta/utils.py @@ -6,7 +6,6 @@ import time from datetime import datetime -import basedosdados as bd import numpy as np import pandas as pd from selenium import webdriver @@ -122,68 +121,6 @@ def partition_data(df: pd.DataFrame, column_name: list[str], output_directory: s ) -def extract_last_date( - dataset_id, table_id, date_format: str, billing_project_id: str, data: str = "data" -): - """ - Extracts the last update date of a given dataset table. - Args: - dataset_id (str): The ID of the dataset. - table_id (str): The ID of the table. - date_format (str): Date format ('yy-mm' or 'yy-mm-dd') - if set to 'yy-mm' the function will look for ano and mes named columns in the table_id - and return a concatenated string in the formar yyyy-mm. if set to 'yyyy-mm-dd' - the function will look for data named column in the format 'yyyy-mm-dd' and return it. - Returns: - str: The last update date in the format 'yyyy-mm' or 'yyyy-mm-dd'. - Raises: - Exception: If an error occurs while extracting the last update date. - """ - if date_format == "yy-mm": - try: - query_bd = f""" - SELECT - MAX(CONCAT(ano,"-",mes)) as max_date - FROM - `{billing_project_id}.{dataset_id}.{table_id}` - """ - t = bd.read_sql( - query=query_bd, - billing_project_id=billing_project_id, - from_file=True, - ) - input_date_str = t["max_date"][0] - date_obj = datetime.strptime(input_date_str, "%Y-%m") - last_date = date_obj.strftime("%Y-%m") - log(f"Última data YYYY-MM: {last_date}") - return last_date - except Exception as e: - log(f"An error occurred while extracting the last update date: {str(e)}") - raise - else: - try: - query_bd = f""" - SELECT - MAX({data}) as max_date - FROM - `{billing_project_id}.{dataset_id}.{table_id}` - """ - log(f"Query: {query_bd}") - t = bd.read_sql( - query=query_bd, - billing_project_id=billing_project_id, - from_file=True, - ) - # it infers that the data variable is already on basedosdados standart format - # yyyy-mm-dd - last_date = t["max_date"][0] - log(f"Última data YYYY-MM-DD: {last_date}") - return last_date - except Exception as e: - log(f"An error occurred while extracting the last update date: {str(e)}") - raise - - def check_for_data(): log("Iniciando web scrapping") web_scrapping() diff --git a/pipelines/datasets/cross_update/flows.py b/pipelines/datasets/cross_update/flows.py index 532478b24..7ac447763 100644 --- a/pipelines/datasets/cross_update/flows.py +++ b/pipelines/datasets/cross_update/flows.py @@ -4,6 +4,8 @@ """ # pylint: disable=invalid-name,line-too-long +from datetime import timedelta + from prefect import Parameter, case, unmapped from prefect.run_configs import KubernetesRun from prefect.storage import GCS @@ -12,30 +14,56 @@ from pipelines.constants import constants from pipelines.datasets.cross_update.schedules import schedule_nrows from pipelines.datasets.cross_update.tasks import ( - crawler_tables, - datasearch_json, - rename_blobs, - update_nrows, + filter_eligible_download_tables, + get_metadata_data, + query_tables, ) from pipelines.utils.constants import constants as utils_constants from pipelines.utils.decorators import Flow -from pipelines.utils.tasks import get_current_flow_labels +from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants +from pipelines.utils.metadata.tasks import update_django_metadata +from pipelines.utils.tasks import ( + create_table_and_upload_to_gcs, + get_current_flow_labels, + rename_current_flow_run_dataset_table, +) with Flow( - name="cross_update.update_nrows", code_owners=["lucas_cr"] + name="cross_update.update_nrows", code_owners=["lauris"] ) as crossupdate_nrows: dump_to_gcs = Parameter("dump_to_gcs", default=False, required=False) + update_metadata_table = Parameter( + "update_metadata_table", default=False, required=False + ) days = Parameter("days", default=7, required=False) mode = Parameter("mode", default="prod", required=False) - page_size = Parameter("page_size", default=100, required=False) + current_flow_labels = get_current_flow_labels() + + # Atualiza a tabela que contem os metadados do BQ + with case(update_metadata_table, True): + update_metadata_table_flow = create_flow_run( + flow_name="cross_update.update_metadata_table", + project_name=constants.PREFECT_DEFAULT_PROJECT.value, + parameters={"materialization_mode": mode}, + labels=current_flow_labels, + ) + + wait_for_create_table = wait_for_flow_run( + update_metadata_table_flow, + stream_states=True, + stream_logs=True, + raise_final_state=True, + ) + + # Consulta e seleciona apenas as tabelas que atendem os critérios de tamanho e abertura(bdpro) - json_response = datasearch_json(page_size=page_size, mode=mode) - updated_tables, tables_to_zip = crawler_tables(json_response, days=days) - updated_tables.set_upstream(json_response) - update_nrows.map(updated_tables, mode=unmapped(mode)) + eligible_to_zip_tables = query_tables(days=days, mode=mode) + tables_to_zip = filter_eligible_download_tables( + eligible_to_zip_tables, upstream_tasks=[eligible_to_zip_tables] + ) + # Para cada tabela selecionada cria um flow de dump para gcs with case(dump_to_gcs, True): - current_flow_labels = get_current_flow_labels() dump_to_gcs_flow = create_flow_run.map( flow_name=unmapped(utils_constants.FLOW_DUMP_TO_GCS_NAME.value), project_name=unmapped(constants.PREFECT_DEFAULT_PROJECT.value), @@ -51,9 +79,85 @@ raise_final_state=unmapped(True), ) - rename_blobs(upstream_tasks=[wait_for_dump_to_gcs]) - crossupdate_nrows.storage = GCS(str(constants.GCS_FLOWS_BUCKET.value)) crossupdate_nrows.run_config = KubernetesRun(image=str(constants.DOCKER_IMAGE.value)) -# crossupdate_nrows.schedule = schedule_nrows +crossupdate_nrows.schedule = schedule_nrows + +with Flow( + name="cross_update.update_metadata_table", code_owners=["lauris"] +) as crossupdate_update_metadata_table: + dataset_id = Parameter("dataset_id", default="br_bd_metadados", required=False) + table_id = Parameter("table_id", default="bigquery_tables", required=False) + update_metadata = Parameter("update_metadata", default=False, required=False) + materialization_mode = Parameter( + "materialization_mode", default="dev", required=False + ) + materialize_after_dump = Parameter( + "materialize_after_dump", default=True, required=False + ) + dbt_alias = Parameter("dbt_alias", default=True, required=False) + + rename_flow_run = rename_current_flow_run_dataset_table( + prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id + ) + + file_path = get_metadata_data( + mode=materialization_mode, upstream_tasks=[materialization_mode] + ) + + wait_upload_table = create_table_and_upload_to_gcs( + data_path=file_path, + dataset_id=dataset_id, + table_id=table_id, + dump_mode="append", + upstream_tasks=[file_path], + ) + + with case(materialize_after_dump, True): + # Trigger DBT flow run + current_flow_labels = get_current_flow_labels() + materialization_flow = create_flow_run( + flow_name=utils_constants.FLOW_EXECUTE_DBT_MODEL_NAME.value, + project_name=constants.PREFECT_DEFAULT_PROJECT.value, + parameters={ + "dataset_id": dataset_id, + "table_id": table_id, + "mode": materialization_mode, + "dbt_alias": dbt_alias, + }, + labels=current_flow_labels, + run_name=f"Materialize {dataset_id}.{table_id}", + upstream_tasks=[wait_upload_table], + ) + + wait_for_materialization = wait_for_flow_run( + materialization_flow, + stream_states=True, + stream_logs=True, + raise_final_state=True, + ) + + wait_for_materialization.max_retries = ( + dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value + ) + + wait_for_materialization.retry_delay = timedelta( + seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value + ) + + with case(update_metadata, True): + update_django_metadata( + dataset_id=dataset_id, + table_id=table_id, + coverage_type="all_free", + prefect_mode=materialization_mode, + bq_project="basedosdados", + historical_database=False, + ) + + +crossupdate_update_metadata_table.storage = GCS(str(constants.GCS_FLOWS_BUCKET.value)) +crossupdate_update_metadata_table.run_config = KubernetesRun( + image=str(constants.DOCKER_IMAGE.value) +) diff --git a/pipelines/datasets/cross_update/schedules.py b/pipelines/datasets/cross_update/schedules.py index 78374f2b5..62388aa3e 100644 --- a/pipelines/datasets/cross_update/schedules.py +++ b/pipelines/datasets/cross_update/schedules.py @@ -3,27 +3,27 @@ Schedules for br_tse_eleicoes """ -from datetime import datetime, timedelta +from datetime import datetime from prefect.schedules import Schedule -from prefect.schedules.clocks import IntervalClock +from prefect.schedules.clocks import CronClock from pipelines.constants import constants schedule_nrows = Schedule( clocks=[ - IntervalClock( - interval=timedelta(days=7), - start_date=datetime(2021, 1, 1, 9, 45), + CronClock( + cron="0 8 * * 2", + start_date=datetime(2023, 5, 1, 7, 30), labels=[ - str(constants.BASEDOSDADOS_PROD_AGENT_LABEL.value), + constants.BASEDOSDADOS_PROD_AGENT_LABEL.value, ], parameter_defaults={ "dump_to_gcs": True, - "days": 7, "mode": "prod", - "page_size": 100, + "days": 7, + "update_metadata_table": True, }, ), - ], + ] ) diff --git a/pipelines/datasets/cross_update/tasks.py b/pipelines/datasets/cross_update/tasks.py index ec63c54e1..257087731 100644 --- a/pipelines/datasets/cross_update/tasks.py +++ b/pipelines/datasets/cross_update/tasks.py @@ -2,213 +2,179 @@ """ Tasks for cross update of metadata. """ -import datetime import re -from datetime import timedelta # pylint: disable=invalid-name, too-many-locals -from typing import Dict, List, Tuple +from typing import Dict, List import basedosdados as bd -import ruamel.yaml as ryaml +import pandas as pd from google.cloud import storage from prefect import task from tqdm import tqdm -from pipelines.datasets.cross_update.utils import _safe_fetch -from pipelines.utils.dump_to_gcs.constants import constants as dump_to_gcs_constants +from pipelines.datasets.cross_update.utils import find_closed_tables, save_file from pipelines.utils.utils import log @task -def datasearch_json(page_size: int, mode: str) -> Dict: +def query_tables(days: int = 7, mode: str = "dev") -> List[Dict[str, str]]: """ - This task uses `bd_dataset_search` website API - enpoint to retrieve a list of tables updated in last 7 days. - Args: - page_size (int): Number of tables to be retrieved in each request. - mode (str): prod or staging - Returns: - dict with api response + Queries BigQuery Tables metadata to find elegible tables to zip. """ - if mode == "prod": - url = "https://basedosdados.org/api/3/action/bd_dataset_search" - elif mode == "dev": - url = "https://staging.basedosdados.org/api/3/action/bd_dataset_search" - else: - raise ValueError("mode must be prod or dev") - url = f"{url}?q=&resource_type=bdm_table&page=1&page_size={page_size}" # pylint: disable=C0301 - response = _safe_fetch(url) - json_response = response.json() - - return json_response - - -@task(nout=2) -def crawler_tables( - json_response: dict, days: int = 7 -) -> Tuple[List[Dict[str, str]], List[Dict[str, str]]]: - """Generate a list of dicts like {"dataset_id": "dataset_id", "table_id": "table_id"} - where all tables were update in the last 7 days + + if mode == "dev": + billing_project_id = "basedosdados-dev" + elif mode == "prod": + billing_project_id = "basedosdados" + + query = f""" + SELECT + dataset_id, + table_id, + row_count, + size_bytes + FROM `basedosdados.br_bd_metadados.bigquery_tables` + WHERE + dataset_id NOT IN ("analytics_295884852","logs") AND + DATE_DIFF(CURRENT_DATE(),last_modified_date,DAY) <= {days} """ - # the line below returns the full number of datasets, despite the page_size this approach - # leads to an IndexError when the number of datasets is greater than page_size (in the flow) - # n_datasets = json_response["result"]["count"] - - # changed n_datasets to the actual number of datasets, limited by page_size - n_datasets = len(json_response["result"]["datasets"]) - n_resources = [ - json_response["result"]["datasets"][k]["num_resources"] - for k in range(n_datasets) - ] - datasets = json_response["result"]["datasets"] - bdm_tables = [] - for i in range(n_datasets): - for j in range(n_resources[i]): - if datasets[i]["resources"][j]["resource_type"] == "bdm_table": - bdm_tables.append(datasets[i]["resources"][j]) - - log(f"Found {len(bdm_tables)} bdm tables") - log(bdm_tables[0].keys()) - to_update = [] - for bdm_table in bdm_tables: - # skip if dataset_id, table_id, last_updated, and number of rows are not in the bdm_table keys - if not all( - key in bdm_table.keys() - for key in ["dataset_id", "table_id", "metadata_modified", "number_rows"] - ): - continue - tmp_dict = { - "dataset_id": bdm_table["dataset_id"], - "table_id": bdm_table["table_id"], - "last_updated": bdm_table["metadata_modified"], - "number_rows": bdm_table["number_rows"], - } - to_update.append(tmp_dict) - - # filter list of dictionaries by last_updated and remove older than X days - today = datetime.datetime.today() - seven_days_ago = today - timedelta(days=days) - to_update = [ - x - for x in to_update - if datetime.datetime.strptime(x["last_updated"], "%Y-%m-%dT%H:%M:%S.%f") - > seven_days_ago - ] - log(f"Found {len(to_update)} tables updated in last {days} days") - - to_zip = [] - for bdm_table in to_update: - tmp_dict = { - "dataset_id": bdm_table["dataset_id"], - "table_id": bdm_table["table_id"], - "project_id": "basedosdados", - "maximum_bytes_processed": dump_to_gcs_constants.MAX_BYTES_PROCESSED_PER_TABLE.value, - "number_rows": bdm_table["number_rows"], - } - to_zip.append(tmp_dict) - - # remove tables where number of rows is None - to_zip = [x for x in to_zip if x["number_rows"] is not None] - # keep only tables with less than 200k lines - to_zip = [x for x in to_zip if x["number_rows"] <= 200000] - - log(f"Found {len(to_zip)} tables to zip") - for table in to_zip: - log( - f"Zipping: dataset_id: {table['dataset_id']}, table_id: {table['table_id']}" - ) + tables = bd.read_sql( + query=query, + billing_project_id=billing_project_id, + from_file=True, + ) - for x in to_zip: - del x["number_rows"] + log(f"Found {len(tables)} eligible tables to zip") - for x in to_update: - del x["number_rows"] - del x["last_updated"] + to_zip = tables.to_dict("records") - return (to_update, to_zip) + return to_zip @task -def update_nrows(table_dict: Dict[str, str], mode: str) -> None: - """Get number of rows in a table +def rename_blobs() -> None: + """Rename blobs in basedosdados-dev bucket""" + storage_client = storage.Client() - Args: - table_dict (Dict[str, str]): Dict with dataset_id and table_id - mode (str): prod or dev - Returns: - None - """ - dataset_id = table_dict["dataset_id"] - table_id = table_dict["table_id"] - config_map = {} - if mode == "prod": - config_map.update({"database": f"basedosdados.{dataset_id}.{table_id}"}) - config_map.update({"project_id": "basedosdados"}) - elif mode == "dev": - config_map.update( - {"database": f"basedosdados-dev.{dataset_id}_staging.{table_id}"} - ) - config_map.update({"project_id": "basedosdados-dev"}) - else: - raise ValueError("mode must be prod or dev") + bucket = storage_client.get_bucket("basedosdados-public") + blobs = bucket.list_blobs(prefix="one-click-download/") + + for blob in tqdm(list(blobs)): + table_id = blob.name.split("/")[-2] + new_name = re.sub(r"data0*\.csv\.gz", table_id + ".csv.gz", blob.name) + bucket.rename_blob(blob, new_name) - # ideally, we would consume the API to get the number of rows, - # but it is not available yet. - # See: https://stackoverflow.com/questions/69313542/num-rows-issue-for-views-in-big-query-python-library - query = f"SELECT COUNT(*) AS n_rows FROM `{config_map['database']}`" - n_rows = bd.read_sql( - query=query, billing_project_id=config_map["project_id"], from_file=True - )["n_rows"].to_list()[0] - fields_to_update = [{"number_rows": int(n_rows)}] +@task +def get_metadata_data(mode: str = "dev") -> str: + """ + Fetches metadata about BigQuery tables and saves it as a file. - # add credentials to config.toml - # TODO: remove this because bd 2.0 does not have Metadata class - handle = bd.Metadata(dataset_id=dataset_id, table_id=table_id) - handle.create(if_exists="replace") + Returns: + - str: The full file path where the metadata file is saved. - yaml = ryaml.YAML() - yaml.preserve_quotes = True - yaml.indent(mapping=4, sequence=6, offset=4) + This function retrieves metadata information for BigQuery tables. It queries the INFORMATION_SCHEMA + to obtain a list of schema names and then retrieves metadata about tables within those schemas. + The fetched metadata includes information such as table names, sizes, and other properties. + The data is then saved as a file. - config_file = handle.filepath.as_posix() + Note: + - The function uses the batch method to efficiently retrieve metadata for tables in batches + to avoid API limitations or timeouts. + """ - with open(config_file, encoding="utf-8") as fp: - data = yaml.load(fp) + if mode == "dev": + billing_project_id = "basedosdados-dev" + elif mode == "prod": + billing_project_id = "basedosdados" - # log(data) + schema_names_query = """ + SELECT schema_name FROM `basedosdados`.INFORMATION_SCHEMA.SCHEMATA + """ - for field in fields_to_update: - for k, v in field.items(): - if isinstance(v, dict): - for i, j in v.items(): - data[k][i] = j - else: - data[k] = v + log(schema_names_query) + schema_names_list = bd.read_sql( + query=schema_names_query, + billing_project_id=billing_project_id, + from_file=True, + )["schema_name"] + + def batch(lst, n): + for i in range(0, len(lst), n): + yield lst[i : i + n] + + df_list = [] + for schema_batch in batch(schema_names_list, 50): + query = "" + for schema_name in schema_batch: + query += f"SELECT * FROM `basedosdados.{schema_name}.__TABLES__` UNION ALL " + query = query[:-11] + batch_df = bd.read_sql( + query=query, + billing_project_id=billing_project_id, + from_file=True, + ) + df_list.append(batch_df) - with open(config_file, "w", encoding="utf-8") as fp: - yaml.dump(data, fp) + df = pd.concat(df_list, ignore_index=True) - # log(data) + full_filepath = save_file(df=df, table_id="bigquery_tables") - if handle.validate(): - handle.publish(if_exists="replace") - log(f"Metadata for {table_id} updated") - else: - log("Fail to validate metadata.") + return full_filepath @task -def rename_blobs() -> None: - """Rename blobs in basedosdados-dev bucket""" - storage_client = storage.Client() +def filter_eligible_download_tables(eligible_download_tables: List) -> List: + """ + Filters a list of tables to include only those that meet the following criteria: + - Registered in Django database + - Contains open rows (only rows marked as open are downloadable) + - Size is smaller than 5GB and has fewer than 200K rows + - Contains row information in BigQuery + """ - bucket = storage_client.get_bucket("basedosdados-public") - blobs = bucket.list_blobs(prefix="one-click-download/") + backend = bd.Backend(graphql_url="https://api.basedosdados.org/api/v1/graphql") + all_closed_tables = find_closed_tables(backend) + remove_from_eligible_download_table = [] - for blob in tqdm(list(blobs)): - table_id = blob.name.split("/")[-2] - new_name = re.sub(r"data0*\.csv\.gz", table_id + ".csv.gz", blob.name) - bucket.rename_blob(blob, new_name) + for table in eligible_download_tables: + table["table_django_id"] = backend._get_table_id_from_name( + gcp_dataset_id=table["dataset_id"], gcp_table_id=table["table_id"] + ) + + if table["table_django_id"] is None: + remove_from_eligible_download_table.append(table) + + elif table["row_count"] > 200000 or table["size_bytes"] > 5000000000: + remove_from_eligible_download_table.append(table) + log(f"{table['dataset_id']}.{table['table_id']} is too big to zip") + + elif table["table_django_id"] in all_closed_tables: + remove_from_eligible_download_table.append(table) + log(f"{table['dataset_id']}.{table['table_id']} is all closed") + + elif table["row_count"] == 0: + remove_from_eligible_download_table.append(table) + log( + f"{table['dataset_id']}.{table['table_id']} missing information about number of rows" + ) + + # etapa removida pq essa funçao foi desenvolvida no backend da BD, + # mantive aqui para caso seja necessario inclui-la novamente em outro momento + # if table["table_django_id"] is not None: + # modify_table_metadata(table, backend) + + log(f"Removed {len(remove_from_eligible_download_table)} tables") + eligible_download_tables = [ + table + for table in eligible_download_tables + if table not in remove_from_eligible_download_table + ] + + log(f"Found {len(eligible_download_tables)} tables to zip") + for table in eligible_download_tables: + log(f"{table['dataset_id']}.{table['table_id']}") + + return eligible_download_tables diff --git a/pipelines/datasets/cross_update/utils.py b/pipelines/datasets/cross_update/utils.py index 1db767be4..9191766b3 100644 --- a/pipelines/datasets/cross_update/utils.py +++ b/pipelines/datasets/cross_update/utils.py @@ -2,24 +2,170 @@ """ Utils for cross_update pipeline """ -import requests +import os +import pandas as pd +from pandas import json_normalize -def _safe_fetch(url: str): +from pipelines.utils.utils import get_credentials_from_secret, log + + +def save_file(df: pd.DataFrame, table_id: str) -> str: """ - Safely fetchs urls and, if somehting goes wrong, informs user what is the possible cause + Saves a DataFrame as a CSV file. + + Args: + df (pd.DataFrame): The DataFrame to be saved. + table_id (str): The identifier for the table. + + Returns: + str: The full file path of the saved CSV file. + """ - response = None - try: - response = requests.get(url, timeout=300) - response.raise_for_status() - except requests.exceptions.HTTPError as errh: - print("Http Error:", errh) - except requests.exceptions.ConnectionError as errc: - print("Error Connecting:", errc) - except requests.exceptions.Timeout as errt: - print("Timeout Error:", errt) - except requests.exceptions.RequestException as err: - print("This url doesn't appear to exists:", err) - - return response + + # Define the folder path for storing the file + folder = f"tmp/{table_id}" + # Create the folder if it doesn't exist + os.system(f"mkdir -p {folder}") + # Define the full file path for the CSV file + full_filepath = f"{folder}/{table_id}.csv" + # Save the DataFrame as a CSV file + df.to_csv(full_filepath, index=False) + log("save_input") + return full_filepath + + +def batch(lst, n): + for i in range(0, len(lst), n): + yield lst[i : i + n] + + +def find_closed_tables(backend): + query = """ + query { + allCoverage(isClosed: false, table_Id_Isnull:false, datetimeRanges_Id_Isnull:false) { + edges { + node { + table { + _id + name + isClosed + dataset { + name + } + } + datetimeRanges { + edges { + node { + id + startYear + startMonth + startDay + endYear + endMonth + endDay + } + } + } + } + } + } + }""" + + response = backend._execute_query(query=query) + response = backend._simplify_graphql_response(response)["allCoverage"] + data = json_normalize(response) + open_tables = data["table._id"].tolist() + + query = """ + query { + allCoverage(isClosed: true, table_Id_Isnull:false, datetimeRanges_Id_Isnull:false) { + edges { + node { + table { + _id + name + isClosed + dataset { + name + } + } + datetimeRanges { + edges { + node { + id + } + } + } + } + } + } + }""" + + response = backend._execute_query(query=query) + response = backend._simplify_graphql_response(response)["allCoverage"] + data = json_normalize(response) + closed_tables = data["table._id"].tolist() + + all_closed_tables = [table for table in closed_tables if table not in open_tables] + + return all_closed_tables + + +def modify_table_metadata(table, backend): + mutation = """ + mutation($input: CreateUpdateTableInput!) { + CreateUpdateTable(input: $input) { + errors { + field, + messages + }, + clientMutationId, + table { + id, + } + } + } + """ + + # colocando essa condição porque o graphql nao aceita valores maiores do que esse para os campos "uncompressedFileSize" e "numberRows" + if table["size_bytes"] > 2147483647: + table["size_bytes"] = None + + if table["row_count"] > 2147483647: + table["row_count"] = None + + mutation_parameters = { + "id": table["table_django_id"], + "numberRows": table["row_count"], + "uncompressedFileSize": table["size_bytes"], + } + + response = backend._execute_query( + query=mutation, + variables={"input": mutation_parameters}, + headers=get_headers(backend), + ) + + if response is None: + log(table) + + +def get_headers(backend): + credentials = get_credentials_from_secret(secret_path="api_user_prod") + + mutation = """ + mutation ($email: String!, $password: String!) { + tokenAuth(email: $email, password: $password) { + token + } + } + """ + variables = {"email": credentials["email"], "password": credentials["password"]} + + response = backend._execute_query(query=mutation, variables=variables) + token = response["tokenAuth"]["token"] + + header_for_mutation_query = {"Authorization": f"Bearer {token}"} + + return header_for_mutation_query diff --git a/pipelines/datasets/mundo_transfermarkt_competicoes/constants.py b/pipelines/datasets/mundo_transfermarkt_competicoes/constants.py index 2ef29374b..8149d1eeb 100644 --- a/pipelines/datasets/mundo_transfermarkt_competicoes/constants.py +++ b/pipelines/datasets/mundo_transfermarkt_competicoes/constants.py @@ -95,3 +95,27 @@ class constants(Enum): # pylint: disable=c0103 "chutes_fora_man", "chutes_fora_vis", ] + COLUMNS_MAPPING = { + "ht": "time_man", + "at": "time_vis", + "fthg": "gols_man", + "ftag": "gols_vis", + "col_home": "colocacao_man", + "col_away": "colocacao_vis", + "ac": "escanteios_vis", + "hc": "escanteios_man", + "adef": "defesas_vis", + "hdef": "defesas_man", + "af": "faltas_vis", + "afk": "chutes_bola_parada_vis", + "aimp": "impedimentos_vis", + "as": "chutes_vis", + "asofft": "chutes_fora_vis", + "hf": "faltas_man", + "hfk": "chutes_bola_parada_man", + "himp": "impedimentos_man", + "hs": "chutes_man", + "hsofft": "chutes_fora_man", + "htag": "gols_1_tempo_vis", + "hthg": "gols_1_tempo_man", + } diff --git a/pipelines/datasets/mundo_transfermarkt_competicoes/utils.py b/pipelines/datasets/mundo_transfermarkt_competicoes/utils.py index fa458d571..a00eef144 100644 --- a/pipelines/datasets/mundo_transfermarkt_competicoes/utils.py +++ b/pipelines/datasets/mundo_transfermarkt_competicoes/utils.py @@ -341,6 +341,33 @@ def valor_vazio(df): return df +def rename_columns(df): + df = df.rename(columns=mundo_constants.COLUMNS_MAPPING.value) + return df + + +def clean_column(column): + column = column.str.replace(r"['\":.mTh]", "", regex=True) + column = column.replace("", None) + return column + + +def extract_additional_columns(df_valor): + df_valor["idade_media_titular_vis"] = clean_column( + df_valor["idade_media_titular_vis"] + ) + df_valor["idade_media_titular_man"] = clean_column( + df_valor["idade_media_titular_man"] + ) + df_valor["valor_equipe_titular_man"] = clean_column( + df_valor["valor_equipe_titular_man"] + ) + df_valor["valor_equipe_titular_vis"] = clean_column( + df_valor["valor_equipe_titular_vis"] + ) + return df_valor + + # ! Código principal da coleta do Brasileirão async def execucao_coleta(): """ @@ -384,12 +411,16 @@ async def execucao_coleta(): site_data = requests.get(base_url.format(season=season), headers=headers) soup = BeautifulSoup(site_data.content, "html.parser") link_tags = soup.find_all("a", attrs={"class": "ergebnis-link"}) + link_tags2 = soup.find_all("a", attrs={"title": "Match preview"}) for tag in link_tags: links.append(re.sub(r"\s", "", tag["href"])) + for tag in link_tags2: + links.append(re.sub(r"\s", "", tag["href"])) if len(links) % 10 != 0: num_excess = len(links) % 10 del links[-num_excess:] tabela = soup.findAll("div", class_="box") + for i in range(1, int(len(links) / 10) + 1): for row in tabela[i].findAll("tr"): # para tudo que estiver em cells = row.findAll("td") # variável para encontrar @@ -400,28 +431,31 @@ async def execucao_coleta(): ) # iterando sobre cada linha at_tag.append(cells[6].findAll(text=True)) # iterando sobre cada linha - for time in range(len(links)): - ht.append(str(ht_tag[time][2])) - col_home.append(str(ht_tag[time][0])) - for time in range(len(links)): + for time in range(380): + try: + ht.append(str(ht_tag[time][2])) + col_home.append(str(ht_tag[time][0])) + except Exception: + ht.append(str(ht_tag[time][0])) + str_vazio = "" + col_home.append(str(str_vazio)) + for time in range(380): at.append(str(at_tag[time][0])) - col_away.append(str(at_tag[time][2])) + try: + col_away.append(str(at_tag[time][2])) + except Exception: + str_vazio = "" + col_away.append(str(str_vazio)) + for tag in result_tag: fthg.append(str(pattern_fthg.findall(str(tag)))) ftag.append(str(pattern_ftag.findall(str(tag)))) + # Gerando os links para coletar dados sobre estatística e dados gerais # links das estatísticas - links_esta = [] + links_esta = [link.replace("index", "statistik") for link in links] # links das escalações de cada partida - links_valor = [] - - # Gerando os links para coletar dados sobre estatística e dados gerais - for link in links: - esta = link.replace("index", "statistik") - links_esta.append(esta) - for link in links: - valor = link.replace("index", "aufstellung") - links_valor.append(valor) + links_valor = [link.replace("index", "aufstellung") for link in links] n_links = len(links) log(f"Encontrados {n_links} partidas.") @@ -430,6 +464,7 @@ async def execucao_coleta(): for n, link in enumerate(links_esta): # Tentativas de obter os links content = await get_content(base_link + link, wait_time=0.01) + # log(content) if content: try: df = process(df, content) @@ -441,10 +476,12 @@ async def execucao_coleta(): else: df = vazio(df) log(f"{n+1} dados de {n_links} extraídos.") + # Segundo loop: Dados gerais for n, link in enumerate(links_valor): # Tentativas de obter os links content = await get_content(base_link + link, wait_time=0.01) + # log(content) if content: try: df_valor = pegar_valor(df_valor, content) @@ -481,32 +518,7 @@ async def execucao_coleta(): df["htag"] = df["htag"].map(lambda x: str(x).replace(")", "")) df["hthg"] = df["hthg"].map(lambda x: str(x).replace("(", "")) - df_valor["idade_media_titular_vis"] = df_valor["idade_media_titular_vis"].map( - lambda x: str(x).replace(" ", "") - ) - df_valor["idade_media_titular_man"] = df_valor["idade_media_titular_man"].map( - lambda x: str(x).replace(" ", "") - ) - - df_valor["valor_equipe_titular_man"] = df_valor["valor_equipe_titular_man"].map( - lambda x: str(x).replace("m", "0000") - ) - df_valor["valor_equipe_titular_man"] = df_valor["valor_equipe_titular_man"].map( - lambda x: str(x).replace("Th.", "000") - ) - df_valor["valor_equipe_titular_man"] = df_valor["valor_equipe_titular_man"].map( - lambda x: str(x).replace(".", "") - ) - - df_valor["valor_equipe_titular_vis"] = df_valor["valor_equipe_titular_vis"].map( - lambda x: str(x).replace("m", "0000") - ) - df_valor["valor_equipe_titular_vis"] = df_valor["valor_equipe_titular_vis"].map( - lambda x: str(x).replace("Th.", "000") - ) - df_valor["valor_equipe_titular_vis"] = df_valor["valor_equipe_titular_vis"].map( - lambda x: str(x).replace(".", "") - ) + df_valor = extract_additional_columns(df_valor) df["publico_max"] = df["publico_max"].map(lambda x: str(x).replace(".", "")) df["publico"] = df["publico"].map(lambda x: str(x).replace(".", "")) @@ -524,39 +536,15 @@ def sem_info(x, y): del df["test"] df["data"] = pd.to_datetime(df["data"]).dt.date - df["horario"] = pd.to_datetime(df["horario"], format="%I:%M %p") - df["horario"] = df["horario"].dt.strftime("%H:%M") + # df["horario"] = pd.to_datetime(df["horario"], format="%I:%M %p") + # df["horario"] = df["horario"].dt.strftime("%H:%M") df.fillna("", inplace=True) - df["rodada"] = df["rodada"].astype(np.int64) + # df["rodada"] = df["rodada"].astype(np.int64) # renomear colunas - df = df.rename( - columns={ - "ht": "time_man", - "at": "time_vis", - "fthg": "gols_man", - "ftag": "gols_vis", - "col_home": "colocacao_man", - "col_away": "colocacao_vis", - "ac": "escanteios_vis", - "hc": "escanteios_man", - "adef": "defesas_vis", - "hdef": "defesas_man", - "af": "faltas_vis", - "afk": "chutes_bola_parada_vis", - "aimp": "impedimentos_vis", - "as": "chutes_vis", - "asofft": "chutes_fora_vis", - "hf": "faltas_man", - "hfk": "chutes_bola_parada_man", - "himp": "impedimentos_man", - "hs": "chutes_man", - "hsofft": "chutes_fora_man", - "htag": "gols_1_tempo_vis", - "hthg": "gols_1_tempo_man", - } - ) + df = rename_columns(df) + # Concatenando os valores dos dois loops df = pd.concat([df, df_valor], axis=1) df["data"] = pd.to_datetime(df["data"]) diff --git a/pipelines/datasets/mundo_transfermarkt_competicoes_internacionais/flows.py b/pipelines/datasets/mundo_transfermarkt_competicoes_internacionais/flows.py index 070253826..c740640a7 100644 --- a/pipelines/datasets/mundo_transfermarkt_competicoes_internacionais/flows.py +++ b/pipelines/datasets/mundo_transfermarkt_competicoes_internacionais/flows.py @@ -16,14 +16,17 @@ every_first_and_last_week, ) from pipelines.datasets.mundo_transfermarkt_competicoes_internacionais.tasks import ( - check_for_updates, execucao_coleta_sync, + get_data_source_transfermarkt_max_date, make_partitions, ) from pipelines.utils.constants import constants as utils_constants from pipelines.utils.decorators import Flow from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants -from pipelines.utils.metadata.tasks import update_django_metadata +from pipelines.utils.metadata.tasks import ( + check_if_data_is_outdated, + update_django_metadata, +) from pipelines.utils.tasks import ( create_table_and_upload_to_gcs, get_current_flow_labels, @@ -59,11 +62,15 @@ ) update_metadata = Parameter("update_metadata", default=True, required=False) - dados_desatualizados = check_for_updates(dataset_id, table_id) - log_task(f"Checando se os dados estão desatualizados: {dados_desatualizados}") + data_source_max_date = get_data_source_transfermarkt_max_date() - with case(dados_desatualizados, False): - log_task("Não há atualizações!") + dados_desatualizados = check_if_data_is_outdated( + dataset_id=dataset_id, + table_id=table_id, + data_source_max_date=data_source_max_date, + date_format="%Y-%m-%d", + upstream_tasks=[data_source_max_date], + ) with case(dados_desatualizados, True): df = execucao_coleta_sync() diff --git a/pipelines/datasets/mundo_transfermarkt_competicoes_internacionais/tasks.py b/pipelines/datasets/mundo_transfermarkt_competicoes_internacionais/tasks.py index db2f6f5ba..91b2b9124 100644 --- a/pipelines/datasets/mundo_transfermarkt_competicoes_internacionais/tasks.py +++ b/pipelines/datasets/mundo_transfermarkt_competicoes_internacionais/tasks.py @@ -6,46 +6,22 @@ ############################################################################### import asyncio -import numpy as np import pandas as pd from pandas import DataFrame from prefect import task -from pipelines.datasets.mundo_transfermarkt_competicoes_internacionais.constants import ( - constants as mundo_constants, -) from pipelines.datasets.mundo_transfermarkt_competicoes_internacionais.utils import ( data_url, execucao_coleta, ) -from pipelines.utils.utils import extract_last_date, log, to_partitions +from pipelines.utils.utils import log, to_partitions @task -def check_for_updates(dataset_id: str, table_id: str) -> bool: - """ - Verifica se existem atualizações disponíveis para um conjunto de dados e tabela específicos. - - Retorna: - bool: Retorna True se houverem atualizações disponíveis, caso contrário retorna False. - """ +def get_data_source_transfermarkt_max_date(): # Obtém a data mais recente do site data_obj = data_url().strftime("%Y-%m-%d") - - # Obtém a última data no site BD - data_bq_obj = extract_last_date( - dataset_id, table_id, "yy-mm-dd", "basedosdados" - ).strftime("%Y-%m-%d") - - # Registra a data mais recente do site - log(f"Última data no site da transfermarkt: {data_obj}") - log(f"Última data no site da BD: {data_bq_obj}") - - # Compara as datas para verificar se há atualizações - if data_obj > data_bq_obj: - return True # Há atualizações disponíveis - else: - return False # Não há novas atualizações disponíveis + return data_obj @task diff --git a/pipelines/utils/apply_architecture_to_dataframe/utils.py b/pipelines/utils/apply_architecture_to_dataframe/utils.py index 7c6532ab7..b8e16ff7a 100644 --- a/pipelines/utils/apply_architecture_to_dataframe/utils.py +++ b/pipelines/utils/apply_architecture_to_dataframe/utils.py @@ -65,6 +65,8 @@ def read_architecture_table(url_architecture: str) -> pd.DataFrame: StringIO(requests.get(url, timeout=10).content.decode("utf-8")) ) + df_architecture.query("name != '(excluido)'", inplace=True) + return df_architecture.replace(np.nan, "", regex=True) diff --git a/pipelines/utils/crawler_ibge_inflacao/tasks.py b/pipelines/utils/crawler_ibge_inflacao/tasks.py index c58ec1968..35a0e0917 100644 --- a/pipelines/utils/crawler_ibge_inflacao/tasks.py +++ b/pipelines/utils/crawler_ibge_inflacao/tasks.py @@ -11,16 +11,12 @@ from datetime import datetime as dt from time import sleep -import basedosdados as bd import pandas as pd -import wget from prefect import task from tqdm import tqdm -from pipelines.utils.crawler_ibge_inflacao.utils import ( - extract_last_date, - get_legacy_session, -) +from pipelines.utils.crawler_ibge_inflacao.utils import get_legacy_session +from pipelines.utils.metadata.utils import get_api_most_recent_date from pipelines.utils.utils import log # necessary for use wget, see: https://stackoverflow.com/questions/35569042/ssl-certificate-verify-failed-with-python3 @@ -127,13 +123,17 @@ def check_for_updates( max_date_ibge = dataframe.strftime("%Y-%m") - log(f"A data mais no site do ---IBGE--- para a tabela {indice} é : {max_date_ibge}") - # TROCAR PARA BSEDOSDADOS ANTES DE IR PRA PROD - max_date_bd = extract_last_date( - dataset_id=dataset_id, table_id=table_id, billing_project_id="basedosdados" + log( + f"A data mais no site do ---IBGE--- para a tabela {indice} é : {dataframe.date()}" ) - log(f"A data mais recente da tabela no --- Big Query --- é: {max_date_bd}") - if max_date_ibge > max_date_bd: + + max_date_bd = get_api_most_recent_date( + table_id=table_id, + dataset_id=dataset_id, + date_format="%Y-%m", + ) + log(f"A data mais recente da tabela no --- Site da BD --- é: {max_date_bd}") + if dataframe.date() > max_date_bd: log( f"A tabela {indice} foi atualizada no site do IBGE. O Flow de atualização será executado!" ) diff --git a/pipelines/utils/crawler_ibge_inflacao/utils.py b/pipelines/utils/crawler_ibge_inflacao/utils.py index 9bf040a8b..3e95f3393 100644 --- a/pipelines/utils/crawler_ibge_inflacao/utils.py +++ b/pipelines/utils/crawler_ibge_inflacao/utils.py @@ -6,14 +6,12 @@ import ssl from datetime import datetime -import basedosdados as bd import requests import urllib3 from prefect.schedules import Schedule, adjustments, filters from prefect.schedules.clocks import CronClock from pipelines.constants import constants -from pipelines.utils.utils import log def generate_inflacao_clocks(parameters: dict): @@ -62,41 +60,3 @@ def get_legacy_session(): session = requests.session() session.mount("https://", CustomHttpAdapter(ctx)) return session - - -def extract_last_date( - dataset_id: str, - table_id: str, - billing_project_id: str, -) -> str: - """ - Extracts the last update date of a given dataset table. - - Args: - dataset_id (str): The ID of the dataset. - table_id (str): The ID of the table. - billing_project_id (str): The billing project ID. - - Returns: - str: The last update date in the format 'yyyy-mm-dd'. - - Raises: - Exception: If an error occurs while extracting the last update date. - """ - - query_bd = f""" - SELECT MAX(DATE(CAST(ano AS INT64),CAST(mes AS INT64),1)) as max_date - FROM - `{billing_project_id}.{dataset_id}.{table_id}` - """ - - t = bd.read_sql( - query=query_bd, - billing_project_id=billing_project_id, - from_file=True, - ) - - data = t["max_date"][0] - data = data.strftime("%Y-%m") - - return data diff --git a/pipelines/utils/dump_to_gcs/flows.py b/pipelines/utils/dump_to_gcs/flows.py index 4bfccbb18..0a577b1c8 100644 --- a/pipelines/utils/dump_to_gcs/flows.py +++ b/pipelines/utils/dump_to_gcs/flows.py @@ -20,7 +20,7 @@ with Flow( name=utils_constants.FLOW_DUMP_TO_GCS_NAME.value, - code_owners=["lucas_cr"], + code_owners=["lauris"], ) as dump_to_gcs_flow: project_id = Parameter("project_id", required=False) dataset_id = Parameter("dataset_id") # dataset_id or dataset_id_staging diff --git a/pipelines/utils/dump_to_gcs/tasks.py b/pipelines/utils/dump_to_gcs/tasks.py index acc887780..8e1cc9788 100644 --- a/pipelines/utils/dump_to_gcs/tasks.py +++ b/pipelines/utils/dump_to_gcs/tasks.py @@ -9,6 +9,7 @@ import jinja2 from basedosdados.download.base import google_client from basedosdados.upload.base import Base +from google.api_core.exceptions import NotFound from google.cloud import bigquery from prefect import task @@ -17,6 +18,7 @@ determine_whether_to_execute_or_not, get_redis_client, human_readable, + list_blobs_with_prefix, log, ) @@ -103,32 +105,38 @@ def download_data_to_gcs( # pylint: disable=R0912,R0913,R0914,R0915 f"Billing project ID was inferred from environment variables: {billing_project_id}" ) - # Checking if data exceeds the maximum allowed size - log("Checking if data exceeds the maximum allowed size") # pylint: disable=E1124 client = google_client(billing_project_id, from_file=True, reauth=False) - job_config = bigquery.QueryJobConfig() - job_config.dry_run = True - job = client["bigquery"].query(query, job_config=job_config) - while not job.done(): - sleep(1) - table_size = job.total_bytes_processed - log(f'Table size: {human_readable(table_size, unit="B", unit_divider=1024)}') - if table_size > maximum_bytes_processed: - max_allowed_size = human_readable( - maximum_bytes_processed, - unit="B", - unit_divider=1024, - ) - raise ValueError( - f"Table size exceeds the maximum allowed size: {max_allowed_size}" + + # Try to remove bdpro access + log("Trying to remove BDpro filter") + try: + query_remove_bdpro = f"DROP ROW ACCESS POLICY bdpro_filter ON `{project_id}.{dataset_id}.{table_id}`" + log(query_remove_bdpro) + job = client["bigquery"].query(query_remove_bdpro) + while not job.done(): + sleep(1) + log(job.result()) + log( + "Table has BDpro filter and it was removed so direct download contains only open rows" ) + bdpro = True + except NotFound as e: + if "Not found: Row access policy bdpro_filter on table" in str(e): + log("It was not possible to find BDpro filter, all rows will be downloaded") + bdpro = False + else: + raise (e) + except Exception as e: + raise ValueError(e) - # Get data log("Querying data from BigQuery") job = client["bigquery"].query(query) while not job.done(): sleep(1) + + results = job.to_dataframe() + log(results.head(5)) # pylint: disable=protected-access dest_table = job._properties["configuration"]["query"]["destinationTable"] dest_project_id = dest_table["projectId"] @@ -138,7 +146,7 @@ def download_data_to_gcs( # pylint: disable=R0912,R0913,R0914,R0915 f"Query results were stored in {dest_project_id}.{dest_dataset_id}.{dest_table_id}" ) - blob_path = f"gs://basedosdados-public/one-click-download/{dataset_id}/{table_id}/data*.csv.gz" + blob_path = f"gs://basedosdados-public/one-click-download/{dataset_id}/{table_id}/{table_id}.csv.gz" log(f"Loading data to {blob_path}") dataset_ref = bigquery.DatasetReference(dest_project_id, dest_dataset_id) table_ref = dataset_ref.table(dest_table_id) @@ -152,6 +160,13 @@ def download_data_to_gcs( # pylint: disable=R0912,R0913,R0914,R0915 extract_job.result() log("Data was loaded successfully") + if bdpro: + query_restore_bdpro_access = f'CREATE OR REPLACE ROW ACCESS POLICY bdpro_filter ON `{project_id}.{dataset_id}.{table_id}` GRANT TO ("group:bd-pro@basedosdados.org", "group:sudo@basedosdados.org") FILTER USING (TRUE)' + job = client["bigquery"].query(query_restore_bdpro_access) + while not job.done(): + sleep(1) + log("BDpro filter was reestored") + @task def get_project_id( diff --git a/pipelines/utils/execute_dbt_model/tasks.py b/pipelines/utils/execute_dbt_model/tasks.py index 3faa09bb7..3f05278c4 100644 --- a/pipelines/utils/execute_dbt_model/tasks.py +++ b/pipelines/utils/execute_dbt_model/tasks.py @@ -72,7 +72,11 @@ def run_dbt_model( selected_table = dataset_id if "run" in dbt_command: - run_command = f"dbt run --select {selected_table}" + if flags == "--full-refresh": + run_command = f"dbt run --full-refresh --select {selected_table}" + flags = None + else: + run_command = f"dbt run --select {selected_table}" if _vars: if isinstance(_vars, list): diff --git a/pipelines/utils/metadata/tasks.py b/pipelines/utils/metadata/tasks.py index 4c36d1ec4..9d94407ba 100644 --- a/pipelines/utils/metadata/tasks.py +++ b/pipelines/utils/metadata/tasks.py @@ -5,6 +5,7 @@ from datetime import datetime +import pandas as pd from prefect import task from pipelines.utils.metadata.utils import ( @@ -164,8 +165,9 @@ def check_if_data_is_outdated( data_source_max_date = datetime.strptime( data_source_max_date, date_format ).date() + if type(data_source_max_date) is pd.Timestamp: + data_source_max_date = data_source_max_date.date() - # antigo parse_coverage data_api = get_api_most_recent_date( dataset_id=dataset_id, table_id=table_id, date_format=date_format ) @@ -175,6 +177,15 @@ def check_if_data_is_outdated( # Compara as datas para verificar se há atualizações if data_source_max_date > data_api: + log("Há atualizações disponíveis") return True # Há atualizações disponíveis else: + log("Não há novas atualizações disponíveis") return False + + +@task +def task_get_api_most_recent_date(dataset_id, table_id, date_format): + return get_api_most_recent_date( + dataset_id=dataset_id, table_id=table_id, date_format=date_format + ) diff --git a/pipelines/utils/metadata/utils.py b/pipelines/utils/metadata/utils.py index a182ff424..235fd53b3 100644 --- a/pipelines/utils/metadata/utils.py +++ b/pipelines/utils/metadata/utils.py @@ -57,7 +57,7 @@ def get_credentials_utils(secret_path: str) -> Tuple[str, str]: """ Returns the user and password for the given secret path. """ - log(f"Getting user and password for secret path: {secret_path}") + # log(f"Getting user and password for secret path: {secret_path}") tokens_dict = get_credentials_from_secret(secret_path) email = tokens_dict.get("email") password = tokens_dict.get("password") @@ -752,7 +752,7 @@ def parse_datetime_ranges(datetime_result: dict, date_format: str) -> dict: date_objects = {} - log(f"the chosen format to parse the coverage was {date_format}") + # log(f"the chosen format to parse the coverage was {date_format}") edges = datetime_result["data"]["allCoverage"]["edges"] @@ -774,7 +774,7 @@ def parse_datetime_ranges(datetime_result: dict, date_format: str) -> dict: date_values = (end_year, end_month, end_day) date_string = format_check_date(date_values, date_format) - log(f"The following coverage is being added {date_objects}") + # log(f"The following coverage is being added {date_objects}") date_objects[dt_node["id"]] = date_string return date_objects @@ -859,9 +859,8 @@ def get_api_most_recent_date( # if not, raise ValueError if date_format not in accepted_date_format: raise ValueError( - f"The date_format ->> ->> {date_format} is not supported. Please choose between {accepted_date_format}" + f"The date_format ->> ->> {date_format} is not supported. Please choose among {accepted_date_format}" ) - log(f"The chosen date_format is ->> {date_format}") # Collect credentials_utils (email, password) = get_credentials_utils(secret_path=f"api_user_{api_mode}") @@ -876,8 +875,8 @@ def get_api_most_recent_date( api_mode, ) - # parse coverages - log(f"For the table ->>{table_id} the parsed coverages were ->> {coverages}") + # # parse coverages + # log(f"For the table ->>{table_id} the parsed coverages were ->> {coverages}") # Convert the date strings to date objects date_objects = {} @@ -885,14 +884,14 @@ def get_api_most_recent_date( date_objects[key] = datetime.strptime(date_string, date_format) # Compare the date objects, return the most recent date and format it - log( - f"For this table ->> {table_id} there are these datetime end values->> {date_objects}" - ) + # log( + # f"For this table ->> {table_id} there are these datetime end values->> {date_objects}" + # ) max_date_key = max(date_objects, key=date_objects.get) max_date_value = date_objects[max_date_key].date() - log( - f"The Most recent date for the ->> {table_id} in the prod API is ->> {max_date_value}" - ) + # log( + # f"The Most recent date for the ->> {table_id} in the prod API is ->> {max_date_value}" + # ) return max_date_value diff --git a/poetry.lock b/poetry.lock index 916e2c0bb..596215bdf 100644 --- a/poetry.lock +++ b/poetry.lock @@ -384,63 +384,63 @@ test-no-images = ["pytest", "pytest-cov", "wurlitzer"] [[package]] name = "coverage" -version = "7.3.2" +version = "7.3.3" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, - {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, - {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, - {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, - {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, - {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, - {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, - {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, - {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, - {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, - {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, - {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, - {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, - {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, + {file = "coverage-7.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d874434e0cb7b90f7af2b6e3309b0733cde8ec1476eb47db148ed7deeb2a9494"}, + {file = "coverage-7.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee6621dccce8af666b8c4651f9f43467bfbf409607c604b840b78f4ff3619aeb"}, + {file = "coverage-7.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1367aa411afb4431ab58fd7ee102adb2665894d047c490649e86219327183134"}, + {file = "coverage-7.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f0f8f0c497eb9c9f18f21de0750c8d8b4b9c7000b43996a094290b59d0e7523"}, + {file = "coverage-7.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db0338c4b0951d93d547e0ff8d8ea340fecf5885f5b00b23be5aa99549e14cfd"}, + {file = "coverage-7.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d31650d313bd90d027f4be7663dfa2241079edd780b56ac416b56eebe0a21aab"}, + {file = "coverage-7.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9437a4074b43c177c92c96d051957592afd85ba00d3e92002c8ef45ee75df438"}, + {file = "coverage-7.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9e17d9cb06c13b4f2ef570355fa45797d10f19ca71395910b249e3f77942a837"}, + {file = "coverage-7.3.3-cp310-cp310-win32.whl", hash = "sha256:eee5e741b43ea1b49d98ab6e40f7e299e97715af2488d1c77a90de4a663a86e2"}, + {file = "coverage-7.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:593efa42160c15c59ee9b66c5f27a453ed3968718e6e58431cdfb2d50d5ad284"}, + {file = "coverage-7.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c944cf1775235c0857829c275c777a2c3e33032e544bcef614036f337ac37bb"}, + {file = "coverage-7.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eda7f6e92358ac9e1717ce1f0377ed2b9320cea070906ece4e5c11d172a45a39"}, + {file = "coverage-7.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c854c1d2c7d3e47f7120b560d1a30c1ca221e207439608d27bc4d08fd4aeae8"}, + {file = "coverage-7.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:222b038f08a7ebed1e4e78ccf3c09a1ca4ac3da16de983e66520973443b546bc"}, + {file = "coverage-7.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff4800783d85bff132f2cc7d007426ec698cdce08c3062c8d501ad3f4ea3d16c"}, + {file = "coverage-7.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fc200cec654311ca2c3f5ab3ce2220521b3d4732f68e1b1e79bef8fcfc1f2b97"}, + {file = "coverage-7.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:307aecb65bb77cbfebf2eb6e12009e9034d050c6c69d8a5f3f737b329f4f15fb"}, + {file = "coverage-7.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ffb0eacbadb705c0a6969b0adf468f126b064f3362411df95f6d4f31c40d31c1"}, + {file = "coverage-7.3.3-cp311-cp311-win32.whl", hash = "sha256:79c32f875fd7c0ed8d642b221cf81feba98183d2ff14d1f37a1bbce6b0347d9f"}, + {file = "coverage-7.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:243576944f7c1a1205e5cd658533a50eba662c74f9be4c050d51c69bd4532936"}, + {file = "coverage-7.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a2ac4245f18057dfec3b0074c4eb366953bca6787f1ec397c004c78176a23d56"}, + {file = "coverage-7.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f9191be7af41f0b54324ded600e8ddbcabea23e1e8ba419d9a53b241dece821d"}, + {file = "coverage-7.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c0b1b8b5a4aebf8fcd227237fc4263aa7fa0ddcd4d288d42f50eff18b0bac4"}, + {file = "coverage-7.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee453085279df1bac0996bc97004771a4a052b1f1e23f6101213e3796ff3cb85"}, + {file = "coverage-7.3.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1191270b06ecd68b1d00897b2daddb98e1719f63750969614ceb3438228c088e"}, + {file = "coverage-7.3.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:007a7e49831cfe387473e92e9ff07377f6121120669ddc39674e7244350a6a29"}, + {file = "coverage-7.3.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:af75cf83c2d57717a8493ed2246d34b1f3398cb8a92b10fd7a1858cad8e78f59"}, + {file = "coverage-7.3.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:811ca7373da32f1ccee2927dc27dc523462fd30674a80102f86c6753d6681bc6"}, + {file = "coverage-7.3.3-cp312-cp312-win32.whl", hash = "sha256:733537a182b5d62184f2a72796eb6901299898231a8e4f84c858c68684b25a70"}, + {file = "coverage-7.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:e995efb191f04b01ced307dbd7407ebf6e6dc209b528d75583277b10fd1800ee"}, + {file = "coverage-7.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbd8a5fe6c893de21a3c6835071ec116d79334fbdf641743332e442a3466f7ea"}, + {file = "coverage-7.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:50c472c1916540f8b2deef10cdc736cd2b3d1464d3945e4da0333862270dcb15"}, + {file = "coverage-7.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e9223a18f51d00d3ce239c39fc41410489ec7a248a84fab443fbb39c943616c"}, + {file = "coverage-7.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f501e36ac428c1b334c41e196ff6bd550c0353c7314716e80055b1f0a32ba394"}, + {file = "coverage-7.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:475de8213ed95a6b6283056d180b2442eee38d5948d735cd3d3b52b86dd65b92"}, + {file = "coverage-7.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:afdcc10c01d0db217fc0a64f58c7edd635b8f27787fea0a3054b856a6dff8717"}, + {file = "coverage-7.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:fff0b2f249ac642fd735f009b8363c2b46cf406d3caec00e4deeb79b5ff39b40"}, + {file = "coverage-7.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a1f76cfc122c9e0f62dbe0460ec9cc7696fc9a0293931a33b8870f78cf83a327"}, + {file = "coverage-7.3.3-cp38-cp38-win32.whl", hash = "sha256:757453848c18d7ab5d5b5f1827293d580f156f1c2c8cef45bfc21f37d8681069"}, + {file = "coverage-7.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:ad2453b852a1316c8a103c9c970db8fbc262f4f6b930aa6c606df9b2766eee06"}, + {file = "coverage-7.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b15e03b8ee6a908db48eccf4e4e42397f146ab1e91c6324da44197a45cb9132"}, + {file = "coverage-7.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:89400aa1752e09f666cc48708eaa171eef0ebe3d5f74044b614729231763ae69"}, + {file = "coverage-7.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c59a3e59fb95e6d72e71dc915e6d7fa568863fad0a80b33bc7b82d6e9f844973"}, + {file = "coverage-7.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ede881c7618f9cf93e2df0421ee127afdfd267d1b5d0c59bcea771cf160ea4a"}, + {file = "coverage-7.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3bfd2c2f0e5384276e12b14882bf2c7621f97c35320c3e7132c156ce18436a1"}, + {file = "coverage-7.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7f3bad1a9313401ff2964e411ab7d57fb700a2d5478b727e13f156c8f89774a0"}, + {file = "coverage-7.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:65d716b736f16e250435473c5ca01285d73c29f20097decdbb12571d5dfb2c94"}, + {file = "coverage-7.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a702e66483b1fe602717020a0e90506e759c84a71dbc1616dd55d29d86a9b91f"}, + {file = "coverage-7.3.3-cp39-cp39-win32.whl", hash = "sha256:7fbf3f5756e7955174a31fb579307d69ffca91ad163467ed123858ce0f3fd4aa"}, + {file = "coverage-7.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cad9afc1644b979211989ec3ff7d82110b2ed52995c2f7263e7841c846a75348"}, + {file = "coverage-7.3.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:d299d379b676812e142fb57662a8d0d810b859421412b4d7af996154c00c31bb"}, + {file = "coverage-7.3.3.tar.gz", hash = "sha256:df04c64e58df96b4427db8d0559e95e2df3138c9916c96f9f6a4dd220db2fdb7"}, ] [package.dependencies] @@ -1053,13 +1053,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.110.0" +version = "2.111.0" description = "Google API Client Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-python-client-2.110.0.tar.gz", hash = "sha256:1f825e48c7fdc3c96ad6aac179cb73c3755dfff41d16487fa7130e5efcfe7b76"}, - {file = "google_api_python_client-2.110.0-py2.py3-none-any.whl", hash = "sha256:55e7ebd6079e34934b6751537eb13447110351ae3792a724a33825d7b671ba13"}, + {file = "google-api-python-client-2.111.0.tar.gz", hash = "sha256:3a45a53c031478d1c82c7162dd25c9a965247bca6bd438af0838a9d9b8219405"}, + {file = "google_api_python_client-2.111.0-py2.py3-none-any.whl", hash = "sha256:b605adee2d09a843b97a59925757802904679e44e5599708cedb8939900dfbc7"}, ] [package.dependencies] @@ -1096,13 +1096,13 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-auth-httplib2" -version = "0.1.1" +version = "0.2.0" description = "Google Authentication Library: httplib2 transport" optional = false python-versions = "*" files = [ - {file = "google-auth-httplib2-0.1.1.tar.gz", hash = "sha256:c64bc555fdc6dd788ea62ecf7bccffcf497bf77244887a3f3d7a5a02f8e3fc29"}, - {file = "google_auth_httplib2-0.1.1-py2.py3-none-any.whl", hash = "sha256:42c50900b8e4dcdf8222364d1f0efe32b8421fb6ed72f2613f12f75cc933478c"}, + {file = "google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05"}, + {file = "google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d"}, ] [package.dependencies] @@ -1111,13 +1111,13 @@ httplib2 = ">=0.19.0" [[package]] name = "google-auth-oauthlib" -version = "1.1.0" +version = "1.2.0" description = "Google Authentication Library" optional = false python-versions = ">=3.6" files = [ - {file = "google-auth-oauthlib-1.1.0.tar.gz", hash = "sha256:83ea8c3b0881e453790baff4448e8a6112ac8778d1de9da0b68010b843937afb"}, - {file = "google_auth_oauthlib-1.1.0-py2.py3-none-any.whl", hash = "sha256:089c6e587d36f4803ac7e0720c045c6a8b1fd1790088b8424975b90d0ee61c12"}, + {file = "google-auth-oauthlib-1.2.0.tar.gz", hash = "sha256:292d2d3783349f2b0734a0a0207b1e1e322ac193c2c09d8f7c613fb7cc501ea8"}, + {file = "google_auth_oauthlib-1.2.0-py2.py3-none-any.whl", hash = "sha256:297c1ce4cb13a99b5834c74a1fe03252e1e499716718b190f56bcb9c4abc4faf"}, ] [package.dependencies] @@ -1129,13 +1129,13 @@ tool = ["click (>=6.0.0)"] [[package]] name = "google-cloud-bigquery" -version = "3.14.0" +version = "3.14.1" description = "Google BigQuery API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-bigquery-3.14.0.tar.gz", hash = "sha256:76c919f771ac82ba372f5a8d326c032229c5fdab738d03a2b6e73b412c22c9eb"}, - {file = "google_cloud_bigquery-3.14.0-py2.py3-none-any.whl", hash = "sha256:3304f4742546be70e531232f31bbf5b4b257aa63a508101ab7c4582c9503b636"}, + {file = "google-cloud-bigquery-3.14.1.tar.gz", hash = "sha256:aa15bd86f79ea76824c7d710f5ae532323c4b3ba01ef4abff42d4ee7a2e9b142"}, + {file = "google_cloud_bigquery-3.14.1-py2.py3-none-any.whl", hash = "sha256:a8ded18455da71508db222b7c06197bc12b6dbc6ed5b0b64e7007b76d7016957"}, ] [package.dependencies] @@ -1176,13 +1176,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-bigquery-storage" -version = "2.23.0" +version = "2.24.0" description = "Google Cloud Bigquery Storage API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-bigquery-storage-2.23.0.tar.gz", hash = "sha256:8496c6d30575efb224c18940566f9ac006d3b120ae759002918697c3407997e6"}, - {file = "google_cloud_bigquery_storage-2.23.0-py2.py3-none-any.whl", hash = "sha256:371ff0a86d6166d7a935d6839474e5b5ab04ebd6598ea4b6c12b920719f2e0cb"}, + {file = "google-cloud-bigquery-storage-2.24.0.tar.gz", hash = "sha256:b4af5b9aacd8396b8407d1b877601a376d8eea6d192823a8a7881bd2fdc076ce"}, + {file = "google_cloud_bigquery_storage-2.24.0-py2.py3-none-any.whl", hash = "sha256:7981eb2758cba56603058d11bb1eeeebf2e1c18097a7118a894510a16e02be52"}, ] [package.dependencies] @@ -1192,7 +1192,7 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [package.extras] fastavro = ["fastavro (>=0.21.2)"] -pandas = ["pandas (>=0.21.1)"] +pandas = ["importlib-metadata (>=1.0.0)", "pandas (>=0.21.1)"] pyarrow = ["pyarrow (>=0.15.0)"] [[package]] @@ -3980,19 +3980,19 @@ telegram = ["requests"] [[package]] name = "trio" -version = "0.23.1" +version = "0.23.2" description = "A friendly Python library for async concurrency and I/O" optional = false python-versions = ">=3.8" files = [ - {file = "trio-0.23.1-py3-none-any.whl", hash = "sha256:bb4abb3f4af23f96679e7c8cdabb8b234520f2498550d2cf63ebfd95f2ce27fe"}, - {file = "trio-0.23.1.tar.gz", hash = "sha256:16f89f7dcc8f7b9dcdec1fcd863e0c039af6d0f9a22f8dfd56f75d75ec73fd48"}, + {file = "trio-0.23.2-py3-none-any.whl", hash = "sha256:5a0b566fa5d50cf231cfd6b08f3b03aa4179ff004b8f3144059587039e2b26d3"}, + {file = "trio-0.23.2.tar.gz", hash = "sha256:da1d35b9a2b17eb32cae2e763b16551f9aa6703634735024e32f325c9285069e"}, ] [package.dependencies] attrs = ">=20.1.0" cffi = {version = ">=1.14", markers = "os_name == \"nt\" and implementation_name != \"pypy\""} -exceptiongroup = {version = ">=1.0.0rc9", markers = "python_version < \"3.11\""} +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} idna = "*" outcome = "*" sniffio = ">=1.3.0" diff --git a/pyproject.toml b/pyproject.toml index d8a2acbee..77870521a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -113,6 +113,7 @@ geopandas = "0.13.2" shapely = "2.0.1" webdriver-manager = "^4.0.1" + [tool.poetry.dev-dependencies] pytest_cov = "^3.0.0" From ff57ade2a1cd36fdc9e19d82cf30a19c40820909 Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Thu, 14 Dec 2023 14:55:55 -0300 Subject: [PATCH 251/265] fix: basedosdados read_sql input --- pipelines/datasets/br_denatran_frota/handlers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 1dbd34625..c8161afd1 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -197,8 +197,8 @@ def get_latest_data(table_id: str, dataset_id: str): def treat_municipio_tipo(file: str) -> pl.DataFrame: bd_municipios = bd.read_sql( "select * from `basedosdados.br_bd_diretorios_brasil.municipio`", - billing_project_id="basedosdados-dev", - # from_file=True, + # billing_project_id="basedosdados-dev", + from_file=True, ) bd_municipios = pl.from_pandas(bd_municipios) From 4153283d200f1ebdb3b055b3f7eb7b739351ba73 Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Thu, 14 Dec 2023 15:56:29 -0300 Subject: [PATCH 252/265] fix: table_id name and handlers --- pipelines/datasets/br_denatran_frota/flows.py | 10 ++++++---- pipelines/datasets/br_denatran_frota/handlers.py | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 90b25fd7e..ce5220df4 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -47,7 +47,7 @@ ], ) as br_denatran_frota_uf_tipo: dataset_id = Parameter("dataset_id", default="br_denatran_frota") - table_id = Parameter("table_id", default="uf_tipo2") + table_id = Parameter("table_id", default="uf_tipo") # Materialization mode materialization_mode = Parameter( @@ -65,7 +65,7 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - year_to_fetch = get_latest_data_task(table_id=table_id, dataset_id=dataset_id) + year_to_fetch = get_latest_data_task(table_id="uf_tipo", dataset_id=dataset_id) crawled = crawl_task( month=year_to_fetch[1], year=year_to_fetch[0], @@ -159,7 +159,7 @@ ], ) as br_denatran_frota_municipio_tipo: dataset_id = Parameter("dataset_id", default="br_denatran_frota") - table_id = Parameter("table_id", default="municipio_tipo2") + table_id = Parameter("table_id", default="municipio_tipo") # Materialization mode materialization_mode = Parameter( @@ -180,7 +180,9 @@ # inserir get_api_most_recente_date # na função get_latest_data - year_to_fetch = get_latest_data_task(table_id=table_id, dataset_id=dataset_id) + year_to_fetch = get_latest_data_task( + table_id="municipio_tipo", dataset_id=dataset_id + ) crawled = crawl_task( month=year_to_fetch[1], diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index c8161afd1..9f77c2618 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -102,7 +102,7 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: clean_df = new_df[new_df.sigla_uf.isin(valid_ufs)].reset_index( drop=True ) # Now we get all the actual RELEVANT uf data. - month, year = get_year_month_from_filename(filename) + year, month = get_year_month_from_filename(filename) # If the df is all strings, try to get numbers where it makes sense. clean_df.replace(" - ", 0, inplace=True) if all(clean_df.dtypes == "object"): @@ -203,7 +203,7 @@ def treat_municipio_tipo(file: str) -> pl.DataFrame: bd_municipios = pl.from_pandas(bd_municipios) filename = os.path.split(file)[1] - month, year = get_year_month_from_filename(filename) + year, month = get_year_month_from_filename(filename) correct_sheet = [ sheet for sheet in pd.ExcelFile(file).sheet_names if sheet != "Glossário" ][0] From d7c29edfeaa9b9cab0d20946fb6518c4c87a5b15 Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Tue, 19 Dec 2023 10:59:05 -0300 Subject: [PATCH 253/265] feat: add schedules --- pipelines/datasets/br_denatran_frota/flows.py | 10 ++-- .../datasets/br_denatran_frota/schedules.py | 51 +++++++++++++++---- 2 files changed, 47 insertions(+), 14 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index ce5220df4..1c01339f9 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -38,10 +38,13 @@ date_pairs_param: list[tuple] = Parameter("date_pairs", default=date_pairs) -# from pipelines.datasets.br_denatran_frota.schedules import every_two_weeks - +# from pipelines.datasets.br_denatran_frota.schedules import ( +# every_month_municipio, +# every_month_uf, +# ) with Flow( name="br_denatran_frota.uf_tipo", + # todo: substituir por equipe pipelines code_owners=[ "Tamir", ], @@ -66,6 +69,7 @@ ) year_to_fetch = get_latest_data_task(table_id="uf_tipo", dataset_id=dataset_id) + crawled = crawl_task( month=year_to_fetch[1], year=year_to_fetch[0], @@ -178,8 +182,6 @@ prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) - # inserir get_api_most_recente_date - # na função get_latest_data year_to_fetch = get_latest_data_task( table_id="municipio_tipo", dataset_id=dataset_id ) diff --git a/pipelines/datasets/br_denatran_frota/schedules.py b/pipelines/datasets/br_denatran_frota/schedules.py index 5ae6b53bc..67d07f59a 100644 --- a/pipelines/datasets/br_denatran_frota/schedules.py +++ b/pipelines/datasets/br_denatran_frota/schedules.py @@ -2,23 +2,54 @@ """ Schedules for br_denatran_frota """ +from datetime import datetime +from prefect.schedules import Schedule, adjustments, filters +from prefect.schedules.clocks import CronClock -from datetime import datetime, timedelta +from pipelines.constants import constants -from prefect.schedules import Schedule -from prefect.schedules.clocks import IntervalClock +every_month_municipio = Schedule( + clocks=[ + CronClock( + cron="20 21 10-30 * *", # At 21:20 on every day-of-month from 10 through 30. + start_date=datetime(2023, 11, 22, 0, 0), + labels=[ + constants.BASEDOSDADOS_PROD_AGENT_LABEL.value, + ], + parameter_defaults={ + "dataset_id": "br_denatran_frota", + "table_id": "municipio_tipo", + "materialization_mode": "prod", + "materialize_after_dump": True, + "dbt_alias": True, + "update_metadata": True, + }, + ) + ], + filters=[filters.is_weekday], + adjustments=[adjustments.next_weekday], +) -from pipelines.constants import constants -every_two_weeks = Schedule( +every_month_uf = Schedule( clocks=[ - IntervalClock( - interval=timedelta(weeks=2), - start_date=datetime(2021, 1, 1), + CronClock( + cron="0 21 10-30 * *", # At 21:00 on every day-of-month from 10 through 30. + start_date=datetime(2023, 11, 22, 0, 0), labels=[ constants.BASEDOSDADOS_PROD_AGENT_LABEL.value, ], - ), - ] + parameter_defaults={ + "dataset_id": "br_denatran_frota", + "table_id": "uf_tipo", + "materialization_mode": "prod", + "materialize after dump": True, + "dbt_alias": True, + "update_metadata": True, + }, + ) + ], + filters=[filters.is_weekday], + adjustments=[adjustments.next_weekday], ) From ac20eb5963ecfc6a0ab1ce95dfe1de228a7c5b9c Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Thu, 18 Jan 2024 11:16:53 -0300 Subject: [PATCH 254/265] feat: add final flows --- .../datasets/br_denatran_frota/constants.py | 2 - pipelines/datasets/br_denatran_frota/flows.py | 80 +++++++++---------- .../datasets/br_denatran_frota/handlers.py | 68 +++++++--------- 3 files changed, 69 insertions(+), 81 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index 6f69d6200..c7abf4aa4 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -11,8 +11,6 @@ class constants(Enum): # pylint: disable=c0103 Constant values for the br_denatran_frota project """ - # -*- coding: utf-8 -*- - MONTHS = { "janeiro": 1, "fevereiro": 2, diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 1c01339f9..d67864dff 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -29,6 +29,7 @@ from pipelines.utils.tasks import ( create_table_and_upload_to_gcs, get_current_flow_labels, + log_task, rename_current_flow_run_dataset_table, ) @@ -44,7 +45,6 @@ # ) with Flow( name="br_denatran_frota.uf_tipo", - # todo: substituir por equipe pipelines code_owners=[ "Tamir", ], @@ -58,17 +58,19 @@ ) materialize_after_dump = Parameter( - "materialize after dump", default=False, required=False + "materialize_after_dump", default=False, required=False ) update_metadata = Parameter("update_metadata", default=False, required=False) dbt_alias = Parameter("dbt_alias", default=True, required=False) + rename_flow_run = rename_current_flow_run_dataset_table( prefix="Dump: ", dataset_id=dataset_id, table_id=table_id, wait=table_id ) year_to_fetch = get_latest_data_task(table_id="uf_tipo", dataset_id=dataset_id) + # search for most recent year in the API crawled = crawl_task( month=year_to_fetch[1], @@ -76,29 +78,26 @@ temp_dir=constants.DOWNLOAD_PATH.value, upstream_tasks=[year_to_fetch], ) - # Now get the downloaded file: - desired_file = get_desired_file_task( - year=year_to_fetch[0], - download_directory=constants.DOWNLOAD_PATH.value, - filetype=constants.UF_TIPO_BASIC_FILENAME.value, - upstream_tasks=[crawled], - ) - # We need to see the year, month from the file to decide on updating - extracted_date = get_denatran_date(desired_file, upstream_tasks=[desired_file]) - decision = check_if_data_is_outdated( - dataset_id=dataset_id, - table_id=table_id, - data_source_max_date=extracted_date, - date_format="%Y-%m", - upstream_tasks=[extracted_date], - ) - with case(decision, True): - df = treat_uf_tipo_task( - file=desired_file, upstream_tasks=[crawled, desired_file] + + with case(crawled, False): + log_task("No new data to be downloaded") + + with case(crawled, True): + # Now get the downloaded file: + # Used primarly to backfill data + desired_file = get_desired_file_task( + year=year_to_fetch[0], + download_directory=constants.DOWNLOAD_PATH.value, + filetype=constants.UF_TIPO_BASIC_FILENAME.value, + upstream_tasks=[crawled], ) + + df = treat_uf_tipo_task(file=desired_file, upstream_tasks=[desired_file]) + csv_output = output_file_to_csv_task( df, constants.UF_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] ) + wait_upload_table = create_table_and_upload_to_gcs( data_path=csv_output, dataset_id=dataset_id, @@ -122,15 +121,18 @@ labels=current_flow_labels, run_name=f"Materialize {dataset_id}.{table_id}", ) + wait_for_materialization = wait_for_flow_run( materialization_flow, stream_states=True, stream_logs=True, raise_final_state=True, ) + wait_for_materialization.max_retries = ( dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_ATTEMPTS.value ) + wait_for_materialization.retry_delay = timedelta( seconds=dump_db_constants.WAIT_FOR_MATERIALIZATION_RETRY_INTERVAL.value ) @@ -171,7 +173,7 @@ ) materialize_after_dump = Parameter( - "materialize after dump", default=False, required=False + "materialize_after_dump", default=False, required=False ) update_metadata = Parameter("update_metadata", default=False, required=False) @@ -192,25 +194,21 @@ temp_dir=constants.DOWNLOAD_PATH.value, upstream_tasks=[year_to_fetch], ) - # Now get the downloaded file: - desired_file = get_desired_file_task( - year=year_to_fetch[0], - download_directory=constants.DOWNLOAD_PATH.value, - filetype=constants.MUNIC_TIPO_BASIC_FILENAME.value, - upstream_tasks=[crawled], - ) - # We need to see the year, month from the file to decide on updating - extracted_date = get_denatran_date(desired_file, upstream_tasks=[desired_file]) - - decision = check_if_data_is_outdated( - dataset_id=dataset_id, - table_id=table_id, - data_source_max_date=extracted_date, - date_format="%Y-%m", - upstream_tasks=[extracted_date], - ) - with case(decision, True): - df = treat_municipio_tipo_task(file=desired_file, upstream_tasks=[decision]) + + with case(crawled, False): + log_task("No new data to be downloaded") + + with case(crawled, True): + # Now get the downloaded file: + desired_file = get_desired_file_task( + year=year_to_fetch[0], + download_directory=constants.DOWNLOAD_PATH.value, + filetype=constants.MUNIC_TIPO_BASIC_FILENAME.value, + upstream_tasks=[crawled], + ) + + df = treat_municipio_tipo_task(file=desired_file, upstream_tasks=[desired_file]) + csv_output = output_file_to_csv_task( df, constants.MUNIC_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] ) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 9f77c2618..7d0466f9c 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -31,18 +31,18 @@ verify_total, ) from pipelines.utils.metadata.utils import get_api_most_recent_date -from pipelines.utils.utils import clean_dataframe, log, to_partitions +from pipelines.utils.utils import log, to_partitions MONTHS = constants.MONTHS.value DATASET = constants.DATASET.value DICT_UFS = constants.DICT_UFS.value -OUTPUT_PATH = "DENATRAN_FILES" +OUTPUT_PATH = constants.OUTPUT_PATH.value MONTHS_SHORT = constants.MONTHS_SHORT.value UF_TIPO_BASIC_FILENAME = constants.UF_TIPO_BASIC_FILENAME.value MUNIC_TIPO_BASIC_FILENAME = constants.MUNIC_TIPO_BASIC_FILENAME.value -def crawl(month: int, year: int, temp_dir: str = "") -> None: +def crawl(month: int, year: int, temp_dir: str = "") -> bool: """Função principal para baixar os dados de frota por município e tipo e também por UF e tipo. Args: @@ -60,9 +60,18 @@ def crawl(month: int, year: int, temp_dir: str = "") -> None: year_dir_name = os.path.join(files_dir, f"{year}") make_dir_when_not_exists(year_dir_name) if year > 2012: - files_to_download = extract_links_post_2012(month, year, year_dir_name) - for file_dict in files_to_download: - call_downloader(file_dict) + try: + files_to_download = extract_links_post_2012(month, year, year_dir_name) + for file_dict in files_to_download: + call_downloader(file_dict) + except Exception as e: + log(e) + log( + "The above error indicates that the next month denatran file was not released yet." + ) + + return False + else: url = f"https://www.gov.br/infraestrutura/pt-br/assuntos/transito/arquivos-senatran/estatisticas/renavam/{year}/frota{'_' if year > 2008 else ''}{year}.zip" filename = f"{year_dir_name}/dados_anuais.zip" @@ -81,6 +90,8 @@ def crawl(month: int, year: int, temp_dir: str = "") -> None: else: extraction_pre_2012(month, year, year_dir_name, filename) + return True + def treat_uf_tipo(file: str) -> pl.DataFrame: valid_ufs = list(DICT_UFS.keys()) + list(DICT_UFS.values()) @@ -105,6 +116,12 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: year, month = get_year_month_from_filename(filename) # If the df is all strings, try to get numbers where it makes sense. clean_df.replace(" - ", 0, inplace=True) + + # Create a reverse dictionary to replace uf names with uf sigla + reverse_dict = {v: k for k, v in DICT_UFS.items()} + clean_df["sigla_uf"] = clean_df["sigla_uf"].map(reverse_dict) + + # clean_df.replace() if all(clean_df.dtypes == "object"): clean_df = clean_df.apply(pd.to_numeric, errors="ignore") clean_pl_df = pl.from_pandas(clean_df).lazy() @@ -120,13 +137,15 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: variable_name="tipo_veiculo", value_name="quantidade", ) # Long format. - clean_pl_df = clean_pl_df.collect() + return clean_pl_df def output_file_to_csv(df: pl.DataFrame, filename: str) -> None: make_dir_when_not_exists(OUTPUT_PATH) + pd_df = df.to_pandas() + log(pd_df.head(10)) to_partitions( pd_df, partition_columns=["ano", "mes", "sigla_uf"], savepath=OUTPUT_PATH ) @@ -148,12 +167,6 @@ def get_desired_file(year: int, download_directory: str, filetype: str) -> str: def get_latest_data(table_id: str, dataset_id: str): - # denatran_data: pd.DataFrame = get_data_from_prod( - # table_id=table_name, dataset_id="br_denatran_frota" - # ) - # substituir por get_api_most_recente_date aqui - # pipelines.utils.metadata.utils.get_api_most_recente_date - # ela vai retonar a data mais recente da tabela extraida da api denatran_data = get_api_most_recent_date( table_id=table_id, dataset_id=dataset_id, date_format="%Y-%m" ) @@ -168,38 +181,17 @@ def get_latest_data(table_id: str, dataset_id: str): else: month += 1 log(f"Ano: {year}, mês: {month}") - return year, month - - # if not isinstance(denatran_data, pd.DataFrame): - # return 2003, 1 - # if not denatran_data.empty: - # log(denatran_data.head(2)) - # year = denatran_data["ano"].max() - # month = denatran_data.loc[denatran_data["ano"] == year]["mes"].max() - # year = int(year) - # month = int(month) - # log(year) - # log(type(year)) - # log(month) - # log(type(month)) - # if month == 12: - # year += 1 - # month = 1 - # else: - # month += 1 - # log(f"Ano: {year}, mês: {month}") - # return year, month - # else: - # log("Não achei ano não mané") - # return 2003, 1 + # return year, month + return 2023, 12 def treat_municipio_tipo(file: str) -> pl.DataFrame: bd_municipios = bd.read_sql( - "select * from `basedosdados.br_bd_diretorios_brasil.municipio`", + "select nome, id_municipio, sigla_uf from `basedosdados.br_bd_diretorios_brasil.municipio`", # billing_project_id="basedosdados-dev", from_file=True, ) + bd_municipios = pl.from_pandas(bd_municipios) filename = os.path.split(file)[1] From 3ea44a9b7795c4f9df7848a58cdbffe61a286565 Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Thu, 18 Jan 2024 16:07:23 -0300 Subject: [PATCH 255/265] fix: crawler error to downloand october onwards files --- pipelines/datasets/br_denatran_frota/constants.py | 7 ++++--- pipelines/datasets/br_denatran_frota/handlers.py | 4 ++-- pipelines/datasets/br_denatran_frota/utils.py | 9 +++++++++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index c7abf4aa4..b0e1de0db 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -21,9 +21,10 @@ class constants(Enum): # pylint: disable=c0103 "julho": 7, "agosto": 8, "setembro": 9, - "outubro": 10, - "novembro": 11, - "dezembro": 12, + # months + "Outubro": 10, + "Novembro": 11, + "Dezembro": 12, } DATASET = "br_denatran_frota" diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 7d0466f9c..71441988d 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -145,7 +145,7 @@ def output_file_to_csv(df: pl.DataFrame, filename: str) -> None: make_dir_when_not_exists(OUTPUT_PATH) pd_df = df.to_pandas() - log(pd_df.head(10)) + to_partitions( pd_df, partition_columns=["ano", "mes", "sigla_uf"], savepath=OUTPUT_PATH ) @@ -182,7 +182,7 @@ def get_latest_data(table_id: str, dataset_id: str): month += 1 log(f"Ano: {year}, mês: {month}") # return year, month - return 2023, 12 + return 2023, 10 def treat_municipio_tipo(file: str) -> pl.DataFrame: diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index c83e84642..3815229ed 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -421,6 +421,7 @@ def extract_links_post_2012(month: int, year: int, directory: str) -> list[dict] soup = BeautifulSoup(urlopen(url), "html.parser") # Só queremos os dados de frota nacional. nodes = soup.select("p:contains('rota por ') > a") + valid_links = [] for node in nodes: txt = node.text @@ -429,11 +430,16 @@ def extract_links_post_2012(month: int, year: int, directory: str) -> list[dict] match = re.search( r"(?i)\/([\w-]+)\/(\d{4})\/(\w+)\/([\w-]+)\.(?:xls|xlsx|rar|zip)$", href ) + if match and re.search("tipo|município", txt, flags=re.IGNORECASE): matched_month = match.group(3) matched_year = match.group(2) + log(f"------match_month {matched_month}") + # log(f'------matched_get{MONTHS.get(matched_month)}') + # log(f'------matched_year{matched_year}') if MONTHS.get(matched_month) == month and matched_year == str(year): filetype = match.group(0).split(".")[-1].lower() + log(f"------filetype {filetype}") info = { "txt": txt, "href": href, @@ -443,7 +449,10 @@ def extract_links_post_2012(month: int, year: int, directory: str) -> list[dict] "filetype": filetype, "destination_dir": directory, } + # log(f'------info {info}') valid_links.append(info) + + log(valid_links) return valid_links From d0f6b58a21229e710b38a71698df3c91bce617bc Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Tue, 23 Jan 2024 17:03:10 -0300 Subject: [PATCH 256/265] feat: final modifications --- .../datasets/br_denatran_frota/constants.py | 14 ++++++++- pipelines/datasets/br_denatran_frota/flows.py | 29 ++++++++++--------- .../datasets/br_denatran_frota/handlers.py | 24 ++++++++++----- pipelines/datasets/br_denatran_frota/tasks.py | 6 ++-- pipelines/datasets/br_denatran_frota/utils.py | 18 +++++------- 5 files changed, 54 insertions(+), 37 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/constants.py b/pipelines/datasets/br_denatran_frota/constants.py index b0e1de0db..5199c2df9 100644 --- a/pipelines/datasets/br_denatran_frota/constants.py +++ b/pipelines/datasets/br_denatran_frota/constants.py @@ -21,7 +21,19 @@ class constants(Enum): # pylint: disable=c0103 "julho": 7, "agosto": 8, "setembro": 9, - # months + "outubro": 10, + "novembro": 11, + "dezembro": 12, + # some months have capital letters deppending on the year + "Janeiro": 1, + "Fevereiro": 2, + "Marco": 3, + "Abril": 4, + "Maio": 5, + "Junho": 6, + "Julho": 7, + "Agosto": 8, + "Setembro": 9, "Outubro": 10, "Novembro": 11, "Dezembro": 12, diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index d67864dff..3c31e1c40 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -2,19 +2,23 @@ from datetime import timedelta from itertools import product -from prefect import Parameter, case, unmapped +from prefect import Parameter, case from prefect.run_configs import KubernetesRun from prefect.storage import GCS from prefect.tasks.prefect import create_flow_run, wait_for_flow_run from pipelines.constants import constants as pipelines_constants from pipelines.datasets.br_denatran_frota.constants import constants +from pipelines.datasets.br_denatran_frota.schedules import ( + every_month_municipio, + every_month_uf, +) from pipelines.datasets.br_denatran_frota.tasks import ( crawl_task, get_denatran_date, get_desired_file_task, get_latest_data_task, - output_file_to_csv_task, + output_file_to_parquet_task, should_process_data_task, treat_municipio_tipo_task, treat_uf_tipo_task, @@ -39,10 +43,7 @@ date_pairs_param: list[tuple] = Parameter("date_pairs", default=date_pairs) -# from pipelines.datasets.br_denatran_frota.schedules import ( -# every_month_municipio, -# every_month_uf, -# ) + with Flow( name="br_denatran_frota.uf_tipo", code_owners=[ @@ -94,16 +95,16 @@ df = treat_uf_tipo_task(file=desired_file, upstream_tasks=[desired_file]) - csv_output = output_file_to_csv_task( + parquet_output = output_file_to_parquet_task( df, constants.UF_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] ) wait_upload_table = create_table_and_upload_to_gcs( - data_path=csv_output, + data_path=parquet_output, dataset_id=dataset_id, table_id=table_id, dump_mode="append", - wait=csv_output, + wait=parquet_output, ) with case(materialize_after_dump, True): @@ -155,7 +156,7 @@ br_denatran_frota_uf_tipo.run_config = KubernetesRun( image=pipelines_constants.DOCKER_IMAGE.value ) -# flow.schedule = every_two_weeks +br_denatran_frota_uf_tipo.schedule = every_month_uf with Flow( @@ -209,15 +210,15 @@ df = treat_municipio_tipo_task(file=desired_file, upstream_tasks=[desired_file]) - csv_output = output_file_to_csv_task( + parquet_output = output_file_to_parquet_task( df, constants.MUNIC_TIPO_BASIC_FILENAME.value, upstream_tasks=[df] ) wait_upload_table = create_table_and_upload_to_gcs( - data_path=csv_output, + data_path=parquet_output, dataset_id=dataset_id, table_id=table_id, dump_mode="append", - wait=csv_output, + wait=parquet_output, ) with case(materialize_after_dump, True): @@ -269,4 +270,4 @@ br_denatran_frota_municipio_tipo.run_config = KubernetesRun( image=pipelines_constants.DOCKER_IMAGE.value ) -# flow.schedule = every_two_weeks +br_denatran_frota_municipio_tipo.schedule = every_month_municipio diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 71441988d..ffb2e40db 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -94,6 +94,7 @@ def crawl(month: int, year: int, temp_dir: str = "") -> bool: def treat_uf_tipo(file: str) -> pl.DataFrame: + log(f"------- Cleaning {file}") valid_ufs = list(DICT_UFS.keys()) + list(DICT_UFS.values()) filename = os.path.split(file)[1] try: @@ -106,6 +107,7 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: new_df = change_df_header(df, guess_header(df=df, type_of_file=DenatranType.UF)) # This is ad hoc for UF_tipo. + new_df.rename( columns={new_df.columns[0]: "sigla_uf"}, inplace=True ) # Rename for ease of use. @@ -124,6 +126,7 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: # clean_df.replace() if all(clean_df.dtypes == "object"): clean_df = clean_df.apply(pd.to_numeric, errors="ignore") + clean_pl_df = pl.from_pandas(clean_df).lazy() clean_pl_df = verify_total(clean_pl_df.collect()) # Add year and month @@ -141,27 +144,30 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: return clean_pl_df -def output_file_to_csv(df: pl.DataFrame, filename: str) -> None: +def output_file_to_parquet(df: pl.DataFrame, filename: str) -> None: make_dir_when_not_exists(OUTPUT_PATH) pd_df = df.to_pandas() to_partitions( - pd_df, partition_columns=["ano", "mes", "sigla_uf"], savepath=OUTPUT_PATH + pd_df, + partition_columns=["ano", "mes"], + savepath=OUTPUT_PATH, + file_type="parquet", ) return OUTPUT_PATH def get_desired_file(year: int, download_directory: str, filetype: str) -> str: - log("Accessing downloaded file") + log(f"-------- Accessing download directory {download_directory}") directory_to_search = os.path.join(download_directory, "files", f"{year}") - log(f"Directory: {directory_to_search}") + for file in os.listdir(directory_to_search): if re.search(filetype, file) and file.split(".")[-1] in [ "xls", "xlsx", ]: - log(f"File: {file}") + log(f"-------- The file {file} was selected") return os.path.join(directory_to_search, file) raise ValueError("No files found buckaroo") @@ -174,7 +180,7 @@ def get_latest_data(table_id: str, dataset_id: str): log(f"{denatran_data}") year = denatran_data.year month = denatran_data.month - log(f"Ano: {year}, mês: {month}") + if month == 12: year += 1 month = 1 @@ -182,13 +188,15 @@ def get_latest_data(table_id: str, dataset_id: str): month += 1 log(f"Ano: {year}, mês: {month}") # return year, month - return 2023, 10 + + return 2023, 12 def treat_municipio_tipo(file: str) -> pl.DataFrame: + log(f"------- Cleaning {file}") + bd_municipios = bd.read_sql( "select nome, id_municipio, sigla_uf from `basedosdados.br_bd_diretorios_brasil.municipio`", - # billing_project_id="basedosdados-dev", from_file=True, ) diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 1ace90099..61ca04e9d 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -13,7 +13,7 @@ get_desired_file, get_latest_data, get_year_month_from_filename, - output_file_to_csv, + output_file_to_parquet, should_process_data, treat_municipio_tipo, treat_uf_tipo, @@ -38,8 +38,8 @@ def treat_uf_tipo_task(file) -> pl.DataFrame: @task() -def output_file_to_csv_task(df: pl.DataFrame, filename: str) -> None: - return output_file_to_csv(df, filename) +def output_file_to_parquet_task(df: pl.DataFrame, filename: str) -> None: + return output_file_to_parquet(df, filename) @task() diff --git a/pipelines/datasets/br_denatran_frota/utils.py b/pipelines/datasets/br_denatran_frota/utils.py index 3815229ed..3af0018cf 100644 --- a/pipelines/datasets/br_denatran_frota/utils.py +++ b/pipelines/datasets/br_denatran_frota/utils.py @@ -434,12 +434,9 @@ def extract_links_post_2012(month: int, year: int, directory: str) -> list[dict] if match and re.search("tipo|município", txt, flags=re.IGNORECASE): matched_month = match.group(3) matched_year = match.group(2) - log(f"------match_month {matched_month}") - # log(f'------matched_get{MONTHS.get(matched_month)}') - # log(f'------matched_year{matched_year}') if MONTHS.get(matched_month) == month and matched_year == str(year): filetype = match.group(0).split(".")[-1].lower() - log(f"------filetype {filetype}") + info = { "txt": txt, "href": href, @@ -449,10 +446,9 @@ def extract_links_post_2012(month: int, year: int, directory: str) -> list[dict] "filetype": filetype, "destination_dir": directory, } - # log(f'------info {info}') + valid_links.append(info) - log(valid_links) return valid_links @@ -514,11 +510,11 @@ def call_r_to_read_excel(file: str) -> pd.DataFrame: """ if not os.path.isfile(file): raise ValueError("Invalid file") - # packages = ("readxl",) - # r_utils = rpackages.importr("utils", suppress_messages=True) - # r_utils.chooseCRANmirror(ind=1) - # r_utils.install_packages(StrVector(packages)) - # rpackages.importr("readxl", lib_loc="usr/lib/R/library", suppress_messages=True) + packages = "readxl" + r_utils = rpackages.importr("utils", suppress_messages=True) + r_utils.chooseCRANmirror(ind=1) + r_utils.install_packages(StrVector(packages)) + rpackages.importr("readxl", suppress_messages=True) # Read the Excel file robjects.r( From 19fe83f4320ee55bc83e55136970680a2b45b3fc Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Wed, 24 Jan 2024 11:21:22 -0300 Subject: [PATCH 257/265] feat: add logs and set df cols to str --- pipelines/datasets/br_denatran_frota/handlers.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index ffb2e40db..9811cb05f 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -141,6 +141,7 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: value_name="quantidade", ) # Long format. + log("-------- Data Wrangling finished") return clean_pl_df @@ -148,6 +149,7 @@ def output_file_to_parquet(df: pl.DataFrame, filename: str) -> None: make_dir_when_not_exists(OUTPUT_PATH) pd_df = df.to_pandas() + pd_df = pd_df.astype(str) to_partitions( pd_df, @@ -189,7 +191,7 @@ def get_latest_data(table_id: str, dataset_id: str): log(f"Ano: {year}, mês: {month}") # return year, month - return 2023, 12 + return 2023, 8 def treat_municipio_tipo(file: str) -> pl.DataFrame: @@ -242,6 +244,8 @@ def treat_municipio_tipo(file: str) -> pl.DataFrame: variable_name="tipo_veiculo", value_name="quantidade", ) # Long format. + + log("-------- Data Wrangling finished") return full_pl_df From b3474a58f71074401d9dedec53638c2b8c74991a Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Wed, 24 Jan 2024 11:38:36 -0300 Subject: [PATCH 258/265] feat: fix get_latest_data return --- pipelines/datasets/br_denatran_frota/handlers.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 9811cb05f..08762f263 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -189,9 +189,8 @@ def get_latest_data(table_id: str, dataset_id: str): else: month += 1 log(f"Ano: {year}, mês: {month}") - # return year, month - return 2023, 8 + return year, month def treat_municipio_tipo(file: str) -> pl.DataFrame: From 658bf37a4c2353f598c0bbdb70286a857a341bae Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Thu, 25 Jan 2024 15:33:37 -0300 Subject: [PATCH 259/265] feat: delete backfill and add documentation --- .../datasets/br_denatran_frota/backfill.py | 27 -------- .../br_denatran_frota/functions_test.py | 18 ++++++ .../datasets/br_denatran_frota/handlers.py | 62 +++++++++++++++++-- .../datasets/br_denatran_frota/tasks_test.py | 19 ++++++ 4 files changed, 95 insertions(+), 31 deletions(-) delete mode 100644 pipelines/datasets/br_denatran_frota/backfill.py diff --git a/pipelines/datasets/br_denatran_frota/backfill.py b/pipelines/datasets/br_denatran_frota/backfill.py deleted file mode 100644 index 75805a585..000000000 --- a/pipelines/datasets/br_denatran_frota/backfill.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -from pipelines.datasets.br_denatran_frota.constants import constants -from pipelines.datasets.br_denatran_frota.handlers import ( - crawl, - get_desired_file, - output_file_to_csv, - treat_uf_tipo, -) - -# Fill for UF TIPO -months = range(1, 13) -years = range(2003, 2023) -for year in years: - for month in months: - print(month) - crawl(month=month, year=year, temp_dir="DENATRAN_FILES") - file = get_desired_file( - year=year, - download_directory="DENATRAN_FILES", - filetype=f"{constants.UF_TIPO_BASIC_FILENAME.value}_{month}", - ) - if year == 2004 and month == 3: - breakpoint() - df = treat_uf_tipo(file=file) - path = output_file_to_csv( - df=df, filename=constants.UF_TIPO_BASIC_FILENAME.value - ) diff --git a/pipelines/datasets/br_denatran_frota/functions_test.py b/pipelines/datasets/br_denatran_frota/functions_test.py index c104b8b5c..c853bda50 100644 --- a/pipelines/datasets/br_denatran_frota/functions_test.py +++ b/pipelines/datasets/br_denatran_frota/functions_test.py @@ -17,8 +17,14 @@ DOWNLOAD_PATH = constants.DOWNLOAD_PATH.value +# Classes to test br_denatran_frota functions with unnittest + class TestMakeFilename(unittest.TestCase): + """ + Class to test function make_filename + """ + def test_make_filename(self): month = 2 year = 2013 @@ -53,6 +59,10 @@ def test_make_filename_without_ext(self): class TestMakeDirWhenNotExists(unittest.TestCase): + """ + Class to test function + """ + def setUp(self): self.temp_dir = tempfile.mkdtemp() @@ -67,12 +77,20 @@ def test_make_dir_when_not_exists(self): class TestDownloadFrota(unittest.TestCase): + """ + Class to test function download_file + """ + def test_download_frota_with_invalid_month(self): with self.assertRaises(ValueError): crawl(13, 2013) class TestFilenameExtraction(unittest.TestCase): + """ + Class to test filename extraction + """ + def test_correct_file(self): filename = "indicator_2-2022.xlsx" self.assertEqual(get_year_month_from_filename(filename), ("2", "2022")) diff --git a/pipelines/datasets/br_denatran_frota/handlers.py b/pipelines/datasets/br_denatran_frota/handlers.py index 08762f263..444dcb542 100644 --- a/pipelines/datasets/br_denatran_frota/handlers.py +++ b/pipelines/datasets/br_denatran_frota/handlers.py @@ -43,11 +43,12 @@ def crawl(month: int, year: int, temp_dir: str = "") -> bool: - """Função principal para baixar os dados de frota por município e tipo e também por UF e tipo. + """ + Main function to extract data from *frota por município e tipo* and *frota por UF e tipo*. Args: - month (int): Mês desejado. - year (int): Ano desejado. + month (int): Desired month + year (int): Desired year Raises: ValueError: Errors if the month is not a valid one. @@ -94,6 +95,16 @@ def crawl(month: int, year: int, temp_dir: str = "") -> bool: def treat_uf_tipo(file: str) -> pl.DataFrame: + """Function to treat data from frota por UF e tipo. + + + Args: + file (str): path to the file to be treated + + Returns: + pl.DataFrame: final file + """ + log(f"------- Cleaning {file}") valid_ufs = list(DICT_UFS.keys()) + list(DICT_UFS.values()) filename = os.path.split(file)[1] @@ -145,7 +156,16 @@ def treat_uf_tipo(file: str) -> pl.DataFrame: return clean_pl_df -def output_file_to_parquet(df: pl.DataFrame, filename: str) -> None: +def output_file_to_parquet(df: pl.DataFrame) -> None: + """Function to save .parquet uf_tipo and municipio_tipo files + + Args: + df (pl.DataFrame): Polars DataFrame to be saved + + Returns: + _type_: None + """ + make_dir_when_not_exists(OUTPUT_PATH) pd_df = df.to_pandas() @@ -161,6 +181,20 @@ def output_file_to_parquet(df: pl.DataFrame, filename: str) -> None: def get_desired_file(year: int, download_directory: str, filetype: str) -> str: + """Função para pegar o arquivo desejado de uf_tipo ou municipio_tipo em um diretório + + Args: + year (int): file year + download_directory (str): donwload directory + filetype (str): filetype + + Raises: + ValueError: No files found + + Returns: + str: File path + """ + log(f"-------- Accessing download directory {download_directory}") directory_to_search = os.path.join(download_directory, "files", f"{year}") @@ -175,6 +209,16 @@ def get_desired_file(year: int, download_directory: str, filetype: str) -> str: def get_latest_data(table_id: str, dataset_id: str): + """Function to extract the latest data from GRAPHIQL API + + Args: + table_id (str): table_id from BQ + dataset_id (str): table_id from BQ + + Returns: + _type_: most recente date + """ + denatran_data = get_api_most_recent_date( table_id=table_id, dataset_id=dataset_id, date_format="%Y-%m" ) @@ -194,6 +238,16 @@ def get_latest_data(table_id: str, dataset_id: str): def treat_municipio_tipo(file: str) -> pl.DataFrame: + """Function to treat data from frota por UF e tipo. + + + Args: + file (str): path to the file to be treated + + Returns: + pl.DataFrame: final file + """ + log(f"------- Cleaning {file}") bd_municipios = bd.read_sql( diff --git a/pipelines/datasets/br_denatran_frota/tasks_test.py b/pipelines/datasets/br_denatran_frota/tasks_test.py index a2d73c50a..45a0311db 100644 --- a/pipelines/datasets/br_denatran_frota/tasks_test.py +++ b/pipelines/datasets/br_denatran_frota/tasks_test.py @@ -24,6 +24,9 @@ DICT_UFS = constants.DICT_UFS.value +# Classes to test br_denatran_frota tasks with unnittest + + def custom_name_func(testcase_func, param_num, param): return "%s_%s" % ( testcase_func.__name__, @@ -32,6 +35,10 @@ def custom_name_func(testcase_func, param_num, param): class TestExtractingAllPossibleYears(unittest.TestCase): + """ + Classe para testar se o crawler consegue extrair arquivos de todos os anos + """ + def setUp(self): self.temp_dir = tempfile.TemporaryDirectory( dir=os.path.join(f"{DOWNLOAD_PATH}") @@ -57,6 +64,10 @@ def test_extract_denatran_files(self, month, year): class TestUFTreatmentPostCrawl(unittest.TestCase): + """ + Classe para testar task treat_uf_tipo_task + """ + def setUp(self): self.temp_dir = tempfile.TemporaryDirectory( dir=os.path.join(f"{DOWNLOAD_PATH}") @@ -97,11 +108,19 @@ def test_flow(self): class TestGetLatestData(unittest.TestCase): + """ + Classe para testar task get_latest_data + """ + def test_year(self): self.assertEqual(2021, get_latest_data("municipio")) class TestMunicipioTreatmentPostCrawl(unittest.TestCase): + """ + Classe para testar task treat_municipio_tipo_task + """ + def setUp(self): self.temp_dir = tempfile.TemporaryDirectory( dir=os.path.join(f"{DOWNLOAD_PATH}") From 0c41c7d00c63d0441f6a9a2e1d835349db8ac74b Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Thu, 25 Jan 2024 16:16:17 -0300 Subject: [PATCH 260/265] feat: remove backfill parameters from flow --- pipelines/datasets/br_denatran_frota/flows.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 3c31e1c40..3916607b8 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -37,13 +37,6 @@ rename_current_flow_run_dataset_table, ) -year_range = list(range(2003, 2023)) -month_range = list(range(1, 13)) -date_pairs = list(product(year_range, month_range)) - -date_pairs_param: list[tuple] = Parameter("date_pairs", default=date_pairs) - - with Flow( name="br_denatran_frota.uf_tipo", code_owners=[ From 869430cc2873fbdc8d49d8022e8ffa13a0d8d59c Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Fri, 26 Jan 2024 14:22:52 -0300 Subject: [PATCH 261/265] feat: schedules --- pipelines/datasets/br_denatran_frota/schedules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/schedules.py b/pipelines/datasets/br_denatran_frota/schedules.py index 67d07f59a..5845efcb4 100644 --- a/pipelines/datasets/br_denatran_frota/schedules.py +++ b/pipelines/datasets/br_denatran_frota/schedules.py @@ -44,7 +44,7 @@ "dataset_id": "br_denatran_frota", "table_id": "uf_tipo", "materialization_mode": "prod", - "materialize after dump": True, + "materialize_after_dump": True, "dbt_alias": True, "update_metadata": True, }, From 32a7f327564d832c1c92444474f6f9e2e9c67e53 Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Fri, 26 Jan 2024 16:14:18 -0300 Subject: [PATCH 262/265] feat: add code owners --- pipelines/datasets/br_denatran_frota/flows.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 3916607b8..26205d618 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -40,7 +40,7 @@ with Flow( name="br_denatran_frota.uf_tipo", code_owners=[ - "Tamir", + "Gabriel Pisa", ], ) as br_denatran_frota_uf_tipo: dataset_id = Parameter("dataset_id", default="br_denatran_frota") @@ -155,7 +155,7 @@ with Flow( name="br_denatran_frota.municipio_tipo", code_owners=[ - "Tamir", + "Gabriel Pisa", ], ) as br_denatran_frota_municipio_tipo: dataset_id = Parameter("dataset_id", default="br_denatran_frota") From 5d3d7936780d2fbf1d6576fecd68fed3531ea5aa Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Fri, 26 Jan 2024 16:36:34 -0300 Subject: [PATCH 263/265] fix: flow --- pipelines/datasets/br_denatran_frota/tasks.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/tasks.py b/pipelines/datasets/br_denatran_frota/tasks.py index 61ca04e9d..592e3623a 100644 --- a/pipelines/datasets/br_denatran_frota/tasks.py +++ b/pipelines/datasets/br_denatran_frota/tasks.py @@ -3,7 +3,6 @@ import datetime -import pandas as pd import polars as pl from prefect import task From ea8d3c9e2b033c235ab4372ac62f0ed23ac9be09 Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Mon, 29 Jan 2024 08:29:17 -0300 Subject: [PATCH 264/265] fix: lint code --- pipelines/datasets/br_denatran_frota/flows.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 26205d618..3673aa324 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -190,7 +190,7 @@ ) with case(crawled, False): - log_task("No new data to be downloaded") + log_task("There's no new data to be downloaded") with case(crawled, True): # Now get the downloaded file: From 16e1977456e53b225af41ffbd369e05ee6b0195d Mon Sep 17 00:00:00 2001 From: folhesgabriel Date: Mon, 29 Jan 2024 08:41:22 -0300 Subject: [PATCH 265/265] feat: remove unnused imports --- pipelines/datasets/br_denatran_frota/flows.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/pipelines/datasets/br_denatran_frota/flows.py b/pipelines/datasets/br_denatran_frota/flows.py index 3673aa324..0d8b88eb4 100644 --- a/pipelines/datasets/br_denatran_frota/flows.py +++ b/pipelines/datasets/br_denatran_frota/flows.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- + from datetime import timedelta -from itertools import product from prefect import Parameter, case from prefect.run_configs import KubernetesRun @@ -15,21 +15,16 @@ ) from pipelines.datasets.br_denatran_frota.tasks import ( crawl_task, - get_denatran_date, get_desired_file_task, get_latest_data_task, output_file_to_parquet_task, - should_process_data_task, treat_municipio_tipo_task, treat_uf_tipo_task, ) from pipelines.utils.constants import constants as utils_constants from pipelines.utils.decorators import Flow from pipelines.utils.execute_dbt_model.constants import constants as dump_db_constants -from pipelines.utils.metadata.tasks import ( - check_if_data_is_outdated, - update_django_metadata, -) +from pipelines.utils.metadata.tasks import update_django_metadata from pipelines.utils.tasks import ( create_table_and_upload_to_gcs, get_current_flow_labels,

O>OVpjl~Mq*B0FXj}l)V(bK9wWIb*sjYzl!G#>5;r>eO82xD- z0x}s6A;TC{5(PS>9^z2y02DfY+8gYEmc{viWF@dRrAlPzL7k%r^s!9UIdh`(AajB{ z3ChR#^4{r3ogP8x3MmUbZY6#TxM+r(Qs}g0NX^bgG=&0-ZLqMTYBvp)$cz0p(o@W?Mgpva$lK=!>`+wDJ=k{rVS~`8 z(!JjSkHZ|)k36W}ib_D~&8JtNC&7m|D265DQAX`mqbUQ z<4Qd0gUk#XQpUXu#+3MWi|;L=>%iI!@eM}fmrw>ky4j#-i++lTc1oCg9e^Vu)Tv?Q z9R`i7d`qL5K2p+WX}O_KontohbWb8(a&~SE$k_f=0>(pdlI86+>C`qY=iMY(adZHMU1)_iWv~O z4isT4r&EbxLuoMApf*9}2D%4i7`q0l7dlg>?}YmC4H2+OfviO(O8XQj(;}0r4Jl=<>=xyWn!1AgIrD7hmQlT@^*t#L8Mq%J7iN&Q1{?q8f9twrzJxX?G|QM)R?@~ zU?1S&j2yywPkRAu$|c-AQ(8oOgAT;zA=)}4719w4C8!e%M4}Vo5x!}9iJeS`cX7P6 zPp5G@E+-HcQBD_H0=U0syyjjfiESM+yB}_?cHWv=KO|VUJ{$D~9i6cH@^*8JqfK!q2cdGJ-G& z9^d6$rVl*Rsr}OMBI_EpYk#h&)N5#*Y728&Hvs_wBX4y~qf#m|kjqH{EsmyQ5Go>( zs_Fbaiz{C^jMnU$?1T~HgM_IbH0KmcDIFM_ZHybtZGxO2QwpNxP%k8EmIB%s_g;DBDo+_#2T~*qhERyXttN+H_Qm7^ zk}}Pj&usV!xX3{kf|C;kP;Jr2bCpoA4g1grW+}v;B*ZD>FJoYr7L-h;5KSR0y1t>3 zdYMC$I6{$BGQKQwaOyTdK&qwE#tNq2hpE?OFz0Kcv(Y$)fVZHHp-GkRAmsuYt4G%U zG_R9<~e8 z3-JYL9Pbp>1d1M47# zciU5QNx-3>LMOq85m*&mok;oRMS=kG84n=cp!1Uj6gGLwzDWx;#vM*^u@{KR>B|ZL zU{*<~uADw#ZxDrBG2R@oBRUEMeJDd zx*Z_FGKw<{@Eo=#ptS%Ne*va9K8dCUR~lcq8i{N}n*hKfkLU{wrkQFIjL#k5b(?@f zzN5uCx8iP9^lab$cAhO78hzX};qu~q*i2!d>np<_&e!tBAPSveU?hA1w}J6ANW7vl z3j3631*a&<@GT`a1N#&RbUTG>5;q7Hs?M?417#B> z8V(n%vJzG!hb^tXNSgB*I2ke-HHem?E@5jg-1lp%BOEl%oEQiX0Mlq{4qi!&qED`%KL;yM9O8%7 z)U8eLQ5GnUD1!n#H&O5EKtC-PbFG0+`D{#_N(WZ}^yNYD=7vzCvWn?E&2*TeVMw<~ zVslQ|3(P78hemuL4&}t&DNcycWSEd)od+j-xaMPv z5e6J^=-P+T%J#+pb{`xH&6cIn1EMTQucnET&sT-^WZ%$z|dPA1;I<0G$R#^9R7Q2w0dCRVVBV8fgjd9>& z++x2&U#?#;h|{8r$?phT=PN9N{U@3amcXDZ)tzPV)-Cl^9%s$$!9GmSKA3~UC*d2+ zD(3bn_8#&BPqES@k=h{|HnPgvfg6B<`lU=5#FhTQ0YtMqvwvYcOnbobatJa&U4(RN zeUwp-BhaAG99+|&P=oq~tS~Zx@c|C~EgGfNkXUSpc4|v6Msq@5>J6&jrjVjxp+Jz0 z^g4WG(yIUsYLggn1HCBFDmW+5e}4$<%heiMoph=Im9MQ6Y?!;r=Wj)gb3w?`X6XUP>A|OGm8Y!8W#9=G7 zfkcPUBXMf|^d9qCPim}>hA*#>1oY@j8>nz*m>R}W;W`msTU5LNhqG!*AwhhU2vq|8 zhu%`C5$|w5i2W13ICIf9VW%vj% zs+L_IhAlKT>Q4uiq34$I+%SwAC8#C}bw~j953VHe9V`=L(>W5tK!EQ@$dSm;1u1$^ z_n5@uQ;j8q(7c1N&^4$W7~uQ~5sGR~X=6-OejSjCHatKN#Yo8^1S<&~Cg`$Bj?<2B zNEKu)(Qb8DiU#r2Fw|`y z_V@&VAtq!ijhzVLOVzN_G6c)&aG2omHo?#@4GfD%NFDo4lmzZ5V9IIsK-i;3CJ?h$ z!*sr5P50vwdw4K_D@H6N)C+Vu?^Vwm@R^P|W_TzuBY+lE%`g+D0!xby z#!Q{5_CoTKT5^vDSJ@4v1Jd?VL&uc?5JUo$XLeC=jsJd?Ujcw<05h;tYHu5>7#q4k z;-Pyo%Xyg#WSYF7($MZ)#umG3X^lewMq1hu{bCz>9`qRI4@rPo8{ftN$FrdIm&Jg} z21xW>;}SC{bmiCAD#+R86r1eNe(sRq$GSK?qSojwz!S)U1&84AON=Nmc61i!p9G%~ zhB0eTP;jGX=%7bvW=4SQMOJ3+23*ZiZALEukgsqhW407?^xBIeBUNOIj*B4%@E}P` zhI53b!=tyaiww@8TbL;|Y81#wn?d_yks)VLSF8baC8UWup;ig$D@n`Ffw`pFotZ%~ z%)*eK=&bAteie_eYcj{^T2mvtf)BJUKY?@sRel*maS(&Pvk)yR`O;$o5`6C+12*Pl zks^mYifW8b|iB6yEVGq?m!GWjD% zYOrU2qq>$4*$H(N1+`hd&dZaTby&Wi3eX;tY6oZ|>JBJB?BeJ;Xhl^s%&~UtOR8!x zL~88yob4+NOygS_rSvCTB;>Edp-)@;)DEd+0L_LrIWDUgVfMg%GaP%PrbRoj7eUGm zDdqYgOeyAyBVS8EiA)Xn9&1oJ96YEgmZm1eG6c{H$(agIvqMSI7=W1aBGhm*?m7Ae!mU3)4o~PzVCL^0Qi_rBxK2Dklo9R2cF{*MlF23J?7dBB26z zIxwL*rkhZ(WmB64`EyT|5}E-`fqF*LP>R)*$_xTS#&OUkIy@2bl>MDGigIi10+oz= za2h;PEEY^YbO6REr1=VQ(c&u`rUVZ--mJx%4Y5ry2U0rF%<&FoAxcOH>a5tGXX7{c z4f|XCq4h)Z6YP~mZbLkShXmk&s193oM}62ub!X zfF|76W^b5=>ew0d6V@M(t=4>njKSlm?G6>f3f5s19mOLal1XffFPligbQR5BHB8 zv8B_oyAetNzF2&W zMMy5D{8W+7#3tYSt+vK!yyx022X`99(O!XbLQ1rj1B75aFN&a#z|y4+z6o_u5J)USDhjpMSsW3}I&xpi!|O5*oA&KJ2TlEPNX?Ssb*akF-J|v|<Ek(8YWXUB9^?hVzgA@o!H!ch5PZnT92Lliz4ME8)+1>Bblj-76cI8>sB_C1JsP)` zAA7gu2mdaMIS8&}9u0R9**h42(4+=PW+fzvHjHKu7-`UkJ}O$djBc!qf}d|(KOeL> z)RJ`M51u0+EEtz`)HNCsvPmRJ7cnoUu_&ZS@Zc>|)8fErq(#RJBv!~(8<~$FNiB%4 z1FL(DN!2=E7isxSR=rahAQ9LoHm=i2K$%m75G1%bS(p-X| zsQ04^w)EqiRdgYUL($WG127AaeE|n&Q8YrZ@#907o}<{*8hAjO529gMT2evu5l}BW zwKvVTT(OLaAjdI{rLC3H0Hu)c9w5VUgkl=?<3ogOW*R8+kYHT%uvJ_g@dyfLh0+*U zA()Jy8X2PaE47p{D_44Du%6?CX{ZKlSQyF1!q~&n3$-T;9kMbDj8?coGP^4`c3?8k zL%wu;jW?yB$)NVLP>}7gb;_*+>_s7~#2J?Frp*qhM6>Cj_*2niai}(s17Hd+Eh49b zf@7)hK6n($=g_{C6AYBm?lEvEd~W)x+v`;p6{a6rjfYWh#|`X?(V8~Yxq&=D6HfJ1 zu>!T6n31CQIOJKJs48S+Zp7eu)DjnhppR)O8Okq)LDmLx)C>ks@;Mmm#>PRQ*Byj3 zyN!jpJ}BF@ZljMoN2#D0bc((nnmGuiz+L)xy+rU+X+W1T0a(DJvQ(m)Q9`c0*xm+m z01`$&Moah`ug76*l>rJvIyaJW5=Wg9&?9pu86 z!=)W4%$S&*fR{KqM74^2Wp~t$IViC9g+;JE#u$G#;Q%xcjcSFmd+I<(W^Xpm0*=!N zYv&-Uh$!T9A!8%6fZQr&k7R)DN`O>k=wV7(~)nHG|qu}kJ za0&LNU>*oWkPKKTqpE^#!ViU`*TdpK3cC>9^Kl>^(AqInrlq5kYng*8EmTJ30oj+L z(P*J{hA5)so;S&grX1N_u*8E&U^>mV&BZkJT$zKR!ck8{lSAn?-#y(U9aJpjE`c%v zIu&=-pgnj?InTo2L>0_cz&2$=M__=*_VFPy!D9Xh#|w`75NNPkLC)b#OqPbB8Mxu! zrsaGC92?)4VV`5+J_lA{qN(#npb^?zUIX{Cl>B0J?pg*EyOB{F{mkxwq6A$HhD>Z6 zK@jh#=c-Ggo$LnZ*O;20dJL5^B`c`2$pKf9Ijfg+lHaoWxwqM}%5*Q_Is;O-Qr@t# z89m0Z!}Ay|cWyoei(*96{7oJAIL)<3W`OoxD=sSTf|u3}GWAg_(91^A;u}6`7qMU-h7>4raqt8b^F- zmn{S&+LAjS2#9*IcGD`rR+jhzSJ@+9L@wPR25N|P!Q#>MLhMGRs-PB;l%iOPKF^>` zpqNV(Wj?1ZHWTbU62} zT=ppg)I8+dFvvTqU{rSaaaeBf8ir4#NV;l7uTn1X_ZD4%dc zPGIi*8W+}+`Jwe9uJ&{F-yqQrj(Q%#$pqf*Lzgp6PmnJxAjOhgWE8vw5*1A^gwfL? zK^FEjC1&!?cO4WE(uXtOVI~y8CK8h1XCFmrk?glpdot?WXZ*PFGsb-J$@IiY2+tWmWBjBU z)7!SsZQuS6SFJ`XcUBwcz?<%Wxz61I%V7Tw&ixw`fVQ2S+X-+jx;XbLnW>v||3S-6 zIoY{`(Wp=Mbna}_SoJ*T?m@xwdOP} z&K-n&{;?GJkWas>ox2w0`RfYj8X=z#Ryub))Roh&ckXtSXT~bL3qC5m$+>07uf=NT zDv{qww_1MXYn;0k`CY%(x!ow=+v}Z6AiusFP#)CZygN~UDBsg}J6GpO=O)~T@*M5l z)tj8#it_c@?A&zJ-^E*;y9?!8_K0(jpnO%2qCHTL4W4kWGx95a%DMAUzEi4@2J+kb ztaBeBzrX&~x$lr){q4?mLisNFJIaXmy5ME!)}wrHy^6X+`Cfg^xi`^Xo8Q2@$ZzFa z&aFaz+ulK2BEQ2B=_r)1^ZRH^JIyWEX>iC0mha#VU{Rj-m=lWlOAN6?ae^6HBGvPPXeM98w zvRoF*)2VuvYl8L~Uo*=UqdfQ4&T`9<&xdugRDajk&vNIX{)Xjbxr32@orAL6cBKE@ zAz5w_+UfGc@E+>xzNT4jDmp}+qwpN*|9EtkdkFm3q*<1G2jysUT$cM5y5TWVzj_w~e`3t{?Jwuzi**2VcC}G0U9`z9{aJ<-S6GUv$fI zmm|NSJ+s`;sIR+vWjSs+{8xUKyB7H@EX;DvkC)B+HFKxegwd<*q}$RSX9nw9lI(fdln6==3c23i8`{ zW|nJ-{Lacg1V1F;|Do#iuc4chy)$bLp44)AD2M+CAj?_!AZ?xUgY!NW3t(CC7` zLrRK9(~Qb>SSUB6@#T%8(fKpZojqv|1@ZVqN{+Wnj7fADZMT%eqjTGz)W3bVuI<|o z?&4!ntV@hff*4PXPn1K%kM7^0eaCKXqL^(4w#Ul`Fsl{*;@1b`y_WvZWV*);%AV!i_4J zK5f?cX|v8OKd*B9%+uSyv56)z6jmYY-bbMgNceRfj6)eq)nANS?L=a)Udc7E0N z8=D{U!p;Xb4E^uV170uhy)kjfl-BQd`1#h8Kbi65(Y3d1TeW&azx)5y`^4s7H|=}+ z9UpcX{O-NOF2DHjCOyX7(P-7bAA9PFmR&AOmRx>Q*&P>rUO8dFgFTlmpK&K50*W+Y<}l6UK;ew9|u+Z*lW*$Z@hHTsEbe| zfBaE>pZdDv?G0a4p`JQ}Ind4AnKQ;unc21tuZypK^_*?F^)LJWk|!6vw&2v)w>3F# zPTM<{7qnfsz{f3ukzA$7wp<{<`bo_t?Th}yQX&(Kb(8r0gaZtJNSvR z`+ARi?S-7z`xWi#IJWsk8&;fq<~v8Py7jQ#od>+};~{15bg8)S>Wwe_v3XnWOScYw z=A!#se^yjuT9<1FO!{=}?Hk*EGUUnS8^_=E=21JgZ2k4^-%ynO3p)9{>knCk0$zb1 zaK-qS+bnrx@BG#qnr?ir_=vx@p7PQ2 z2Y>$Mye2O^bk%_$mTaGS>Vjk6T7JpBTRupR;`3>fPaFBd zdzZX(@!TzwPkwl8{^RGa_+-~%-_<|qmCAlIj{ElB%4IdH)fjl?8Pz_0yWq9AlhyzI z@#=q_y815@hg6+;`_-Sm^iAo>4}Lm);x)s%7k5~F^oM`^{7dmyKmB*Z3CBNQ-m1le z7w&lK-MZN?_ip?^>+fnGJ@EN1bE>cHIIeN!iq|gOw7%86KVG@u>8%ZV-m>G`16JR5 z=TZM&RQUB1k34XD?;~o>9`b3&ZPRBSGi1jvtv z%Q~Ml_^?-7{pH(pH(W6J{h>x!2BxVe76SAW{J`24X)Rc`P2 zT*q}ct(yMvlGkf}d&=1_ZT|X{dUuqLz3+wRm)1{qx@p|s&psn@Z;KBmobaFV@2>Cg z*n68_{{6uAIZu>)-Shl!j%{~LvP*WaJKpc`NzdUEi*GI-bj)Y77xk)kOUF9hM*Mx# zvZg0ob?dSd4jp&UsdwD;d5`NiPJj8!Mp;)5Tes`yU)%q~uPx(iOfebFDk)?IK$n===je#UiU?|J<%$DG^Xk*QC= z(Pi$3GynE$VcTvC)=#N^U**A9{H^Q67Q0SwdGEvH&RckOi(6J)dD)f6?d(=q_qYCk zSy@u8Tj%e;t;)H4Xnyx$%@3_RciEh+D;|F4lUjL?FZkl&cUNrv*X?=VU%9=(^cz2# z@yV$x9w__koGVAQf3JOwHZM;38dJg9|2^iV_xfz?KXdY^*QSjB_tv4UnjW}oYWJI- zC~Hvr#K~hXDA;sD?-Re@-7Puhs+*76-Ld_gxu>-HVC<8X*R?6DQ~1!{6|Y_JLEoug zuWvu>?StB#zqKOw@$L2Q8TQHBoyL85@viZ!%O||k?XuIqd~)tT%MN?y#J0z5+5F}9 z&F9bf*V5JhUi95hpU=tbz5Tz>9P#suzpVOv&+PHt`|WObRNf^cAKUbF?u}EgzyFDM zPdfOAm20m0BJs+1lj~kEJ8?t5?=S8*dg9K(McI2_s+{q!>C@JYxWC`Um!31L+X)ZP zY1ib!jwkF`_SEDr=MO44eeRs8&+UBW$wTfaZ{6{_mCd^!)8VP*mnFaJa{CqkDID<8 z1DD;K{dvtsUoGA8?eR}{J+$PsUPo>2+NEKS!E0JR(xT|a0dp!xEpK($H=_pjc=O&< z=iL4NuDiz$`TdIWJ1_g^A2+r-yXP}Am)yI3UgEh=#@2amT)$p9Wye>$yY$vgm8~DR zVAGcB>uNT-;GZ389emWtT~A+g)Xh(~`QnHMH^060mNzeJ-Qt>$&R>6E$(LEzAJ=rj zp*fQeoqWTwFVySZdF?qL-}V0GJ=Z;d?cjk8-fuVgg1iIj&mJ}KiuM)fPWa^2i`urI zc*xByHrzV>jN|Tp`-~f^|MBfB&mY&J)o1UF*|p=^pYAWb=e1YuQzyQ)44MiwOLjFgbDAho!x%e ziHClD;&-!7d}_kdsm&i>`t*md?;JYw^UXiZ_-CuDP9MH=^OmM3zw_pvcQ>DKMZpg< zx}0_7S@*y4)!b2Ie>&*MCoh{@yWV%x9xq=uy>p{~RWCXF_^p>$T~+7S(#KxB?~O+X zynI@_+g1)4_3`yZ7jNtIP5H{4+Pii(-#zi&@*9Rcd&%qbMxVW5Tf1QgH+}rv@>BB5 zPPt^mh+kV?*>zUCB~QQB{FkN$ubzL{`7QPw(PYcLoA=(m@{x0HE-Y&HUEOvK+RnUe z)xsVlKkd@{;>&Kl>E$L9&YyJufz_|M^vT-oj{5eQrA_;9Ir+Hp^G6?h%k{P2>aya^ zS|c0Zf8>kx`mKLw+QILv?E1*_lj?so3ou%wJw~&{glB)O6|j&;MuI zx6?l8Grr!xH$VK^pbak+e=+Ov9V^GKDC*quz=wWmdF3}>&g->(Z>{dRlPC5&cJzBE zwE6b)7n*g-z3{N+wKjac=kAAJJ?_D0TX*=i=tu=)-MWocQ<4M*O;I`vZ>@Z<@BNW8rsy|MBm~ z?P~Vod2??0uE8JeD{uMk&_71~b?_^F-ud#vGafs1#ImA^3!Zs?=%{M9-Z*f|hoerq zQmVvpVJANNE!W2I#7J(+@6~TdZpUpjJ@y`qAW>25~#$!1v zT70l%$GvY>U;JsO2Az8~KlPh$8{F4AyUk@|p1N_;<2T&$!hvVC|3|xtcO9PH{mbjl zz3G{$TfbSBS9Zvt%ileD+@^|!%cghv_TULC`nMd|qIp@%Htkl;Xn1_Tm8*ALQT}W4 zzOL)89`dgQUfO-^&36r`@%K@WJ@(v(siJ39JIVd|%mC4Xe;MWprTx%`HEsnp@Sanp<;fHMen6 zHMi;FYHsU|)m+sB)!gRdYLkt>$(&uI~1nP~GjtDPq5js1D0kb(eibb(gcY zx@+=Sb(eU(x@-AWb(dSMhUnr{2wYq}jD*K|AoQ`7A} zpqAUys+QY}W2b-N_Z(+ps(NKDm$R;xYw~z4mw2O=Yx#98ms`EI>)N!o%j;0v75A_0 zO3$k8hF?(IRjjP-Cf;4!Rc@>8=IyHOl0VdTOX_92<;P~bRVQb=HCP$jI62#GT9oa! zqVlUYXS?k$X1g7qWV@aJ&4zKVj@xr$9k;ijj{9X4EK#%Sxa_5MT+aGBt_duBi8t%G zmfzHIxi#v#u1C~$c^&JzV)#{*j;rg2&#&t$uC41P-c#3AK3CVxd%vzr{=2SQQoo*C z-n^b$)uWzU1MAGjDfQf@#r53Q)%9G}L-pMDm+HA4pVo6b|5wlLKB&Ii)4IOfTUg)y zG8$|$yS~f5s=mv)qrPkMWPO)-tG;XbZGD$pvw`b+WCNGisevoT8SSOx8@S;M8n_Br zIVaxRz*YXWft&Y11DE`Y9{6!}`K;;7ypw+{JkE42&H)NZGaM)1s{OqY0CyjY+g9Js5%x z*2ESCk!c6klY+h_MT?Z~VqIGx#r2gv>%OyYN3Y`%UjFO0^BHJyH z*&ehSr@&|fLpko1{&DerHNnc8m@-BrgnT!DYUC@d|!(x9~j@) zhMn)4hVgwiaO|oV-`7DouR(qhp1P1wB@N>HdN7SV9K2s2n3@Oo4bUDXL3#}xEU?+} z`;E~0*97V1pan|;yp7RzVg3iW1Kh)P;`a}PDeK`Ny@Sx&B|-iNyMxo-KLkdC=E3`i zx3X=6U3b^bb#+}_XV=Mfbhn^I@NPAf z4*w{jA^Gvk=1PacG`- zwCwInV-feIK^pEy&xAtQG7> zqjnp<`s9qngV{Ot=2^dv8+U`~Nj?$5nUt9#*ZY zTGe4_5hhGd?d7foKiXXu?k-B*RYP~VE_GKOcgfTplnHlz>aHg4E>7KHb;2!7-C@{w zOHy~)xVt=cR|j{CQg;}j-4&_3dbnGhx~q@7D^qvu$V*dq4RLo#>aG#)u1eiu&~wXD zca3p(b?WW_+$~St9f-RXsk?)4cWLVGVBA4h^0jmb?pCJm4#nMN{*Il!k(&xWW_?yi zGc4#+wn+8bUhVBduXbhp%B86?21>PL9JB6BO%WHCsC`LCF2~j*Ehd8dqeiVC}?U7P2#z<=lX{AS6Q%I9Ve`6Yh?ub*Wn#FM5 zWL{U@pz!GUsXIbpVHvZT;nvGV=@iGw8_DpRb7P9@8-#rcMCt93Qe4MKYYFMO9%(JB z(_!oQ#*$0pl=3PRF64F7429doPo33Q6H;CLLl91*GNUKg$st55}YW31N$VV8RTEE6h($`q)w+rHQRXF4UYYAVQ zP8jX#k#cB@k!B0&Opi2MNb_oa%v2{m#j9ew;>#GW8qRCOJ9*8Sqo-C2>S>OBtZLQ{ z(xa_KfOry=3Af=fKi#HDv z4<<(hPpwYX_Xmi(w=dDt+&E6vFoxHRiz%*K5H_T071zcir5X?;tt+InJyMPdNN>mk zOe6b}Af+=ER_ia9Oh{TiS`H?Sav0~~wY(M^=d=h?Xr*x2`YM^VnZMf8RvsyplNf0| zA)Vuq)-$BL$12sZ&seP)F5gcA6h^mex#; z_cNbOL66F_wpQy@&gN6sOIORyxK(v})9s{pU8tvFk8+|Yj<3N#Lz?63l!{!8w1JS$ z^GG?VLq56JG1a{3O54&KsIXc;FI~RmWz=#64LWMQcjNXeA`3J zVd?cjK30$7+{8lB`vp&}ekC8v*O6X%zMh^E#2KKlHr~K;E^66q{%he@ITG_>7OyuDoNP9g`niMdY$wKrQO+x{|o6Zc`l#U_<`XS zFZ0@D8Lx(G-dcuBMM?H&xc>6^scB*|qmiWeh2NJua8NDnfkRp%%N<9n~}bEgWi&SaMEWjj_F}}_Ll0mDlDtvHKgr4Qclui zq=yRWLXY%NL)vQ#bIZF#d0HB#1F21SOID^yDM?bN`Wn5SZ^luL)8ztxufTWTEKBcZR~a zZ#d~^t4=GHy{^~lspy*Zy7->@>rDrYY`%Q(ka^>&HEz$H7 z=4n_i)QlwiVp2vt#p_mScP2^i5m#=S4|>%%U*MYD`YPiLU&O1WF!45q_g*cEYIc+9 zK|yVrcD`x3M@o}ajPwX0UE+}*VRf1(EN@FowS0C@Q4YDhE}zM3-b7K9Pu@_4i+L@) zh1WF`c=e;d;;flLij7W|rst3VDN<#e0*{o2vKZ-+LVCGJdZZ!UD_&c*g6~4$iu*$K^eF;aRxH*!~aq(>Rjf2(CT z1*5j>qnQHCGOw||EdDCBb}S6?wA@NaSuB3saju?Pf7eq#Qkaym_-diFI<+3l zG3p&x=q5w-PpQ@(OZcT(ce($w|7f01Adk?DO4>0QXw5Rvj?F-8o`H5;23m^@G`b_~ zi=|}-+6ftGtuoL~%s^|Mfp$^`TAK{Cwi#%-8EEY?(AsC9b;v;Ln1R+Q1Fdrg8vWPz zt-r1rXx%cZZM z)R)QL3VFjQ5#9Kd(l$nVoRF^YNRKn5=SZ{KyCTlVtfSTkc2|(@u~^#86jLK4Fi?*R1it5x(^~2E<5P25(39NLxM3^meX^Q#HH3Y0IT5 zL2{Tq)m8kMJe}b+t9jkKfY*v~dMYelvltOmynSeYq|xk!<7JGrrI2z@7B%gbhIHv2 zOmE_%AXU|u)k5A_(c1@4tuAu)md&q6>uK1&)_+2+#pG6q)WQe(*5@c5BRxS#uk%Px zFr@1@GM|bol$+l6GeSv`9FtPvy!0T&RIjU&+{imklu!=!5+xC*=~uZzq*mf+o<-dv zM%qe9ulGplv;&MeYnk5gVD9QQXX8_~a&kbBXFG+3x23&RDvC(}!(ukKu$IGC3Gqgj zU}`)u(i4UB29K1EMZlPp=DK{Ia#I?9EVQ;W4s8}cHLh^Vd82xxx1EL()8ua`nXDy3 zj24dSlzLc}7(%kEb!rN8s?L5Q9YnAa}DETdpa1|TRbX5GX?+5knOJ;9n zxOzUNb{Hc)Nl0(>NKZ1PZ;DUnS?wsLy0-Ji(zk~ zm`2&ZM_HRitxugbM%qS5Z}Ldn7}8;Dm|mWZi-uIZX)`ICkyeE~sGeYR`m zY4sFF!}4cHjUGwAb|$90-3q^mvBTthlh7U#nsj8m$Vu9_?)W$|)elNv9TmdiU+ z6mdwd^f0%Il#1!RTAaj1qD+V>E|~p>wq$Ucjr*K+#7Nr-=`9{E zi|e$5klyBzcCb2Kt$L{l`o15d#ASKb?tz}<+fMQ{Pv!9O1Fg^X5o(kCR)b-ky0}c} zx7PZcH^xXi3h5e;w4))NbuZr=up)ljTS%;rpDVicWos|Vo~m-vbBt$3DNgq|1=mmE z5M4M5SUPr%`aWl~G15*#db>y3$&fbR!c<#c6Xat$kka0JKIv%^$nw;+%?3WzdJ#@g z2vV@xY$=M>X($;&q%C}%a*iD%?JT5gJ<`sGwCYl(S7CK$X;=;xwm#b|Kw+{+veJBJ zy!IN_TCU=Ulr)J2O#H`d)cTzH$4I*f={k?Jiy`eO&24wUr_Rq!m6Ek=@4Pr|BJG_v z?=-xILUO)p2%j!~h*!5**I;fcFBX@ER6Wq6wsZ_>u5W!>Nn)hkg!B%Nw3{LQeI4_u zxLmm@jby2XMW3Ls^<~RJb!wX7d~tWu$`MM>9(pTm@lXfw={S}$vaiy16C>>|q<`^9 zyBpH0wldXR$r~$kC>eLCN2T=^)pgYwd~1~?-0nFH`~GeyOg}wYbfdHg!XeT~=ch#} zMtZW4ZtzG?Hl$B&W*R$}$0_BhWxai7oalM+QISa0a9nP4e{d|tFORTVUpjp?Kd?C)4Fw7&#{Xcq(Hvc@Nxv#x8KLf3I23kP|T44rSQ3hI{ z479!(XvG<5B^hY_GSK>Gpbf}C8<>GMCKTqcYG&XP}*)fp$g)+L`;%xDJp9THNFE)Z^~)Juc6B+%H$LUsRf0 zwO-)0Rnon6JsdYJPA;G3*a&BmBa~Ct*Fwsl^|(kjuvf%L^M&+Yk2K$q&ez|?KeVrUZ7q}yp@wK>wQDqnv9HERxrwWhyU!!-ZAe>4 z%W56Y3C;|VPG&d_h4QyiYM$xmlF8oZS^0a*S39K>A&P6lC|1kS7)A*aBP|fp`#sVE zL%LBTL(YsK)h=;3X(L1TnBwcb87aB;mep4{S7~YSgSWDSupy1`+89Q;79%Yb(oG&| zp&?B?$}|St9H+Eq62p0AyzV`ZS3l-jEl6Lmoe00I=TkqMG(J)O=3(u18p9ZtBSaec z1yb6^NQ;E@0gtrEkbb3k)?RU|uP@V?HLCBnS_|i{Hj?HMV@q*P)dGgYd9-hdP*VtX zgb-=u#l$fnM%qV6AM{B37}9NzFrU?{l$+8>nszNj=4dHE&sx|n#g)( zvjksOwTD?YJtg2MPcgjB{hWX!Q;f8)kZ$%!`wHp$#G&wDTvERduKdSq74vU>9jlb*$p?qeGDuL)8zj+0)pW-95)-oaC=Sv_5P8|mJb66m;|udQYc-JeOR z&K@a8@fc}|kZ$ovOAKj`<;-nUWq`%F-w+vx`o4^`(8>HR4urQa(p%zL*KEHOTtG<+ zD;+CAw603sB1YOzNFVk{`x(*|o0;Azw+E?Ok5Woi^GNqzHbyy}6kF$cjvV4DY_6-7 zE#>F@8b%^WGdBnuMjKiB_&TM=6C>>}q>p%{{SE0?Yn6t2h2`V>hI*^tClShUq`>y~5tko2z`pi92P> z_N(X0p=v3g+AfubcQITsi&vAvmcs7&qX8n# zI{kek)7TsKs3DdruL<#Qn*GG2q^=LGWE{V4(9zyFQgb`h8rdr9%3IM_Ot~|E+OmY0&yrWlBS}khJ_mF6+&wrd{n(OIRC(x|G)&!#-xV zdbLM{6v!~Zc%+b}OZ{H6PWPxq-8?-lt)@-NGq;o9c9w_nW}kAn_V!iE~HTnx4F6L{2?wqb>ejY zmSkR93LdYoQ_j%hIvpaUPkW?84C%(rMEZ+r)>85&j%aO#^TrryxsXB|Xv+%-{CT=Bf2fSGA|! zZdE9Z7b&K!K_Sn0FMHDu4PCZkrXh9ACDQphn~jkU71C!sQXUh5xZAffjrVWmRk3k) zuENU4e1g(6I@Ps#S&Wo^S}K_vS}l{Kl|opLVK~Iw-M2pH*fG*!Li(&nI?RxoWp#(? z8cM_4e$)qS#V^hK)W$`PFnctwb*9CHJ-wNbhP)YuL!^;~jWhok>1jf`%_BX{kUp`3 zsrng_r4dLJuf6Zz_r+!NOj|JBBzVi)4#WQbXRRNN`?N>INQVpQa~|n%Lz=jQNcUdK zt75yV(l}gUGGCl%Pd%UZW}GTXe(z6h3uD@lxWgpmH#BOPH# z%}=G$+R^ekQ~BibYP+k`Y=IU>t3wGxI#BV|#|)SE7STB7ks8m~yWzE&=Tq8lVx%L5 z^lu*NNJHvZMx@*ORBgOg+xfNJuoqjKYIIDTD~wi~A%|FPhOIAd@#%+1BTbqXr5Ncb zA${H>9VMiBufB)el2e{lo=PJr?lb*q@oLg5gAvTuGS|%FTP>gG)Awx#J~U3D^a6$x zR(g#HY1){TK-a1YU#GNl#YjgB>2{BFwAJYW_b}BR%j0|^nM6vSFGlHf=7C~A+`OH8!z53AJuQ3p$IjhW{hcE z@#*z?%cPX?fZpfl!wzk2x9$FBi?4e@J) z9}l!{jNbwH9f%)}I@g)!IO^OTieD4_aNM~&96ugmcLaV%;)f&89S^}y;CBpu&G0)G zzvlSi*mKtcKOB4RTH<#Cey#AsvFENeekb9_gR|S>$79^u;fJHoT?hPd^ttPVAJ0a{ z@#n59emMTzb;s{y{CeQm6TegN!%0Xu&IaE?z^^xc1^5->SA-vqLU(=f!%^t21iyax z;W%_R06!du?grsE7{5~dPQ?#LqB|Ui?#l5SiXV7ViG; zIrR+V)XtLqFKMhYo;TlP-*+a77uAF8Y1P@HND}2PVc7R<&8>VKi!YgM6w`Qo*tl8O zWVFYImg*SknL_%aN6JIHkk7a^%x#Zp#nIcKSgIMcjfsqJ9=$o2DJ&W9SN<%8;y8|_ z^QS(FoJsxPTnDN^e*3Nijmbb8n}K##2HLm`wDB2eXJ?>I$UvKzfi@`v?VJp>$r)%< zGSH@GpiRp_o1TGInSpk02HK1aw3!)bvog?TXQ0i=K%1L^HZKG1ybQGSGte%`K%1X| zwjcxT!VI*F_Mvedr~=Wb7G6W@J=r^vK3~!; zZ%&M&avsBZr}Db;DPGHO;WdX^4gcYqP}pW^h)a5);aD7B;&QLUu&>5Q#|r5y9_d)C z)8XrwQmNIB^07UjmR@oipZYnTp8DB}>fJo^yxmeI^KT6ix^PAl&KWEn8!IAv5G6>A z^eiEL)gwL2kiJpHR1djNX)6u$uQj~O&nG>3PW*KD1cq&{de>Tp?Np)A_UHF+_KV+g z!-BA3R9(ZT)9jX%YcbMsLb}5v9cM^)OFOMPJxD3!sXWnr+DME4coi2fpP{GOx`tX{ zn1aRMKZPhALrQ5IBONcKuX&{74e4JVVLm-fU)I~Eo!a>YYvu}t%}}DW5#Qoe-N~n$ zY;Mp|F)fa1iiv=-KX%nAdaohn7!V^pTS#B`NY6H;OExgQoF#FpdB**!g@oGLS zUCk?N&rN#EeDY*>@ilJobK^AAX6ivYDcc1{rWol2A$`LmonS~0R-JZU6Q{aHy~uQq zq}n%J2{8UOu6%GU-|}8>rnLw~-dLs9Jx()iSH9x-zTd^yDaXqg=|mxY(<7Z|NXu_z zdYcvosfH^$R=-{1r`}&x5_b7w(*3GWB97ywhw-oB3c1)QrWHo>Y>whF(n&)4mPb0t zkXEf{4r>Bk%k@^CYJJ;p<9B;m4$9x`ymnU4nhM1aEI!cnkY-woHxtED2(QsRo4Q4e z^c*35+ao>4kWO67GJq9kxmxUcRbR`hP3nz=5xuj%1v*3k1t^?TuypLGJZO5A;UIT9QZK9o5aiB(xw!& zE8mrx3{%^r$y3E~&6LhC&!^PGVx&`qbf-r;#gN)~8P55`aX+t=>7|WPHl~YnbI#*a zzo%TB>ub>F+~F9tKc5=jX!b(wFh)96NZ<8Hry9~JYQa^Dm8ZRJb|;0sZMA3o)b|$E zl%2?7dmX$r&QdT-P$)z9w+L9w$SasSYm9W7kiO@UP7~5(z1N9ih-}wZBRehR%Vk4kV}XV3DlW#TY?6O^8q(=Py2~S- zZgslqFHH59z;ng_Tm3S+0Wd$95l@E;UY8dGobRYwHT7AW7zHIpkTx zYjQcyxBiSYq%(x{A0FupLz=ynsg7I|BVBWr!s@Nbc??(CNabrpPi2MeF3#~f?0`50 zk2)Mp18afDE~F_>YtGQ(I-Mz`A9|!S4e1YCn8TX^(xldYY=rS=K81B^sMWjYt4^(C zIqYNn$C62(_10NyWg828SsBN-exyrr-WVgDC8WDO(pf@UwPgo$xZ@FC728!vd(JbB zbqVQ7^<{f%r|{X1mTsEUG!f_InO-9-wgV^hG)|MqhCPQVqqVH>b2b|zoh_svd8D(g zPM^DtZzRHTzmOEeWxfibeLZ=Go+_VQS&hvfH_eJ-vZ7g>j*Uo`X4*CKv*#Q;Mmk4G zKlVuH2x)TtGfWSk;7OrNnDp#JO74ZC2RvvJ-p*gDtKPVG8RP6$i-+ZNA$JF3M}$-< zM;=w2`Nv4-3h5^v>0GPR3nlaIgeOZQv{mgD_jzrJX~Ej49F+4z*C}jsq;O<2N+|7n zE2gCoUZeF&+9P75^Mv$Mk93|PEnLeqb}S51DppwBWb?c9bA0*K>}gxCRZN?^gfgj% z=;9D7eHw3sNTW3iT1jH0=LzX&9_e|8^dB6&gZ3iF5?WpLNQG< zZ5F@fZ51Ym4A=hh)aa4qr|l+2dcKf;?vb8vNMC)3IqbCB(c4Mu^-A0CRuA~pW`Z`# z57HbgR~!=V8S#3JO5;o4GAM^(v}-h)(xMb2y+BC6@JKHZ(&S6eGL06>(^9QckFx&0 zV?LkyHFM(!jk`(pme23w)16oGYW{4NLZz_#vm*>q$Qwp6SryIqY3GWO&KJ@>9_f6m z(`WBxKBd-PD z(gi~LrAN9zNb`!N^Z&FZPRXwcX;!>MTA#N-D4*Sv8MAUGuE~DV`gSfQWx4Ty#W|N0 zt9PsAydk7m*k8rPSgA9~Pn%$j^g<#1$|Jqd>U5FDnRyx)EseY}N>%z}sm6WJxkBMB z`qJt<-p!bK;}yT3u8QMN4)!e}dLYBn@J2q0v{W{7UjrL$lotuXQ17Zfp%*K+HL#L*vFEf#XT;m9`~*9aY^fOJ7%lz9;B=F zj&MfodtdO>;@BuLNp#a`!d@AMgZM&&iwh;1Nip_{80p1A`khC5u_1L+l-vKq+PQ$) zHJ$%|Q#5UrDQO#;wx`onr>Z&#g3u$<2vr6_RB*&C6dgnap+^!i2!;efa7089G9n0q zBU0iXK}D-NF4a_B#ytrB`}_UAJL}!&tkK{9dE|L!+1|DGyFPne-u14_-p7xIKA%R$ z=5$lSGzHCbWIz0~=F+DGwRDhVxrh{fHIR-a>Dxv+R-`r#XjMcxY$Q5_=3~=}Q&*N} z17bT=AM(99=H=34EOF8-y+~m}0_ixCb{Xk7k$y&Rx%JPYOH(H$l`=>29%oYSW(meZ z(!-`9wlI!q1~AmKvd!3Pj3o6XP7N#9tYOyz>3EX9W2EDAWx9pS$Cn^ye)6yC%c})r zu6-|ZWo>p-f++|7)rOf@2x}Wi&mif$MtX)w7foYs9Lc50P9d@GIuAi?Zq-uH!4XSe zX{(%yG`SUc|E%?NlCa!YuC8MY2&5B8`ks+a5b3Z3090uf%Ht0zHg*winLuV(RvYe6sSWv)8k4DY$dxr4Ov<_ zUo6X3)%yis&YPuIkHUBvNZUyIfswWu=~bZcD|vo*!Ol}`Qb)=j(zhM*#chnO?=!xX z>#r@nd4(9o1L;{L{m@9y5^05Ae{RmVLEzGQf22&Ab0=H3ovf{A`SLPVY}TXTTLjXx zN&1nIo-NX%>{C;qv-L{lycy*_Pj_875wW)0;^fvs>e;;{>vgJqcszmh9Fi_K(sM+5 zF=sCo*+goxmcW)Uh~7N)^b>p8981t@yKVvYwu_kvg+kHvF(aI+3Iw8|g%m zjyMl@Xf|zSAuefcp}s!Sn(7LpV0ztoI`8FtCilj>C+hB6Ju0hxc!z=XT#|lbr00rM z^Jw3TbnZvg**N1!l{4$Q%yC~|U&-xGxit3l^}JartM=iu2Ga9L`l*qgC(>5ge6vPr z>eTypTv{#ZrVW-gF6_ee-K6Q3G_!mnJwHc!K1o*?>G>jEiz@;4-3>o$}>%bzf3= z%WtIv`P3^A>YIW|mNTB!(j;GY-ItoPl?(Xyp-kIJ`k9foi}W&*c8%qI%)w@!tew&* z$O|kx%U^boYgN-HBeqJ9rZ_BUu$JIkcinTC{mV!(>jCg?lAeJK4~5s`f9;kzPpBFO2j;k*@h5?(jQn zRjmiGwd%`2$*zu6t+)}AVRs{(JcF^mg@~m)Qu5l9Wos;$p@lM?MAG#48TpmPNh0kr z0r_NoJWXxySMbj4ooe659EH9FSyjDfeHj{5cK??!vr?Eh2GYqSUByTzi}ckBNNv@h zy8T*uvJYY-Uw9|iV{E7WXjLOt>VJ?@bLLB7HXBGUBI&9|dXY%&yKbBFKIwM;h! zMRhr=zooklc$#j~kRT0Gj(nI|HMLXBu>kF^UM$jymopzfkMjP13u8HUT5igL z;Ubo)Jb#N7QASZq=XtXWJ>xko7{ryMb{wA zS*blJ*_$av-QQh{QG2!98Yxyu0_mkBUBgH(RhcI8czo~n*Ca~n?6#gM+l3;~&{+tV)6SLr zIJN`iRbQt5=~bphq*?h(YgkbVq?ePlhml^c+Mo42?%0rdiqy_@u&nL<$r045ve*LG zvSdGf2-olNSqq1`G#t}%@49(X>Ct(y?DrtC&J{?flJpx!I#p$Ar!~DM-#2XJaTLmj zVc{6c2QjSgGcKjdAR4OnvHBKBuOR6+jr0nU7S2aL)x(*abgT8V-PtZ`!NrP*mcN;H zqmy20{v18iZ{Y5#r|xaBBE_0uAia{L-!jrGMQW#Fyx)`QNS`44Dsnu}cCMk6+0%2g zuX?WTB_hR2WgxwZq-z@KRU%zfKNfmwzw1z!TVXVwz;?6#f5-i-wS2Yv0G0HKYxe=J zj>x7(WYw@w%!uszi0p=l?8b;}Rz!AFM0RsTHajBgh{$e<$mT?3 zw?<@hBeL5fvfCrFJ0h}q5!sy)*gWUVR%r6bnT>p=u`32||f%IyUu4SZGi}b>4k(=%F zF$Y^!qrJ8BzWtDfy0Va#VAvGMZRX>jmG|bpja<*J@+cT7`f4DZM$)y7bQ(#kTR)B5 z-nu@p*l5d@fW?z2KOw}*_vem!`GEzH-`Rms9-=*sykX8JP2%cF5{<>_3|96Q79@~f zL(&E#y+&m^b0YF7X&lm%Zw86<+3cl$w#N~{=k5 zPSWof>2#95(eoGSH-Q%JzTV0&0~L3F3VA*_I}MBLeUOIL4thBWXVXKt>%H^LRNgcZ z-xDfs_gs2iZo5AX?fF)_0oU(5LJ2(%n9r(X$4IYLnKsUV zzRF?LDoyf&IA6E*Xx|3aqc|c@q<`MPTG6>C=9isSrUsKFLBC0)Cp%}2F(8o6AnCeB zIzyz(*?)8XhxZHA5?C%-o~cG#5$rex`B#V6QSga#>FXuxby@9WWD2C$k+i3gUMJF7 zw;`XdF)p`V!?oTLuK&`SR^b}BlC((gFZlC{DzADvFVUJ_*7q@92GW@%{jQPD6lss~ zdgyV$}KJMeT6+Gg5emf%GPlu5Y9_sZ4oZK70E> zEMBWdC!eR%u#7qnCF3B3|NlF{yen&`@L2=t%_RMSk=`uQOYX%TL$9{`((5YM1GEoZ zWZSTle`1uiZQ)%r5H1>vFy~S24oPmM+qYu11WB?oot-0{P14>*I$NYu=R)hkc7#lw z6tz#vd4DH+x9tXqw23L%mS4LD*CqDGob?ceZ|~MBla;yH4o-H`7XE!G(+-kOTU{%` z9U?8t=KE(x8#L-<0I&V1C0@1=ovkjHn8vpmrTOwuC7Z1TW7ZK!Zz1V5MtX}#n^?a& zU$So?HBY)5iULc#Q*}_^yXz$}c3FPRg#zgul1?|$IU+ro>v`{A9O#Ps@|yYR*E94+ z5OrlIC^tcx6})S38?JMw8N9_3T|Kq>YUZKbnj^iHq}Lkhts-4We<=MrSEzCCjTR|y zbg`~nma;zVBxb#Ra4GF6y(D8-nPT1;%5*MCXBg>Rk=n24x*E^z0eb4XeDtn}?Zjm{ zhbQ*w>#wsX6Del1f%G<#UT37YiBxMW_CAF4sdwvoFiX?>ERs{w(27_)*HYh>_v5`v zUms@aMT$9gAibTWGmZ3il9qq>7wF4f7p@wdb)gE{u(1HhbY#ik)Hn%T6&c! z)*}MxJd)mEr1M0&8D~55+Cx6(>5<6Z0M}}tauzAag-OB5gVc zIpp?Lw_=`p=3SJ(!UUx(Qr1D0r*Z6@VExl%r55gTPnqq@BqGH+S0J5F(wmKRzLn`2 zq}a}}xE__RaUh>Y7whvs1@dfH#ij8?-Cbw7h!m@DYbUc)Hms-JL(&c-y+@>rId;o3 zT6w8$G6!3uV*jyNwP@CzzQAc|GW&=p^G_pE-w%x4o=l`z6AYyHlJpiMy;r0i6M4rm zb|3QTuWN+%dq%$HS}h~C<20t(iRrU;2Mvvs_?}tME=lG~VWl#V-bd0oMtYw}JGHB_ z8+GexRWH({S+sIitc6HlRA2I5VlGXZH~xKj_|@(MRMY%w_W|yY$QDFo4@6`OBeK6l zWDiDU4@G2)BC>}gvPUAaM4@x^i0s*j?5`2o za}n9ni0t`@>~9g--y^aYBC>x(WG_Z!|E!V0ZdFrR=y6r{xLd8qRn_BqjYr?9v?65c z^eb-R+I&;LdM4YzeqTP4DF-q1mcU=D$JN`0OfD;iUJ*#|C+S=xy7elZ#U8hNIGJ-)zcO7(v)`tsea{{ z?;@AyJ_Gsc9gL;z)z^WWx&F8A>yTf+5Mk@tOhc|k7vj1><2Y9qtA~YHods_>0g{my z7%A*pAYDk(JB)Op%CwWaC(YU?WzNS`Sgkwzh7HDmP^J%(^iCsvP^4X~wdUhUCzjvxn(b6yEb#BDTB$W6jeVy??B-3R z`DLfXy6s~@f9mU~M`2_Nqz{qwE+c(Nq-#vaeez;OVP|~VXSCX9XTJ3uWYkQ2W;^cf zJOrU{Gqz$Q8=`vm)Y7Bc&%R=U@iLGuBI(^mx=5s&&y`z{n@Drss@4OfRXHeB&gS>% zUZo-|*D>Ewb`Wn~0`B0?rcmnC8B)!*29~J3fT0MU@C|f6IDQN8S zR!SwyzHf7a?U_=2**!0>0l&qyB=>0-{6Y*k*GWL-#P-=FXl zO2b&aOP*+TqrNRC-OxD=D@oxUraQPP8~l~WNqWDLJ}%NJ)1a@~9<*BT;)vLBJmuc1 zD<78fV70{EnZ~z7QM24hkc|bp*N55fL%?SZq)(7^fssBT(zmWfK04cHTD5P_QtN0X zg`W{JAGO~$c?)VG-rrJ7S341x*gd04JhM_y=189;=>takq)7W+2bT78NkmP#cYCxR zJvhYL2{5)0`*ne18S6-MXWd07pQU?J`1heq7n5|MkuDbL(yNe9MYSwVn=@yYh_&DP zd^o0eUWAmkSG@u6k_Pp9U#2<6B)uz9nP%s#G3yAVPm%O5M*5UUn`jLOPjvYV2Ni_7i>c zv)Tdq(n}fJh_Fb%vH}mgxY|>YTrv+~vqm zK>7?x7a8d@D$^cwa7UL|NNV3+W-Uk7SCtRL!Iv{PTIB5HRhnP=J!{C*r(#Hn_X(Mc zjSJbYE?_nrNS`I?!$$h7NSn{1K9mvuAyi$fohr|ME>^9NeWs)}B=taF`vsTYbLrYb zrpam_bL>F+SCT$rq<1J-?d^50vyHzHa{q-A?HS4s{NpW%t!ln7ENHOz zf|`RQI|rMfBt)vG*~4ldGyg#P97!KF(&t3_?A_2eaz@Zv9))ZD4w2?d9kQ6pL8V+m znuaS8wv1_$=D)8c}_V})r#t1b0fuiL?B&C(#MQ+sYsVjM?TA0c6wTy<4cn) z|29aYSPMA{mD(xam7&HZJxwDeB9f$jj8beiMq!mCkUme+$Bp!Pk)C%Wv=%O*Zfdo2 z)AZPjBPkygVs*Yk->1>(tz=)uYK|hVzLfZ0E<6wt~E$dLv^qUop+kzIC1?yjSVFE7R=#Dy%34(!Z1RNhAHc zNY|VNef>Euip9Q(T!38jPFs~$p30y7{e_E>##&2#nKmL;I&*%u=}8cqkz$=IkiJ0D z#YXyqNawSi7AHEb@{QO|tE&C}E>`)lO#5CyIp;AsucRO48vT`CR@gIU{YpMRR^I~Y zKS=tNk^V!ZGp9o9P){naNMp;M%u}J|LrEjTWgLkUd9U?0$xD1okRFj{UxLM&U?6>w zq)UwSMUhTpnU;JzRsUhj(l_e->K`>)OYFhgPmU&g6GKv1o0attS9f7{nhqDblHzA%_l?j`XSLsuXr+{@Vo#vyVkcI?twD?+nO)l7>E%7u;R-WvZ0$`o7BF z2k14(7EN%yLn{&L*@sci{zYABkZQDdh}zCUtgXOo>NIF<^|ry= zUTIL6`32||f%GMkK5L{eiL`hRB^7VSMFK@%H1=3eZy3|Nt6=@4=f8gYhkG;h}OW%1S zrPk*L+@dyD3l z_JvbP6f4iB5qI?(htN)y*%+PXm#ru$rS6K9DN|cL(tnfm??(D>k*?sprHeCV zD>ZACq&SFS5uwE@XITcGW3gY5_guN&l@g@?>NH4CR{Iz)1L-o7zF?%wMB0yKslbJ%bH0k2Zii2?VMlR36f15oq4WK;_ZOfll6W07J>A2lD=r9uZwiU8Dw#*mWljo zmCrn_g?Ry-#e#O{b%$~w$4Ww_8 z^kpM`OQgN;#~tg;3|dPZmsE~@SiiaN(~wuE|6jircj=e5?L-q}ZI`PUbo#F%rL~aW zrCCtAw=B#5c8>IIlD=Z3Z;SNJdARSb=}zkiUeosIbh<16b!EFG$0AMZ6$rI5@7D~> z&UsSr6Y^Gy3QBgL#EkiJ9Ge;MgJA{}uS^7P+;w_n`QxGamMl?&ydun~6^ zjz?%?l)Mr>hqyeE1#&%E=k)5eVFD}nb*lYsp%M6*e3cWcRc`k z%he%P?}~J_rjqiK=OO=;eR5toqO;)A_rlf@#oSpu_3@wnpN78>A z>3b^EQLO#>?IEAy?!0EpvJ(ux#i?BA6Skj?ly;gy<*r!y*-T?}_2nx`wsL`aV<3H> zq|1!-eUbLy*xf!VkXmgrPy7B_WQ0L_J7c>U@AY1ZZ z(p==TL4~(p{%gvVG8ys1E$Nq*AWu&B_#W>_GY$zYc+!e<1yc zr2jS2k3>42vy-`;Ws20!A8Z1a(rAP^udfFsD#12fYuCuzQ(KX1Myzzkz8S^X?36v$ zBLeAilD=W2%SHM!$C-rwv}x5$lr3H-82oI`EH*vR(j?@j=g6(E%44;%O9}8V9%ep2 zR!IWs$0U8zNIw?oES6?JmX7pU-HBxcSQ0;`Gf$lnXjh5vz%*Kw6;Trtq_j5xJ*izwPfC#f^VgCv z%=W6Wq7+C!CF$En`YB0^H!g*a{__wrb)u7X<-H+UV;aKBaUoWIlGX&acm#6ot?T5K zG_Zq(s?7j`7a8E z;PkBgDiqcP1L@}^eb-1o7wPBIpl>jH zvGTF67&buO#o0-&?<*hn?viZ&AQElMP_gp)y*;&3PEwu9#caq1R{L0~45VL>^gSc} zLZpl4B8TZyLO!M8yzYr`@K|1J^-mNE*~&)It1TVDG(#9Fw!rKE3n{GBSGf<6K4RTI z0Dkwoc5h(Si0o?-*=iBl>Jb@!N4z!<{H}Pd48Jp8E5q-O*UIoa|_1bjnMebccBE#>p*WTMZBKu)PhTn0oy%)dh?q%2qK>G_lE=il-+R6LYM%3jmn&OXBaVq=(k^GM2zAvS$@^l#exwuz8;mKf_tWcJqFJgYm~ka;lZ6@hdW zl73*MtBCY$dNA|76&uE!Y3c1tkbeC{q_oDp&O%B%M<~C?#pZquGoen!D%4n!`32~! zfpk@perTktigfJN(9v2BnsTRnWTE8s`+QiYFHGiL@*2Ezt^V_!f~+wdMtfn0usReSJ^y3WpAz^(<- z)kwPBNLM3i_1~{T>*4f8jFc-`8cD0O5o=#Om+odt;L}u(UX1HknO;7*G_=#>nW@o+ zEi^a(X~11->D52l7zS$_NLMH6$40uk%5(|Wo)%rqyU9{Gl-DeU!pXQU?;c`pgy;OP znRk^BWUTib)w@Kb=kwQIl8v?)0|Mz9B>lul*Ra~>+S*cjDk_m=aNw#QkLz5^RX$rl zuJcQYo}+)bD^cw$rG+k5619!2_AxRA(yx>BQzQMlNVN{sLQlm=Ngy(fCyP&~lkbb=A>tfA%L6VLdDpPnof%ID> zJ=#dWCDJu%V{C_%q~=#k-w5Ww)v#QN{08!7j;4uxf6vm)yQnR@t6q|%8qyJ0r0~N6 z>6#=x#z@x`X-`_c#p)X({R6eK)@+}$K4-Q;JH@0P=-0MfsTrwBNT(;r(ufq^VIciB zN&jS|-zI7G{w3hrrb;^Mm@)y^+Sh%N^{ex?mM5Q}z)^O|9Hd;t*_NGU5{3Gt?6M@X zu)6lt2U?lJXAPulk+juF*HW3znuXjnQx=Q$jb4PXoc+h1Lv_b?+IazD?Ky0` zNb|$FM1gL_eqj9ZYQh1QlxUm-yU9Cq_O^c~2`-%&`OM_eeV0NWZ5tol}86o$)bE z8aru?I{(Dn{7A`syf0O?E?PCM&}QXGJ&LuElKw{8D@WRkq$e9`FOhCB z4|kO5ze#IZ?T-DYojs~_u**l|JFTZ?;QDPS^HWGs+=uDCRr9?|a@pLhM`4vDl<9gT zJ;g}Z6RE6sqR~cAyM5p?|5&4tl|`yC(VL%ogVgpaG_om;p2nx|6?E2=vT7e|H-U70 zl8!Ob^+{UY;e}L3dHY2{lTL^Cr#*e+Qph{o6pK(R+8rn1`kvbnYLqLCQJN%`=yw9Q zo<<2vF!v=djic-b=~}Kxv7!`6e?Zbxjr0d9)0c06zA+@Sr`?M=un*`PMZRV&4fEG3 zfvv~-86U^moDCJ7FXgNah!pEwfwVVCPczcqB3+g3v)D^je!1=1gq^v_26Ly_KbA9G{LDj)qKk@g{G zk~H@#$|}v>ao0M0zOIu=&GOr+L!PmG zO!EN-kjUkrw$XeMn&myu7BC?-HWK9v-FCwxHBeGvcWE(|fzlz8vu;ku^tTn?z)rMr4~sWPKyD z%_FicBC;(bvVIZSRuS3O5!p5oS^tP^+lXwti0n5tGVBAO{e>P^V2>MXJ+8nWSN{HD z^qPa_hCbDDCa$aW={ne_^cx}8@72rcJKRZMa>PWYA09Mx(HpLECa$}3=N#1UG=}YM z_7=S&kp6_Ep7bDN5nBn0c!X3i3ea)yTNGuH{J<5>VDL{9Z zKL=&$HJ(Vn53@3bT??drNIJnt`-t=@dfM}+2A0ZjUUO!!l%BTE)L5RXHTvGiaQw5@ zLW$DYo`+}m{;NpEo~>NK+6K~}k@QR>{TWHitxte!VMib>%fF-U<_hGc!$WL3W~Gwi z(Fn(Ip0$`Qq@gvW(cWC{yN+&zvnN*D&sHrl1_aU#NZMwk8>mbh=xaT8mCNTaUbD~0 zE3^{>DvMr>-4@{*(-Btb%a-?|oM~*{vU8B+et$rE)ZVkVnK3d2(w~#`EF=B7NJpOz zedgIo$3`IsTU+zJSZP>y)gzgby(@Q?w!Wv+l2~a1c`8FftetzIo@9vG zQ;gz)^cN&O$4GynGQE;5Q9Gpe%<3B~7h4J5)a64Km7u+^D=*S}f+|zhuhK`nLh8)k zuYzw8NH-+uL?hi$q=RPRjvki<7JH|PZJ=4@;@9|<^8lo;PGTrhZ!uNZUeXo@sxAoU|(=Wxn>o+4$-ZITsMi8lugNu#cvgcc*xPO~zF9~MYA zBI$WXx)Djs^B;gd{g#O|RSsqjWYH_a=sYiD; zx@$=kyOXt3c!z=XS0p{(NPnd={o;1$nD6JVHn)Skaujpeg`sj#8)QD8Yd*o%joerE z*c&zfv2v{Q9Bln7+gF9p8b~)LX}ghbEYb-bpm=p^V6h!t)|c#QCP{T=r|j8tU!9D* ziYmb!f(GrmTd&vi)mtgG+-&X&PdbqPnxq#P>90ll=3L}3a7xI>-m#$WLL22nL#&onqDzNH-zrBqQBKq*vaI zJBD!$!ZfKiX$?i1v{0*ZU?~4-1n(+vq{_}crun4}Lh0RI-nKeDD_4Rs7Yd}Cl610> zZYt7Oo`=3e76z@$)I(U~H&-BUJ}t!RWO4!ieEE|5A^(tVK&OZGtR1w%Rn804T61SA zL@MuUxRohpXn}Myl3rw_n~}6U^u@(RS&KWLDigsm%GRnoYRd1D~$OVW#tw6DtaLDqh8QqYv{AFt$UJr38^ zJ%c1^}YlZ6jS&zbOHjr*k(o2kVbCDi38#(K3Kr6Kp zSvW4WaO}$ML?(>g6=6Rjp(@R`e+3pG+A-3n>RZD&|svge`=%h^+3zFtpuCKxmSK)NMKFE!FFMf&2M zpg5U5$I4WFpXJh}G9Bhf*%OLvA$>VUwT?w>b&rt7YQJxgBn5YEq?BxL?G)<~fwUh< zFEi49B3(^wtu1J>zQOvE*B4nGWq;_T7jAReErSMI1NL;?m1*{67_5>6(yd5(xsh%q z(w#YrZfg(uSc$Oq7nLE;?eD2XRO0IO>TkuM!QOCG8&G;rEs1(mMvAqYK)N+aryA+j zBK_Xg$f5mMmyc?VrC>W2vVF?ILZok&S1VFKMv2jr=I%|I@DE|OUxgK=K)MY{uQ1YW zL^^UI@*GU-t-FibP2<{l+l7d=@54wp`;uz>in)l@Z!DVs%`|#jz_;A|xyqC&^K`bd zc8YbbK-!6rkW@J?B)ry%L({;g%&wv5ORhCW zVNEcQZb#CJk!~l_?{XY1u$E1q%9N#0J%)^&`{#0F+bFS(+o2FASwUPctq@7%`dB*qsy{Uu!s;i7^Tg`*6?7ZH_koRNl7Y<{Z0SNUpX4QTZ zBpT%vn+x&I+E=*`P)wh=b{}B-h-^SawnIcVFe3YHL^dcQ+c6>=9Fgr5k?kCj{VpQg zB_jKMM7C>0wp&Ej5|Qm5k?j$Y?HQ2`iOBYf$o7uN_KC=bMr8X&WPgar_KV1dMP&O& zWCuiK2iC~24}kU;dR&n`ZkqMDB70n=Zzuc3L!oz!o`h?i``m@SzdAO=YMqZ?;7m?< z1oA-@#+Faz-)kbdQxV(1ltbbFFsW2D>5HgwU7`7=oN<&p%NN@UEP zwxe~E@34f7^1J+bt3)HOMgxuin}+Ae*@o<)`M+RnmR{Q>p+ARdD;V9K4j5O%0&4+EsXW!oLa~Z{w{x=keZS{Mha^i zNPkPx>x}fbA}wm1J=tken_}IWzeMU>iEw<<-iqzT^l=(kUY4FumiC=crY1?r(xp8k z#TXDs2a$B9kq#2+imRZbd`fUO0OTN$4dpzo0o>AACUx1M* zknTv*>y30rkxrS3JlCAe{B`%fyr!RO=V*3wu`Fw?sEnXDVddV}rP++vqEo-}C9Yf~ z&(;DlUIx;^B)!2%2a9yt1JK%jQ^-g2d$q)VXG3o5rOJV2T09W)Cph!bS4^r0I}P+{ z65nR%o8{UA=W$7P-U_35Al-?iHyY_qB5h=^SlSlyNz^xFX+~1+dyC3~C0MzDu_9v2 z&9!A|@Fl2gA7(uYzC|G2nWVFfbZ3zs#9fuvYXhmhbx*%<=vc}R2(enh)f{m+@2Z}O zSX=8Ph3#)`;_h-QF!nTR8{1fqg2xj`e@D`rjP!RRz2!;hyPhl8(oq@390nj9%5lNg zdq|-@GOeDCx(jJ~us4>E<6TTsrM1ni2>N#FY9-0+Dg3ZNx(i8fHqu>4+IigT$l=FJ zLOv5YBh?!qZ_I(blRZakCe0+OqMa6(JcZcx<{|WN6RnsGiGAaQYcK8YIm}|w+NSe3 zS$=qjf%Nwzoo%GQSDE%@J6$#ox~*O`_h9K152l>!X%?#zp&ja@5+A`denwbtr6Tr} zcV$)zK5HP|m82a;x~oX_^|Fe_CDPehUJ{i`)F-Q>SmoIWxz>T~TM%s5_B86(YKgi_ z&u1D^Cj3K~tp~u94y3!0^cExCjii;`)=hsGXz21J4ejn{9{|N+DC^>?^a`d{AyEt6 zW-hMzb;Zg*-bb4KktSJuG1D;r*|*{PGFs}=a9rp17`bj#ITG^MuCv;Qe;-I&NIJ(z zTU4fpbl{Fwmrq&!p$YP?;}P0^J}FY-RHD7n5ggxiI>4_P*x3b+9hSZq^w_o6ldT6} z))7c|C+V$5y1Pi*)N}o~&owFapW+_O!P^_<(*yF#F^pARd+W)k%#HO-A0f@&S;Jf? zknTa!xkkE&NIRz>x26fqQxt9&wR8~Wb)#w02>FOILR$;;q+2*`(y6D>wQsYTe~KAe zAl;Lsw;Ac4B0cwZXw_*Id*;I-sSZJ??^pTv(X6DJ5qnexp>{Mi`bvY++dG=#s<$3| zvUG)1RtodRKstn^w;SmYkxqFKxgC28LgmwS03uDC*G@Alg*kR0-J7KIjC6029yJvd1(k~^G)6NYy;)novnEp8*;4=U)?Su0 zM_2c(*>k8&G4l_k`;hcbBi%=&9XCVAR5v?G_M}$k)_fAL-Kb^zs+{pHz5=oG0R5=} zJC~iaOw^;2@L{%QjrE8?I+Ub$8R<}Kr}TsxeC_+XmK_*Smro-kwo<5iZ*Xb+wdbn8 z&a4zxNdoDiO(6XPN#`5sA4J;kB4{c(4<#FIAlDh6+;5#LH}<-QF{BVtGp~(B z*G`hP%2cQIeWlEL6jqc1>3$@=$4K`hY2oqzr25L&(tneVE{?3)8~u#dw#z@qVB}A~ zx%kazaedSc2n&BgC=L1&o_(cDM2Ce~rO|tX?I)U*!a7$V9Y)f7jdYmGbl7a@7<^&S zr2Pi1C}{3)_ECANbm$q+x)OI)Me*C9A)CtviT&=8G+4;ktVdz>Es*X{())~bf05cQ z?pUX_AFpX+Y>g`C^`#o^tNSC)M#|2EnV#+1msf7wudjXCuxvENnqVM3fTUF;JwT+r z?m#}33UlMrS{boN&n#0eyTw>rVHyPauJ8<##Ul~scHh);y~o-}J<{OAW~+UyR0h%m zNqWDL9w^e|*nemF+CP9==|9<7fB|*+^oK<6;+N&cxRK4y0Qypv#qf+O<))PMtK0`D zrB7VD4{%UKHasFbI3hbFB0Dr9J1inQJR%zrksT3{9T}1RF(NxEB0D-FJ0>FgQ$*Gp zksTY69T$-uACZlW$WDmJMnz;NMr5NSvXdgRlOwWIBC;_N*{KoPX%X365K>G_l zuEZXD2S7d=-j4TVI7;3#5mT^g$y%M5M3HL2hmIxTLknn$_C}#WG_3 zS8X(gihb$Th+TXf)3_OLQh>zI5pyGNj1<;3kRD3Xhm7=4ktSoQRWp0(XkyMR1v~Ah zUZhxsWGV2Zm7PTG#k&++U)S}LETwuB#(+S27)ciy>0ws;GmygzY;jhmLzpM)t~wIe z6^*Bv?o^`lEkjxRHrw%ID|@4P5W1^A6nnPDf{`hZ9!}DSjr4Glj${okn?O41tEl$b z?(98GKhIJQjYx05#5IifvXALmwP%?7?h(@~HWy|d493eqI)bE+80iR+?#Fi8e@Y-V zYsk51bu{GV!$Yi{OygW-tqSC&qZqqoNMnqeuUWl^SR<7@BgH5lNRJ@tqegm!NI&a< zjtXtKbl8lg8S>WC5#~HTXiT)D+v_sM?!)l+2&KV%EngGf4oHK-Y`+S=MIb$rq>mZt zks@8^dgRdQNX_ab%>Q_XEeLbx{MZtgpGUbyry{SFKi8>^S`sVSBs@*liqxav@dVO8 zlJs#S{i8^K@gQ>O>2`q{MnR%J)AIscSJiTvr|nzs3;Eu+Ak=SR+e#(Vbg~Cpd#9wT z(Sg_Y1oV%~EjF6M4-2G6k@N{8JxZj_TqE_rZI|l_Snp2~*9I*g_Vh*PBDSb8P5oUg z+w(5ZRX^^lOtZNwyu(0xG)bQ{(xa{RIrE%yanNmVO*7|?v5?oV1giu~-b(EhG}!lS zyxppAr;=o&DSXyIdJIVy8|g73UBML{`)x{Jdo}FHXe;-I&NxH;HTS?maqh%nS^c+HI?ZuKRv(Ie9J~MD?h}Cac^Xg^VNiL|}TN?|S(NRK1wGe&xx zNT;(z^hJBqIzU{^pCxN=R5WX|nvNF$#qcWS&q4I4^Nf~VA7d=AS+*I7Ho3@wlz zPts?N^mviJ@FetIa(mF)%=JI5^}a!GuzX60wKIS8VtU;P`N#_q>dS$ms2s-h@~728 zn}Y_UR+(n|s+czh(vc+ntC5Zr=@CnyW7J%ysm$wP2zy_SuL2Kd9)GZx@dCgiY ztN(7{VwI+mk}(ViF{GDhPos9KdRO}H+G%1v3N!yedLl`mH_{VD`V2>>X4N>gn&%`I z`Fr)GEVT+t+)jD;5tnwO+cT>7J3L*^;9Aywm8j{`kjID z($1-`ea%{qn!;F)`?(W${UJ|&&rn=q*R?{Gc=jD&tda!MlSuk^BRxr^BkzO0Pn+G#dMVeKZ6o=nmgjPzuZR&IG2 zIXwPo$VcB`x01aH^5Xaqn;eGg0?Yji-qokVG{=WDntR*Zj_hgKsmCO}*XoA8MEb1* zS$?c21=3SU`VS*Lg{0+k7a)hJv;fj!J3_RE_8k^yfoz?eeo}!xLvaE$=!}?AD18xf zll<0QgUKvI>S2l$>s*0!3`t)!(lH|Kcpf^=WgC#zUd&nJ{*tQ^Th&;g91ek`R6_XL zLWFbJa?Dp`n#$3T7Y;%w-z4I*G$FP;)JU=V7D!Je=|7G1RFanNc|X0QH11_;Wj?2| zHaltUFSr}>SEn(Sy<*DQxaNDI)l2EuJj(H{m7~9&btdOmr89XKdrq#UC)B_>W8q9A z#hPFsJ&mNDMtT}alNWEqeect%DxdNmA%}FACXMa%UXl9jV90gGr>wGL8JPyQ!Q5D1 z-}l+aQj4M5$4X@&{WD2lGSWYbbU0gR$3)VxOzoQkwAC%6Ag^DS(yF9=U6=lwBqGhe zTorV7>svRZq+jJeKskNl+I@i2BeJm(*|>;od_;CeL^dHJJ2N6{i^$H3$j*+)&WXq- zMr7wkWamX>=SO7i5!nS1*@Y3=q=;;CM0Qa`c5y^@Nkld!BD*vqyDTERJR+MKkzEmy zT^W&GRU^Yb0NP*Zab@nu+H83$g~KV=$rj}!drSYrevd^y z)doR>&A2xSlBCgHOOHI-tW04+0_ixC{>wcNLt)@Df0Y?=WeXejD{}}0+D$^;KLSKvb z`v$ul4#ahCW%8)=(JyXb4RP6@iRSrsI$ ztbO}>f^wtnk(C;%HH-auuj}bng1+U-V)@ppK2|VNjN*axERz1$NY4_fdVTTOKx%eg zT6d+~TXicP$cx7_mh*$mze-ZM?E_d!N<5>NXDh+*EduG;Bz?n3&lc%VZbNSUuRxgo zL#UODjUln!A?qQGRi12RyG%nGo@39AV^*e{BGz;|Yikne+1kn!9#0@Whoo;B={X`D z$@%A8T2<4bF-mQXKDMnx={Z<}nvFD_PZqXi@4worOQR#L@B6Y0*_UD9hXvA!Bz?qt zNY54NX!fPn2|;(2D-oK>*@>oNh&3C-oEM)$`R^F|{A$-5y~M}7QRfYdM@wkqy_Nr&lT7|ZJ$G9?Et4i zq#v;SY^SLtcjBls~LB?{)k!@ zMKiC(C`o-NJ=xw0{QE%KPSSUcv|XeF+o4roFt>a*40+m_4)04TPqxaAF-)me>Dy@` zXfU1Kk!I}_vyMP|0ZHF8(hEe|z;a1<4px?kpQ%>a_q$uiEprZT)>GvuB6%nZB~b}_ zUXxhuV=fd(FC^*vMtY%07t8`<-wOh%t(LIw+qeE&Ladb$Yj(}4kXIGk7}8h^^%lTW z8!yvmwT~HEAe}_g4~%q@NY9#!J0{asi9)L@+CAxF{bu89stfGof$Ii-J~LGhw^yJPvYui$XalWRL1- z=Ur+cvP_EYOSvDHSVMZsd}y_g*=!)ah@>AG=|v)aVm`F?paqbQ&ci}JgU91KT?b1; z%YkJfkM6DODL)>e`P?EMOnH;LtDaP4n$4py#}1?ylXSU}UM$iTH$z{88%?wQ9LQDs ziB_gWkuZObV`fQJrp`Xd6UgmYc*|gVQnDmnftNkS%s-G`Leh_o^b(OicPny!<`U*l z9d@E;6G$qWUuo1*4k`=IM@t+Rbe6^XmC~?n*cl5WyY@BS$7#^BDjaNOidB+8 zdMQaiHPTB(+Bpq63L?_eYF6AE@>Y(E_MIQaDhHPMkjc#dHw-mTRGJ=?(2`j>M#?lv z^{4GywU4!%KzbQTR~YGKBE5JTw04xKoB7y#3hcklvh6HE%hQ#}E*$aA6WBgzNLc&k z`+0U<`!E}$u%Z-5FDL0|MtZqO_n3|xW~p?j!&)5u{0@=s>?o8^KS;Emp}NkUooi%z zwN|C?E^M|k#X46Yol4TrjdUtWD}|S!^@WG2oBFC;!;$Z&lQ#Yoi`G`ObNZ`CaMv4C z5LWa|)X;D;B(|bVt17EzwIb^NOmno6V)ZSMUP00?jPweX=>|{WjwN#unkM#l&65k9 zwJaXxV%g#}YF%>&==cm5%QIO}(sgP7Yh<%BIEjrmTXs~&zi1d822D(<5 z@qV@Y0G0HKYxe=Jj>x7(WYw@w%!uszi0p=l?8b;}Rz!AFM0RsT zHajBgh{$e<$mT?3w?<@hBeL5fvfCrFJ0h}q5!sy)*3 z*=T>E$5q(lR<#~iQIBiq>VrQmWqq1G%g%*t<$9Am4|xZgWpBgSzAnv{y!L)UeUDSW z%f1eQUJ*#ICh6CV^lFkW{@J^!*7BW8Lq2-*SMT3$emmqN+>Alz2Fia*<;7$Fj(cCK zB2BZXnSaOWkhF|JsQGx}y)~wh#V(y}Rt$YLkWM4%YDPMZq~)#!(02&OTv!!sv3oJ`VMw7_iW}_`ENFcq2q^le0HLCsIvyt1v zNeHFG=V_yaqp&rWBGM1ky2b&#*Uw%wPxtngZOItLtJrK#0J|1Qr;~IIBb_eNji(`> zUS~5m>adw7Tb5>rxi3B`pG}dz$9V{C4x!enSk_05OY-^g9dv)#M61(YI3H}-mt+a9!Rez>9>sZdXegPzZyold^QQ!X0hlkXLXlq zO#dN`eThjnUsgvHzI-K72^ym`FwEW%hi?%`Zy@QKMtXxt_r3;swvI=b{!2si3dxd; zq?|TMu@>$Cx!!iMb3ZlFL-e~QVGl0q;ohIkMSBFqe z|2>xjYjd$$cR!}_m@4XY;OgASRkE6(zT3qmPk7r$B@6T(twb5l< z=f0=Fvd}JteYI$NrWqJCXx5n9wW?=VnP$7{@L2=t%_MCw(wjxP6MYcPKlS|fJyq&% zKMnbJ%2uho*mE?`n#b{?dL&7;Z^1M+vO%+^=oNe9x|B>j$&&K9Xo#M?T# z?k*r_^=@0m&^YdMU~eh5GNszJ_dy0w?k$tQ_Ik21g?}GNJ4m{Yk#>l*Fb-O+9Hqma zAM&z%lX_D2pX$*hQag3FO{1B$Q0eT>N+pTLeat!n=`AE(*GO*>Y14%yIz3G}HvJoy z{^5KBP7YvC9=qMxN5&2<_CB$zi2XY3gkg^fyEoVu!Hxsg^07*e^=GW?V$Bq*kyz)$ z3L4g?uL6s%NW4FI!i`1@C!0 zJSpZ=m_K2@g!vKXLzw?yzJvJ<<};YTV7`L+3Faf1e^k@I`_sP#>E8qC-@^3oFX`Wd z>EA=?-=g&I;q>p3^zYI1@3Hjn@$~PB^zX^^Z*ltfRQk6h{d+q7dnWyRHvRi+`uAM= zw>15GKK=V!`uF$r?}ha5AL-wV>EA!ozs~gUrS$LR^zW7Q@7470we;_^FTVKV-|2ss zrGNiP|6Wi3{+s^2k^a4z{=Jp{y`BDbrGM|FfA6M$@1=k5r+*)$e;=lQAEkfG)4z|? zzfaP?Pt(5@>ECDR-{4ldT z-X_v_>Epj~F||@hvBYbRQj4`#s@hZz%9-|lYCBTe+*PxDrBS_mPq5zhOHVeFf=vme zx0AG&k={U($7_y{&6=6W#*2cbQ{5{~Q$BDZQg)0+==ari9w@ip zQa^9ljCT#S+K1%}q<4^XJtMt?q@|tT#vMO<2BGS%AKU4)>rzR%h3!P=is{Fym9?b%aQD>dMl*Dx{(I+U^tT)GRa6`p9ASUlCE#0^HlrO*&mw5A~$1E zD`V{xMo``_#M=C103|mG1>fK3H*PyXnOi$+ZV-yLbcaro6MtY}62XH2} zbW+e-=9;t3MOCxTQ?eZB9Soj|yKEo6Z_r?Gxb|=oV^2Wpsk5~SjCFzZE|T^((z`@D z;!)^3up?-#9M9__LcK*(IwZu}TNb-Qa>+b|?dKx2FBY)WJ&Z4nnN8Eaj=N7vwFPpY&mxW`>F_@YfMn|u|%-OM?pmK1auo>P?kPJN?VeuHoI!mVcm;7zh z>Fude5q-{9+57+0C(7U!l%tvZkWI7-TTQZ5td+s%2XceW=yZx z`W}_ISf$BAk-`THr1z4vV5Ik2?Q>76lci(N&o-!bU&Kmj?)O104SnemY&kX~^gYU7 zi>Ti6v;Cwal}OJvUv8O=GpsW{fNy?V3)J#h_*M zyVVKXM(zZF@B3M4q6|R#RlW}bzqocE=>CXoK|}^Wy7pf9)wMGC*|jqG-L*3K;k7dO z<+U>S>9sQW?X@!a@wGDe^|dni`L#0m{k1a818QZM7u3oyPpFk)-cT#UJfc>Hc}1-Z z^Nd;<<{h;%%tLBrn3vSbFi)wKVct?J!#t)|hIvh`4D*~?8Rk8;GR%X#4C|I?f1$@! z+2b0m$5qwiUgP>h%LMi^_61v0QI9*8@_r%K#!AjlUYJ7pE)4s-G#Y39Xxr#w)#DVK z*#`8AKzct(e`=)ni*(F%=+IXI)ceh%)6$pa57t{H_I`aM-t03igxQZK=**pbthZv~ z&BieF)j+y{qv0Qm8su(^gY2mm5+S~h(!8jl|sqosS%#D#%VJtr@xy! zZ?~h;ySwC%iPS>I_BB$B0fF>Ek~SIXgCgxuFH7gUL|SYK`RLR|Q7zZ!!<>6eWJ>jV z@8x)JMt9ZsD7A;3jT9qOAbp6WzcA8=L^_nSm%-jj4QBq-q*aXEJHE<+bj!vurP6!* zK>x;Cf;}Ho`e)U3w!V(>GLSAJ>4rwSNTlO0gN|NjI89pnVJX;~?J70t7Aebg@mSnt zzP~F|+nM)$th+MJNHK~B(uYa9dI ze{H0Xi*)G>=;%4wX;RJuA+d4a*KALwY(}V7Y-fOdsc}^+ciPhRH!E4SjcnY9&l*Ud zAZfFaJ|WWi(~)O^WhWh)dCF(9-_7vehsuKMP%|}q(e8?Wnnpg2N>e51+pHwgleJTL z(t-3zl5S$8Pl{Auw6^bNNXOpHNA<-XW$*h~o~gz}cBp|Z)K+=@*eS-|)Z^~TN)sBg zYpZ?u_knaVNjEjp#Uj1we&`!^Q_xx-&1$;$Nr%sK+;QzYHYNS_kvGTNt3?@Q4FnJ+bhjJ^#jPo-&PtZJWQft3_{W9}=~ z^`utTR;HK>1=1xX?Q5hAyzD!cNZ^(yrdrJ+OqA) z89VQ-U$uAQQJH4`DQ2^Q^jVT_X{67Jbo&L+F~aqzPPNS=A+Mf^(9QuU z2kulQ96|e55WARZ?D?3c#Ct2w@+Cu%(&|jlsyf@n+9~GPf%LB=?PsKa73oIIZLsQ* z`PdEwYp|+u-}hqivW$j~WB%$8d>w=&Y_MEd>> z$SwDcO+7!KxnmSrG~1AFSNn%>9nt24+cTxo&}YcKQQ2KP&DN~39uY{Fl5}e$T`JP@ zROI02`?e=S-I|x=c1aqMUT5w~6G*2LS1%H&db-A4NxTh{MC=8teXNoM(&tIKjgdYt z(!P_CTgS=FlRB)241mP!(}p3|Rwn2t*)MW%bjr;OxObI%FRS1*h?G4lT`!a`g|(YN z`ZtpHH`2d}bi%#RG3&aZ$yWW@%34o?yi*oaImoKhb2{L9#5RvX=vOUM{}>WkShW`a ztSU{(v%ZfNr9k?3l5T6He;4VV3!wFl83@%MZ0Cpd)ylQr+&781o{>DiEp)&nj1v>Qm*(y`p0hYca zm;-k&ES6=VRkp748M_lh*(%-DT?s1IhgpxpnqVM(k)%Z!nNcwVJe z_HrcMD-jvax76PIuZRq1U~1FhJWQ<&=VNMRI4@Hx!}*z78P3zx%HD{`aNedi9nRm> z%5Wa1R)+IAwKAO7sg>dUPOS{*d1__vM`SqfQ=1Owe`;kPMPxW1RGaSOhz#e4YSZC7 zQLSu6MD|%khVw_Y_u@Q~mth|O?JxAWPWHF~*5f+W<2t6Hzce^sOCykW&I^aJH~HC~ z`U~x6^F+kz?2LYy&-$!JFIsHtaZS{tdljn3Wuxs&IntL%x`UCvB+??iWqZp~I@Ggy zU2Y-E4t4p^YtgStnf>xMR^zGXqD?evPny^mhQ1og^ktF`G}4zvy4nSx=qx*yfxMOv z`UhTn3Y7&ttI9~m>d7cE7Nu9p9B-25mE+AwVL<}vDXYFa4Tv@PRSFV8EP7ZtD!FrUt%l9$gez&w9g^?+c z{+pyb8R@@8+MlZr#nDcyW+QxZTUp)4#kvw1Dqm|bWBFwEG}7RS{IxV>dNe1%co|5S zk#uJxT_)1A=OUl+^kbBdtwPcxG2e90T2jpb*0~z;juRL=B&4xJge?ZN$)*U^68-TjlhN zRAF|84IWP*{Vz#>Z>0Yf>AURp%iOwERW^w%4Q1qz+jSNx`~GO&Wp9VO)}5$#`R9|5 z>lsxy+3Gs{ut53-Nq05UH$-~D9I&*q7h5~s2NJD2bdKe<#&MqybFQd$b57vrS$5V& z^{cyNle`95gKYmF-eDkplcc*D>6;=w>RPZ2xsXKEWV28{bCGK-)uAC)Por5vFV1Z3 z?Qma$DpQr3=)9GZM0JzdQ~0cb^evLM80lLg-ThurbdgsSl~zb(tBY*KIa1}omC84G zSIbB~ht1B?{1W|QL_up_;>xvIrpc4SlMbYBlXQ0@eOshY-GY3YTsyUubJkbqIK$mbYB3)eiJ63w+mQG_JBD*a$Tx}sGN>MZ(EjxALF zOL_)UqbX)+f%H9+?q#I!sZ6Ugp>?LKefyWwn{9Oxdm2jg>mc?Xo!X{Y)W&mM zDF^=5hS_L}Id&lZkfcM6^h1$;jjgPMUXe6a4*#v=j^pvhhu^tgfmy`4lM!H<2Be+KT0!v3FV(YlnUHmii-_lX2C(vTf zpA5N92Ibb$)mr?xue&^>B-vUZR!IWs$0Xg)NIw?oP94at!I74CCl|}5d_1nLwOT%q zh-(^cv3&txd)}oq@~eC~`fJad`KMUB38bHpbeNHTBGT7c`$hR0)KR4+*Zyq_Z9;C< z(v|7JNu=X?O3pLXNZ~C&H|=!gjs;ef0_mqD-QP$*6{$`t__sll--gn$Q#^YGiS?Pj zko3D0p|1mrZHlM2Se2=KuO@4!Smz3)D@b~Pk**MFc^b89?nWI}o4mHK+2%%5re|I2 zcb4o+m%jGvN$bm$`cq#^b6I`vaMH0bnemc}kUSe5)L_W_dhJyE|li+zCfLF;6zMr2=$$X1KU zR*%Tmh{(Pkk@bkkz7dgqGa~y|M7Cx`_U(vlt%z*xh^!$Z`%Xl*PDHkDMAkDR`))+` zy@>4l5m~Q@Y`utV{fO)b5n1nu?1vHAk0P=k*T}FBfc6)9T(asa>HiJ49+#wzF70b) zKaPI!(CrA-7kZU>eJsMBoGC6oA;cz)xGr)AaNVuA9z2e*&a=|@&;46&xvyNR=gM+q zvuyN=K)MP^4>ruD^^&auFP1k$gO^iU)H8cC~n{5RE6y#DE+slbs}-c$?A zx~algjb6iW&G}#TE#9@AeD#xphMDwhlf5V@AkQu$ zRHjvyOX0MTkG<#B3`zBH%KN!kXiT&^xSamEW`wzK?9jilbvC7!ho);U$;uSgHju7P z(!-5(b&=k12PhV4wS+o~2a!uR$adB+UIx-0Bt6nddx&(~dyzx$X(6A*EJv-8>U%8mx2?RGb9*b&KXN@n z*)vZ!Na0%q(r=RVC?ox*NZ)6<^u365)M55f?Ns(u zIs5+0x^A1qyXcu$o#nR?$*1?%o;2HAfyWa_zeUocjr3b0y?q*TYdSlSR@I|=LLy%_ z@oi9f((=E`^%=8L94S;%k=pMa^jm2fyV+CtVS#i_k{)BEYl?J>o1kON#X(bXD6i?) zcX9Mj28P&_K20yleA;5Iv6N-!RbHA?Zs6|n*GePOY##vLVIciBN&jS|-xleU3!rbc zYl2og2UdVYzgA%1)KCs0WnI5~3)1NA2KxYaPRDtz;P~CEFv^@9^maaIS?6LagzMh+~@cXCd`u zvuybHfwY07#~En@Nz20?#2t(1QAvk=*K=QL;@V3^qrXUZfLwc%hjTWmRS#e8Is@6M zy5U_p8zw!QKu@|qE3Xf;jzIbyk{)lQ-%**axCeJMyLQ^n8c%3@`mwBwvOp>w*;De~ zd>!uX)Et#-omO6~kHR5{HA#JsQhV=jq?ii@(sf8W(n!}4>4npvuROtN<y!!q5N2yEn9T;#?~?RHBmJ&O_wPWS z&65%8?y79Kyq~d@JKs|!t8u?4y;^G_+XW4_Gf;36e{H;s%}&~4jvYw9N7B(o`aO~M z;J82clAzVT4@WxtwJ=|g%7?ac#2LJ6FhlMc>RIKz`Z=KOUK?Y|WTmolEf6#RK>B@> zo@Auo7wHO)rak0qP?No@&e2q-&=Pv1Mxor;%7$JFM*B^9_AyJN`tV~^Pd<(ARjW{# zt*>G|B9QhX>B&agOQg-Tr*p0inp%$KHOpwRN=?06`7|-Mi11wYL#=n4U&Az3njFWB zU2_^~P{^lASHopbu}Tt1*CXjEM!KFzH5Y0Tk#r0q3!k}i6tCHTa%D>U*qg1}R*rp3 z)QF^#mCju6N}2EvVYUZ|wVOb?K1s(I>G~oaOrQTSSEi*yNyq-)Do=VSCDNVnn!Ro` z+jwCdB?CelD_?oFx{Gbe=p^aI^x1E3V?`;D{(z*X8tD&=l>T1BnIWHSKNOPkfed|* z(wvHIur!Kyu_f5|l|-?H(oOo@S)IN%~q-|1`x~OMaGy>Ay6G z;u#zZKIBOGop)17?xP(jSua&qn$~mFb#uaK}96pXyDoi~B;N`MBO%GKI~|p zj$(<|Y*|Ixgwlu*Yp1|yVMkm8`7-vX)ZV1ms+F>8rKcne>CYl2avEF#+=BKvtn))bNbA|l%`BKu`Twoyd(tB7pli0s!9S#w0T zNkq13M7CK();A*CJR;j7BHJ<|>lcx26_ITnk!=%^^^eH5jmWl($bM5J!#)7oU+8fK z_PDXu;|l6=#qsD7?X*PJ7y7!M!nJfiFSRrrfvhL?W_s&iX?{s}b85TSY=h+@zW}`= zkp6_E})sW=IP5fl~q#6QL4zX*v{fLD(5u6#7+WvD~2%#|7yd` z-lDGt(ngYwH_}FtE~01Wcil4^58Y+%J@{V%wmA&TG+i4<&I1^#WW^#cz}r}Vtu%U$ z>>UeOkU;uVlAd9tKP72-BaD^F1UJj>It>!>_U3bx#H$=MV;X`qgJ`Qqb5yAggG8lf zzWVQi#MTC+L180fceRlLb}f+hA!*kd`i-MLD$}z#+8)&&v{v`vHOpvcR@?k7J zm`^y`+WQOMTb0M-=D@ixhMS(0ES)wPDXeWE{TWH$G18xjbOl#*2A|9Psl#fYwPWX( zz z?QpPGtcChng?QBivlTY@7J+m_l73*M8fJxJQ=OFe{=Vhh6L&3TkJ3tP?v0Ut zq)38b~)L>BmO8u}J%|-XFV?x~a8mq^=QmjYVj^TY0ifwdX!zCSo<$ zF7Khc5~SZr*Fln90xpiIM(Vq>pfhb(HHf3ER5#6%Iyj#XVh~ zJ$TJhYde$IiuD##{o0-^0iEvh5?QH?6#ji6Z6@ibM%paW)$T-YiyW!#`O}7W(R(d= z%il=4tr7NQnRcCw>$0~)>Pxc1B5LMco>c90D{H5ibp+B)NV>vEHxcQLRp=OXeb7`^ z&pil|0x1fIhge(j-4~L9*CMpjxRhAU^17rF7pZTvlBg{gjTCdCK)NYOKQq!zMS4jG za_gj@V)>}{Szkrk#9VnPpFX%tU+61w6iB>>vN2-QXJD8hWDhj`zGO2G1v9ijx*177 zH`2{SI-54}-dRDbPA6#W?&SC*i=}+ziRiTGactu~#`0cgJ?(oo2LzqD_W|^*to`Ed zR;HLY2GYJH{lZB5inLcd^mWl6vS;3uIj~I4H)(QtDj$}M+J>D@EVwj2JyV*s*R>C` zbJm#62GY$*ntWZp)aD|cHXS)E<@hJkqROHf@)F0$+{t9+!yeUn0n%ufEoV=+f?O8a zp1!-<&+IAY*nxBllCEN;TZnXhjx#+t!;n_nb!M5`x|Q$OuAQz)(oR}3|65`a51-nM z+LvkOOJU|8NVg>Esz$mcNz0EsfaiaqgQY+ni;w3uOIBZBZIy(vvg&$!W(oU#^BG8A zboN1>R-&G!CsQf^Ki1wq-s}1P|9={@wi#zzvu4d+J8RZjvs1#6|p%ygHJQ z9Q{xT&yFO76Cs3GNkVc;5yDGCejkMV+{=$yv$nO(tl8f4ecW!h`_tp`>O6eD|LAgg zJv`hWkLUeyeLjBNANR-O`FK8$7$s3H_p^SA{RmH5OVaI)v{rRGe-+9(t4KO&qJ1)J zByVLzkjjye42R^Cg$Ru?d`hf2s#|bXbr4r6;?2%fV3)*`?nlxcjC4Pd?#R~Hm;J2u z>!?-jHHPu<37*QKRUa0%J|)(^igyUZl(<8L{x^qnU>sXY;*jnP`bc2Zb^PV%N>an;`Ia8;*f zUfbw3G@p%lc^oDE5$5ZCs?|ql<~iBw6g!ok^gxn+%SaDYo#weGp*5)K7)-6Kg)+;u zS_|u<6Y?}HKxk*$>Ufp%R5RWskbGI4!bABgp9AFG9dG*_pie|r7m*zlk@bzp4vxtB zMP!FWWc?$uLnE>Q5!qo8*}#bG@Q7?sM0P|(Rv(cKj>v{YWJ4peVG-Hzi0sIS?5K!r zL_~IUM0QL>c5Fm8G9o)JB0D}JJ7F6co&%u&`4N}ri2JsUxV%Q(D-U5@biJ9QLzb(7 zagGsv_00S}jiww^Ifr#z#<(n<)`iL=i?%mYC8-YLl4xeg-Vn#A@T7f6x|5Oi5$P6| zHe$BdWY7Dl+fIoc>{HEtaHYDEwn1y%iWAP7&qCV}#zm?y^9nImJ!u_Dzhk6zB7Na@ zQe5F#>>af#N@#UcSxe0cDuJH%=y}K^8&{I;Q)*vc8|DxFF6B{b_QV1f#FHLG(w&X; zAd&w3J!oD3G<8$Qdae(&6Y;Sus%ALqE}ep$1$wJbK8twcLWFjHlp4%R%fFx`3HCMI zJmKp0qDXcQMkwB7Kc(!HT~~tR6@2$eySVqHdMRQ12bA;fW%xa4Js! z%L`De=&I^%HP~K8=E1<)deVbQT4kgMi}bYLJ00n5uXs&5eY5^*NZw@M=uFR1Cy}&j zZDcJErU$cRF0Z}RYbczD`1(bZ)F8Cgtf=#pvoE{3TRUu+13YOzl781n`-ya?8*!a| zOOu*xY;cU*69CTPHkMQx%U`YM9KBg`FNR9($~b4_imQ~WQ2jJ}#{x5xCq0Cu-!sxf zM5=Ym)~2AGU)l46=tRNP{~yMLnln<&m!7mgNxyHT{Y853{kY<_ zg}jdC*eaX-G@TB4#VPy!D52dNe=Fms@!C8?k;+Piylv}Oy*PVA9J9D5J(Q&Fjr35F zPQ42y6zBVLimbb#S6>F}vp8ldcY>Y9MCUR8&Z}~4{fZfvPM7<~RQe$08I0F4 zRNoYZ?yQ<}N%jchS-V49HumAOdeT88{gIIl5@~@R%3RitYR&d?IQEMvN(i5s+M7~` zK>lCO2zs8L>i)!~oepbdM-baxSI%sA9iFr&J%XgW8R-!seY=P<_5DJTW;=h7ml_dP zw7yE%6Y@>d5n6s)18K0+A|dIQjs3*tDERlDw4S6tHqv^MHm>-aD=k0e4V0;JT4=F0 zu{ICoc+>MWrRLa+3n#k#rGc;Gs&$Vd)ZafNL7P9Sr#rwz55|;4G_q zwe#O0U5*Ma-RMb&k@TlVI!vVcE3o$5QJV79%JHDHi1uceMuF!*YfDfvfW>`Pc@0WtKruASowR>qexn9q(_PLN|shE zdQEyht-iKoHstnBh)7x2dICI-mf!r-u-;`oLK_g*d_6#N0YRZ zksdA5%W0)H1a)eAx-6%b-k@xiwVFzxhq4n%3+l_1D37gg!g^#&RA|tBWN$8D@5YlJ zL(*Ru=`kW*z&afl)M-gRJbjAN*{rGKg8EX;_J*Y6e1uh#n7U7pM|B!{CGCS$-K+Fu zPk^zb*}KzXDw)-Jdq?UfqqBIIjY=%{HZJx^Q3js z7U<;ow0qSZD9mP4>Ri7>?w9CJ?RM~?P8=Si1d}^&@tksK$C1ZYeDDFlH-F^)eh@) z676Yn5>xl`dF<~9h4t8W?5j>O_P@&K00no)+dc;v6_GVWWG6;sqa(7DBC;_N*~t;v z*of?ui0sse?6in%Tts$yL^eJmJ0l`%jL6Q6$Rah%0c!{n|!cK_gDPLHd@a#<9I6N-Neb9YxZvMmkEQKYhn(O|N;Jx@lju zucGJbGjD@@6Fn}wj}ss%VO5j%T8DV!T?iBIVk?in86SFu;rrvtqaB!Hwr7p8>PZ_& z`Wqu{5b0kYMmaAmWoabU?vCcIE!^KNkM^l%Cpov4=)v$TtNmSJQP^(ck-=5@AkI>> zyY9S8d4;ebp7cbL?rEeaiu5_I2^yONO_~ST`YjV7uXq}va@hJ^uR*Gv&c_+_M-UjS?CNlzkajgg)d*6BLdj*-d>;H;D9+BMS4x`S)eWeCmJ3P+Sk!#Rw; zS)@+0(;=7xJn0ycb~Dm3B5hvCGBy9R*6h8GYRHqZ3=d$)RNJ?rU$Au!YGV=c zy!?V;L7rn7XJ59f!h6jap)LC+80Je)I+mn+8R=M&_F}tNtWScy96O~DmZ@^s2j^W3 zBHK|3Yc1@d${+UA&@0To4}e+Rlb%A-9!7c!Njty2y?cAMrs;321!_Ha72?`eyWs`I ztGU9Fx7=RfEsng!pQDx7sHt^PZHdRk8a1mU(8S;9Gdo zQ%SnFk)EnLt)-7`-*?jeAEGi5+B*nbRarU8!&+;Z!kijQd+DkKyo!hQm;|ZPpfKyF z@OV7wX(ZjpNKX^#o}7h>tSPbBej0Zc^o6LjVx2`6j{U8iO~Yp~b~hSJA!)ceRO^d0 zTW7%!^Q7ZQy04Lr6X|m;xZ54rnkuK*0Eyb#&QNR2NH;_6w@>AWvUi>LG<}OR{tDWEk@AF+`$#!TF0s~Z9=8%m#J#}Zut%3B zK%#w2t5fzLTN&so?fry|s@d$jK=4_2N%nJW@T|s@w5O4dSDp4+jB>WlVENQ!Wm1!! zqwL{Rb=oe?Lt=lYV-QoTgFH;Fm`%T|PP4HOPui27LDKz=^bC=1q9vUlw0{0LmYG9n zJ)th3NEoj{IO$r1_GVK!qS%Wo-d6asI?Z;2;NN@FMw0e2(ngUEeHo=)#olVIKM4}E zCA2-|lPQ5NJI$&6oBdPP$d?uXU`vg+;9sKZZ5bd^Uzfd|W&aUf@*=EkS)QG}b z$dgVWX>TK)AkvyUQCee)P+HSE#SxarG9JuYb}E$i^v;Dyb@hU4!y4>N32RL{wO4O( zkt)pgtg%A#q!UScppi}#=|#(-wPqG|>uT*kwu8h@A=U+{>ZjcxS+)paaRyVv-5|51 z!Bt;2qO#Qq){UNY5=rw$I!UCTaOMl2Hl=x%z_Fi>WSm@9BeE{Eo?1sG%EQ*QJR((2 z-M#M5;*JUb5N5mUSj~FU$t3M#q?1MZoqNGzYbRb^JP{Im53rGO%{kJo+M&Ohr-f^z zzg6*;crRWR+P1d-sqP~i`&eUp(z8ffXQXG5G<}bj|I;FMlch9{@mhrH75O1PRXt8m z2`;%G@~KS-!)Mj@EXMqY1otg=-K#>iS+*05mA@yQLehhbbc*V97W>)~mZlcTR!u11 zo(5}#1SQCyZq&Y&ywR}rWn0`LQ42NvD#uuaQm_=_edfjaPt6S}RTz zsrB1hLwX!*+4_n0E5jb5cCYq2-Cr#DLcg)=zO%1EVwc2|o=wt&jr44_{>^VV9qC+J zM$D*Oo?m4K~ZN=epBTvZvU) z@ucUFw4aflBhrgW`uCF8G)q>8Pjx^}$Mv5IJPkJs%4>8hn)%pdlqrMl6sJzBL$GH8SlJE&nM{vp0(pO{? z)m>l8NnvL&!k&AOPc>fk)9edI*yr-3(@5IiNT-Q(r@NtJDGYr8Nu(z`ONpIIPkI4K4>QsWMB0@-)SgLGM|jdFS0IH} z8(|5QtiJ}SdEHsa60V?hRa;4>?W=tbkh(kG_Bp`xh^#3hyD%b~5s_UKkf26;as7=AfITJ-G^h7!{3B3-{4B|I09@_Pz) z7RAnC)p?3=m3{L)ke6kj_Y3mK2Mqo5FC)#KW@4;*(k7A)GSViIZsyFtk#%Qv8u*&F zqaUtJR2TGaJ6{4i^KL_X+m@@X1(u#{&l(oQlU_*DBaHMyksi7NrRgt+iPSysa1ux0 z!p13#)0?sT$mSlGx?Zy_TR%BiS0%VsGf8M;tAkWAQor-tHQU0jdD0mqtvAvcBrRR@ zI&?hraG;6xtMirl`H+``onW20*7NJ>Pa<{JT!i75`t$^=D9=WB7T$+QJ5lo(BZal~ zq!*ENu#sM*I{o+&T+w?GLe*MH`xI=!Ez>El_o+6bSZiIDLEd^cQ^S5bm=dx`XT^D( zuuk(viaEfO&Lrs&Bb_PI#jBvT7=P+_Y6UGido!~UP990MtX@z4}TsyCOzOamCj+D zeRI|v#EYsmmB4n_Q{p?=bMz)la)Q^OHDY-3&Gy`+K_Ty;Trg7j7M}D{k{)TKm#X!< zK86yua;L>cl;$Ybh`q@gjwqGW9anW*iE!$L2$Mk!m8#KI9Z0y=wf>_#w6JdHKy?a_ z$CF-0(xZ&@GLq(ZdJX!XYVlh8tHn7&s;;KI!KZ2^rza!VJqLM-^=^AYq$u&uZ2v-B zp+%NN?AiCM;fHzB*(4odq_ai(yH`=#+WS3={?3oe$#cxu(^Zv_CmqhI-G$55i37TsUCGbBkj(kn@N ztdU+x()3&JqRhY3-l%nIFNP#xKb>|x;)U^)u!NRbj34d7{IHi0pTW@>z6WT#81e&U zf7x@T-$M1%6Rb|*-+R(#l8!XeX4R?otu|i8@^!bGk*XlctA6W(RMiFhK!@8P*M5NR z%qVQ82(Aj(lqyAbHnaR#b$HS_Bt6bZ=ZN&%v^4+K7^e=Mo7Qe$NwYxM%X+eW*2tcB zAf8u!h4WZ%=8@$W*WQ#UZXqSv4ja}&p7bh`9&e;qiS%7s@124=wN-NhO$B*$p?|6# z$NjNAmm*J*c`9rYM@z-?s&I6Lq}jZW6`Ci#nxrQf>D3}Vf|h^AEhtlMXLAc%r%Jt& zPyDQ9J1{5h<958uaUqVmHR*i?Y7>`>R+tdeXThEg0!sk^W@`N~pce zmy-@=oF0emu!R(?YyFiP?XTK;A>2RLXi+G-uqTAP*?ZMk&3e*nNIJ?$uMz1e_S1E= z-nxJLt`_UAWfH0T`};8el=i>tLdfk)J)vJGYTm2Wsm5W*sCc#)h&8q+y_Td6MtUtt zOErW z>q&Z&kzP;Ibn$1d{sjCvj_I0)|91%zGr(# zRL%RJfTer{n%ahJ0=~yG3FVc-mP>%iWNs$g? z$!hBYHOTeP~QhtThW^|z>d#;MzH&1#KNl!7-n?%}`J7_Cz z4_L-9UWc%F0m9J6*d9M^*t_h%I>{8i-C!Od??80+zEH@>@s?)iRIn%LNpB|UsYZIU zNGGiZO9$FbX?3eG)C=n_V)<2HwaD|_od{blVg7y$#nMahK+@KiQrl#Eeb}k=q_>dt zG$Xx*q@|Eg!!=um8U!k@ib3~ z+C3a^x*N@Dr@4OmRlW~Uba%Y%bASaA*}{nI)`)CTM0Q(5wm2fYJtA8Yk=+rI-5HVH z6_G8C$nK8FmPKUuL}V=y+46{NMMQRQM7A;_TNRPr7m?i`k*$u%9*D>ujL05}$ks$; z4@YE=L}ZU{Bg1n5^glo1iX3s{Y{V5g;&P{NcH<&#dWEBdW1&djsfaO^G||5)X!J9+ zFcI=H!u)UFK>U~%gyD!Qo()M+y8;|>+L5y{t1(FHlFy#HV^nz31tdM)NEeVa>2p7{ z>TeWEQ)vVwir3IPu(yCoD(jZkA-2-B4L!+9?BWp!0J^GZT{>vn83hheOG(uE`) zZ=?%F`skA=XBp>Q(WR%eq zb}su48!U(?y_KYA80oDd?azAAcUFxeJPV@o_w^K(ry7z^XpL=F3+u7%Y|GiX;$GDU zve_1P&66%7X`_)Y66pxmNGYh13QtsCRxTuETs3kj;%Pl4Vf(fv6_;wWBDB_rwe_U8 zk@QR>y-lQDxyN$vGc1idmU7P|od(IN>=iS3H>!~WdxG{$Z+IAaa*YU!;T(28B(|GL zoo;{1NvuwFPxOkG&NWiZ0iJX*NhcWTVv#Pp7dm=0drkQU##sxE9K}hUPjx-g<=3~k zM{7i#%v9}GkjuWm8rCDdUL#c=rDms>F*AA6+etdnNN*SEPfI9g%Z)6JI_z{Udu!t) z$Sd~BM8wqH=n-tWf_cK3zh|4PLcda^>QQx8r&NhcfW9jenlte4vP&?ikcLfBsERLJeruj-T|*iI#9 zm8I+zwtr#eAZLk|={~N}N|!=Xar$5F9OFhA4nC_VT}IM#jC7gx(+g2f zXt%TPWw%T^(%5T}8lFPX>BJK2eXkNy?PSHlh}+$$RjLEYpdcKcS9OZD zkSAS1(({dUh3d2;$I`6SYqGzu!B)0&Ds8^lcx`*!x)j6I|lslseG2rD#C zdM`;YFw%QP`V(6IsaJd5_VyP^HSbsaEh4sl%GQ5>DXy}$3wy3{g>ezJ?YWZowmQYS z(UYzuX= z-c7t}IK%zD2BQdVTTPHEUWM7IP^_^%>3t+^GSd4 z>B8IP2=_xcyaizmEq}#di0A&B#-wyc-muY#%AWsYK&JLW?Cy!qjX;VL!r?t|sXWBV8@h zH`m~bm7Fz2YIElykT*|6Sn=0(RAw*8XD&xLqZwhvIV9G2#dS$(uhAft?7Vgpj#|UXtDBON!s0su!X*XQmbfr z^CO)+|LI#u{Riz_xQC)I-OAh7x+~lbkRFZL*2y;Zv7_WkA0p|+M*0v*)BKYtt@F(Y zr6X-*oYs3PZGx==R3n=AY3JX45IHx~N+oq(gT?m>Bwsf6dl@PAxjg9_lFl;HHR`AP zar`c!4K>n3eF?==84u?uS;H=nuV0L?C|eQEOUk1=Q&{D7suXMe?1UnA-#qEVB)!B) zA6A`SvKBfza<-9EA3K$v^ih&tW~7gb^pN!^ty5t6wM(Mb*{C`_n(Sd+@N}}yigvi1sXVAc#Ua#C$iQ0 zdQ3{++s3_Fg0>0l+(;i2>GLEF-(@cqsFg(JM#ODbIw(Q= z=W}Uq`Sb#RqtN9vQqCI{do1*KEme9nS7aUx#;PY>OVTThbgfAD;mlukNl;Ed#%Y6W zP6$0d)mILAcDe;&aUAo9K41?@LjNjEwL4C5XW4!LEQlw4oTOJ8>Ej~3^#y26S+lz5 zT*`9jUug|hK7$gLptrNM?tY(sLE|*0%8O;5QUi7B$%m}&Ag{sZS=Q+nYggDcPr8nz z%|^OTq%XY$9gFVqnryeN29o}?`lUJs`nc7ZeHe}Q$EnAS|6x} z#GTpHIt$j;lRiPxIY#<~NGJW?U6F40xYx9~nejS=BlsMkW-28lwKv{SgZV)lA-{ol znKm#F%FBEj)gxCa`D1))NZOeFeE`e>p7cqQUS*_DinI&;di(oNEXPjStDnk`std|d z&F%?_-h?i*#=|ouwiZi*tJ;oz>B-((!OY}IpCakiM*5UUf42_$rY`bYQ+a|pNH$ze z`LRCLwV0E;Rfh|QtU}m-7A0X%)SYSUiKr{{uqLcdX5J;8pRPj* zZ!YlV*gjM{NLJ3He2h;uUa~ZHU~Lv{G$XgiLkM57kfM-+R(llFm2M zR+3H~ow#SCr6Vw>;-3r8A$19TApIf7%ztn6seL)u^7MW2x<5lc`6+}gvJ%vgnBYjD&{}ETpvowCG$=0rH{TBI2sw0)N2g|HR z*q0Wr-9?lHBP!MSQBGaewx6=i+zg^R#ahUdzD&}ajr3)aKKlsDNpE6l)LJ-+an9_r zShl`bnY837$92;RsN8SS2aRje*-BdB2=nQP0H)L;CaYz!QZV1ecos_#NbFoyGj; zBh=lD=BWEH==*jq3pDnuLcT=qQma#}u|4T)Bwc8vuaPw0^Ica$+PdDCqi+GplIt7y ztDBhG4x#pU>BXcUbAHQ_y`VcFi=MY;y&G2*+qOQ(fm_#VL}BIcNna=Ftw#DfNzWLaR7RSh9(#rwD5-(OdF>*_euO98 zNYX_{x{;(wc@eKrX(H8}P9j^I)*_ElD9^r-%)1_8nd7Ho&1^k1xGL-V8Pe5O5G0@t;cn^f?Ulr#IJ3+2*s2%no;$t})i@Hh_ds9O%hLW(Y zEACbD?CcNrZanFmBwcKzZ;JGpXQ1!XJH6K2sf<&12U6JgbETUzf>zP{KZ2b4d$HlO zc#DTNH1rCjN4o)eYklk}dD6E?db^RnrPfc`*Xq?Dsl$9pYSJD`#ZxntvmY2Y(n^$4 z-dP<(rB*XeOKSBP#+655jgexX%aguM(%-h%Uo(GOq}t7$d#f);PgRl}CF;LN`c!+W zJ{*#3c~YVCbf$*0X@QckPTThM$~g+VZ=UoWk}k12eMh9_RnR)?3hL&4%463m#LjoH z2D4tqoV4WkEn}RsZ^bT~7{huDsa2aI&Hg4B_5?lYyCl8CNZ%FdB98rbYC-9cf5CX6 zfh-(FMye86<5lyKYJN7^zr3xfNBYAs8~fO)^rXKd>77RUJCdebX}v!VMwIsMw7)l- z^GrT$eR@cGqvEB9P<}dzVbJ>eVn}|lr;Ds^IWkk6QTr;N1C-qzZ~GkJy@>4ni0p%i z?8Auc_Yv7g5!oLivP}`$A0x7lBeFk5WSb+hKSyMLiOBvMk!^{{{uYt_JtF%@MD|HU z_Romy(}?U}5!u#=?B5aDXA#+dBC`KRWd9eD{VyW>d>a{_1EBx;5m)AjyURvgStITZ z&S8CT_oKt+dD@^NpAhFp`&8}o>B~Q#aX+9x*S+$+WgF~yyJjg_f-o)#N1QuVAP)wk z!jry7(xpcFo~&5yYEW#N<5_IgOnn;n6=#D~P8Z}qxCLP&S1&e`1gW-;l_cW9B<@=0 zvxyXA)swzY(z}iHeUj!+c?+d|NPDCjDP9DLc3G?DAzn2Bp;C2H(d{)m$&a5yxONFb zdrwbXCqoi?6BTE5l_x=-WQ38zf_TyoNV?2OKTw^%yO8Bv!0V*r03WxLNUTATT1~Mv zJMunqoWm;4(yC>R$Pr{GEJBG$vz=hrHBb5>N$)Yz4@G*?{ov|)ou?}|FwPZ#&aS6* zKGjI+iS5JMtYI5ecsctpe>kg!aq(&{&b&fcTTl9XlC~J>??rm|N@&&JTekK+%yVf4 zTk-u&&9-|XPl4mGgLabWdt1G?<*M;IEsuD!Cu^7kJn2UyU2dcwiF7sn0)2}@I`q{S z)t&hTZA+$K@HW>3b}qYHz!LTr5mg7Nk|@kP7|cwb^baImVWfW$=@ax{w*+IqSfEzc zLP>Le|DYVT8rMzjZiC$RtixKXWB!mg^nr|&d9w3Xm@hr)CX(K3q?<%~&@;HA!xCOc z9i?%Mw?nvo2155-!G)^vl%AOOFV=8PkZLvE+viE-txppB_+T_h`oS=^KU zk)$h)^p7M>d(+oiS`5lLmT_uo=B|M4W2zjLe<<>-pykig0)+mnS^j{u!ZL(y`HUaIP$g(Y(KlSx0(toqgcbW%{h2@Lx#4}N zmMzTA1jFO;q<J6zw#RDCX3l{_PcTurn=*7FA#p1C*4fa`;Bz7NH4)0l|KKZFQ+^Uah;ee)6TY%#cE*;a~2T3`Z&V+ zTPTs7_gXUr60;lZ1K|lb)5H1I?c%DR!aMY&e>RS4Aw?K@zsFKd0K9Y<};-tCWYmSZhk-YHOv``qfsa z@T5KIUrG9)k^WVr`xHquH7KVS)({qnAZ7J>5=E1KhF9oR%o8|A0&OmNdFG5N*cT)?`~lYT6QO<;*_4(GL`8vs^NKHqQMWnPqnqOb$9M$eBrVjFX?9@#-it2o-wGG*wFQYjM zD}PV=FOse`(toK=KjeO1XZh`9vGGnKo&HD;3d#{F>+x;YsjZ`Ag>^TIhc(-_^<{Ij zbrkj^Jn2@FK5nF2MY`-+P<(QyXW25Dan{I|S%{~{`Ba;E>L6K6|J1&Gc8JeoXI82u zL70a3s=Lu0kF+|)E{P}oH%ZqS>Ayv~-+E{oL#t}-QeX+Jky&j0irJK7mVfObZT}c@ zwoG9DkVUhAktQxr#mp*Fji~ILHTG^i>1QN;!bm?8>1V4^&iq9zjXDaaGR_&MCPiGU zd%F+X1g%70xD~0kbKKW!u;&1p3q%yuxanb8Zuda_6gx_u^gkqh(n$X!(r?mw*Ua|i zm`}{sX;yuO6e_tI`Db$+ru3XDPN%D%hU0y2uir>BJtDC;B~KapN= zFSJg(n!0uMk%}YK^Z$yukmc8(i_}RA5$4$Xwo4!leW)R%3-3dD6lVS@b}BvT=Olf` zNIw^8En9y}*!r^J?5D-CEVGuObZ7m`F^=HQgzfi-Jw$B~_R}yP>Oq};mCpf^?b|*F z*e)XbT12*eM7Bdj_VtKt$B6735m~#4?3)qUw<5A{M`SxiWZ#L%c8$bJx!?HZB&Fe2*^k^Lwl+btsdaYWWJBKt{1wtGbO(`{sU4uJmWM_jV~ zcJBY4wGo$W|26l2Nz2U`P38+|ENH}WWZCT11$oRuX~c2de>fL%doCx-B@J!IR}yGY zo-EYNfKlN|wjik>T>DNe_epGhlqz!95X=ly6he9&x286bAp<3WdCO-^Uo!N@iKeQlB zPG-nFh4F|pk4s>@;8U$__JyQ8#{2?U5Kp>2NnbG1?Nz65-;XP{27W)E%o%vpEcQ&6Dmx(ie?%2i57Cw^4HbLC-Q( z`}zk$Qn(gj$~v-gxG%`_BI#AE(*oxf&15dmc5XIulMaSKvV;45-TiiSzi+r-JNNsh z`+dv(zU_WHx!-r(Z)f-0#r>+>@4N2zJ@@;*`?Yt!AGqJH?)O9Y>)?Jra=+c&@5k=f z(fxkne!IKhPu(x)em`@+YWMrO`*m`^U%1~M?)OXg>+F8Na=$L__iOj->VCg*zdhaW zx9(Tte%;)!yZi0sem&f8Z};2B{q}XgTKC(}{d&6J{_fYy{SI)y-tKpx`{muQkNefR z-$Cxz*ZmH5zkcp_i2L<-zeC+`fcqWhegoa_aQ7SJen+@pz55Mzzaj27)cuCJ-*ERk z(*2HdzY*?twEG?7e#g4sNcTI={f>9P6Wp)hexuy4!TnBjztQe@lKY+Pe*gFR=bw*t z|2@V1PIbT2+;5!wo$h|)-R}(dYjnRe-EV^XO?1CW?l;-}&T_vg?l;x_&UU|Z-0xiX zo92G!x!?KjcY*t*?&tbT=|uLXK@8O|hXip+I1)r3TSBlURpnLO{wzGWi~>dVS0iE2=Bg-Xr-wjq2= zPx>vAzG|f35^2j4lvz6qq5FqWt5K3Bq(~16Qk7>fNS10WjbLj3AP;xoDo!;@o30JR z>>Lw3UQhaMlD=l7-xlfU7f?d?JAFBJ>YSrndl%-lsDyoxvosXp?d&tNHIohS8f-@H z;U(@#zsqkmAwBIOaZeM~PvM7q(w#{9x{>ZA(qHn~+LG(Mrc^tCY#n=pqRp(XCz#uF zH(@>Z=F`DmgZ;(LszA~?h>KLI+27#A>cEqJhol>g^gAM5vkW?lS9ndO;Qr;g+U}l8 zU_0vD7Sm{j?Olg(Ew0wL{EooQ;a-15&1QRSShIN2ok{wJk?u^=(r2$g$L<`zrlScG z(T!$Zm&XU?(B6~^PLejW^+zsd{^0&p;}x~MU!XyEK#w+`J+Z<{%9HLw(l?EC7m@zt zCFnT%A+M<+359#hISe<`a&b@@UHU@~JkWbC9$zBDAkFv5t&|qcM@iBzuJo zlf*(J#j4YjewUR)-fL1 z&;xv`-Hq&Nc2)svVNd!!lD=c4-y>;y&syln={YWPC*@PAm35k`CmcZuQxn#vo&#;Z zAM%!|OdaO)*fXzijB%Av!Kg8o&HGrPd(!Wd^j#zUzUp+6>P4lAh5o+2>ytm0<#+cK zRvLNdHA8OJGtASD`NQ!pn`Jtl+1nz>)5sp3!`xM#{|89^_Z-691qgK?`ilRSb1C5+l+;c}3VFG}u-W=4b~8Nb z4@g=z(jSPl@gZChzPDt5;fb|irG>prtzV0)cDNUzJuBKDago~7->@Dz(k(UMbzYa| zDD1I#(p^dVo{{cK(o&ZVDB+5Gd^yc$BW_=dxrFjjK2>j{$`km@TF5`9?-zb~y{PNYeL>^oJx(2hw`C&i5>(z%uITmCpKDjj#`DbXU>mZzrNY zUW49duBgG#&WTiEc198VQJ%B|Nk1^s4r=}XEkFt3?n9dQWfs_*D%S1^Q`wr$oWbmS z&t3dgHg{^wh)82BWX$Ahee9BX(jSrZLnHl>NJqbk61uT=R0~_0SSEeU(bpp`?^&s( z(;>-oM%dv+#NS^?NnoW)yua|okJ+t^&Ru11v}b?A2zz&)bT^Xz-bi;7={fA7BW9yC zv4l@2#Z}=+t2E9+Ll*I>Aq>M270y>7o#J7beQ6Clik|exB>l)pe@xQS(;vEW(#G{H zjXE~49(A^2BxkVJzycK;kkh>v=fWN)BIV|=RWLvI!r&$AJQ zeNIo>k)(ex(vGUrG0#B9NRD6Wusurl#9T8=2*#MrQT-s_X$``uGZ2Q}c78ao3Pw@o znXJU+*KA#?H&X1rdeWbebd!<(M5M(QXw~;g?QV}`IjoDC35cf$Q^Fe8`byr1o&u_N zvUlkdP}t}St_pns=}}#0>nQ9Ad(z!W`bQ((U8Mhh8u~gd^IBUcGfvyCZ|J#G8Yo{S zaHMIS{Kjg?dt8Gs)%`J#-fBu%?{*cnSzLN}H~Ay2PO($%Nq}|zttMWP9?#R2eziJrzTCy&o*V1yj zU*_zkv)@K4>#9}YnY;tD^iG%Ejpl(K3z2HRLoj3MRB(kanWG-iWE$9JU%a^j3*t$C zPSU>^>CZ`;URHvRbzHGHB`%)o*%Rxo-E^c@w7zUFXSM$>M{4602rJHq45B3D+OLg- z`rSEBd4;fRp0pE5|7xV2NLsq16*~63%WKL_WSs3gshRQNKGk+E=;NQY4)WYwgyD`# zDi2Y!op`wtR!w9fb!KYOuU943!&vM_$xbj}VNvPkQgI1kl4%j96n`46|*n^~hH_|;wx@@1b zU5;Jf8R|m(bL-gi-pC`~;=(QKw!>d5c=KPBbVIm-HMr{oE zp9>3@G0qY733oK~OhT#JV{uP!T+UDF6@DmxmlEaC+hpM?DCzI@+ZTj8L*nd=>J;;( zC+$qqe;R3Lwf+xRQ%BKjvXiwOIo1>EeX4ndw5R&kR*n4dfW;VVgR828xJJFKU1p^) zi+j>vk@Qm|{gp_!BkATFy{7VMjI)<*ypZt$KGkZLw%z{PAU&?q;2=*g#t#T2or1VX zJ5Z8+$pXHGC+$Mge;H{PlBPR8k1Hm#9YtY#lq79oue7gMK$kto(r)qh(U+5roHfEH zQg*^YqbP?wNqDbSlu*ChIZ*4vvcgn zCo$d;VeuSMJeC?>_nMk-K)gRJbMgrL?*`Va_0U5g z=dNY?-L;5s;{4XG32~9OvRCwHUCaK~H2PFKDKZd}*7J=N{=FxyA?g1aX^rZ1`D$FT zE89`!==)lF2V|9g-qh^tBi(vpaLr>UYBG(!f$eTnL!SM# z@l5GNSaE_tcB=;RTxO-P7V@OsN&2~wb{A>yH*m!Pk0TVzdRp?r8Ps$u!unuDX}?mt zsreGGT8ywTn(=@%e8L^>zS>UV-pHTNMif?Po^&sgChhcfkiFFU|K_LjCx&-oKAxM>dRQmnB(={_Xg-bnW$X@2+rxpH#FKch5hdTk}*>tSQkMe7jHvF_~YAAM+! z_w@BQkvjBIgj;FbWXX!G`@lfImG^Z@gmQ(wCi@_9{4W!N5Jp8cT@ z8MpAB?636jUW@b`mZZT|^k_tFWB)*;ma@MGiCq#;x*th*G}8SXr26RTB+R0h$~ff zr2AOL8Eh(B*>+-4o;y8={NdiPo*0`3St*VEBa9ULT%NQSNxx~Ny;P@PV_OfTPa#cO zuh|(jwwgU97ezwq&IoOs)Ke1LcJ^g^{;sQX%oA!5X||5S?wcn)fTZ6t(gV~_hrQ)= zq+bt4)Vg`pdNjh#94)Q%1gu7A4Ra?Vbr5^bB;KXnpIA;ss-0h`fVfatvbDU1+Lh<5TRJg>Xp>AnvAwC5=A@a}OBd2r>B|W?bYwK{|gdVHi zt6D{RvTqe&r_z%iNYb5*^g#8~e?E>9@^|@i3a2r?Cqvmm)~}VrR+DdZZVU1>!nP*) zk<72Vk%u3W(jPGmVc!_w`sr8sK1kl(@wU$a`b1=P5!pczS>K54;E1eWM0Q9-);}UU zG$I=iksTJ14UEVRkH`i^WJg3~^%2?Nh-^qiHZ&p|7Lg5)$c~K2j*7@eL}W)tWXD8g z$3|o$BeLTnvg0GN6Sk3I_YeKgkGMQX+;?omY)yc%>PhQJx{Hz4iS+9m zoYr(T{Zz5&`&y+TD6K2+V13GxsoQFVc4|M`>MgWlp{HFK!~F6KcxSdg5S?b*{g9`e zy$=El;zIg~Xn{lhnMdzQI+82J!BU=MXx-T`NLZTTgm0Nxx^L z2dnk>d;nMMb~~?TIqt8aJ4uc$xRGmDw-$C1BW2s^{A%+Y$V+D;tk|bG4w7Q%v$Czt zA3TiO)LXN?K+FN2v>!>oZ>0T1`mdF^?&gKOnxyF|jC0Hsr!juCPgQ9;L(zB>ZJQw);=9LbDyor5AyD=4eu=`U3*A3QZxT>%-&mq=%8TgOMJlI{o}nT+tBJ>FVj!#9FAo67kTg+lcB1 z`G!RZN3dUq=iA+T|4yF$6`KU{y(rOrDBd0tH;;%EewZg6NYWn}=|GX5*NQ7n59(BJ z%*YOH=FHw4Sap?OqCLHmHor{Le9%MOGe}UdRaB1^a}>vt?%1t)L<;ZFlO9ge-Hh~b zkLhX`u=4eS+gI11g71vEA?gz{ZdW+@J zNat*3BQR|J(Aw>5bqY_~lO93Rjz)R}Nz*qu_W#u4NedkNg$77^G$SmJ^QpGa#?d|N zI>>bjFzlzflPG6s?CjST??7$p1KElY{=FxyC+Sa&v|gk$N&5HOcr|h-ty3BAfv`q( z8u*@x+L5)EyN7wsW&S#b)S&sQ;t4QEx{)Tz$uOIvuuQ(V_5h}0=1DK$eeAY?scg0KD8$R-U07;(8S!?HA+&D@k@QXGw=V@&A$9#sgz5?A z%Wxb_nq#exwU8$rLeifa=@9kPi|C;Y4C++7iaJv{kDhc&|KDmvy^M8Qbu-FuxquXP zVsYhVqn>uiu96SH`>-*o*3bR|D^_TpbSO!4Mmm(FrQ2RZ3IAT}%bCR)R5SGkjt&JyZ2lX)^d)jcnZXFw8OTM9(GQBd7#&j6Bl}j=}g0(E)Rt@Ud)~X zVKwVXhm*A0NQaBGioI-M(E6qGSi%s5`rGjpGbQU(&wDSu6M1SbV*Wl1QC^bQwd{$y z`-=HWy+W;@y|acjwkJK3q(3*(BT1Uhc@`y{OYdD;ThtB&+ruX&EjE@)GtRk zPdi3IUrq~;v~lRL0He8 z5bo;P)71lzy4ym8%`*_@8W0-Sag67^q~f$yLb-Zt=JR7e!jq05=`W0Qgh)Ru;yT(S zD<_eMUk!PB8ny1v5W2EFoPYFO)6LzG)1P(!MO-tI`iUeqUr7V=i?@r7DD0AW(xXYb zhmjtw)?c^|*L{QSsB&s1Q&UHTb7=>PTCb=~wc2o`w$lHuq2ySS&C{yKd{Oq|9@+H%mda%!9 zD;4%1)5%qt#bvh`rdjJ_N6C{OOVZ9pdaUa7{I^iTq{n?Z8(5E}21q*c4$7)!=(5vW zvZvkGB2OoIH$lA@=}V<2QzwZktOr|5XB^!MO?8TWE>Aj=q`xxKks^JER%!|Djqcf= z*RdAt%T~v-Op&Ti`$95nDdj1`aF(~z|DpfXt&N7v{)-g5Z=Uoxl6EoD<3zgQ3Fs)S z@S0X%f_U11a5L*S8RJv!%uYR17b5I13!&|1@owzBuTyyy`#{Arj~wOlsIsruVNcML z9#7I=8|m@tr}wYLb#HTQs7|+>MNJ$P+UqM8C?SQdO=%52yi5$j*((rbT4uMP%nkWEX5B!*c-iKR@CM9C5#~5m%6HC~J3Z z+m0RcU^wTOE<>uFUFV!1rLvui{=7?BF?kANlw=R4jx#HUvFb@1NcvkN zZBU(l@I0>2U;7nHGcCQ&#BJe9s^UrIK$bwy>eW?`TpSq_fFwYQ%q$>^far;iD zX5o=W3Jc;%Pb6uLk)9~h7q}1f!fjqtN!E2FB{LA(Ux`qS$Xe2Wy?GH*a~Cpa=)vf2 zj;CB#g>|ZSSIuTK1MHe79Zk}1Mmk!g-RW!P0@75i-x=j>W&P$y1!Z!Uls7e3eY}yW zAt~pLij!e`2O8AwmmF8pr1veg+S+;xDb8fcs#CS#p^*HOeS8xw zTzGz{GzO{RUPidrYVR?tpJw0Q#w_khPa)|(MtX|s^hd1I-W(euHJij%E?~DX#rLae!|X|G6|d#^G!43A$+MHT@GU&)sU+RkNKYkcZs}%d+Urf~ zqmKD3ztl(x?_PcGTkR!$95S!)~E5>-u<^z#~Q&q6B}+0Ah6 zs@hbTJ*$Qv=1IqqbUz~%@BBW5zrKC`}Pbqep$lb%k}o<@2) zNz;4R;ktdLm8ANTt;RrOGg9-Tshg=bW?858Tu16}iH5uWrIVSzzrV^o>jSkksL!^8 z#O)Gk^#Y&Ola43p{zf`pq*p$TD;BdqN|SbXWMdXxkJP-zjLK1X805#J-V?Qc_-sYq zSpImV8eK4h*-DM1<${sIllG)%khGVPo=k&k(;h1rPfIdGnBT07mR+ML5t zQFAxs1Lq(tH26H_QxGqWr$kn5gip1v@UWk{Ju=lP{CiK@NYVq0w2`E_N$hK%yx=vB zoQL>*MT8yc4|HN5u-f5BD~>|yGR|xTlG;;k)_CC@q?UQD?0o4YNK8XL;~atcY%dV2 z4o`X}NqZaVnIuhet8rb&8@#5n+PV`Ywp$&HYn!9GAhmWe!WQ~cwx%Yj+1Bn}r?t3J z!!X-n!&=CbP9W)lMmj;HmpuV}Ukfb1Jx}47>2)~$}~v9JS4p%CO5 z$oRg2gllT6)12f8zt|7J3eA&FBx&AACz7=0weL9lRR0USnP{!^-4)Q$9(|y+!%Hqq ztJg!K+H9o_AHn{x+lNS<{5Vqc?A>CSM@!POkXMmQ=P^~YdV@#%Os}uBeu{OYC!Ivn zK1Mo;r1M^B=NNNa{*PLbI~l=pinE-gl#+BU?Sn|mry}Ptkmiqn9q}i5XX{zBBHeu% zxw9yzo?9L?QmkfoN$MOM)_;>pdXSM$R_i~(x$p{(ag~#!4xKk1 z!BHRD8{0kWjMDVZkDW)UW%<0kyHBp8R`vrN;IP;>VEDy;lH=@gP4 zY@|~}+UFTuF(t74E$2g`{vL4dTUls1Y zW_3z!*_XDkOX5k-Cg~wYdbUVsu?34WyjDA>vj-%l6Dbc@mhz4EWGdU;zE%}@OGesN zIvLviCAe4JvBHj4r`Wskr00;dzmc9J(hiqH(}?nECb4hxrk)A8k^82pL{Bf-;pISe;266pGkoy)Pt|tR}AG$P- zsSJx8je1JGWTw~fQ~H7V6Da9`aNQiAs$FmQWmVj3cA5_RT%L3qNe39|G?6ZN4p;n$ zD8hzIoE~ zNP3u&o+r{JoG;5^>-V8nwy(X_UlWu=x%>{Tu5D$moCRh>AD~oFZ2bp8mZyVi9J!*nC{M; zT@bc#{_<44Drn{)G5ZQCv75Wy^%JFboV=;wO44x zWN&Hdi?X+EcO+S-8+n)JkBN>H#R5r#JJxAfyN{4Gd$s}#;z=(g>0l$hP^7ioS=C$N zrl~K>;k<3$ec(r#_t_D7(iEX~V#B?3+qVi=fz(z(sv6Hc7}zyWI)kJ`jC2M`izC11 z)>-+wulW_>=Um~Pb*H1q|8gT(4quB$>%E( zs#gwN$T(=SnRfsrAKh=WEv&64y@;ekjr1bbslEhKajK$|v@$%LVKC>1^^$55Kz)=x19c+#099cH96MY`x|=-73&*Q9sZlVOm|o{O+iBZs=vk&tLr zb=D%p=Uqt&<+_iSCP^YCt-WdB)wHzg!m!yR~I zWS`ZVr&IQZIOa=FI*X)78tE+6Y4JMf)7O7>&#A^fM{YWnrS)S-3cZ`I6T`XC%L*-- z{L1}F5k`8cNOxF>>*fcm3tQResBb*N3JQ%k zhV7;!)mAC;YsqELSZQ;uoityGT46it&pd5-Jf8G2k{)fOmx*-ti@4&7hj<-z=o>bA zX1jrXqkghaEo(K)I-0u-@{QLsHK;*7k+IbaEkHr@s~F8D;3~J%tvL#Qm?xc0(qoKt zwn&Gs#1*@7#bo!d^=b{|I=f!+Mj!WHv{qVuE%KzNBeX9#YgyudCH5d{$3-1xZI5=@lYfITt!M!Rp{2!aU<_qx@-%9}uK=W1KZ^r`>8P zQUBH545TEq{9iWqI~yrHX-|43NslwqD@FRr5@@x*qRMitr8x80)3I>u^I3&v|8}!+ zZI$X&ywp&n-)MI%_9Mv7xYdV7R92_(?>%WVNsl+uW|6kA-P2iKlZ}1Wh@C0 z+H-wD!t#eRuDHTF)%+TgDqdxEidBavokP+SjC77j^Q> z@hrwQ#wfA+QoSpuh`x+8v;0^KdD5#$S}@Y9L|UX*Z_mP{m7_)Nn;%LR_5`C45!=q@ z2#uVepPC(L&ugVK3FD3l{}@`GVuj{OuO{gqzOL^AT`khh_d!ShMF@3udIsY1Oj}gf z;mF+&sakEc(vvRG+E(ltj7J{r&>GPYuiqqOcRfe;6zfJ$I+vuQtWM{WG=JACPDi?L z$!i+hgm{jYrYF}|=~SPZAB?zGR*kEeQx>k?=P6x8x$FjeYguDV^{D>K{@|Y4h!m?? zPkIeW8;tZC)#=5{p;i0AR;QeWbo!&r`BEoIvv~!t$pOzv7D9^k}~&!dfk9{X(B?EQ)1sJ zu{B#bvn`p=)S%X?cx~a5;Hn_i7}?WH*?B6g{5|P)Bz@dSuT!1&UIu-gR2oTb?#w}M z-`EO!SvAXN*xHPEPP1t+qH+c1>Bx{eE50BuiNb6hh5ZOmI*+95jC7tzQa~WsYj5SFkXdF_B7Fb1iqAUg=0UAhoqT3#V&~_y`H2`80qyQUCr?jwv;_RsR2t~ zo)gErT0g5Dq?Tz8WEQACNbSQoE$rBth}$zFO2m~5d>kXC#jv2qD zO8X3JX8d!Zp4+D*AeqY5Q9(7U5>&r^k-Fq^gmx~QR>xSzLtYfGbPk2YQl&>>cJ>GR zT%L43N!J_cd~5xip+oPcnWlrNl|8GV(Gs@Z9!#x9*xJN+9Yc;~X|S^%?8}l=tQx?C ze+YACPqF*vNpB+Q(?)ueNJq{=Ijd?K~H)!NuM#&n?+h)f)aM1-4v<(U_G_lqIHS~-x2we!T4eJEc`eRUeU;w@D!Mz~_Bp_Uh-_g*c56hoC?dNpB3m4h-5!xG ziOBAV$nK2D?uy8kMr3zKWXmG5dm^%yh-`U8wjv_CHzHdZk*$iz?u*FokH}U>WDi7S z4@P7UMPzFtvWFwGM8# zg}#VcQOHXiS+`|l0I*w3q<-I`mbFUcv9PUsHfy? z5{XwO44|BIv7Tbv+YN!Gvs1US)v^TryneIly0dJRjj`%U7n1Y^BV8!clOBVPuJ?FN zHB%VpY&&f(;^FS7)iP&~mGma`b%;dPjdxQ;&nA^`sQVk`^&2VM#`*JF6TpIa(pyRT zqLJPz(r4E~M~{HCk+VULx<8qR)RNXAEYsehr5B*T;nsnEjJ=P*JVla*dsXF-nt9}J zyS+G(!mfGJMI>!C(nTb#|IObVOa9Y0L8QBFreC5O`Dhj7{BEeF>aU6x8*tS>Uv^>I zlc(T{L9KPZ1y>cuAk+@m`U@Ek7&S+iv%hczYwJmGBk4;{WRBGOq8q2w!W zXZh4xl+Q|QlxMH7r#&iDo;H0a{mrhliPr{qlc%?ssAhH5!Ct?S$}VT$T)-^uN$()( zt44ZHlkMTs>vF)Oou!T_gGY?^u5h1S^^j_x$82ucyJ^)_ z6BS`M>!?!;(Pr8((8;x|S>a=A(u8>D8a+V)RrRiz`94etS#;<*Tu z!3@PH3eKjzXg3n|kifRppNah8nxNvnYq2ZL`YC)?Pr8hxZyM<`k#4=76kMfIgGJ<((7_xkual^6S*{4?2X|~4#Pui2-L(;d5^d6Fy@BOFKkvsMS zuW9Fni1Uj;>3!=EKPRa1!pV@7vCmc-_7dU?)=+W|LQ&{%hSU}**$1KCcQ?k4l(Ws; znR)e7`1hW)g`{sAX^ZM~#cjB*<6K^?8j=6j9+L7jgyES#^F}%L^G!(26?knYhSXsD z0YNP%@)enCyozU*AFB>ex}2o%80m76cHo`Qn&rz0x$G_W&`PPdl5`elwvu{r2d^Qi z3*sW;eOE9_Pqt@`wU8%WLDF}PbcIN7+~BmPIt3w3HBBf-Ud9aWz=V6&dRI|rI;*%s zpLMIxFAb#`kk~Wt1o2!0LZycLtNHBj17L;bN$(};?~L?bk@ln|9TN0J^Gdjauh&}t z*r1#`#=9Y$)r_!(o_9F9%O^r^BNGG_@7;!^UpxcEy3v!aBx%`5SBiAXqtIF%%=+DTbJ}JtmYE!c{QA<1z85$3B1(dpy(Aw?9=2LJoR1}8T_@QWH?W%Zq^n5!o{_E+ z=_600oHrk2X=35*D1WGi*2_*LD76=JvgBU8zdT2Mf%T~Nt)0U>dov_gnHIxZUwYJY zvo9B7jqOSABkB7_dY?!?XJ6ZA3AIv(?U!=2x-Yo9`>>~vD&aupR1LEA^_`p0+g2Nd zGpLO^X$b2ydvgIRe@}WpNk1^s`$f7*YY|!_yXU;9$yi`~Ur7?Qdr(f{RLIR6Rcn&P z-ubkgysA3TAYO&p4jc9(Jn3qZerTktMLKCNbj+I`Xj1#KB8QR+4GHepc+K)-m&B7kK+@kE=>sAyu0S~xg0Y`#V9A{kw!08vei$XvUCTJV zxZG8Umm4YR>+{&tnUF3>HAdY>Pb0E;(%KDBn0 zwdYtmxCL^3*VpReXh`%F^`hm7ccqWBG3Y<~62r!;sgre=JBe{oS25lNVe>>I#XgrO zT|?4MM!H6I`f(9g=nI8bBeeP2QE#1q)X=Kiyx);>`g`^)Q&xv8?wpLfs$xabn-YCg~rI^kI^wJ3kH`KVaR7)Sgo80lB_mQ)mpz$urJTbpEY~=P#o~)=Q)l zDd9Y3cOQ7Kl4!@mJ#UpSg*`z}`UpusHqu8_r(+gE>yl>bW;ymukFC=>iE^z1l&ZR; zKa#S=OD8Z7YgrWedP-#Zb(QRc;tJJUv-4Egsr00elJrkT`lv`(-axIY7wRzk$dQwm z#cVrrt8rCMD}sZlA!vPDodoQ*pCQIDgxB{~J_jhdJKpv=z+(~F+KBA&h-_U%_C!SX zWJLBuk#$Tmb|uSR6AMP#o> zWE&&0HzKk(BeJ(5vbQ6$cOtTPBeLIZBg1n5^glo1N*r;UZN!x{;-+%OToTyz%p-AE zCM8+);5oJJo6$CGp*6O@6d2}_rPIig4G2eHIN~zffKlN|A0z3Xjr1{*7H-1G)=pZ5 z4N4$S#xvyl)9j?={~v4T0%q5A{{M}%O_g@4sivB?r&HCbst$r6#jF1$xVjTG)sT*6EhG8+ww!Ruk?*ZxCBE5&C z9e=PKYM7;v#qUY0(L-)^6t0ZQ?U2*1f?aph4EZ|lDu33K7SC49f<)4LLHdqJ?^4(sxCAA4wmD zSJ=dn3_8NMdMqE5)RL(d_wx|FOM&+ACcG@Zf19x!p`nafnAWl(>9w5>lwV+DKqS2% zr2i7>{UqIJma(*Vf(}}sWZK|!ydxE?>%~1EW1iyz2D2? zbbjVLeKBZ$!?pL4HPu4g2 zVzgpC&wv+6E@@aZ>deY6o+35hB9cA?()UIB5J~Sqy$^S!8E2kokEIEgL-DLF=nB&Z zQD{&n((K4~O z&N$WNen!al%N;@k@tmUxBb9${-pWySo2avfRIRWC?Z_M~q9$-~8VppYla7h0y*&*nX|WYv}cF-C=S4ULbPTSAoX`dA{C5cJ`H9Eo7Ueh7abM zjw-<0X-TNaw^GBN6&XBZ5om`LQebj};dw}LiN76ro^dph}nWSstZabXUr_lzM zDd&^RO^Uk@?qKGJ_gY8=XSQv@*jZo7>~v7XTM}bI}JVtYu{!ak@Rtpej?JxNjml_ z)7rvkLDWHyqo2vE$5~isPuWjUvz@4kYQ@s{XVuxr28nM8jx>z2B(=FvBz*#;pNjMe zlJ2`SXf2O_8oH?iR2=G)c?p@v0I$ z1eGt^IPa`-v`B4+7D=B3>1QH+5~Oc`=hq>{GyDBCg!UJnLjC^Pa)^&LJ6qf5qYzey zy=D@6rbpdo@s($Vu<5XGgtrH~4|>ZaKSL`Dwl~;>c1xc(-Dh%Gue|?*h_fWn-!S^+ zJ3c8=n>R+%r$8E}SJ|D}8QD`HtvwE|;ZD?AY3ztxWeA-ZUe9E`+?RK^k ztu^dIH!h@^2%DfUB0$1lM&Vi9O;}&B^kGb4?b~cNl0FU66-4?pNb?OIwk!T+C8&Jp z>Cq2e1*Dm)S-l?uKLuZn({o_|&H#6X)cro_!BM|>(cWvtJ8L$_j-=0kbVZRq1Jd$+ z&zp{S9*CM2qrda3B)7xbwz^hUJ_so>j_p6+;?w3pLaT}r96r?~tys4wSNV9P(YTaZ zsjOv^+CeH)oB2o5zkqZlk^TjwS=%Lcg@3nFD{SkToKGX_zNk;@*=%Q9S=PH-+^sTi*fXpgt28NLSj_AC{3_hX zBHU%usg_b-2SS?goj1FdcR-2LAYPX55S6K|l0?#HLHZ?;KFcz#o^4t=bC(X41@hn9 zLSJ5*n_3^wf{h7bcLix+f2G0Oe2~`F3MCASS+uR)MAGL#`el(mN78ZUSU&w-@7BIJ zPhEnvXs5Q$6-i$JX6LYZ*r& z=+>MP?WlB!*{VPaM`U)-o zUrBo5L#E@oo1>=r7g)T8@p4VH4SkP-y4#R)h=r@ou~5Hvzb)iQqc<7HL`kqlA!Sjf zj9VD?8qo6FnqVY-5u{&LnZ8KU7Wn+$57xRAT3Lw}+xHN*IFy&Zt4K!ID)lC=lhpYy zykmyN-XB}3jHG`9>B=Jg8%g<8Wf*vQ&pBEjdAYLY-vQPd%7#`V`bA?}Rad_`Ms`1H z`L>~wW!td5KVRf?fbMX|%RdKrDIt3~A$uhudo>~ZdqVb)gzUA1Y-vLFdP4R_LiW#u z?9GJit%U6DgzTM!tS2FRHzE61LiX>3?7f8SKMC3U3E6)WvSkU`2MO7S3E4*p*~bal zCkff73E5}M$?Q3RwZGWoy3ymlrXJVL9=G;v>pSz$vQRy47sO$w{9ab|6!a$jQa$bM zfk;2lY2b>&Hc`Ug-I4}x8wz`Cy&{sn1kzPR`VvW3t(m@Su8Ugf!O%kR_tP}yA_u)U z1WT~+JiDrL8m=7?HFR)9bmJo5kP|7b0>+jwveVvLUyYS6eqD(6w;(oemm)qGp;H{PEl_3px zHmc=dBq{G^DM_uc8It1nSIw?P(pN$H4UxXeGUe~NHlf8y2U;jS6798gZBS_jSU!A@ zStEe+wTiVvM@KIQ_n|Un8z{U&v$m1+?;vdw>EA(G9`T~-8|-E;<;lol9}D+^2kzfH z=$T-0u0rmLHa-P?Qu6??w4HBhD)cBpq+QUS6lGl*%KqUPKNWUr4f3Qp^pjFO5 z>r;6Rw|qE0Rw{^d#=?B)7oe3@FwV*oYeq_@;R-FvT{_ouXPHK!NNr?_q_2T=HIcps z()_5u1s(a@4@OP;y+BaBceTkEogB}q^}!Pi-_8wZ$6sTi?g{zx8%6@f6h~^ zaZ^tg^b~!};&r5jS7^RPBz*&<-xlc`Bwcro>ErVp>0pVpn7j!q0h+_G6o#9eWy&vK zYb|9EHIl)#@;w^(#gJ2VaXUy6+KP-~I3DWO~^i7g>+-UkL-qYS4IiP;K zPC%TV084?SYnz;JW@s0HE5U3mu5uQmZoeM&Fl-g6d54koEs*vX>02PJef)ILnlGq9 zH?Hmg9p`zIXPLa~h+0j%8{- zYb1Req~8_k+bq+4t~4FfP|Iwm@k+cV--xFyMN%wo-^zHm=)OtYG;-hVyAb$$2V&bLo>^O{+pex_E z*wTD@kDcvdi$?wj%r;3M)1W6m?QUIA&*0!Egx&qDeVcVe(sw~RK&0=Il)nz>S5Rfc zSvz|nH(#?&kRa5P7uqMvL8?7A)If>zU(`Y_+HBi&i{{brL)px4Q}asF2Kes)&RfvIylr@`MrQTsMSi=_Vs=?_HuZ;<9A zuo8UeqNs_zi1vKbt4!X_bzJ0G?m)_67Pj1CA%BC{zwc2+-_Km%uTH{Mq$X)!lhi7z zeVaE%()U36Ly^7*(xxllvn!72j+(|_Vezv0Sovo6S$u2P-#Sh<33juWZ(fWv_n5?g zvE>o8(ACi1>E{lbZfR8SY$xlRWWw)7YO~o$`X7*%MEW1rehocj=_IFVQ^W^YC{G%8 zK>5&r>t|;tYl?A^3Id>T-MKT?W#X z`*GEB8Axl-TU*O^!?;LIi&&=^{VOx=tey)o2bMBQ?OQk5*^GDjE5wmTZ?cSzlG6AX zFMKJJgb{&dYO5rX^aGIoSY`SF%QVMaug#C_n?Wo3rhYxG#pQ!~m-QxfE6%!hDtihI zD#zYxzp$sab`wcI1nHV0{ZQ@nddp`ZR)49re7H%-$dRXR4%{DH=wl^}Joy+%1|me6 zW~l3K$|-Rx_F~VFenXY1ttds(k3jkpk$wcy?yKJoSCp1^$9&$ySjcavJ%?7@4g0_x zD#*XpYBT2-`_JpLYllyc8rDXuSb7#DC~^L3oa(&<`NkH8y<4n(Tjz?TAA@u)k$%iF zEXT9@`ctz>xU*ez7q$v$$hJg!-yYU;8kmM*VWn*KEs}l$ z(w~a-6Ozuo(sYb=ULSjUZD*7BSlJajWT=}&XaoGkF!{|}Atln#Z?0)RmYD|URjc-C z?QG53*7|HsFp_=>(iV|^O49PJmctS^3YGRZ39SzIROCL-QFfMI48PAzj~$H6dF$ zA^TcFwn{>_YC`t)gzOs$SyMvx&4g^VgzQ@hS-*tr+X>m~3E6iNvi=F#cN4NT60+|l zWCIei?|E;Yam-SgO{4X0*wI1ic4We%n!0yxzv$N_! z>?!oS(7#$vv$NV2+KiM)lh`S^Nj$5bOKmN(4c03n=?WnIxky(a>5p$W9amlvHSufa zIc!-Kt3i6MPTd2M5;LzJSm}I{Nn}NkhF(UA)(sN*xYUqA1MO`=YJD}5t_ad~M7knL zbLi8~erjrlChFs?s?i3OEKQAT<}77MR9^H~IEGLsM#Q?(q`dH7&4NVIl|cFnk*);N zTJRda;fqxZTV3gt;hS>JdOEIJ4RbL+&nh2dSNShnWcxrT=~$W^ z&G%L9n_Y{feL%XdNc(`a^66_qM}FB8QB&&$7Uz29YqwdP?^v=#G!B?=n*Z@WJ3Afo z!V)|PrkRQvVfjouOG(}8I>#1xnw5znHESD5zXZ}>iu6mY{ZZ%@-4mkLx|LFT%XM{! zlqeUD%UWGwNwL(}TD+t;|F!U7Yz&B`Uj}KbNWV)G zn;}7eQ!RTIj?Vu6n4TKE9vf}VO4-O1NxuTp^+fs=l0Goc@*FfXvS`%_GlK<~Q)hd` zv)U(w*~`T9OBnM8k(S?V|-S8r)K_Odl(f7?~jig@(=_XoZ`8vzA^-9yqC*#twi%Gas zQELONU)~2xkk%HXMvXR%t6fOby&p87-0O7WtR##V@2!|89ZA0d(v4N7-ymt9s%c#? z8M=8jxzM|{D(x-*R!E7ni>6wc%Mfy#)(+!^p`Q#tfkQ+4d+ZEXulT5tO!k**f*$Qkp=ir-knS7NQIJ<33(>=xF z-Og@xv)nytW@$oOCaKMZBI#-%-BhHjfwXqoGvSK-h=q0?OQa30k53;5qZL;iDWAAy zSX(QD^b%N)U>QHxunc`n-W7Y!0r9LnAhh(*S4nC!v`G3bkZvZ@Z?X29Fh>}dx7g?p~3v)J<-Xmpp77w-YuY&Md98>GJy>9~Y@*t?Id&vn9i*F! zbaj&6I?r;Tt#9g?=5V>-B^POb8dU`4vo)9c=frgbUVRr(^_&Y(bh5Eol6Q>miQXsqKZh?+>gsSpK{NXK6`&J6)UF7-m+o zp4yWZd)IB1B$9p?q(emdU6QVj+MipETC43AXUS@wIx?PBZ&}|Yd^4lt2%NSv$zCs?zu4RnBkJ6BhQ&;yY`$ zCKyS70Me~R`U8?yE;X&SKUm1N!*~2Rs`Q{{>)z>7>$CLT9HVISTcd`Io+0X2?QuP5_(H5IpVC%`W!-<3R*N*s{H%NHTW;S zXV$%6#nPlUd$0P7d=5|wcf9=j06$8|niH}gCuD0TWIsvB)=J2Jnvk_5WIs#D)=tQN zo{+7Rko_VdTQ?#5WkS}Pkgb=Ht)Gx>kdO^b$Tm#KHcH4gPRIr&WSb;pn+v4=cWZlq@+Kx84dRkCt};QjN~uzuFjFIICP3FXjZ+S0iaNNJogY8KmW1pD-QQ+!ZzP zOP>|^po?LROGm}CS|7sQv~-zV-#{80)3i;pcurdlBLDP4>sBR86L#x!v^5J7Nq-E| z?L_)xmT4DiuoJp@xAI?+L%D+dogbz79LCm8uBEVMeF<)ktNh5|O1!R23;)&ZS|nW) zq}z*hO_FxZHm!@?7?yDyKyIB!*jerP2fJorXd7WyUpQN)kBc%Q1)sV2JLb20>KLId z>&9rLeA-MxKefy{ZH9!p*GC+_AzMgBKh>8S{1rc+ z@jEe><0Yw$0g-eqknSMTwMbf-Z#iFig<~0GarO$X_4+qGvNBR)cBFVSv*tHP@g_hlM(cCbusyo{tRAZ-(A3(IsgtkfXp22Gl&!e1)G ze=Sxbg0A2nfCw|G@_`oD*%rvj0_wWmV2v|1rYw4tjpC8?XCU24q(39+e?QN2*MJLDG{Sv3w4?9l7D2OPrImnq*C^Of81Tp&VeJ zvXOSS9ez#Q6pQ<3fKBZCY^NaNJ8qtlZ$;(BXlg!dBwZJzyNYyOkd_bpOUNfLV_ry2 z{Pm^Ep_c!vDC<_&ipwXNJVRR^kKVW^N;U^OHE0}h_vcq%#oKIpLT$13&6AF#zXa)S zBK;*u^M{t$6)!)4{86S&r&*l#bm2u7=Qrz_1M8H%d*Y3Dc9rujY&yht}a-m;y!SziZ*6T=W{(U5E1?lc0ZDs9m`k-C0;>{K^pAOdkt|pmt9^_mVKt8et zWs}cBiBDvY+B#~ep+0;&)qI$wjyLo}lG>~zlCB5RQ6gOrq?OXkmc!gdF`u3@EM7gz z!g+Ho>~`ffd@53!7n8qpuf?~y#lrF)kb{C>ZR>#z;oUc}*OAeM)%`_kbD>DOK1lZv z>G~|wKJY+$&W!o!{^5agjH;U>uZxth`!?iQcwNa;-sGl^J+#sH!H%CPYI zY~C122ZD4jkq#v3qfZ8{`Ez$8Ph8E~?*zr|=o@u=L*RGt`O}`TQZvuBYfJk^4Qwr4 zCqmNK!ti!d2z4JU%>gC}Hi7NbX0wrWLy(RZ>4qfzc)DG|Z`4T>d=t*ga`fLipBOoC zbgXj3hsCP<{sUL!d?_c!<3MIlFGy;0>`1y1NcR@$Mj$P{{Bj`8w|LBWNjl(ci+3Gs z;m0VoZtSP#*)H@hw#|p{v@{Rgg!HubsFfNlMmszT-m!n;_4$fbxVF1^v({$*k#u8_ z?jzETL7KOt-q*U`aw7}pzJL9G4TVH4Q~s6#uZMp$n20W$O-on;^IhqJhk3f3rnpV8cZCriVt z5?|XPX|vj?t&&92O+Z=^=_VxYdztAQ#B$;NZy$4@4X;~WhY!uCEuFBE<^3$Z-;w5L zh$8hijJagUr69Gnn@GATNcR=#rXcNnZl&-AvOMdFbS)Uo@q4`a?T?$h1FeikQ_0=XHgb{)3w9i#dB5KqJSMMiWtTMF~rAWFNNXLkDGq%$k z;Y+Qyz-dBBu?^gTF`aX1<+G8c%sF;mXYr5Ev9MZ+8u+$*c}$dO<%gxodPh7j-UhLC zu1GoiTp;CNNW(E)UN z#!BAe>kqd27D;~v(y=1_6-iG-O}#lIYORs9WD>2|>=Msr?Bi>iWWgyGmf54$ifOd3 zrNv3S2J(`$*imC^f{}D{knS(i%}JWUR_ZA(b-*9vs99ofDaSmuQirxy+aGd{1(2wP zU^Jx$N%}es%!OewkFu4@NV)|`4-n}VB)tpuzKm9yS7S|tDOfUnG4I*Jd`i;IY2qw@$%0Bh9qP|6S6H6vSA6?RteeG3E4IY+3x68FglxxztSuqiDIwcAA=@P(8<~*pnvm_5knNt3jY`P&NXYg~ z$o5LeMki!@CuI91WWQNXX3qhv{ly+vMvpsCJ+6!%SNrUF>m7GL82d{HM&3Cmn`B*h z4K0)6+3FaJbG6_i%m^3FF$s5GuuqkKXOa^7qgGeiqXzZ6R_H1GSL+p#bO=b>MLLAG zf%|$p9E*1S!tR85P{`AJFv=O$RZkE(ZaCYZH8*d$=uH@n{l&1D6Ifr3q(eb^kVuD; z^w;nLN^WG(`WRLyv`cJH@G=Kl;|)wgKUK4TS!tut*y_hH%**N+c^}2^2AKtkq+5dY zV3BS~(ovXU)sAp1^ypD)<=r6%S6x1+yY4YKi+kexT1vwbbfv7dPTs2zi#dVWwMaS) zq=$%f7)htjwA`Bf$RI0j@(MFaO=@LX+3<7>b1UddaGVP||Mj}sK1j1pysECHld%Xn&$2Nf zl5P#sLq)nZNgtSR`uJ^A)?Jw_EheW0$h>z?PX*y%)Q5I5xOoG;3GL1x(GW*nFb4hM z**-~aWQwHQfb=ktZbQ<3@a)=rnX>lL5-Veo!%&wGd@#-l@(Cta9Sn47NbPDOQKs|@ ziq&-+FC*!2kp5Pr!$~^e8p~neg)X1pAP&;f(H7Uti)Fz+-fZ$Nc!go*F~mI!pAY!f z?bnIb>quJcwzE+@l5Pvq4v}t4((l9O_qi3hfu)8OD?UqY$GTt-cs1u6WGTzLT6hh{ zg(c{X@?xQ3!kN%U-w;IIw97c_{mQUYgSBtIMI;>o(q&)fn)L{h&W2Z*Q8zX1fP9)Q zY&#P1VF-Daek$xx2gai6VRn|^y-<148n8w4s&$GmX@f34}@7elFot&F?rYbV%QwZuYqknmYhJA8vO=TL4G;{2ypadZh%oE@avH}5c# z{u-o5iuBhcuU0i)PzEdZnTDpf-jZIciE+`-SB< zpEZ*10MhXy-2tSvcb_#K2i+ev)lgDgab9qR$uav65J6Y57PpPb2QRR2+GQ4UUpCY5 zE6J7pO-_mWBpDrPn47alnI|1dcLeECBHfW?`b^dI4RUK}T#?k%q(_Ui4W#)=k68|{-xBlTvxj_)N#rt}SuZnvTv}EYDl4uG?HFlI{%B2_oH@ zq})x>cAV2ni``@rjZWSIfswrWX2?ifD|yJT_>FLA5WBZnp0ucao1sP0T|j!QNOvLW zz=f92ZJ1|JD|gp&1*rQ>J6mFFMGkrjgmNsSZA?4M(&#A#((tK@yjRvTM_e)%Hs7w= zR<&>Q#z;C6q{oSLBuHyL?^r%xc@eomQx`^oCRoy?b4|X^x$!K2p`HHLx1TWi`dlfb zw*U>5SthTY9k24=K+>KZlyd9gBDL9UB;6IH$BT4Vmgz0%75Vv5YndxR!%Z?AK1jA_ zJgevb8=9mO_AF=5DaSPB11uia`9c`}La4TnI3)^;?^xIzJCg1O(upG74W#*V51YRE zw??hqusz&s(pfdRc5@&fuJZB;&tn*g%kWUL9ixV>2^QCTM7(NLJnKno#S>tg`A5>- zL3)BncW0Td34iESH|}db3LDynQK;_O3g;QLrzmmlaHc;1u52%Gv1d}!+w7#6o7#Fr zBpn6P6Gb|Tq-EsBchhvYw9;tzTG4OuC4xA5dUY(~v_Q=+4JGV3B*p0KOH=V;G__Td zNV*3|PZH@KBpr?V%{pT~^52jT-{{M>jAyluTQW&2Z5vvppGWCiF`m?yFWDIuWom0T zk#tXx<|5sbq@9y3Pu8;T6TOA;oHM9_jx=N3LfN5pqeL3K{Vj+>dY$#8#S;r#QHrE{ zf%IgN?nTn+S6e=uO-U2S@j)gpqn&aGh0dZh>7On^%jsqtD3dqjm*w=Zd7GK{`pKqeZj zF)bXw5679|_(M24!*NzP&JM>p;g}wdbHj07IL;5pjBs2Kjtj$aQ8;FX=grh4QH-=+gIBp8Z z{BYbHj$6WUYd98!mcIo=5T0G_JsHNKKYiy}|qotmrmb!PJ6~noX zo8Ao+-3N6?mZ=z9xlgt-&*U0y;T;V+$0XS8k^kUHi$6Wz!rDO=lH!`#7GKQ%2x~Qp zehldtVipv}KYFOPCLBrk0qJCs?gP^7DfB7rK7tPImPHO#&OFzP6ncinQR-BaYi8m{ zsUb-3Evjr;pwZp%p29to)K;n^>2E-Ksz`rB(ls!8H%*6bkk&>b4r`r{x477GR(laa zS_Y{+7+2Tb6AoO6O{Dvhv>z;C$4N0C zzZ1FE(9884sATCiTi6QM!dl2S!T%}jR3OmK+BylT3oB-QHIj}2=~R)90cn0eW`pZK zfZTBP@Y5~cfjQykuyO5qJgYea=3zJAVe-c?C*D zS&&G&A4pFZ>3$@A=^oR1J!hcM)Wfj{_LD1cmHjM@^5ohd#)^GrnY@!N$9dD0W02na zu^fM)pL(?KYEz92X4fL=Sdg9}(y^@l7cMld%iR5ELy=ErA!mmEZH{7;u(RDqBPC~p zevY#(NBqdefjLCqSgh!Lws)wU%1@DlAGIS z>^~hQpLLss{ij&y->$9QY?7+43F;K7o#huK!=4w8wl)St(gQ#`O{52~Oy9W7uHzT! zSubU>piHwP>}bk!Bgo)O?FbdN4>kMS3tvUqHDG&z;sb#QR&Q)d_gTb)=xs8&(@4JyvCu zW*bO+-}l}vdF#h0^LW0IofX(@Y&`^|XN&X@kk&@LW?Hv$mVe^KCgIngSMRd;0(T$f z4wH1-Ts;5PlNNvcb_;84t)S?O^h^LV2-rWj<>pJq)Dhiu5p&^7j@NPlznV^IAv_Lg?Em zbHKBd+0$_rtH6mhRNqb;*{P>^5@4QmB>gQ&&lBlyNjmFl%gsNNlAVX{@))o*_J<~u zKY>xBm2Ge^QZj#fS4g88ZzQFpC{y$ABWVXn&lhP2Nk`7G9J&v2`LG13iEE|4bjSh; z-*_k=h-*C;(>K!bS|1i=YO{_=dN@dDi1cuhzCF+Kshtr?Wy9eub@OS(`tdAnK39jE zt};1S+4Z!X6s&`d+*Jcz+>;i+VquUd4IRetlG=zV=yOt(Nm} zkmhEwvbx;i*l+Dm0>5(A4P^3qaG`qs`(Hkn%u_tndJ?}UY@u3Loa|l=Q zn^M~C-{R8H4h(ma-bhm+V`532_J~7LMz9(!_oi)VS1(WP5 zty_5(w$T4eJ1u4>Hk*y4M}c&vNRJ}ves^1L+~+|SJ=e)h-ikHtx*ZdwMyY)Z{^=Zg z;ohFAd`*My53NOUV=CmuUIm+DN7AD~da+24Ch6&2rmyEzrX31>6^NO}xNFA?c6B%M0Tbj;xx4IOzKw8G=yieTa$36%IE zcsJTj<5$z0O+#Hx^wtuJzHjRhk#qt`FBRzolHP%FrsnM_>{IAvA-5X)wfFjPH{9p9 z1T~@F*bn!|v$!@<*E$=RirO#QsjZSk(qlnd73r}goioF7=sw)#GYE0^5ZVFOxTioF z@qJdUS~fck^c;LS)@jHhX|YGq)@~x{aUi`+q{oqTFxF5?m6(s7`9XJiB;;y$E{BrI z`Flng%e~Gwz*W3g-k+z|9aEdEl&vU5(&IroOQgq>^!p1;YxQ{Oh7PWqu=e!@X!s+l z&1R%r)56Vev{3Knc`n?CR$ItL3FAI2o>#~$@qNQuEFw=1K^)0tI(!xsF>RTi|0i?4!4%yIToj%GIN&2xmS%P&h_?e?;tM^Ut(u>My-@bS)6IO@=~o(VqtzjJj*oN zCHz~F+Dc_4Jqe^&iu5Fw=_PYbN8hufrW)2hIIr*IxW83AOJ9n0J@8zUSI1kZ_iAvj znj`r((`e_I(w+i+kNkVq%axz=1u=W>wT#g=hm3myx9>-rWE@4Gqy>^4xzqB{3HA<9*Rt$cD)?u0( z(y&kc&tWmovR)BMPX_56k)BM_sqjAQ{31|@i2h*Xs1B>!0q<6O+Z#t@&)C~&TlfXm zS0m{pkX|j)Ng&PVy%WkJfAWD?BG+GL@#(N@&);hC{N#8x!w82xZux4@oBWu2Ev$}< zX+~p2d<4&lHRc`>&vG26H4HnRI5L<8iKM51^cs<#!ZIC;SzQL3$#M+4phC{v|CzTV zUS};K!AMH)hu;E`rDr*^e0|;c@@1T*T&x6}U5liXL3*u7Cxf(nf4Ak_i4mTp9hhR}9UH&uk`Hwns0S@7uc%DT+D6h-K{{8Y zr?O11xW{zp&2#9`INxmYIpn?z~265wZE-kU)#T0huJ zq&5ab(kURlPNY*vTD#J6Sj@gb9c{?7$-)xHbNGOwfShe(EIgR(K&1C9jlPzjg)tZP zF_GHH6iH75>GdK#jimZE!XC(tI>>^!=3Gu9UX-l%z758;-aho!)2ZKwg|B7fWh9*n z(i=oNm82!KLH`XJ?W!Ot>(o;)ACTr_!HAZi9?i3jcSdevZKB& znWu#{j;6l6*vDJ!>|+>-OKdpz4 zq0fIir7{lr`_&-UK1%Q&wDFv2nvs%3=x^+w3KP^wUs!&dp+(YjKzh4K&mrlbp0Fz> z!n>1J_|5EBbKw)0cXAXcUwCx+um?@P4DF}RuN#i^{wl66^FA1|k8PncwRvMCoet7J zigY?j??<^b!5WcNd7|vJ*VEe=j*+lKFJK)}D@ML|(@J?Rw3fP3)>)C-Y&Mdf3(`A8 zdM-(4u-DVl@anZtB8clPzs4Q~NgGOEcGF#@eLZ3c1ooE>i+PmIu_NhuAiYzh=aFlrJ0dR=ZPalY%O=iH5L)6=nadx`E|Wok43NP0d=63Gn z9mv5yjUXdz(hS@sXIXl32#PZOMo&7Z7t-Q6fUS~5(hERZ6X^vcorZF$`!4N7G{-LA z9$f9X%PLz=bJU>O9JCd!+nx3DV%)bCrAT@aNbeEpMI_x6<4n)7QByHfF-i9r$T^NP z2i7TOp95f}%7-D1x9u!nFY&Edq`0c^rEHxmlFkI_y&|1S(yeQD#S1fV9dwk(AdY_3 z{|v}8^2`A64ah@XSa%d8d=CorHnfcV+w2ER^KA&#UNcM(u+wt zb+)nSSsz&P;h=-25@-7BK|)f7@UuHOvuX6D8r!w+U0zS|-jb~eM$$__dY?!y0coxM zEu)xyUu2ncrp4KRxj(gfLOiQc-b%UqhL=n}=MD=?2gNkic8kkKqu%q~;#rj`?k4!Z zEK^&ljHH)>^nQ_E$}+9M@|X5^nqYyXkM_pZqvWvL?NjZlZuUBFbA74(FY!S7MLq|p zhC5#VIlyHJ*{p=@@`P-5LUu($c4b0#RYEo=A-g&uyCxyKHX)mvkX@IMU7wKMkdSpH zWH%;c^AfU~60-RT+06;rEeYAJ3E6^#?6!pL_Jr(@3E3S9*_{d5T?yHrmXq0Y0Be7- z$5qke9#D^~vd4{@V!cLR9b)fjb-hpXFDGFd^!O@9KG{+~4)kWTQoWD1!Foj`y$qy_ zM0y!XyQhPKvuSA3?4Oo<6wdaN^YGu>S*^niKuWUob#c)(O0sZmu$CmXz8Xnqf%HL< z&LZiQDs*r*O|5Q5SUvz}VH*qkr5r*&?dRd_4hWkOdM+u$6N%cD)a<_McBPq%~-|JyJ+cg*Ib$?lqa8G&N@A3E+R1 zdLYKk@?x15p0-)rNO}cG9}(#lB<+0Jawy*r^I0<0;v66OmVdV!;pD9%=jyYTa>`A( zmTiD6BcZ{sFS^wbF``d??!nj?5J|5D>7ydO5~O)QJgHjPiQJga7{t*-^gX3tyR*%R z!z;X^X7T=PA$}eW|Hi+Io$zRBD~kPAHZn!ht3djgNUtL4W(zGh&I?)lTCEra3fQo^ zZ&PO`r+v8kj~4G?9SpTNHL#7>wbN2O%QT;-WZ$>(GLp^#>7PY9hqd2=5)qxH)?RJt z`wepN?Ud~czI6Eyb~b!H9gGaKhBzch?-@Ujlhj7>NP0C$7mM_2l5U9FZ^HT`ujcM_ z&hpEXEPu`Lcpo6GwVC|RJ1uO3w^sMPgH25Cf1NA!J0_MUlsieyw}_qDO`2I3zWXCz4(Z z(zn0LFIZhm(ycMe&eq)xHt(HT6yvql6n-(xX6mpcH@@Ecc58s++XS+B?c{}9prl5BEQ3kUA z#k)Y}Nk`HfK>D;uZvbgN`$5yO{j8{|`v{A3_B7}$i`V&tEhgdW2KNMSTE(?nBP7Kb zi+6KH0}_pFJnO?9Rr}`ON762kJ|ogDmT7i@X|1!T9HUV#@};~zRX%pr0JNNp?a`-E z`>`}C)Bnw$+N>jz-U!mai1bF1=4YF}x^_xy2%-x6zNc`cgSa-!5uYo>Jj-71+k>tO zGzEJhp_Q_^P$ZoP(j_9DN79FGG*W&ollQMxJ@grUlhlv^9(&t5bGf79HcWZT$`MA>2?qzRJnFi%G;WW!l@43{~ zFDOJE2*O{ZL~^!Mn`1}PTR{4PNN*wOLX;`Lt;bT(>M#0ljrJ5Js4`;f1J`?(SpFSH zfx?gb&5$(SUmbfO3l4{@l+FAj>8&9Bt4MDp=`?szr4Hz(rlE+V=V&*br(lnQRb2=# zs&)X_An7v9^#*skd@6{e9NWetPIl($<{A9bTA67E zMGg91fPZ?hMLeszp|)Zr*j7m*>1`nWn@DdXX&?08&OB=3?;)^d>1_~{pmJa@MqB2W zkF>MFw-Af{uUlQpbN&3`G%dK`8@+1XjbG&D@Q{T#176^0RAE&rrVVQMS$%N$&vZ%Obslq%UKPs!faecwf2eD9D{Bty(LY{QcP$=Cs9-sAkv2 zRT}*>Bl2g-&akljw)z%H?*!>9BE6HO3o+v>(Zcg;wm6hXt%5w85%Mfc3KWZeXL9ZT z>b2AYLD4Fyp)ORJ+L~Y_y$htTiu5j!);@g3a$9?@h2hV_$ri7`_6)CDJU`H#WqGxk zX_BlW;-0||y0q#!7?n%h*O~@7|WcMXx_a|fz zBxH*cvIi5ghZ3@f6S7AVvPToL#}cwXCuEBgvd0s$ClazJ6SAigvZoWWXA-i%BxFkx zvS$;r=Mu8#6S5Z)vcD!|FD7JvTTW)r0j&MS9#=z;`-gg5jXkb{c~)Mf&D=mG+DHp4HpPTfBc|y&{s{4bs;{dN)ZI!`I4>aQT!Ow~)3>zy9g_ zH*%gf9Vv$*q;(Tr)F8{~seQay53s%(N$&yaQjy+6(skg$bmi0?Qimxw;;{7c!0W6S z(!e+Eht;4Ot+Ai0umt^`HTtqVTdZ4|1&O5hg7kHf-b>P%bBwF$NYL?aInEJ9~6Ml=Uy36a4^xk ztZgK{52XJT>3uBI_uwzp+)95oBxsEE1W7MEh_C6yuFf6=6 z8v`Qg{UCi)r1z8bwZ}~BD6|1;)h}s)cPc#8@Fs+n4(e<1c#C8GJfB;$`1Vyuwm}-^ z&z8P}lepCov7>c`wOslIHZn!h2SECkNFN|+&)uf)5%yx_!~V`y7ru|pb$#W)vTL@h zHbpy`4eQ~*B*r;q^)J#K|K?}H)xSn+^$2&8X|bP-8Mp$4_HhB``7Yp<(8 zC=va-^a!MPevf=y&(+wYbXH|*qj)5J5Tx&j^g)s?z)ZQq`^VMZzpEYs3dgRJMTzj& zu(gYH?RbAmlR3%%MryuABz*{^JtBRGq(8jF^eu(I%^bA939xMMG zq4=6*&KRRUW;^9m0$;z4T#XXy$ujnRo1sP0CqepwNS`F>Iw+Sm*G{#<2HjdGXpZ-x zGJ>Q(Mq+u}-b&H_dOCUw1zjxb!k*f^F_Jz7(ho)Y6iK=7qm9q;pb78yhM(XuI=#U( z$dRHA^2yrj=uvtG==(n7T&W|Sw8A?cKP#x)fsOMQB_LOS-ex>bBjPfu@U z*kXN6&i5JisAfwkM%W6)MUAt?`l_vxMABzL`k6?dC299GT;cnSE7M}vkIPf}1ie|) z>5!{5U7E(aZj=;y*iLQjCXzk}((G&8{qY=0tFTf%N5y>PNu%AB_k!HFQ{`#$Wq-g~ z*1j(_j#u6aYt+hODU-CY{I;SLNuLMl3L<@;q_eRyF%^A-wWEC$&{V^iUbnA@Z4f!X z2miZrIC#BH;@$LKj>gNg#nVb#=Zd5+fOJKXzChAn-e~zO&XF7F)Qg}=`~LiM0QT`s zE&T}k49DYIwoPc@H-)rjOo=aXN*ETTw)z%H{|eHTMEX~fUN{H&OhAaMi?<9+B3tQu z3(EriZPI0yMsrZGtIx2t@SaH2NJ>4$lQmltjHEAuw2w$%B^Z)Q#;F zlFs9hayx{+C6cR-jyf}Fc41*pZKX1j{tcwZtim4kHx>j~K# z3E4jrvNsd5w-U0q6S8*_vYv$O-GuC43E96BviB0Q|0HDZCuILk$d)B!A0%WSCS)Ha zWFIGFpCn|TCS;#2C$r}O*8XCT>qd{8pdQ!F9;Yv=xG^kiLq9^#?m7Z-zY@%Tgz>2r z&k*=ko5IG1{PYdCx~BoOS-uYz){vvE^@>RP5=f5~=}RO%4{I!Szn8)%?O2=WKH5l& zx7^^wMpw*IW=ZIS+xj={C z-R9AIf#vmF@2w35{7(#ZBY3GPgHNj(e;560|TBz+a66Gi$eNx9-&_trf} z18AzYBR6mLSr+7-ZfDE;B8_KhhJ-8({b=Lm#b|5RHj@4wq$h~+8dnY8t*t*U|b~dqps2NvzBHo#o&}S=Z-^PGQ`VWwvDAIqBbe*%H)jzRde*lqI zd3z~SK6TfQPv3t?#CsB51ACE%ecwi=NctK`PZH^CBrTDY^G{w)Pn4uwJ@YloG?YxX z{PnhCi({cT1ufeb~ndXs2q+zV=zZ z-cR&?CCh_h(f7@_h@@|TbdpHlAnDH*7-@}jJ6_FlL@6|J>>6Zgd}(se=skE2u=q@z zUC*W20dY^~>Z#C^na);Oe)D)D=|4ewib(%S(l@aZoOi^0iV+Etu?Pppv&sh)6Je#) zqr4qby}PT}u2~X3EY<_e4~wL4f^@P--vnuGc^Q_gnY~Z56$4Qm`NT_RIA`p5=Yu&dMDsQ}YfZ>02N@RitmROc&0!+_LcqsfkY( zQ3|y&kk_rB1daN_Y6t7%P^4koqz2l`-pWyFpr6X`o7y#wn3W#{$f zJ6Zmm5mpXEye=O|&`$H27T3-Ze>b#A48=vA88jng8z|meG5uuW;21=uu6_B0cYq8aO&JB_+MtfnwFt=8ci` zJ&;Zl>3byI{VB_bzn;K*?m*7@?k4Z*v`}BTMxOkd5$oW$57^l?=33~V$Ykh~b$bei zSsIlo?*Jtpo;lD%vDs`S{SQcgFVg>zl)q3_W*_JMqlI#L(l5!B`w^eF9SfZbB5HP*Fn z37)!G3$&SkB>gW){~*%;l5|1U7&Tj_4z8s`cX?0Tf%o~D1|>NAJUiRXakK>~c~+!O z(pxDPzLc#;MABs-?G))Ul74-j>8m@$ImuTJQFEvmVm> zRf2&|1NAU0=25mv5=lP*=~*KEfTVZaVLCccI;^`g{R`w);@Cwmj=D*-p4zXaTcjU?w07wo+HwaSf*#elWv&? z-O#FMSFj@bb#3?~DjoKmW=mhY-ohDEajkEsd^$s`N>Yqz(m)CHf9^@!I#(q97^Krh z`Y}m46Rzt~Xrc5_wA;JU0+HezFtTm%4oIQ?gR_)0_I*lA52Pgrwib z7}a*X)5^NTJ?9)veT!qxXvG_#&9t6?YX>+DB=u$5NXj&Ym9jO#Nct&A&lBmVBz^5p z%VE)lE}yX$=UCJN@1wk%JIh)_dwAm-lfQa4&bqtdR~f36c$IcB@-7*YePgv#Td9ns zpMmszk$y(f96gs~XI)E#KJ8f{ozDl7R?cWy`;BRQ`rhMT>~nzZOO4L~R!GQJOvqMB z$oeE?UrNZnoREDbA?urveKjFlIU)O6LbggmwrWE5^@Qvj30YG@_RWNBwS??j30c2{ z?Ar<1>IvC*60-gY*>@ANH4?J#C1e8+#sWE)lhX|@nHNWMSvDR%c-KFY1mmIjUC&(2Og4QXhf z>qZ8oY4i=L--pFop!L;Ax*|v~5b25}UHS*hO@1nMaIAzq)M{I!g@V;DoeENVVm?jd zIM66zUWHd^79^6c1kwvdx)MqE!CJod|M6;!PpYHQ#*&!NHJf~Uv<=O~;gRSn>gkP+ zXBBE>FuN8>`+)Q!k@g{JpBa{C>yaSh)$~_;!h^9fAd-F= zq!)|y%OpK-f#tU5Oymho>gmlUshn(K&QfFk9REuuf96UHhfhKpw=$#ez_gfLW!hWs z+Df%=BU2>(3P>*z=~qblo10Bv%NbFt_W8l%)R)TrJcPVh%lL4PUDbqsm2v$7_o_X? zgQCv5@7XX7^%N_?HeN>3z979+qQqh z8mI(umvyUyo|?HRRGHc+9!b9n(yB185anWUY+vwU(|Bj)4ldK4&pZ($nr z^clIGt&Kz)Z>1X3_uj`i&oYlEl70=Ovqbtel8(g;q|%PuNa1_J{*X782Lp{z>MJzox2!4#9+5^`w_L*(+ z()f5*vxfsra?}$RzA(>1eNhA&T91NcR||Rfne%b9dktfD=@9iO^I0S5*Fid2q+ciL zE037IPOOzlE4fN0ABFPLstYJMvX-s=<{$9>cDO8c44a>1rfxJ;k)v&G?1GS@^~>>!?Syn_ z*PoYTEajq|+H5wGejB9Mi1gbet``bNGiKo` z&TKY`8uV>VZ((^=9VyZmdw*;_B9it8>2)IQuiBqsSJYU8(4@U7JDI#nIs1&y2W_we zr5T<%g_If*m32!G`a;WRx?8m@v5Yv|I0qDa zAY=~g;N7(IX@{%*U?qc2zD3OTUgv2!((tV#_I+EsiKJ_Q^ahcxLDI_crd2gg z9j?~oLpPQw+MU*kx8Qv+4EcpW#C?r>8^&CUkfgSv6iL4a(k_vHkE91zP3vMl%f;1P z17^=r?K^f+pwE1Kwq09c5Aw0kO6CTyK6k`4grjUpXD(h_^O8|(G- zge5YQoga69qovQB95Fj3i$Hk z9iZ>OcNtQ$NBL4?8ruIxIxi`9D%hG}B>e$MZxZPbNSa?@xp_aB{ek7ErJy&DA824?ZGLrrfr1M4kLy~^|3d^U*m8o{pBDWIdu3yVzM~T0BzFn(t zT==<`FJIC*uSa)Nl=~O^9H12Lc=`7Mew2_kCuBcP$kt5Aev*)_m5}{3A!|vn9Psp}dPG-*mto_9vS3-}wSv{`A9ycFeVfnY#chncSf{8wbIcohI;_N}N zVoNXg=rpFBrf>#LEp8Kk$0v>BweflDp7&L=ITrm4S2 z93IT9>n!f);5~=qtj!wB)h8_e9PD5h{0nL*A7pav76n)Rb604<$k%<6NX>#o(jS9# zfk=PM+HX4#*Kus;-L3}-;@w;uX&g5(R`kUhlDtT?7Lv*)QyW8CS1&2zEK{>Kv1l?c?si%2V-MEBwY)ne-!CjB>lyG z$jy7&tnm#@-i}#~zWT))_%?NY|o^0etMSszc?Q&7w}6=&%cg58%_;&~kD>O=M@8^t5(&p>*Y zNPkAsm2R=z7Pyt*66pA~*EX(73@Ybf!aDRz~E&(pHi#o@hF>cY>N+p87I%qLtyQBalDVe(Jt*Y!8K;_S9w_k#s$f-Y?Si zNV?&TmfP?gdGhK#5J#`zubb4BDf2|hPDO9*q`&89r|?SZ)~Z;_)L$@KnHKA-HW!Md z>x1+Gk*-hD4z$zm_DEWAnWRJ?!1osBgL3C@^U4n`MGgNSUSCoBHbaY~8-R3?NH-wq zBb}B*zK_dC{Ri@ql)JMeMVa=UiZsJ<)?2A&Nc{cvZP38FDSDL68zbpJkUl8Vfg~M_ z6`eME@}STt0AB4&Z)wN}EPc;5c?Z24Ps;Ru3~p?vloTF{&1NI%h9G@Nq#Kfy{a4SW zK&p2TP`}zA>@7b_3gP0}M!Jk`9PF|l&{MZI+#6}JBi!cLk#r-FJ}lCWKw5k7^^jZs zk9#do=F@Zr;%yeLgA&hKYRHW?G_zS&ZQ|c7&35xGEFWwkHPp~2HEY3Db#Gv>JjzJF zmqt^Y`A5=?LHdYDH)ff>eYaiFb7st^OiyoX$iZ0mTy>zyX}xZTEzV}(TK0FACdQ7s zS)Q*IreQcxq_!RrNe6-SQIQTJDW69BzVGK5`A(q77zSM`HP&p?WXOji^!3|Y|M84P zoc7dKNh0YcAbm`vn~?O1n&neP-%#DLOwmL7p9YE%2&Efwl;AlxS$sG=hioI4W82q4vq(23=^L0w`qg!L94I60U1QG5A!yVr;GWBksQWN*H6vu2 z-nhI5#*3#wwxSeCHv{Qnk#0uPJ<(^nCb)dCKEm=XkAb|-`v@BKeTPNU?QA#4RBt^S zTT4O$J%!h2>s*m^Fi0O4>0pwsj~di0g!ehh^5;B#LXJ3nWu9ewESvnxS6Wy)9cegc zWg6ZY`X2AN?kg5d!?s+^PHgoplKu*$Pl)taBwZQnIZIAPZqOkwuGu85Ct8@(w`L9u zG0Kldedvkx;HW{*0HHyobtRq!of>hAZ`RtHU?klfq)&=;bCSM@Rj@g(N0s(Rp43h6 zV|z!zHj7d_4)xJA=@<}+btp6Js}&FknNF>?U|76m5_~2$o5Xi_DRTovz*MH16ccuJ+6!%_mpfy znYLk#S=L|be%p>?D{O6Rq@(Vy*#$LiS1%rIC~K11 z$P`Jp0qF}O-G-#)i!HYqTo0yJdRDL^HLhH22_l}QH9}w3SNCawycfWFryb%|{wyUK zbQV_1#>+@L9Hf60>2Q+1IM=SwPI>B3|1mlD1s30m3A&2sIp`sa`9#KgSD3^gqz3u2 zPU0;V@1QTv7OO!vibv9ILHeRdwwhm$B?#*++q#Ln4~z(WqFZB2 zB!&5j_7_5FAPY;mk(BpQ)V_Hgyx5C4`nnZ+wGj5qVxDE*VI=)ENM9D|uSq)d3d^S(ZGbwsmcu83 zO)NF_kf2NRBa(LEDHrz=6>FVH!VkvRPdgABUDxw=%^#&}<#)d6m(GKS)@no2&NCla8c2 zg7j69?#MFj!OBI;MYtN8YI`FN(xwR(*B%h&Q{)iji}>VlFw#4VDLa6c&bzN$zos6P zX;>wpp@Y3Urxrxj&Kt?IeZRIAw8;%Pw8Rg?&Nh}Jt;v!1Kjt_puH zY?R<^u_xGO9g%b=kp4rYJCU?+)pYO+Fw~v1?`J0O?y#_~W|=>%Jy#3#1q*M7RK9kt zc-bmFJ0%6F&4nWA&LDkFq&tJO_Q7+eZ`h+z>--B4pJd@fvn(7mIiBT?*3uZ0jGb@c z9M;Fkm?k^c;%wveM5;(H>MRRqxw=srtJ=32S|r^Cq)SD*3rH(3Ee%@py668ITg6+rCt?5Wv z?+lAC7};z#lI{x9H$=KCNiTrUzvz~zsf#ugHio}?sV}I4f=^m&ds_M{7Faj~7NBxK z)Sz9$gCGG>-As&k15Z8JV)lKTV@J~6K>AOS?nct5(4)GY*C!9SWckSJ+a*%yi!P|s z3PvzI6HvQTxer15R(BP=2%RMtZWi|>$NZv>p7uom9ledK@YEDzha!Elx!+eTP2C4dw}$9 zk?z6TfBzcOHx&uS=`T&=r_|Ej^r3T4C$SZrzbLGA(t;-N*HdS zGPM<@NV*qDdqlbyNl&`j@>%UNU)~WX+1?se+0I2#4KDj z6d^4WDMmoTawMtmQB1=-E>?SNO)!$~1JZwsbRUw=#8{}W4^oF;VH%4(y(i852bz4@ z$v8`P-=h+(5-F*l8W=Ci)K)4Z>2E;#o=AT~(hgYuIcG#onu($;@-dL31XZRS7hw$t zVSMM)P5&J^Jr6`0UFG9sWGS1^|3y9rsDwLS{yD(D3E7y0Y`=tTY(lnwLUuqxc3?u* zo{$}skR6iZOUMpQ$PP=$ew&bWBxHvtWJe@qMMTk@d??)gzSWb?8JoZq~&C`qH66g_P7dq+<(;LD(G?fPJa!3D!&=NA$tek|0?fp zeQhGv2*-7z-=U{)rIhopmfK7|YN~~P&kpxIm-paR2szHNuPHQnc+-y_jP;60x-UrI z7wNvV4XpChgH~TbnazSk()~cXOr-mf^uzg<=aj3EKl1557;$(cm7^`5x5u;e2sl?+h8enkeR12E zMyoWKRmk3Q^x%CcMEb&mF}oH?$Aa_&k&Y$liCDRi*90BaeN6`~z1{@WifhnS{6+;z zZ4}$@21viFh2+wl%dZB(kKoxNWO}tzv$m0Re~^AC()~%AV;suiQ%MJMR-R<^r85FK zAm^SV5N}54N2!63;J)j*vd`~E@?zD}#(+qA07yR)=>a5df{#)@-svVOTNX=deRq~z z2=#U$Tb%DRjdk7FPTAfwm8p$Pk@P^2ek{@hNm`p?6de;B3w>tl9u9enJ8K%XB3M2Y za`qfwrj6;*Ka28(2I?ukx^LrUBy9)jCn9Yp>CYaq+m4bibmXFXNTinb9!Y+qxAH8dB>QSiIft~vWpcq8^t5(K_LB9qz8et?Fa9N+^Q@8 z-SVU+eq&`c?AA44Iry@8HbZOap9e|pqNhy$W3D9}6Vo)olDw(a5R)%vKOiH@fU8O^ z#TtwG7LoK|kbWl8gIT6y&oxa`r^bBz^9k(;_x>w$gP*L`b@p*zzrOu2eRI@bSF**9 zaPxQ~=^-G^R^>jHLrB_mgXw4jFLn4)ur?k!c;B0C5MJzBRh%W4pS{2`XvNA1LIz05 zI79lu#as90hegtHAYDPE<4C&fI@7Vlk#?XSyT_PZU;o%G=A-v=2b-i7Ei^mG;(n)g z_W>rUAyf&nb$e3Ai|1A59Y)eaLAs(y4<+f+i%qM%dtSY(N$A&C4nw>ZAuVs>s z6CuZXi{2n&n*YbzxyRWxo&SHkN2~47RMS@VbgDWjw)iEN1h{;6+ z!InfaB4Tn8gWyPl5fLMahzO3j#kJ#7QdJIZNmbivi>9jl*5~tiwzW=X`TqVfuh(8# zdDhy`dhd04*0a{W9F3*0CCnxz(5yU?WUCkWte$ifNw+Z4Q6gQr9Hos}#4@ErtL!}> zvAt8y>{dcGbCOi|j%+`T`IX1sA5-tvmC5EBV*+0FhdQ&T@T5KIxg_1vNY5o{Y2Sak zlFN7hk>yiUFZMot*|BjggK~oi>-C z^|2KQ#nOb9wGlOxyyb9?VtpkCBhQv|5vD^B+Am;|CC}?fG%v}X_M%RahG8~GVTI;N z$C9+0k&YE8pnBAwC-9fga%rivYXjf6dYs_I>9mjY|tc3kU%JYpBo7lpi5*A`kwVKwVX z&m-wqjPyK_e#pKyk~6hYjAxlgGQ1pNxF4-M|JwO$nUB=G?xAQej$HaWsI9M9o8b&? z_h?k7nU%sC+mntb=~s<(yhuCOptPHoAQWlG7{=KX+eA9dr)t%tQL*A?$n8ylK0Z(W z6vk!wMby=vN|NnbV&(5i&nM}2MtZ(T=PriU74+^znrih+J4m}(xf85Dn8#U1(r)VR zX2rf0ZJ0f2`+xV-%;(2`geRRq(ytlm1d(pZ(sHybBDE*dx`CzCh|tz_&}F}`r+(UU zK2z00Lk~squpV>FDGgzmvwn(Q5>I*oNxyES7l`z>C!pg^+JBLDYBuLwSi^f!`EZpb zABdJo?P1@!418sM5h%QqY&JAxWV~E3QtaJ$(hEuY4I{l!q`R_*zD_?yq$RC6YH$U* z8(kWNxKa~&MV#deY6*=!$yvV5PByw7LH5K@NUC0ud41SX@}w7$w8}^?B5Atvc~I>2 zh-b-9K|JNCSYJfkex*$1^k+`8rwf^LBqi$I%wyj?qc>>R7kXo~2IjqAj< zq}vVNr|6;!kpphQdn(PDnk6jtZr^Pcycdc%h zOQhHn^rV-N^qWR{2}w);?Lf&Nt@SMHCNn+&p?;?%yaSwYeocoW_0y#Y^^L`JIL{)5 z?rz$BA@xUHjpCxF#cAtNiQX7cO$)2by~x*)TXh)a%}yfx;qKwS3I-Xmqbj} zoforVVGog?(A~4^d4-BPRS&_4`ZDhWr0$A0y$^6%L^dfRn;el%iO4RG$fibQ(;~9w zi0q1pYA(bn#Mu?#?uIMQ+clD2aeed*Fd5?<^#%OXR3S(`HAj}gR%`66`u4mlJ01v zm&rDaxCL5EGg%rn*&Skz?5-Z4%Fzn1^-7*4Pk|QLM*psqhc-5}6XH#nC-b#1Rz2w? zl78DrCy_Kg@d=z!y^7~iM~VK5o=VEIzS6NlD&v~@2k|Pa=$VI>t}q(;vtLKxxxKsw zt7VdY{zNz|h$o#)(jG=SS#?^w3_8Ml*;-|5wW%`gIeOKF)>E8eJLEyg%c=`lD5-c# zxa<6@St9%87}zyWI)$X)G14g_P3EG62K6 z*OI(znEkdLtgR=#oTT41(#uIY{HWP3#~Ux5>O%avaO&H67aoV*mDbT;cV9NDx+3BC zjmXk53#oNjofV!!YVy)6E}mYp7IJz}`D0#2{8ahGn$KF9T7$4aZ;9_g7S8yijVR0k zo^&cnzh|UV)lc_+9A__ENlhfxyFGgDX2TVbYZpb=k^Bl0tySJzhdIAr0VTp zdm8vqNK8Xt#4FaT8tEaa;@SNw%$J_DnWW!0(q@qs=`U#qO64TSvP@oc6I-g{$z<7{ zp2+h$$G+_!gteyifpUiamFN`8Ze_ccn8iKm6(rr+NUsp--0M)L?w=Z|YKJ8h8c7}a z-qv>Pv&CslJ(^)HLs8HZb6P*IWqU?XsbW`Zw#NeB!jn!X=?{!_x=8Drp|8lgGg7s$ zw6YKAePK(Loa5S7HR1|KdJi%hkt4ugJj}ih0guO%UP;oNkzPsC^r>y#_-#1vQ|hL^ zA92^E8e=T|^m)jy4#r#VQb;;6(n=qf5npu^!jtA86w!3{s09yF!Ye3`W4sz+;Z%g_ zAcSroQL`!hFi$#zq(3y$8LHElXXA|Uso(G!FWsxL9Rgm5?KQKPrP>cre+=tX<68Ou z?=ZU$0PoO~UPaPsBfUzbQ%WGccm+b$Na1kn3vJ@G6r6^V1qg zgLc;|p3&3n5K^;;xcy_*DSTE>I+LV7GSZnM9l;URE?+~M$Y>sqcF*d_qEyu#L-#}k zsQWTieN%Z3r$qfXJWFwf>cyFd0#DkLUQN=(-n+h9{q*0jLhEMFQa5#oTK#D00?1n~ z@u|sB#8cMeHZd$B(V1@)pi_M%iD2gwL1W`u*#F!-+(Txagj1~9;QgK>hPqqNcv+V zouxYc(QDAx@}$=~f_5u^CM3faAuLYzsR?VRgqlr{W*;9h9jUp|L7s~cw>uviU9xs! zRJ*gT-432eu@>^Avq`$Ekjnz&JpPmysz480dz~(q20AMA$VuNJFS6d%p^6Y)?9mq`MjE zJdwUee|HGIBGpK_k>#`QikgK&Qq>)O{vI4}$zbNsGZe)UUW3)LT0*G`#h&f3Vdd{h zuO;d3MtZGC8y<$%{qOSS*wg>4saCFslSZFv&!&=ejjm5#V&HFCZ>bK>qVHwYB2Ac@ zeH#S(5uUV_q)^t9z(tL<5{9#?VH+j>bQXti+&@^6@j(00)qyoN%7aoRKU z{WK1xLG_#UcUdXyl6cbVNcuA)y-uVr+ykvmH~MmlXE4szDbg|~NBUIrPig0yZh)M& zwc@UZ-9=T87G3B`hP>JRD(u~O((6gOr;%PS(z9+uY3*|ZmXjDKi+Fm4jY!#WkI!p!H#j*=(6fuuh-(i=poFRkPz1m$S_uys;dto}i&N+7R2 zheIoo^!0hN`<-4=*+Ua|eJ05~6zp?(()lE=;(8w z*QE8hEPs!yArIe2)7aN)wHy0sPCooEy#}qc?TcONt#v`F*vadjtPm;o1U>0ZB<*FS zH;J^CJAHnneQuqRaPv-A$MsRm_}Ebf@xAM<3EA3K$v^k$Oo zWu!NYbo>IG(R(J(qo(ZFHy|mWMfm|f)$Zo)3Q4Ct5v8iF#Uk6P+LWY6pg|Ime%bc{ zitdUxy$^6pM7AIzTNsfoipXw_$Zm_sZjZ>?BCE^R> zm10k6*;sQ-Zn*=^?w2`b#V{&7=`AGP+emK_=_^m+jPKGn6lsIz0nSWS8vW-|tIDCx z(u{TgGRW&^F!jVB&sfI8RYG7HRf_F^^fywBRZqHrr281@0+E*KYh8MeFQ=1rs(aJT zq^Ot~=tKWx`xJvI*DNgiTbQlP)CbzDBxGq=oCCqis^4 zDbKiO!_yeoY6QC6%?(OuZwpg>+@57pp00DNtgBKL>IyOs26oMpE+T1fBV9z&{C4Y6 z+O|)#OzP147Wt8oY`qYnyQ>67rfNqcIUSOpvGw)UwSz zxD)g6TFnFI6*zxWBMNhXC%uiN`y1(PB7Nm<=y;iFp#vz({WwX$?J?hRaE(a)L4w`cW0X z@~hTlIksD&F&=V-H7G8frFcbXq?j)~X&XuV7-^eGucH4tn>|j~Utm4Dy)Rc^wX+cx zSVud&BGdg>{sUeq0_nOBs!xV66OH2bYk%;KK(4wC-DNbewN zI*_D8mO`IMTVxG~Leg?2LfgwAh2FuoyFgs=>T7bv;a-Ejb872C)g~>OF;b5`sgbR+ z;ahmp#Uwq@NEfS4H_Sl^>n`)DnK} znIih5ris9JTnB@v!J}raw;sIWRji}IP zr8c`(F{-Y!`&ID6Jn0gW=8bfTNH@~*CxNGJU-glg(AGgVi{ z`m!eoRF5L64m2>2_1WxRHGEc2x|F1SjdZC<_qZ84+Jibx>Zw&ekf?hG<)~y@rsgS> zAH*>5N31`DEgsr1kt)pYtihA^q<53_xo!2{%H1N>U7!(@0v3%^mSa!bh4Xk7bLu+I zW?VHcIm<5%qI|P0l4NstY~hYA-LaKBwsyxh?&#)@ZQbz|cYM_y+qvUw?)bVpzTu84 zcWm#D9o+FvcXW5hx7@L#JHG9X9`5*#JHG3V@3~_qcYNO+JG$Q8$Nug(z#V=encG9i!bb#vNnb zG0q+5xnsOL&UeQIcU<6(3*B*%J0`m0Vs~8Pj!WHQE9A^DLp};6;r)KS#}GtKFk(Hbh`4g01@6=pkE*f;Q`D@b~nk**Nw?j@8qVL8j>*`@OlPia>RS0P?; zhmS<^>vx%pRK>G^l@!vpJ%EVWwCalCI z-<7a0W%WyWH9}X4Milm=Jn1Tu{?bTSsr6T_#u-Pp^K6z=)@p?PQ5HyEyp^Mp+1A6Z z!CAWRY9oyr?9Pz914=4p0rek+*)9rp$vo-(Bt6nd?-yyV1*N5zc+!epB-w%9L25PQ zY(e`K^cpX*s|h_TkyZs7BvF`oQ`o!nq^n7Kl##AhKb^D|I$jROzC8`cepi@*RC{7U zy6Yg(c%R6=k(>&NdHT#_wJe`XXN5LQ60(2(tO9lvJ?R4^oxOwnz6VsNU+F+Ok3Wo1 zH6p)LtNbb439u)pR03#Di2F*n833%zt#jAWPz0P zi^6QyQk`N?*pog)(gq`ah@_>v%dUj9_C;ULmh%wTKA3*ZeOy2NGT#R&xhvlEKF}i(+1iNg(TMD^ zi0tu*?1_l%$%t%SMD|of_H;z{Ohooxir)B6}esdodz=DI$A0BKu85 z_DV$dYDBg^BKvJb_F6>tyNK-di0t0l#$ zM5L=Yd;OWSk&#{m3hn7k;pngMVCcJOzfaaJPg2{ZPgpZM8-WJ;7{l^^9u$j1<<^lRi$;3Ez~j^|(k+SP6JTUvsBJUNxFILEv`Qg198zD5RTnq2V}{;b(SRI)zo@zcJ-k*qdu!J+qu9j?n$2_>G4MT zlt^c@1xvHMZX2`It-BQ!V_zlgh5Y(LbkdLKhIOj_fUb19))*;#3s3qqNl!4+r%9T> zXuT^ZJ%B3%U4J?gCFf}q`|vsn^zlF6yGLpR&iWe9DsiUJ%32zVqp0Bwg!+zs8jLs7 zb2w7d>`7~QJf8F!lAdU!&!|pEEx{R+iqy($E{#N7_t5mbb-B@}s>f+pt$YFHZ2gKo zO3qI5$*uLP0}U+2c(ZTC!VmML&yw^cBYjq+YgRzVv9$lDRkJo{p>C6qs(Y78wY?&) z@LFjZ@?0H;dlUH~5&uZ6yC+NqVA^aZQh zCPc@XC{b6nZgYRs}H+FmyO6icmTIfo#8nb%ife%q@eS7{vc9L7*} zs@Xx*3MqF_MyvI)>hPp5kn~g|eL1m6KIYGL<1?8 z-=n(F$f4C~pf6*7AZyt)D1S&7QcI7*j1=oePx>-RhZ*V1B3<~LV@Y2tk%(uvPDQ-L zdB%S4ZIVy5ry+(yGJFxjJadLUq&yb#l-{GU9~5X1V+|$Q(?3|vdeYyJ^mHTr4N22C ze~mM)=4wh>H9KmAOqh$*+KJT45>ooDr3Of@T8^+oM6&kGlN%0sxC2!2{JZLxq;B=4 z5rs9jCw+ya!;SP6lIGug2U>6b4MLIH`!=#w?8V&z|0P#I&Jt6%e+Ka*I2s!+^&0eM zPFWgqkXP6+j@2X&xqE^{q*(cT(pO1(hLOIi*8gw?&SJ9m-BF`ESgsOLXxanZZDT(-}nn5yqiv0*rx}KyXjC8$7Tic*-$b7HWyrRC46f|Z| z@u{}XVB3`@KyGjP2XCsBTkPfcjgwNG5qh+?ml-4cs^6^!+6K2ta!tDknK&TJipy&F&Z8cEMG($_@V zmuo%!4us0F=d@^tQuVdEfHYy8<>WNdXp`(q%UMmKu8$AS`XVcpSU<&%k|+HgNzXRY z--)!$@%z~AUTbRPii_O)_YgYrhpocGNp1$#T@0cxZLZBRifId+1vgNEHV zPx^b3o@1oH7wJaXMD_tArN<$!ubu5HAH>SxSh9YqIrvyyO~qP^D-Y|TAc(C^t62xx zFRoxu(38GF(oshG21(PypT!vu+|ToQ_e}S;XT_An2z)1IE>L7%N+=H-c9COM` zrG`#=3-%nac7f`77E?c8m$-9XFH)Uir_z(YNz!wT^i7hMj)Kik>z?qM^!+sLf-R+0 z&yV$~@>R9cE|N6iyx`Vuu4G+JO6!$apMl)`Es=I(&ixR&=ia~E`v7Hk#hcy-cq<}% zJ0kl-ME1vs>`xKdI}zEt5!r@_?9UO|dlA`RBC_`*vcE=Te~ZZe9+7oMWdDfB{uz<| zD&R5%QY2lIk{>^3g%6yc4E2aE>mIWa>#iPhNJA^Rg^~c?y~h6w>2z z>txvmj0#Ws7D-1N>07d5)lZ^?Q|=AQxg2qM%PTnU3);)jb#TT?=qXg+!LtS<4EFaGmGz=KH-Gg6FIPx>}V#~A6`s?(k;p-I1QDI26Os>;*W??jhEU+Z9&d;mgy z#YU?E+iBs|XlFHha>o(ax=i{j!km%9f_TzDkaVn({z0VM@d*Gu+iyB(^)>%Dsb1LP zma4Yf6Qrr^u;yRRZOUVQqU@?#q8j;4gCq*GcW+_WJn0`vI?hP{C{o?28q(r5*-C>% z+SRML_aM@q$lqfU&r*L-sPZ+>g`{Czc@$==Y*<@Q`X`c}XQY1;=@AQ1ntjumXQ#)p zeD?U1t3AD?WHr)*sjR^~d$j9osIT1^s(g8_)s*PU=tWl4spQ#P7MKG(={qDHZ=~;7 zopQ|N!Y6LHzPH`Up)Bp7fI=+1j#}=l+Pf?vi|RL&=&Y_`wtB(LG?+bu1Hh* zOZAfj7VSY)Lt>sb=kTmXn3E%_;t4nPRH!gatGwSKlAfcessZXoFdBi%sK^be1t zWUXPuQcNLf;8u4WGI#Q^u_0&k2o|rwYsy@R!`4PyUlgFi+?c+7r70Y@Jv9XU? z+>`#9q!$?JpGlf~{0~k?ssD>!Q~657b#G@4{aWq#s)W*6%!yrrbgQQjpIM~DJgdY> znx;Wg)b)u-ez^K3drra~yj=GDDtrr1`W{IyG}8Cf`crO$)=zFgD3$`(RLNiQ*B1lqc~DH0rs6v^qA_ena@NZ%J}A6ouZSFlW;ZM!%u zzcd{3ij|416#HF^tdwf-K(E2>_~}|j^#2=C@D4rcUrBngk^WVrtJo7K1fTXkst{{775k9LY{ToRyG19-0H2s7g%3<8OmhKLY zdiM;0(_Q4~vb#OhZEI)R+$|R(kM6pLbVas=p2#y_Dj%{d&T~()u@6t$lm4Bgmm2Bc zt)J57H-vs2=X6nPjcPlnss)XZ1m)%WJNmC>3 z6zTPMqRhfvgr=#$ID1xJ_1m>Zs*z_3M`Nme4XsgCzIFma_OQI z?EN~dg*@p$Njk|$|0&YeIVfS{BwtQ=zag*EG>TM0jyXAZ+H%EN@pjNz_lXI>l<%lYU6j%Z>Cyk?z@!az?NZh$VLpOKw2etSjLBYNV_C+Ta&R|+ITAhZrRe2OfG{2CQ_Xv&eVlkLQ#EpQ1-crwK{#Jj1sarx zR`Bx?g?%nh`Uy#A80jY>t)k^$6!ufq4zJv1p}t``jI(b{r)c(?5sxIneKKp<+VQ5N~?pUoqGip`~50k zTp_92TB%`})hTu=J?Up8z1m1W6Y1F1D03ZsKT(u4gVGLlYes6m5uq_su6pdeo^sx+ z2v;z+ch)mFt2&6=6+q%_@t1oaAlbU>eSpm(vdts1Eh4flBeJa`vaKVsZ6dO65!tp8 z*;gX6uSR6sMPy%#$i5zteIp{PipaK)$aaXxz8R5qkI23ik?k0feLEuS5s`f-BKvMc z_PvN~r-Ty+4~J zv@Z!=*>irh4L!6Ukf(;werT+P9!zK(G~yIy{wqd>C*6#svy5~zk|(#X=8 zB3?cN;Y8UfdR(#%d3p`n1DH`n9{Xa$XiaNUHTR!`EAwQ?r-qh^=CK!(x%7BA$?xVYU+tyXHx^ zBzB$x%bq;zGj|+%2a9G?VF%Jqc-3e zlLqx=+XGPkuB|UgwjY2wz>{uG(s@R@wMchc39d^Pla4G_J7kf+ke44LQh76~)2ncn zh-^oLdCZGc?dzmAFA`&BBZ8s*eaM`*rT;1$|;j=HwEF*+vvAWl#(G&E=px*V=y6z-MXT=xeG$ZIbvet)h;Yq(j((8@% zDNqU2kewC!9)o(Z*>3J`DP0h0r*Dm(fv_tlFLY7lI4ygr>vDS9Pt0o~V(@Kc6 z;X+7SY2mCFsV|F^V^z<{l|~sU{4h_t9ZBaK>2|8q?KnrZOo48dWBWS1W_$MPmp;|j zM^%uNCR47tfc8-uvfthPr7lk^rN-JYZyF6-`o8z#NF8-MwU`VM{;W&RrDy0rc8T$ujtNl0`Z zC0f{Bu0!hCe};Tl*6hx=`#i_ohxn}w)kB9~rc{Pw5Xv{WaDlZx)?)@$Yamg9^f@3hcTXGsJaeooTaEoJ1e0& z#R|=nev_mNjr5x$-K+$CC$v#3brhQzrybIrHCb{al}+l2Jl*Iml$gJuz9|ighkZc) zh!_*<7kizNV%_LTyOVU0k#-m9vGk%gYPON4pqv)YtXhj0>ESGAFNFFvaI;2zD3^x5 zjDI0%;?6Z~*&Sf4WUB z&20VVNr=1WJ3p_f;z-61^^!#Un8rvsdzbTf)K9VU_oUw@>Fq}PZISA^<&h*3i~Z(? zW>fXquuSzY_SPKRBR!EN?;CLK!+2PaT}PCtv)0FcgeUDm(l#UQLDGDmmz>sg#N)o4 z61~o*agb=Gl)uQQ>Ylr7`_8l&O&24z7>uZP=Fd;$S-j%#%@DKv>>=(M7u6|tNj&Ly zNP35neut#R0knyyyzW_sadu43g5-JHggxde6=6DwakOvR_7vhHXe-;BDJRzkUTa|l zC9K(0an)lrP9at|`jx@0knomLAifVld^JqgAFzbCAp1 zw|7z~F&5ge3NFnT(h$b8Hy5za$nkQ*PU{CGt346Tr$=!7%>JKVG zHKN{kI#YWv4C>K*Rr+;Sv&v(PjtPGVv)vx-33}3D@;91CjQpXFBdCuc?Wa zU+$jmUaOWcx*A`$uF4L}Yy;vR_1G2S#KEZ6d>c0Q5gU;&L2u?Ka|a z8gVOHFcxz1uQY1&932|dx+f6YplYUayx9Aew7nHikJT`btcY}0#1n66vVALz3Qzh& zlHOyaKNM*deeAZt-r6dZBRoyqvY2wP=Q<)KQq>W)uVuDK3*^e$HRwsztq$pC5y_mIN+l^)e; z_7y(ZHBY(=Nmm%@E+QRrBeWJ$>Xr_zJlV7I!zmB#y7I7}c4#M9&x3~ZmfC=MDrP>N z8)$H|r0Nvb)|392r1u)>k3~A>4zSd+w@Rz_d*mGyMkBRiFNgg%p%)fr_LeASCQteklHO;eKN0D0?gh5BqV7amID>KZtn(1JXBt&Puu>f- z(gx<|UWPQ-v*2IU`l6OK$lhkgeCbJRNV>{MYed>vL^->(ur#vd3yjk%tQyC7NTG7* zYgJv!)V>UZzHE0a0za{0eV{8=n5_sgi+j?alJtHf{i#TcYf;W$SFkjmt@{9as-kKp z<*H@r7WLtf|B-i(%fpywkk?S=wc33S)g7)}((G;}JRVQFJ4qif(%nUx=T85| zD?O>*SEla5NXkPCq!Kt^=4hqt-s=HggFP*zo-WcbE{Vd76n>Z|-GiiSjC2o@=EiJ5 z32(ma%jwP)=?8Nm`C~i6PW1um?noigT5OxA5#Oy1Vc{BtYTpK~GPA3P+X-#u8p*e+ELB^1Z7{QeA8j_QzLp?!ALN>MdbC zR@i|A*CajJItxClC*6~z4;ks6B28E$-RA}69M3pe3gZwjHU_EHjB`$H<9$`z*AIKh z{>&4SvL03A7K%N)TM19vlm48f4;$&vMcS|gTA$@8mX4xE2wBpJNX;L|lA+7}f&$~* znbJ3-?5?2ZROT_ihIY>CPS+<57E(|4RmP)-7F!zGu=KFIZFc>jzTC6CANgVdFieb@;aYt64i3H6O2`dC+$hn&D?n) z?J3gU3!tMgC(xwXk^RU$wTW^D1gUDZYDnxpPhX~nZLQW1TfA#ORcdDWu@>^Ay-2#b zk@gbl50;~xUfdOMDK1{r9TWO&dVjvc*H8(xn62~4*oR@BAvMV6SL`2$_LO;S52@P5 zK2~U+bT5)_VWfMBw39uw8+Y$S8omo;cc8iYw^Wg`59+(zHlnnrDhkc48r_nFaY@uG zGG7YoMo(Ht(k+d&j-=^-UqxN~exSESvq2V=czN7sA;so5V3 z8v8*lTQ4T5eO*^}GptjMv5;<8UlXo;)T!DgoAosX! zO8PL7xN!?EvvGw;; zoi1sGj^@j~rpzWmV(-&i9XVauliaMYB73*7*LV$yT3>aiP+Xxzb()QR?A>_M{YmPc zuq5gJB7KpolinOxE(Nu7GRtIZYPJcVm9o**19|G{Kjqb1f?3Ge*+ZnW;;T?%RG8ga z!;X?CJ%FTNHPQn}np?EFyGvbK{sHMo`u<|XSIu-`y5%~=ue!&l+Bf#cIZ6KHHz8lP z5~1!~YNi~<{ExBcXm2)uw%4G23*7-7G0$2b`&^#14@tK((mtxwq4c6Urv#b?GR|I> zs)vT-p_-{|P2F|1XBWaevJa|d)t&r6)`Zovla*O58?9hm;e?)dzL{=Y>9UhS#5t02eB0Dl7J1Qa@5Rn}nku^kQ z10%9Q5!v8~Y)C|QOhk5UM0Q+6HZ&qTJ|a6IB0Di6J1HVNIU@U2M0Uz1GTaA1|MMd* z&kv#*$7RCv;ZNxHp}9xT!#X9m4NEmB*HlG>jA3jKYRT#a%HvM3t&W?fx*?w0~d z5n8b@o&>4cY>Tn#N&Ax2{TL7Hw692STZHrMi@&5x2U8Qh!sJ}WLk~ullPtC$AkQ`Q zu4{Q#1zi%gBSu6fdaB<*gb{Y3h~Qs@YO$v|I;)^}FRDN^+;li2NjR@Q9O zETooxg|Om&m1bVmwfcr?FeFtU=xH7dtgR(nCeM6<2l5^bN(5*D9MMNAIwd zG{#hp`eR?v)o~mahLe<@f?Z7mB{d9nRyf;AqB_lfF%ENpC+$zt9gVcVNZ;owd&D%a z)xNdF7SD^Z&ZpY!$=NnPgL2Kh;p%i3$ZZxDS9PF4j0&^W3uY!ydKgK+ZKQ{ZbVLa{ z`mFGpI-3}0+v&{|x3`G)RhjIM^1X+)P<|G}VAZI-kFdYnj;k~%tj1aHNjT-Pc`tS}t=}{#8zRL*@I!bbv_pZTN01Q>3L6Sq?`$PJIJ#7)x{l29W7XkF2a@!M zMmkWW_pO80{qIF6txXdd=bWSO1m+ukYO21mKO|2sLzp`Uq5awoN%Qg>_v2Y%TQl|Z zT|kt0xQ!^Rg*@pXl2*HPjHp2(z2+6CFZ~`ZfJn>DD51a_spoySrpYW*6tq~{-B^AP zb2cKZJ`osbF%*=#~CSBXr6R1Nq=OdgGrix?^&F8%W9rYttHhd z`&w=e_mnU&VN564VSc1R`2GQ!78cVCNhN3bs!gI=k38NzQGRlLC@J+xu&c_xj0 ztY$swF(m!5kshPgAJB%178!%O~kXkzip;GPsL?1}>+aM*ib#SN1 z%{(qO9ip=shVz2Pn8M7H#>(H59!JujxDqjwmvc_#~D6VdS21yc1GM^v2B%btmlK#|{h&nx9r0?B^Gd7S{EVjGOk=s6+ z`oc9*H6^_fHeG@+)rwCeofKwUgH=Gq9WNtIaP?U~#omo4J%OaV8R-ckP47i%TXMD$ zsonKud&!G3KVKA_k@SrC`Wr}k6vMs= zCmJcoOj*7LS?q~$wr^geBJ?%XYNW6yuVl$Xu3n_32C>^ZQToF$YkllvLC)Nn2!}66s9lZnSg#>B67l>fN?3Ol&y8xN zvCV3;-v+_%n}=NcwXlJw>EDEC6FiXr%^-8ey6KX~kTqGWSEOJt<65dw)R`nzeLI z#wDGJJ4<0G>3BeDq**#!~Vg%R0B5!u9u z?Ba;*l8EfmO=P$afd1!4T!AC5)<#@GBd#Au+=Ot%1(u+EI!8)4165N(UqDX}*t6i8 z4K%)LnMZMjq2&lAnH9sR@T8}bw5O4tD$@Jzht{tLUZLHkpoP%$iWTdSV@N@Ju;?1Z zOT!VGS4Il066~2xN%A~Pj0(k`Suu=NPufV*UPjs|(z&ytqc#mRnGJGhCT<;su&eh; zi`qGnsahq-;}S*BKwHSAxI)bp*?m`75Knp?>|Us(H8cW27PJN4fd{XH|QWA)~`tnsc*n*ubuN(qSa6bGa~w4HIea70~*@ z0_rAd;T*;}=jttriuIgkxEkbnoxWD0mJRD&dBU3A)9W{1ORZmPz80*lCq12{dmHKL zB7Kl`+JB+fR4y>yA7O!Ynw;QM?VGk7WBLk&J(VB&W9-YRYF72gE3+DBeHd@{ls)DE zPdc2W`xxnPl9vCx!BOPjeATmTV4Jp2f@CSLW5pbws{JX=!mm6Hc}ZSulh2b}jdr-;Hth?#^*mrM=@}&b*gYJC);~jaI)UZnrv{piWt=0VR^^8+tNxW^9*sk` zeueL#`qdayohrX-Q=#OU|BCt2la3(izE-CrMB1l_GE1}oYMs(RQqXfwhciwVYdiI? zI>^f!`|6eQB}rkc?2t}pg`|pS&st&@_oQc%w6~F-Dbgmk?8eC?(%JQlQ+KI=c*Xr3 zjT2I6*T?+VaCYeGYjq`6oo4nFzJ(_}i=_J*=~*IO$`w}2Wu7#A_oGPPKXMO;_SAk6 z??_(F!Cr%XJx159uq&yhT0e!y<4MmZ>HbD~wn)z^qJ+W~z8o9-eJGK|3g%ZEv#ddl z8LdpZTCxg{Ry7#1XZ=^ZLGZ&o=}3|uV5B2Ox}Zd&#hx@j2627QU_D1#UbDZ-(S9`9 z3vI}$H}GIT{d`|e*4C7q#4wy+ zHRn`A-l^WrK3nl-{!W25adoXzk!E|=@L4_SD3bodNJokE*=wP-_EN9gEH+Efw}>jf zlU2i$aW3e2_8CL zL?!i*Xa_YN8KnLaaoq`Aay{bu4FS6YOAY#VkiA8q{-|26Af?Xi>t$FAdD1Z?J=n2; zbc{%I^!D@Pd7d-{HK=d9g|%!u7p%3yg*;37HPWP^Yp<+ebWHeDC@X~(nkOAg(!NGI zR-~&qk5-I*`VOwYI!&eH5ZV(T(yfue(OspnulZebz4H9uV?P{e+5Rfljh=KINe?m7 zaU?BFd)Kj)X8wjmEJt2vk@fY^GRSw~)u8@aWXmw5PT5 zKzsAt&<@F}g}qg0i7^bbyXsi^d(!hs+TTde7wHs^Ut7CLM_*5E-=PW1QTgnN_C$^5 zSJkXEbnT~-cMUWD6#EgLbOK2aGtvnnb)WWdwN@PF>Fk~twc0bYs^732@>XeHVEtCS zpWd~t!*j!UW>2w8;z=(cX}ytNAksChV5|wezC?9IefIWQb#NW(U$m0BX2|Vb_3&ym zzlKDzs**@U7RpLt@5Yl}NYcZN^g@wtm`~DRbZ4ZbJB2KR7*{#!kJXSgjH8_Kif7d7 zgZw%x>_3vw3c8jMDRz`R=|v96P;MhdyR3nNnOb9vHkn4P88|eZ75;r9E9%Ah4w}T`Cvdm`YCqbJn6+GJ<{dGYCQF9|!wuGp?h2f(wgF-a-7;wUk_dQ1j2<79rkm7DCO(Lup}b zc4BMk>fJA2s`ar`=}9jo=>Q|WRCTH^R=z)v<&d5!tketT`gPA|jg} zkzE;)&4|dZipXY0WLHOIEfLwQh-`L5HYXyR8t`LI5jATGrWB7Ba4vdX}@eX5XtHquopEAW7vnG%2A(XIYYHCC$B+$Q+aBbU;SN@klG}PE6eS8 zs`X)QJ?Z5n9b%-Hi}ZnY&^nhrPNeory!2wLT9BHKL8w&wlEDy2W^z_-8H;$KG01ZQ z;(CkRJRbHLX|R#jo%yrxtzZuDq*FSe5j94W%qx2I{i zR%x2b(z@2^;gok{s2c1_s{UJNb&8qElTIV)u|_&gq*YuI7wK&nY3Qx0^@CM{J?BB+ z$-G;Q9MuuIEKg{S)MrF3xxyMF#eC^Wn@M_{kv5C8?_Id^q4WLq=SLtee>*ps@_|0p ze1Gm^+HRLp>wTV5BjQDQLZa*GQ?2zyntf>tv$!X{f}}%@^a_%eM!n^9q<6mTH8ssd zJROB_bM6!lz0#-JlXUDMJ3Ih+C-;*?r&ei!&zKZO>nw!%2E`K>H&V9B=TF?gxA3IX zNqW4IPFJ0t(hePM*9Mx-V4St)zKHeWo81yXI=is4Agslo0f zP=hNC*Q&D=7pcPRZ4mfjo^%FDPc+gQA|167CG;!$a!P8oy&x%Hh_HfG^~Kb5AyV_| zj~Z8E89;5!V{KhUiBc6xl39Luho1B*lAdIwSBbQir45_qHCY|WqaROsFj{QalD$mt z0oqK_FVH}1Yo3d^LjNVK(`+{gKC364Nz#*zbf!pmyd5R1yUv$m?*mX@i){X2pK5o* zIfJ!nw~z6PI~MBKVLgUcO6&?VQh3sy^lFm+%1Eyk>8{H_@oCWdMfKBzAlGi6JxysP zkecJI_dLY)C4=zplz9TdIF#q)N_P1xtW?(e@b5io3rSBg(iV}9A!9jcecStIdzESV z!zVlJca*qyS-zCint#GsNQ}W;U~{TnD|r>qEI(Eqo^%#T3r0Fiq+fd)rEMO}`)%CA zDh`LdNb40oy=*@BK&0-$Ik@Qp#7n0jbbl@^&|>7rQlefNKFg{;%kk#CV0kE53whGn zBt6wgXN&aMTcEEvm0DR&N($ATp03Guf1R$Z?btWF&E#1JG7Rjgy~7gLX=qPb%IEhJ zM2Z!fC!IsmMkAdg(yCUJ)2Vip4%$lVO+!hcF{4z4qL|K9c_^|;N)4!0%cd>VkXZnc zV%_LT=aTd^Bb_VK75AgG;hg=YwP_+Gr9lWgIFFV`A+A*IoNLT%m_|9rUJ_V-yK^WD ztJ(}_0nJVf-3SmVRu-) zH-EBqk<*1ggzBfN-%t|9!x5!ksZ@oTM0JY&2v6Ed(lcB+X#G}^?#!{@V=}nhAHrZ> zOvKVBNM-+$C9j$Txn0M>L7u)rTsn1@#S@ew(#)5_E{P|-j-(@8E|6YF()7I7oYu7O z^IrEF&OA-5<#!fP-t1HDxv*bBGH5BnrY3~N^L!rlicXC;5gp-E&97n)ac>u^PO*36 zNv|jAnMQiO>h$u}&@uj2uc^q{T=yY1u&&L*sz&n6$+29x332n7gL+RJnJ2vKtDYe0 zU42>ZsR)r`N6C}kK+>~}^ahbGT!W?@g4xlD%QKb z_y!P=}|;92Z`6?>LFX>+_! zwN*6d`c`@>e~7u#WNLO=6!&oyW&mn1KbjkEr`e#Mr4a3vRfmv z+aj{tBeJ%L?2d?RaYS}!M7AU%yDK7F8j;-{k+nx;_e5mNBC_QX*@}ql-iT~vM0Q_9 zwkjgKKO$Qlkv$NRt%=AUjL05}$R6HAhWh~Me}2RjIpWT>5m(fRn@UR*`UUp(9cLPQ zepS8`N0V71`rd6;`cT zOZr0Iq}e|3qUF2D({7uBJhrcKAmX|Xt#xe;BO+QorBXCJn8;w-$R9bDSOx9z{b)@dI*qVeI68SFSY!J>8 z%A+vrr?9r3^j4CNGtyf{+K01kVHSvtMdeVp?Fy?NrJMes*5IuiQRW5g8E8-*^@@b@ zt|N+d>ekw-Q_KOL^fr>7XQa1TKV=JU$#Er8TW7JHBHKNuS|+K@s${8c0fp_Q%R6A6 zQh{_~-|RY~bluszK$w|4>Fp#PZ=|=2bm0@w`mbfw&9ghzD>;^X>pstEJ~ej^;%f14 z+=ICG*emW=4QHNyI*XxJ;-b?Pu+7|)8md#wm!7nZq~{xH8%Z}7w{Xu~6fXKmT3zns zrp1VNfH6JeF~qlJy=(7Dzg^Labwj%BZKSSTfN+9#G04*Ac1ZL~F7hI)&WFVPAv_#$ zJ@vX}_61JN;-2&ll1^}WVWsX+oyrHT3Cc;2q1I}Idc!t**2n3}p7LQY)7qwdCiCyX zkSuv=sG&qP*vqF@*wgGOCioVfbTLUUFw(^$-ReQ;nAGky^+*}-kFZR?&%OXa3i+?H zK=tgW;?i8;bi1?kg&TWTSfrtMD?J)f*%vq9@p#fZNqV7?-YL=t*hBLRNT+gSnNEOY z-DHGT%PK)Td3ng~o2#cVPcWj&?ANv%qqEEoBAV@JA~VjtEv^MXtQKrcUdgMQYPE2sPJ+qV@|at+Jujc^$IM)7n?3JjSi19T`Om*7HJ(d;ho4Q*2MiKi!lS&)pDeR3!ruMlW@|0ddco)c? z%9n4ge%iG^h&QwRSfP2+Ow z*6&zMy#@023w)}csYs87MBl$@8iROYq|c-NVBZ%~e^mWazifz};C6nENU@srr1z3^ zijm$cQhk4JV>s`h$TB&P+y4E*p2FT>+KrNl47rD8-&7Tg^7jhPO2T;JuFU-*%8fUwU~5q6;J8*B**;&jrx1($l;T**)xP2A zmL4&7jfawKhYkA?o^%ySry1!gkv{bRO1toG&r;NQuZN^JuOlDyL3DdDbX| z70(A9M|ppS;?mV9-i>mF`&vK6E{P|-pQO!3dOu0i`n5Q3;Bv23^{c!3H8UV@;Fz)6 ztYuD;E|yIYDf@%+q_hJSUI}}>X$W}T&aFli_HI1sYLZ@Iq^m{x%|}u4iz`?@brdc| zJV(#1$U5yj&!_5MpPv6-Cwtn6RP#ouK~IW>o=(yy(4bzyT6Sx1kzz;5lRiMw=|=j1 zTK}2*pks4dBdZb3IW>^C$jcZUl%rOo<=>hkDq)R>mf!9Js2-`u_OE#z8Uf~~WUY^V zE>F6Kq*og08j=2$V}JiP&th*W%2qW)UOdC6>i6}uUMchXO6tYI{Rw>;*!JXQ=NkeI z;;p76d%F(1Z=Uo)lFl&F2Sxf?31{>QMpV@}NK{Aps}au+N9g__AHdW@5Vp|gwx@1_ zStvJwc}_;Cy32E>kOm9YHrboC*c0@m50UgLmlIa%A@$P>9*4dWE2&j1nvrM?dy}*z z3(HjbOnQ=Q9<6XmE51QqL;ftrWls~vck-zfqLIjjrqLAK6;-1hqR@p&}rZAVkrm-DGcD)}!R>6dvQpyaN2)B6CA zL}Y6tvPUDb$0D-FBeEwVvL_?5brIQ95!urb*)tK@vk}>I5!v$**{>tAj)?4qi0s9P z?4^k8<%sMz5!ovd*{c!R`iShe5!q`I+3zB<*CVpuM`UkAWN&UF!+iksKR@D19C26M zh%0HtRnsr%zSNHhea}u_>AES97XmA0v(f&LZ@7wQX&)-EV)D|PxC3JIz@A>eNn|s! zXM!;*Jn17OZ86eEWX0xiw!JX0VtQh^kV3cKtJkxvHm0?&L#`6{EK=Dx+F|7>aTaVa z|D240<*+-qnsfV^6~kEdq-#k!%ShLfwD!18rzu_c7WL7x6gb>i$))4<7Gw)3*t#1CFyJqtwj*&hl z(yi}+zPzrVq{$GLK>tH;SBAc+^|Awyr(+&-4rLhhQ~Rb-Ps*h;oWn#~#nkLM7Fb(P z`Z!7F8tLOA?Y{_Tv;}pl)t)>R>!Ak+WvZO+kTh@~Nd9BRm!tM(eqN2WL`W)j>B-() zz#QO7pCIWqM*0Lv3m^T%X-(h#J#|w@=~~2VFGjf2{Rk(p->J-6`iYv6C%=Hy9Ueod z=NOe|)B;EfT%*Y!)DEIivo_`Lx;;htub7!U>60X#XQWT6P7Cxw+gqXAG#$q{Yfbyn zHXe8#=6BLN=|&r7?}xJIN<;RnK%n!B>NI=O7W1ViT}RSuoi_Md>qL4OYjgEeUh6uJ zlZMHV6nP!?EpU;Z#hfQ0JeIaizm1rl=QZ@W3Gt>Gl<2*f>G)dDZ9zh9jw)=8yZ=?p2`5ZF^)uVLRGAAh(a5N?-LlWL6)O~=86-%|( zZ*{8PdbHIkJRVQ_3`wsy(q~ks!`Qw{S^`b<_jUa(O_U!Qq^if!hUq$N4>qXxaLr}) zC~L24Rmfi9_UkmF;D>qAXGwa4kv=QZ-`od^QS|Pm)z+MxsoU9GlfeP0EOs3vec5wL z0};`RA(JHMHP|lPu7N~!Mw)dkAiXT`#L-_2_XN4jaK zs99@$tU5gD3nVQX=?f$+zW=t~&NDMwsGC~NA7Q_*8UuNSCFiJD-z;+n#`^NUUPDsPxN?d#j7y?0+X=>M)|38* zq>GI7H%59pv~GE=FGtVG%F-0MMymK-%f8In2cdq$z^+oN%YKcpBwleW^5BgC)E^d%}x$%jpIM`=G@o`Jy^a zY(!z@?@3=J>1{^(sz|rK4=i=$m2N%nBYT%lL28Bf(H9cUFvVLK*L84CH9EC^xN^=h zr>JG;WXZDMu)%(WCtXj{+l_R+Nc(X_^F>_5QLC?<^g+^2rkQP?H%q`xI;o00xjqyrY9%=cNQ%CY;_)LkHHIKx=4tixFoCL`26 z4DGiYsd_?a|HIZ7qv|)CO|f_5Nna!B9Y*?^NRM5G($=aSbvFG?S&`hOWEsj(C8%Y& z5Ajdhjdt0Gz%#Vnb!iLRS`vk9mCwCC>?nEC-;s2&k^WAk8y0{F-54k#k{_YDYRa zkE-=;zUE5Q%2D015B8oBP>|j7$Qr19tyc!up;8oPq}UVmq;HV)E+c(|r1`TpI34+K zafPaKhLOE(5_DgBFT(J*%}QM5l^Y?y_(6oV7a(kJLMRREdENElc+-q4I<*Sh!2Qy& zS|2-=p7c$UE_K>4@4qS1-CuVlq_02i%c*BiD3bKTHp(ydsk#H4urEKh0`d>&!**Qg z^Q@bWc%G|q-7hkWtooH5p#PFKI?^xmK0w)B@uv3y-ipZHj>!HHk^M0u`%^^rPDJ)@ zM7AL!`*TG0UPShni0u7{?5`2o-y*WVM`WE5**_w(e@0~gipV~Q$Ucn7K8ncx9g%H} z$o>Pg=w={-jJwn!I|bYtqv3AsvV zQ6A0=D!&%;Bjxv~1~s23wQK&aq?L6F3*t%tK+FpRk3S6Q`|!8%vv9I&6EC-q|1%;k0R9Lkadu_KNsq4g&cgBbnPD?AGiWx+YJbn zXXt&1f44}9xB?GJ>$nm>D!YzJN|7O@OPep}~=NR})lW$U{;VQPKM;-2)+Bwb~se->#i*MjPs zYCCyHvem91p{}bpCDlE>7WH3wv>I1pkwlD=bRCnKT%_IDLl(44q z7cs6L8unAoS7D2H?WgL+*?s_gR!{mjl0Impe)g&X!yY<{P0wBTyPjl-L*W z*^4UdoY+O3-L1r`!;}7lq(AzKNdKWa{o7lvob>CzL1`+dVo-8I=Ws`|J#1flu-8yJ!E3O#rZ$VKPJ1v<_N*mVXrA<6Bz?q4 z|D`&e_%zPgcMZ>@4!zr{ue#}eRSWA;bt-REr26V%$3&bPdP{oBqGES2v>vKi+K|tm z3C6n7lYT(bwMP1Z>a=M-%4weJNyVt^w;4b5;Z+VpdnZp6@>5h_=B)%e)hm^1Aycy_ z6|kE1q#u&>Q6v3Or0Z#)HqhFu*7S=mW!9sO-}<0T5!FDleg@@7Fsu&p9F2G>xPw(; zkwemKj=~z-lYT_f$BgtNk=Ah@?V&QIgFVsS1RIGm!V2bGowk4RfGyHpYeav{g0Y?hj#K#REy#I#teW6^&gIPx>E{KIt^UO8rNq z@5_sto=rrB`Q0l@--u|FWXtNNlH~n{jM)*j>6uJC;gbD z>x}eclIA~r)s>lE`-~?oOh>$(K1;)mi0f-cDpND7?hkjT71k4t$;nQ5{X4KzV^oRV~|=J%UhS|65vCrj6KOyPUM*4|J_vSk4_D4E z8SB@?cKw5OK}q$yn?I}4m!h1O!QI1E>tpxLlm3sS&lu_dM0zA!aOo{xtKA8B)p)<{1U>6nGk zS~m-!bX2?{Jp%Fydz#rnCvVXHIenS%Hy7+qYsjU(8A_xlyQ_|!N>BP3NuM*)&qO-7 z9W3wD0*ch0Fr!`3*FNH?h-|BfZ0m?@n~1DiM7C{2_LYe2s}b3D5!u%wvad&E--yVnBC_ox zvK=C_Z$@O@BeHKrWIIM=-;T(7L}cHI$i5qqeJ>*0DI)uRM7DE8_Jd7ixDSB-=SN(! z&1UX@&)bMgw%OeMFPT3FqoY1W=>8DOcao>1HAy&=Di24H{YJWWB{)}@hB|5sXV|Jh ze>m=vMD`Y=!jo=B(qB7m@C!B*>GPb!UgjuQIeD$Ask>t=OQ`Qs4ri=-`91p~HMDfL zw-#D1U3VoTYNgg@28>ltx;aTZjC6C7rkit}b?$1?!F43U z4cb#Zm**bFka-H@5HD-yBV*-L8;MJ`S^Fp>g$41XTafexBi&+~%eHW@F}q{3JEpkf za(7I1$24~|yWG!5#D6aicqKa>vc?D7xbocPwznLU$~3$F1(T%^kP9qs<+6xMQ(9{vT^+A7|He z#r;E7rzlg>HdOT*k&ZOg3BicqW<(5v$s0j%^CBW5M&1m9lNSWRh#&~Ah=_O_1VM1c zTd3+#G&I#q(>7IYr>dH^%Cpz+w@%i&neBO=Kg{QIc6Qd;XYKFVFKe&8&pzkg6OMbs zabGy@561)HXbZ=K;dm$<4~JuUI35Ydqv3cg94o@{csQO2$CKe$8IGsI@pL$z2}da$ z&xT`FIGzi~^Wk_Q9506BrEshc$IIb(B^*Bs$E)G^c{pAR$1lRs9*)<;@kTg)8ICu@ z@m4tA4#%&;u_hevgyY?C{5l+K!||JNycdq&hNB#g_rvi)IDQw7b>aAZIQ|fhKZav{ zI6e%=|GxO*i$8~dKMKcR!tvK|{4E?E;rM$vJ`Tq}!tqHs{uz!>!||_hYzW7{!||VR z{5Kq*h2wwW_&gk6gd^D^yc{YmrVieVe%k}>Og#gPhq*JP%_X!4IIC}Vp#8PLhe`5C zQ-_dg8W87*O3BXdEF}!H-9a+0SxemlE%gm;savr3U-qk@BYj}CY3e}!1?*pY^-htm zpJ`{cXTy`Kho_dqoGcw>X_97%m(csvtD-F~tjZ#2ke0HdpMlrq{f$q~XpCwNQO=6oQV3Zs$Ix8(*% zyzTeYjyF90WbKQ;WTaIfeOpPZNIKy$(K?57Sm;Q{As^KK(peI(cyoo`DMrs%;HTHI zRl3<2_qOX^YPL$>-$=?k?xm#S#Tn^0LHa8t{U%B0{voiW+e*KZzYrdTlH!`+sE0&8 zhvO#BwoesF89i#)ixTJWu$I6}4W$%mF#pxLjO6ClBO+OiaJl%{_IQ*wP$*N@Pyc^~>F zU^Q~gzP2PDuaRyI(sz_}Ym(N!DOdbr1+D|jxY>yJk+8^--;r|uf~VN&UC&CI@r#iD zc!bbU&3ny5g4SB`4n_hw*F&-uR`J7)bQ_SqtEAho_RmJ&Z@=I2sYCs8mfCWu$eUcv zCRpj?+`7d3pl?VnkgBaX&~#S((gD(F$qv-om)U`lehZ|(R?=^gbl2sgZ_e$ewS5xe zs8hbVqTjV)4zvTXp3~<`O72kPkg)&otoG;zk@G1WxpeHJ29~=YLD?#CR`swAWTY~aGSclp z`Wq$P4y5^y-wS!>w|rf4rj9D~bbd9Z8hxgT<2&-9Rp&b^b!a&`^zj8VOheKlajq$A zEg$aA(mtVWgg1^^rZT@X(rS>tr=-;^)75Be$puc68>9UmQQn7I8kWdRxk~HW_io=p z-6*dbaK{?Yo&w6O(@4J!(%&lSw@Lb)XTbQdkv5~}a*xU!tPJKkQZWa%(*{ZZ32oS+ zxE8Y%=C4-jNYh#InZGfb@YK{7>h6Q5p;#tj;Uf=a#VIMmHakAh({7Po!T5w@5r_`O@~FeP7n2 zjI=9A|DdE@Nm_TKmwzH?||FZ^}C+#-IpYj~gq0LtGeV?9J=?EHV7T^f3Hz8rl^pq|YBvrJ`0(MZ1!(myHb_euIzNpjd7{feagzHbgARU^vR z`}6deIs4?7j`jT!XWLS=ZvOIyjud%!A7sRxg(plTm32-d-5I1GD(TK7E#4$L*7$bH zGD0boMj?lNT|VqNXsvTD6*)%=oolkZ$W`sG@^Pj~a5meaDyy$X`U8;uSxJ9D(tlvw z|J0Rf+d0sI5pfOLMsB3#NneUSUfr!C=dQNQVubv{qdKJL$i@=v+{eh9eQQhBgpG6; zkbb13yO8wcXGLp|+o2m*>ysvwso!A{t`mwnq{Ik%@p6gl=Xz7DQeG%jWk; zybRB~l`{os;QlmzMOd#oN>VbeeSdF}gckkPJ_pK$JKpqtkX<9Pnuu(-h^$*gwtGa@ zJtF&2L{=M-?Gcgnh{%2%k@bwoeiD)G8Ik=oBCCtYdPQV=MPz$NWW6J@eIl}bBeMM> zvigW@|A?$lM0P+#);A(MFd{oBB0G2!nLG!Q_GdjVhaUIW(C($j3e5o&@V<&TtLr_U6#bt2EtJlWys9UV*)Ii4Up3Mi zkaj3(4M{(GRC1nvC-R4mBF0LVR0&?cexaHy0uT1wd z@+?ELXHTref*9#;ApN_N?nY9+&0a-M6gqUC1x+buFAa7d>doau()U^k^Fwi#r zu6V+Eh1`42eM#*oHGQhX95@P~W?L5`H?+zMPaAis-?QLVook=+tW3qXFw!0%-JqmB zNP5#s$!+a2nNjXcgWe4z0URhJm-Swbvk?TYend*oa=5} zVH1zXNPi5{e=F&aN!s-)$*seApMEc@j;yS4+=u3jy5m>Zbfollh>T4Ce-E?Si}+zi z+7qPzQPQ3yeGR4A6a6Zj3DgNkQ&>Z;>u_JSo@M(&8F8MaZ#Z$r0u8z^pFNE_c@^V6 z%=*4~herAnkp5Rme?rnH9+NUH+$kYhxQ~|OU-L|nr^nk_EpgO-Jyt#Vytm-yV$IFC zsvoaH=u4cWw5QoTOMF%%-4mprDe0ahP0kig6(hTE{p>%TZ44y(B!hYStH|>I7jlde zPufU-3ex{6=}$@8|3M*rZ?S~oFNC@Ai1(7P87pj+Um(I++(GSS64%xBo{&R>zLm#b zq+?OCQ9pChFx$f@{=Jdbf%Nl`M!dc{k~S}w9JaXG@t6|&SeccQS%;DK0_hh@+6$!V4KItnr&gHO@*Iih;6-f#+g|ZJ z10yA$yezm)QZ`?JYw4AMf=^otv|hAHN1J}Xo|I%yfn+XZqhRitU!g3Y078`nQeoHyq#5x z+!gX{N0rPQjkGsNH&@c$AT2HXAY73yf5S8_#Yz_6oSAf=$Q#ifl$32&+D1CHBxhG* zO!ZHS_Lx5{MXl5zubhOrY@dqEW{q?okbX@`_W@~=UN2Xu$1JJ!Jui+tYKPd1 zd6s<{C0>{<*XoSV`y;gTB=T1=t|6|?cK*p6+er5X=@v@5FKhp~pUV}8KC9P-_zLv* z68b~m8${0C30kJ`2e_WL99}K=+3T-FfTF{0uX^bfBGmh_HQMoRyQdtioRlx>1lRZ>{^{18e1wTC2ZL$6aC3exg8XyfS5I_Pcs zz2{IGr=+qTVWjmSy>fim#G`$Z$uzYEdR0K&t8tccHg>W0W$ngD`+#(TlJ+5K zYnx~tTZC@ZoxTxpfJoX?33V?I&L)GA683ZfZNjmTG$N!1j>iX@B&l(6>Oo0_Hbzoe zQ8Lm4KzgH+9zfC#*zHn_)6@@flt`Wwd%LqN3)qYI@s2-2IC z^gxpS2mR+(v{tsGGTSC{=3BtU0$7+^72>G&1lBfx4lKh2*xdXC z(~v;YF%yz{2@B}y+M{p>9BV^el2leIjr3rU-lC)jvrOMxEt-D#Ahh!Sry`!0ut*QZ z`TTq?M4$AT$0SW2);2%FH0X$bq)D=GN+cn@@}m8Onax-G93UU=c+=+q{UWl4i0qJv ztbasyXhb$3B0DT1YmCSakI0UQ$c~K221aB@MPx@uWXD8gO%d6kh-`2~HY6e&8j%f) z$c~N3j*G~KM`XuGWG6&qCq`r=BC?YrvXdjSQ#O&wa{y_7*5mT%akpxZ%cIAY-ffqD zar`Rl9rX3McclZfm;AYQma}Y*u;u$j&M!&$r`FJ8dPOX^8!>^^$ zHb}29(taSlO-cLFHZ;K_$a6H3)Y&%xsINiv=?*)dr4_~50`Pb++U?< zkxQ16q|#T7v;m|=C2b(-?6*YU_?4!$75;02F}FAT@Yb{KtUkHMD7?jUBIlPG%Gl39 z3sp5szi*Q1J~T_ME=L-hQQo`qYSR1{B<klv}JhmmyEYm!^v zRT7eP%}m5kk#G&#Z{d79t2-I+>}=XyBG;9|(UztFPrE=#=236d@2yn08e!T*>siVlMF(<2H`k_zGm4IdW)Q2L#6Lhv3HQYj-e3P?keM@JoB_=6gSet zL3)>x9!}C`^r$vkMqZ8e6W+P*v_-3AiD#jZ^7|Lc==(lfsIT$P?Ua&?RD25~Jp!al zmGlUZrVl?Wc@BL6hEPfSV}*}iDW9D!gw5rB@EHoecAH*^ zyX0@4w@roylvHk}#LMt&c~yct)A%r?#2h00>Kxmt_+dsm5TwhLbRcVg1)lx-{W5-T zr|V|5(9N=7t-(*O<7mcu_coVaG}CM7GB^Gm_}7D`DZEP} zC4$*V4t6Mark&O2<3mM~zZ@yY;OuZqQ^rg&KMfL$rYYy;5gAPA6PnOOPsdn-G?OZe~U?kh$*jXj2Z8hfB^|`t&)p-M=Ai7TDV>NM z&`-EFp{uOS0rk$YzRcAwdMIxFT;KW4K@YF;aY|USeU((^LPk0mq-{z%n6>}g=SAPb zC8kxsO9Cs>2FsAT5~26bdGr|6egS8TemwwVt$vY@T%D~4dRmx4uuNr!W~4(v`k;~y zVVSm}N3Ee(M6K*m@cPoTa0k9e!5XpDbVZ{-(zx}s>}?yndtE`KejjE%O6HA5IuxW2 zDd|v>@>{Ugsc8*!8);v-XRM`E&Q3HRNz;n<$lW3tUC1xd((GY6gM|>eXUyU(Q<=>g z=`fH!tfa$8x_YkYXysZNulB1>$0CQk%ZKe0_mN|bb6iAgQ5LlEigIL{jLxVt|5WDK zMtUqrmn-S9B)xU9P;_lI7A?m{k?=cKe&t+Q>gBBdLfO6&*A*bLz=kCQP3Oj)>LF$3 z^(7L|zG5RYem`+aU^Ypzn9K5t=WuMBsw={DU*VI7Codm4p*@RA<_HjYTA^` zj{?-g_K>wxS&uN%;UIlfNr!_py>yLe9rLp3UV-*dKwrugMLx&fM{G3Sn6_w3ESc%93% zMy@Kux7YntzDz-(9=?W!1fu!TmLUpepb!h()mV|b|_ZFrB zOZz!U!x10WOX=9_t8vzIMdDhfvZ7?9CxY~GB|TBwDZEjBwTk)Z(|)uy{{>s6z$i!? z){gqn=l{;0>T0SdMH^5JUs^b+} zSFqje`?6ALq^E#%rIMZk(!#mF6VgZChE|kFJL;6b13GP)$gAh$ENYD-KG#+@dq(8^ zJ`86HY>7pbGJoMh=eV$K+D^%iQZA-}^sD?XR3Y5)rq2OJMr5NRve6OQn27Auh-_>` zc3MO>E+RWUA{!r(oe_~uh{(>2$RUx|ca zpGgQSo}1Bf!YdpxPtNLG#aq-G)1bYq^T>eS9c&zJgY*g`9SPE>m2@OYXI~>)x$j@K za>fLfWC-%?JkH~6E7mmio27bxA-_adTs@s14SYONQt7KkItrxEDCsDYKKZn;tcJBB zX?YCjU}aLQTP3vdECsH%og`^CUm_uQJEX&K71J~!zBfYNWvx5QG`x>&o+TE{3wy+6y#Zh@C<}pA>dj1dZ6R? zph}~W#`}Q%At5gryFfw>o;usVD&wV*jsxinN;;0DxrL&GJ8HGmIP-*7uAW7{mQo{E z>2I(01_frYs)5v=$j8acF!Qu!6gSe-LHeSSo=(!_dC6z(1IUe6W4)y?N+fHpmeB9* z(AjieaNduekt;KT}j2` zG14`xk0BPy#9|o=I0qN$}YmP+W~hvs*p zb<{wsNXMH7KKbTvJ#L&6h#zL86F~a1l1>0=dLw27lb!`)L?r-|FEwjH3)iM?D&`8e&=_^WlCP`PnC_4W8glXbe7Skaj zX~YUl-BdfvUoYqPA|6^Ka(%bP*@rw=F-~+>`TjQq0F8W_?m=&htO>oC%@LHe4Ko=wtq=(+bgJH%ek65)D}?g(HGEF-ka zYILoP6lbal1>I`sn0(`&bb|ahx~DM?IMYHpx&Q= zZnLMQBeaWvwjWBWmQjJsBAU*?TQIt8S! zE9n%L=@#hSxf!NOdjiTR&k?b=oh1wR_^!s?Bzc_O+oi#L;Y-)4$;&YFrDQg1q*Foq zhLTPNY4tb$7jh_-|77`0yiek7H%WNFY6<(_ZfEo3BwiFBE5CZJ#1Db>=x{b^Dg1#g z7U3$CU2zoRq{~U1-)DI>D^ri}y{_yG4n&p}f{$L@2xd z7Dj5x2W^1AfYSwB3+VrYrR$B7Mt?m5ExJ6?^y|C1{Y289{jRCZ{EhS+kiMy;=dkuy zVnkekHo%(Iov0i`PD2hyxO@&o9CN4P@U(P{q6J{7F+DVBYw6}RFiiqUt+rEHk1)~} zkiMm)EhOFjLAj#wX4Ax-JE2U1Je>l0qdSYyiC)I~Takumot4t(Ro)u-I7xXQ8L6z2 z80onneOpP-CF#(Gl3RJUV>uRa*tMZo)6MBN_sv?-(D#cYtdTSrgALDT9MbIpXjWgIdF`E-CE77PL`DUArevp{g;Zb zYjq}N9c1rT$~u>kP6z2bN;;jS4NpoA3zu3x+?B{4T0p54ea~eM4U+!N+a=Vopvg2O z826QwjO>TJSB7l48L6zk8R-QeeOE~@AnALUK`r$?O1UKGs+kg2JgsESqQocAVxWBe zKAh~kWsbed#YxI>KO0SDP0&a$1nIAp^g@#M1f%XbfQ}0PZ4`3wo&dSf26X;WgEW*w zL&cMSN@$Z9CnF`<8j7q`8tFwKU8|%Qk#sz2u&EWfK@*>w=&yoJ7J0>cKFp_=$oUjT z-&u1OQ~P8;=wy1fZlzAbwQSL$^uOBY0BN}6O`ikIh{$F}WV0f&*%8^r5!odX*`*QL zoQUkQi0tx+?23qNZbWuvM0Qm~c6CJ78j)QSkv1W1+;6nUrR;HC;e~jg&ae9GN@)%Hj`kPC zVJ-O_Q&(JR-I&JD|0wBf#WHOiZKYQj=?sv*r=&AT%J+SGFLNwh|Eqz7W0+dtpey0b zkE^LA+FRNl=`~3M@L>G9~GJ-1BB5gIEwFodwdelFlM&)k5K_$C?;PH6M(R z+*MIwZ)sOCh80i6JspJ5&l*|2jgXV;%W6M+>t5`dkr=*vV zbU9{z#jBjAK@#Vlk3s=*_7LXDaTB%Qb~aM-EUW>!wAazEWtqCO73|%#Ol4#;(n~?Q zPDw8%=?3(uaaV!}EV|l=*@!+LIl|7Wrwy;a3C~t^XD-;4q5JJ|f{7<#JdI_AdR}4btQ> z=gFN(od~^ONj+%SY4&^O;#(N$NS%4tXNjclItkmR*;#tg z^!vKsA@UNeL20<9Da?>KR*XU+L+-4twh)%}iCU)O@fhh9AYHGdS7^`(iX%jM1@eYmjN|1i2q*s!3F;;q-XPYMVN^s9y zrP5K0d7>}ziDvcrjubtR6#f~ja(PlevSzbv@mY=ZDvDX)8$oqNJ@PosQC6 z>w8oaa^O9~m&#MZ9M}_3rhH1EPhHV+m8F4PLAT@x%&#nTAh0ZSG(Ourx4+cfBU0Mn4mw@oj}YG39;Mmi6qe^b(V zB%Sq`Bk85x2- zco+2fWrk*?*MhV|Nv|d8tMf$P@R?3)qs8@|HLd_L2lgn~Q$9h{oeh*Tjq6>!`-+uz zreT;_DVaAK>3op>T}kJYl<$GeNsUh5*F_&lPlBB5`aTD=$_4amcxP_h*Dst^Ii1j^ z)Lu{K^~r43NUsCw$4Yt~Nq2lu^esm{Qd52`azGiCrb}E$E#|=d;Y+PqfRx7|#2kSd zv|aml>Zz%REjRm)h0L*y^m>r~LrJeEY1IWyYNrg( zEkDSW4(grH)|bu^xsII!T$+9^&a(TmcAD)`lT{KUy%D6JD(Q_R9SP60nQZ`CJDQOX z>|+x~({jP(OgnI}NLsIe99({^&ku*(k6O+v@Fg3(E?OyByD`$6K>9Bwy@{mHKPOs; zVDzVs`b$KTA0{EcuTUN(am|4g4I(Mx{z~UcT;Kh}y`~&Hj&oNX>Eb#HK$5*zEh|b! zdNW8jDCx~0&A+f#t~hD6X=0&0CGPLf zf74X&7`}Cyy$vGkTt>POr2kgZg)GzSQ2RSAwtPyX5r=K>fR##I>FAri2S}Rvv=}_Q zmuX1YyP$!)=Duu<+W0PztiBoPEg=1mlHNkn7vBguq^nAnPb1-8o0)}Rm4XWs>ql}aPM4Wyqb z>1{02^HDBUOD!MHHIoxXG8}mpM%h`N8>3`bUn=r;l(_B{mHZO!!0~Tnddr}7gOtHz z{A!;A6vG{F`W)c)h-^_rc1J|EI3l|J+6oz_do4%MfSM&VHHkAzhhs>aqbL@y5R=tQ`x$X^d|M1nnYe~lQ0=4p}sGM zex&ordYom?s&R2z3x?SjIHgw@>Fpr>TuE;SX>R>zK}X>mADgBoSgu#$)7-F1=|yemevPunHl6X_dgSem}`B|e?AFc6ivRzqsquU?X7^>u1*rLP+4B9MNeq>EUl zAKfokv{EZI!G6(xlgmGe)o;~c?%ECWUiDx15k28gLatJ=)F?^ZSue?E*`+MRWEs^1Vrsa4ER&^A;X>D*Nn^6b4883T-T2}r-Dq)SLzUIdC($1)gk z)(-1^fICa-z9Pxd(>`3{VIE@lim_Nd6*6{rXUX0Ll5FlOBa@Nd1=1~)^e&K=#=a$2 zZ2h=tDxj5dcL=|-*z8Mukfel7O27A_#A|Vvd9(_am%as4XF5~oS8AEECbBOY%Xn#| zOF{Z|C0)ugEj}Rn#@%RI)%&awN!>Ka8{Ju!S572j(BC+F@Xrage7m}<5+6^(wd&Vq zzilU@xRKrs(k(+W=}~u+bcf}l<6gHOprokfbh@0aSPg0r37=_IV>XbCfyC9mmY^rq z_K?W6!W8~+RrYK}dy1mP%MR3vy^!alOR#86b$bn_U?>cEQfAou_?YJRT#x2c%U&iICpI zGM$cmUcK4!p})_4ENQdI^-XM0=o;m|B3}(UwUw^abS0Q$5wG&)O9{j5O9tYH8R@+s z{ic%MOVX23`;Ci?RPP^spU(&Ua}!-pgICZSPdl`2K*CZ}+tv#@+4no!tuAsltQ*nt zi+5CZ7nEqTUB+b)ziZ8cdsT)*b3Fvo@MQ6C@8lk~Zfrh%&n937P1 zwPJ0d`)MvD6`$2e?+5ADN_s!bv}J`{vEm-fry2d7y<$Tu@^qA))n6{gy5#Uyk*nwA zSackv|A4a7)j^@j_AXXIXSRn;JZU3+0HoW5#L`Y5AnBuvpJWMr$LSq)catWqE1_<;%ps4UxJkQUZkX!%SLS^mAR0SJ_OQjwM-u(X$R`PjP|Hk zvrM5|-;>zO<-k1AHuOzW)_ApzGJ@W6hUInxqk79wE|{jz_#;lGw_HoZa|r zMP{=``UptB9TG_2e}tr*m$WcXqAhdnJ98q;+#epS~+YQjRt`k+WpAck?WJ6wc~Qh4q{D<#3gH)%5FlRp-7> zdG>Cl%>0e?F_7+{q>qub;b|dS+9qN6laO@>tJ8eG$aN))XJLW(w$IE(a+a3gKPObL z4|k(F*(#~QhuN14Wj(@3SAeujP%gE<0;K7*)nIv8LTcrgA=w_Q=+&QMXOmHg50r5I za>U0;sHG1It`~-#9ngu8{*z~{fjoN#D61q!`Z!3x6D}9h$62NcJn1E{|0K+XA&ayCZE+KrJu0n+a(=@TSfceiL= zx4`97K)g=E>PZqtb}GPn7Fux@s5f9xGW`c7091 z?q{umB=b*Y_03410_lz+YiXxXk#z8#a>bPSrl~j<@qQ9kqkMH1KvK3Z@UDl?ud@T! zPSta8o=(LZi{4^owJ&ReM*1{JcT&=)Nty>~87)rBlvawpbpohqVMz)r#Wt|BZ>Qcf zWUnV_6*PEnEP;f)*?eDCDvk6RkbYlDpCRcg)F9{VB-J-ia-uJfmf%+$b*%=xb8nI~ zoQwGPa@4l^wh3+2Um1pR|Ev5iP$}H;rq2PMjmTC-WY0xp&qri0L}V{UWG_Wzt0S_P zBeGW_vY$m{uSR4)kH}t&$bJ!#wMS&HM`UkAWWS8a-i*lJipbuM$bJ=(t%=CqiOAlK z$bKD>t&PZj6Op|ak^OcPnLG!O_Gdk=gdVrE_P7#yTzdCsq1QAo`@8fV_Jy^y7R@60 z(UTG`!-&kY(vsj5Q%EYT`%#%L`Yx*Qd&k@7xcumNzR7-qx1@; zR~YHDApJo|AoliI+JYNV?`x{H#oBI%LvvUXl#`IHKlPw_m7`;~KjH?cwFLt$_Aty0_>%RS*N z+dmobqk&`JxVkPD#7Lh5=?|6kIg5Eyr2Bh4Pa!? zK_Amv@o|#+9z{}y*-l#-nT+%$knX0WFOhU7_yv3eg!vRsNB*!S`hAT{uoujv6dsy(d4?o#pK1K#>fm z4Q<3(-=j{1qz)nPtisny!nMJchH&Hhs*K`B`Z7p&SJIbB`mI%RMeheC41Xcy6JYvI zBd!y9j&=)Y^-aqGB42o$gtY2)%@U`E!dS@3PEtSTq8`*)ct@8#N_-0=eFdc5gF>hIUXBs@%PS;ofd$YJ2^6}z4h>|ln8}coVP>Vo z<1x~of%Hc~xsd*hW%`51CAUTQOQ>4ULL6hN%6GtLx%P8|g1V`eP;i1xW`Y zw`#UH=+G92QplqhtH;3{SR$}G{G}q@yWSnt)Id+blUCVTy&Fohm0a$H1-lxZbcv%b_ix5_Ug&7P{utiwoO2kB3g^mUSM@sO}I z!ZMOnci9gHBU-4g?UDU3$k87@nJ@AD7)TlrB279};w5URf!w!K>fxPb&#GlEWTbC^ zbWbIHgQU$ji>4Notd?mLbi*Givi30|Rn!_sDwL_tul;CxG&J}X0_{bCCVO5*(rnz9 z8Jdy)5~M#>(qEEvTUeSkt1ib>@xBx# z46}AB^F||m6Qp%Y`X))4TlG1P#g&DwK%uU+Oql~Dt7qV|jw z8tGdg?WLq|k@V9=qND9HrwO)_9z zM*22L_fpcgL7FzmlmGm8-jm#zPs?11bB@#pK4EgBolVeB_^e{st0EtMsf7Ob?f8Y* zh3Id*;{gB4o7Pb5`^Ec98fpqVXK*s%Fu}u3sAy=%sLqd`!XCRJyUO!Xf z6&?!wX4>4hmmuZg2;JyV8UhJRUkG&GrTQs>oeOX9bBvPp2qRqs(%#`hAzcH~(oL_6 z*1evCZs_2C_2LAPl#2-29(i_@Nb>MNZ$fXZo-UHKAR$?*&y%>W%;Tzx`5;>Y?jv`a zlFBNHk-h`ceS#7peTSqwzA0LlVDx7`UCD(pwE!Ddo@5mI)n6&Kbn3GrZ^ToLbeyH( zOhKOkf~#URk>di&bmO<{WbMXC-v#NuO8PEqf5Rn`1K;=}slEZu90nnOT2Gb^O9XvC zM<0v*2ewKzc>Bbw61xvgLp|9TB`Zos`fHG0)P-gGYmlbry(T*5ta6&*m2lPcGy423 zc9wQ4Jx(N-qxRXZ%dYm-tL9yj2>z@xk{V?iW)p0uvd(3sYeBl7mg!oS>Dq^oXVF+R zAM{YZcU3Wu;)sAUeV#Vq7+lLbWeK8R>+FCMXv;_gQ#Mj%W0b7E8R>68TCb$PA!+wE z$*2FV$PHTSXCi*2gxm?jr`MVfd-M@*?dnB#DUGz}|~=ulTMb*CFaeJ{Pt>aBeK6mWE~ON-y^b*BeH))WS>N2|BT2!jmZ8Lk!^^`{vDD1CnEcAMD|%k_P>bi z^N8$=O=PmZD(%mDTp2y?0PS&Q_P8n6O224w^Jw(}(Rb4k=r#MezQbMv4|V-)$Z1Qx zZRk9!q9yP>j`8dnq4WwPeIKNKmGpg*_J9?uzsj*3jW}2eqY+n+Ht3Syd6KZVgavxN z2S7rbf&6t|=4}JV6HiL^%zu@>YNQ{4^gt#3fTZJ!lFyu3$c>r?AP!A=tV;N2|LTL{ zK9;v4C48NVl_}hZdal&@Wn)-IDi*{@e+SZol=OEb?YKyC^ZS(aO*z&+eN)(89TPYX zApZhA-5T)vQe*ngZGhB1%xYiknvt#p>A_06j-;F^w_k|dsKa|o@KY<^@*@$-bPn4o zB|V)6H%jRJb#A9B(J@S{t&#p7q@qwp+uwsU9rmmUj(pJaSwBPK<*^dpJ72;aW?P!) zAtK>izYS}e=}3|I5t;K#zT=>6ATMbus6iTL8}tig3^39^fONKcg?|8P^YNbs9l2XR zG)>i5#mHlY;O0j}UQh22C0;6sq^Tu@rIBw+yknk(tLI2amQSvcxPLPvHwI@}jx2F_ zy`?EiDkGDT{t=}8f)XjyKeF~eUL`siG=Lw>0r~K zJ9OBJNQc&kdb_K%RVJd1arU~slvGA>BmEOd4^h%Tk+ce>);`r~t+lw$TI)=r z<$^NeFT*8GIP3dib*J>W1HIPAGb<&&g^_*;(*8>NAxV3p-ZzI;r6%qNWxP0D^7Q4U z{vG=JXY|kU{L-(lYI>F(ZB=J$z`MzIF^R`xq<;qKp-TE^lFoWUSon*fq)S=j{Y9Qf zKgpqYYl$%b202^i?1h%BUL>l4qZ~&zruR0CWlDM0PQ?#1(vLtoASjd`^$|%w!?>Tl z4-rx)+BZ-Zx;va}&^`zBw`$%~S1{HXsqUz9V}!O%YVdlpr|RMz8tGp^dYF>_MM+_S z^tmH-V6~j1W*PHneG|dw15$b@x}xIhSD$XO)OgjGwcPCM5aP2M>0d$GsHA@->9%)C zSyW**&AQXQ$~lp9e{jWf0NNY0(*i8NuAg{ciav{DuP9T02ic5JJZU5S8%PgV(!Y^( z{5?Wcf}JO6GDala7ua+z;+}%}>?!g&H{mQj6z5B6ucOzcHGz~GPeecUWb3Qq-y3NM zNRJ4~q@8w<^oqAd$8N8frd%pdn&UIBmFx_k5tmXlQdrx9o4O-DUbCN>dQ?Md4-i?i$h<|!w=JED;OQM zR_dUQ_DRdp^lO>~lB}J|T*yd22I)X0{TQTax>~My=~2_f-$}`1T;k5g^lUpz%a9Hc z3E#Y2jTN^1@s_59QZAkf32Iq;ol+;^THVu_eaAv(Xh!-EkRGL^|6rN+yKkEIV$Dp*F`6c>e%W$#^k;j_c@2q>Ql9-Tkjxv6^b?RCt)!oj zGzaTl@ip@S(ApOvOA0ngYmIe^e%&-1Y53&Dv#|DkdtjSENvIx@W@~{mn>EsZg7g?A z{U=G6EkTB#3qAhM&TM$!ZuBe}8cJWEAs27;_rlG=yaJWAFh zjC2D?2P^3Yl0J_zUFXV_@6U0bT*O)+=OTI^7@hbQh3*ufzqb#lNkMA#I=xC;C8%Sh zvPxp4{|4z0CH*%^Cp;uMG;_3pj=~h=iBXep^dL-W8q$x58&oyGc(E z8u&C;Yl1|*O~1|>XhX6mz_Oxbr2hr!FeUvj%e1&qbkwpJBcEgtv_exJeTMrhv>p?j zMZe+`G%Z2jPSM}8^noD!;VSB9SPe<`RVZ2KGSbgLdaROuM$*35%N4_E8L7jqMwDnz zy&uf7K-;LEf!t~kvi(v6<7A=a%ff6lmDM*R{U1n=Q_}yDwExqR&xQw)8}yZ05XW-} z*1q;}<^~GxN?AEiQtGahQKlh0g$i=+mDRBbBSmE?Cm~H(N1~OIH9;f&9HhfT0`a9j z*D|HI1Y1Q-r6%NAFJWOU;{6ellzju`Rm5tR+I(O8-alnK^}UOF7-n9dtW+B57a%=e zNxvZJCpQR%e`ifSC)6@ahu{}7pwh`HO5m|La_U(vl z`-p6Zh^$LQ_MM3AyAj#4{3Z8A-?8C;1fp+?6vqXlgrK&Q|REaaL*G?O=pQU9s1a-kLH7f-qns zrI%1owr(YT)krr7=?Ep=oTQ(>5p<*vzi68Dn-2p-vQ<&SGOZQ!flrkmEb{l3NSLBN z(o-Z(OV@TO;uu@>-PX?RHIgQ*;BjOS3u2^S1L;X2fs71aBk8_($Q5muKsQ*tU!9)_ zd0#uLr2|X9cpl^!Npw8n-Q*$nwa@W{XMLFYuVUAXbPJH4tfX6zbOpwt(s;+>{Z9B) zk$30NPMapStHI8yhlugIJW5GrWHQokfOKR~DDCtcEYtp&y(A!F zK01#_Nzse0_^K&e-$9ZyR|<8W<>mxhrfAF5sn6p`T@fm&jF(1Q1=3MUT1C5L#Ix{VdLJXjkk)VM(#XF<&eVMS5@B{A`ChX&)H(VK#RaKg>wC z0qIyJ-3FwkE^kOa4?k*jbuEZvHL4qWTE*<8PR^!M<7wTq67M}9={ZJ#qJ0w5^oN{W z^)5~c>|B^la*Pu1&`7@p($kdmTP)M}&`xL50ze0MC-R*t+8g}>0CQk%f@0~FAQ}z| zv=;3@hd|;>mRC`OhDej`3=^N#NVf&)I3?Ydq|=tl6$=;OI_hA~T}7h5s=z+Ov*`7F zdR;#oR}~QEO+%g%wi8|jFGBBw60&DsG7wMNNVfy&=}NjCN$0~#ad)q3;(8iNgsVaR zccRn-+*7!^qMfQIz&juX`@XYV6~2@&-^`a1|K3QeK{{SZt4X?Ro8&nZGgy-5=>yb= zywogVdW3{Ls~#)QvV|Utv-K_w(|3o2T@+0vNDyqkdbZ=(g{ksJxNPf38Q|4 zkeYfMHT}?v@4B${!RoZPASLY+%ZM8Mol)Y;l#)!&zArO0Bi#X{XDaCqB(1$uavOm) zAuSR3#A*Si$k~eZXp+J+ZiO$!XB+zEP2{iZp2y)nNQC~W`YBg>32YSR!}1C^gARS1)Klb-KHr$3-N&xE=VQh8oTB|q9G!$hCNMC2kBs31=0i~ zYsKE`&SlEF$(~iq9NS303({sK{Vqw@U=*sG>GJ8^qxN-Y*`rue(;;W8^lfu5$eEJt zK28Zqv)Y%Lzma|qq-QJX_egro&qV9U5_CgH(=3S>M@hH>bL@)W;6op03GPyqG~Dg% z{pNHmG@K@(T2fkAGBN~dXydGXS&uN%t{|NhE|=Qx3etSPcSYZD@UnheQObo0BERrH z2`g+^gGlJPT=|g1`6fwmn#8H03T-Ao8ImdqwT~$&=V5LewAI@V;)z5MY*_k$$AGD^=Bc{XTM)1Yd1!^ z6G*2h=}sgq&X+6rELC+JZF#2X#TDPLA}MD5`s}Cy>G!s)D(o-Vb?&6`B;>e}m$fe| zN=Ev9kWN+7?~}CZHpyXStIMYeaT1*&ab4+WJ}jgCL|(iIDM78XDW<_JEA#4;kg_7~ zd9&3XS?4m+ok2P+Tqw1_GfDfdl-!P9j6A8sS!~^hWK9E#&`2es}#Sf)9V@TkN+bOtNY4!kr1pQvGTnTIT=C*v z&M`XPtvV9`5eIv5{BC`63Z2yR?PegV=MAkPVJ1` zp7yvLd)!)BTK?9H_JtAXDX=^AM7>?p(Fki*`FWC3pCh_C0agowGU#FdLVDFt3D0KF z2&GpT>8>C>UrBc*>3i^8Kk{>e0&|d1_b>Tg-XCXcB>V)VYN6nRDa*k~<87>ulaymc z_EwYhRU@qd>2xKnA!!-jay91x)Zx8Vj=ZkClm(>a=^*Mn&*}|1wQ1N%LMxUe9K*zd z80l^xU9R7>-HoIpo);a1mzgGA`xyqwr3i=HS*{1ruJ?Lark(lsDG>ltW; zrbevsbj%dVoK^|-$pp@($0Fqr37@}JLe9tijF8Xc_={p%rlOUsmXT_Y6yRV7`&0BHibj`Oo64Q-O2sTSB~_mZ&FZF^5Bua-4({(Yo`^ z66c$*WGPM*Ns5_|($S}(2HMtoNfX{ZAgPSvM!E+`XNCk)rhBkV7hEM*B+jSv&(ZRz zWqnG)eAs6ZvW2MsigvABHPFfQ468dyva=)=-@-_HfOM9U_8{rHqUb1H?li%(q~EDK zfPLL@4FYz1&Rn@F&-A{oQC?hwRd#Rr-Mxl6I7!9hG14D{bheWIn55-}l3RcD9Mw7y z)X>M#RClSd6xcUvBu&$Fq(ofXFVpmcoNDSq6<*a}HUmA?`N`$y?Kh(og&Q^oOXEoA2L3*i@?n%;`J490> zTAbc<6LcpMstxBn+UL+s&hnSHb##J6HPFucG0N8pG;7L?R6J=T{V7Q2DCtj0x&SsQ z<;)%|e#Vq%?bnb!=*qsTjog-UtYs;)r}1t$QZlZg(?AJZQT9|_{Cgv<1L&X$gY2x&wx{nFe8a7oOw3%>0dXKajR6>3$?#g)*h5$JSpQ15(sJ z=TutC%%KKn(Yvct#2XO0wyYM**S`0psfS_qtXkG1jIiNSZE{JnPUN zdCz_=y)X`pSi#g1sf7e>V`?A{4e!WcAxs0?gNUu}Uz922` z{HLHbKV_}u!||#Xy=7LL$g6I!v-DVtu(LNkEAlaSN~rJtfvf&O~gN&2f5LhOSz2FAT1-ty~6!TV!r zq7L*vD5-%?X{TT1bAWuf<4vCf^oz(EBCnd;S#H<7llgZ))R= zp)by2RMS4ik%WCJ8>>RLde%!aPg{D0k@f@WO-kC2q@!+^eA-)$MV|;lUyAiCu25?} zqEWvN)H(}S!J;MoOoM*Mk0~{DXT4m$875^aebq=CKzg&1HjuO@o>!;@mn=hqi?pM#rcDZ3vZyszbIKg@GjrefEOv_D91QPTb-{cxGE z)H|;*KMbT8nM!9P?rWAdo*{g#((y>+d|Z8d#E%BP#CgXFuFA$Rv9?BfC`fNr(nCr5 z+3VqowB-d{2Oa%ET?S(TK3K)C3HFzid`eNhSmJy>!SD64R+^h3=UqalAK`QqMC&dV zv`l3TFwy}ay-i66khB~6QpdTXTWh}_agO#w5LeGR=*o5_)rh==cB)tPLP~IDb807{ zJQ6CYj7&y)7)XmsdKgLPpq=_X!MQQW0X_%cXVLb+d?4pjtA)5r{Y_5ZAJgm)4cZ<9 zL2Mrj&t@wZGF}>KBS>#o(ngZ<8DP~6=te$SO^HNj(B4+kCcy&aPsdekgOrn$b>KGgFaFTxUnB+Eg5%Po%ox7s!`0IQX-?2CvDeENcvqVCDE(B}9 zmQazNT;6A-qy~C=Ywe3~VWdZZ^bRFGf}|;|xBtqoepL-6k`9JGaA|vFJ_vP9ljY@m zdc-CL4*A==&!;1+vz59w4we>P12@^+qe zfHYY-It{-4X8WzgJ2cXxK)OUpk0NO;7)x%=T7Rj6R_a9L;O#c$px_tTbT_-VQtVNl z)YJKr&7P`@&uXMcgY+&XJ({F59ubx$w}S{ea$^y9qiITB=74(V+J6aGsYlb#G-!|V zrR=Gd6zQ|Q>*7fp=`kQ(s-(w|^vMV1iY{1XWla?d(1B8@nkjMqiY3qL3I%fh=w_s( zCH1|V5^uM>m13<>l6igN-y3NYNbgqCCX(_CG)49e-YsT(2gqE=NC$)T9wi-2(rWnaP0pLBc<*2+^wAFa+{n_Pxq*W5kYDy) z6QBP7)uUvFW~4(vdasfWA?cP+NDgB$N8z3G4MeVy7A}{w1^U*^xwlA?10*cNN^x}~ zcts*dnj-pSsR6{e(mn&(i0YIku4=3(^Oa^jMNEy0e?IFPm}>2W0G?jC(YNqw%a>DyQA zIbc0@6*~RCDqAijdao6C76|0;OF}JES&uN%;UIlbNr!_p-K->e&b?nk>f(&It8bid8Q$3e>% ze{3urumf2AO;@ZI`67&CypIi-9>BCBT0&Bl@p=ez_Q$n(6e~>G)w}2{Y6Dc7XPK(hGl18UtXBQVe zn{AOKn}_3T;n*S^Uk}HY;rK>4s>1QjaBLNht;4ZRIKCB*ZNsr$II6?(?Qm=#jvd0$ zB^=)g$9Kc=y>N65$ByCHDIDJq$IjvSK{$2^#}C7i3&*bEs0qhz;pi5Q-NVs696t(2 zZ8-J_M~`s)I2=90@sn`u8IGTZqb?l1!m(F4_6|qyaO@L~eZ#R|IO@Z(e>nPtC^TKg{IHrf=f^b|Ij*G&Ph9hfPXj9tC7|)&o%Zj44)DzKCmupKsku8;9oz^!y zcr{xd`l!B*HG7Zo6ki)ISE^E2fDX{`SiwFl;GA6OT5JAe@&1hO=%F~p54b; z?2PrGnMtTZJS19QzEYmsgrkYwUAKf7ZeFZ*q<1;Lh;tp7{t+e<3J8`*|pfz4? z`YYOi_|jkHbD%=F<4vCfjf}`fMP#ERvM~|asS(-Oi0rh8Y+OWkdPFupB0D1@n-Gzm z8Ietl$j*w$nj^BaBeF>m+2n|9N<=m_BAXVGofDC@L}ceiWamX>=SO7IBeDx3vI`@! zi#CzTGYe^d*5eB3agS?{E3n7i3(sioJnIp<^1wbaPUIDY>hSv zS!I^MX-F7Hn2om5SB-QONS{>FQ6&9*ja>2XXLxl;owT5QxehoO-gIk=o#psclCdJq zKQHp;>m=lyOu3Mr?-{Fv<<8P%>DS0rVTGI{gIEwF9SzczA%VHe>v!jCoEmtQk9$4Yx}}T(MmiRx&nW3wlD6C|EbBRL zQpYIJVI)t_ka+fPSJ0L1=tf=FIS-=Zw@!FxHPAzyzI;i|Fx$Z@Ba@My2GWv}o<`CS z9u<8l+5pSc|LVf<8OZGfgv^ue5hMTFqR2}lq2UmhW-#Kk233grR!lt!=;&aW*VW zlSBiCGh>H+=bes#J4cg@gRLJC=t@}AkF{p4?%1C zsw3sQN~MXC+vg~?T3Aey=Fs1B`iQ(0cTgUSYmqb4 z6wz{ZJ%;6&GyOUzfb|INgrwq!8R-O&zM!NNNcsu<`dUwV7PMl#oO7kbxl2(=ndkl@ zUxAiT7=!eXXqqD-;fO#|-)7nCITmC)0K_{q(lbH&qLQ8o()8NrMC-rWpqpAJBfhtU z?H5a!a%OKy zBFmId@mDxsD&HjevvfKzMkNDGqBBBRhCJ4Sl@SsxQ{0Ef$@OKHKl4z;lQz<`K)PB< z&m!q?luK9l94ODefp*$)E*KrVS{K;%Hnfdo5Yp7UyP?+y4H>UH>#4In;o{#LX){P) zR?=pYu6syyz3KEoIb6xQaF*v<=q2 z%sPzpY>>X9q-TS)@WK1Y?JWtZspVRUm%)20_69xg+6LeEES-$>kK@|82q!=y`DME; zSU2>c*~f5J+t0p8KSfDpE@Y&WK>9N!odnYSyiC&Qh|8LQhT8s%q=~0tGnjZSwpd&r( z4b#N0k+MwBTOx9ODh&#bk--BF@^c@NaKtqd@{LNe=uRu%6UTjDrW{9WIj?YozylnCM``~gU zlvHN3MmiOwTPo>Pmg&_f&5K>_H_eg!`E;!3u>1uP3NBBap6 z5vgOUq~zUeU*a8SW0cIXjdU7F!>7Vg`_ovaV_p^=r3XwCS1|bu?@iRKKE+^()F35l z^OeVNEk+9cCL7Z5tEPGOI+oo))32lHF_0XlWhyg&BRvPCApq$)Bu(#;dd$zKRJzg^;d9YI^X0Mc!h z^a9p?VWwP>;5urmn5og%KyG@LEv}1PrEgjAEIn-8P38P95M*<2o~;O#RMrHI^g@ts zr=%BxwD96blIK%vBqYoHTP42qDhYoKAEX_9nP(SVj+AJdFQN1ge^4aDXF(2%&(Z3~ zED#C58&l^kKkpSYg2FTuXgvTGu;c@f#Q5!w8R?7E2T`iSg?h-^Vb zc4I_#Q$%)iM7A&@yCovKH6puh6PY{*koIRiE=7;~w)VJ`J&wP-oWndo`vQ6pJtAFM zMgP*X9E~sn@!QPmBFnaBY- zr_&H0h!FYc8vkA*(Kq4_lX%5yF+9HX2wX){dJ~?MqiyDENnbV6nIPRkNoSI@08gpn zD~u-~2Uz;_bi^AFG9TuNuxqQx`P@~xkVc=?WAyN|stWs+X`=@t7Q{$rfwYT~&LZhw zVZ~F<>~Xbv_uYk}$g$0>Na|`-jhyY^h|yQ#6<@#PoO(~lS*CvWLPmz!7p=vv8R=}0 zen&}Xle8B8Ab-Dr_pF{0a~R!;f;pf}>Er6&2HcsJnvZ)f#;KWM_KkS4wnlm}NWZJ3 z7n8KivDN!RgFuINq&t57n9tn6G8|>9-(mAl(^#5piA?X~o;TYQE@Oa^UINnZDd{C3 zZQA~yfh+y@A3+Bl@1l2g%n`{ypOml;Ekw%;Gc0^fIDf|La&{;9k11wbOvB%uXKm4j z=z1X;ITvb>YlmN@eu0ckMtUhoyDI6WEYrq&<%*9`vdkxcqDZ(JRc?`Z#YzwT4_Gq& zZYz4AzB>RG?tDm3f*#V*wlS_PH<4Vj)gT!!jdTu3cU00jB)#qzqHppF)5>os<>0$; zUA;Wf&gvW$^O^0$$4y#c0dj27U@5>lx1WQnSns}1lDD6n4SqQLzKr5VdKpM}Qqs#v z`pQbVVlQV;`85^J+WD0tl`seNCC+WSw1K4=d9qHCM(4U@nQ5^-9`7{iccL9CYcg zGIMUz?FL-MnF-jnOj-LCy~yd%@+80mSNUsKIPD!r@X<_PzK}S0Nx29e*;zm=3Fdk_--rH)LkMH{xUZu+M-C;L(b}Z2a~i%iGOdTtswny zd#W<{Z{uoc;_tz5b#h;f3&UNB^Q#B&T+%Ds<*NA@Q;TPrhN{^T*If?i zdkK3TNvq^6SB#owD5=akjPx3i?y6;a4Qsy}Ea`CPOC^oWQ$qdC4Zm)c!`VG0)NhHg zg~Aiia<4-gU;B~1p9Bq|{j&CDE@Y(hKw6`u^GJGdn`oVVJ#^!q^@$(Kf|fC%PwYyB zHi_PizAMzdk*Q?9vEkc)*8kX*1pVUjr2N@?yjWQ zk#w7zM5}&bojRNi*Qd@kj+8l|W~{?5&SS7i&V%Cs%dry_wD~<93)8rko7A|o z$8lk3HKwzztCmbDLCm7?$Icj!E+kCW@m!pus^ zD#>=q9)V5PDQ*O54<)@3r0L{ULh;!H#= zs7H@V$Kb4I83ajRch!C_u2w1u`G&XOSo^Y~WTZEPw5O8Z%rZR?7-}rn!&uom@9(`ZGKkSz|jGj5>Gv0Gtp7D$^$D9lDH1%g? z)nzL;qb;6AZ`<}!@NNqKMSA;opSa{1>RuJn3YJbZQmk`%(g`H}kC9Fg=|K4W$s>1r zmQmzN`$O^t?Lb8LW``&f`<)cxMV^j;Gy&jD_X$R_>VYT-5kWE0*`QsEu~JSTZYyUg1e^BxyGzy^*BpX|KBL z(!(pfn)&GIg?yK@XfvA6@MrCPfbAf;mlkjeNmKbc)X+2>XN|N2;+kQoBy5&VyIsjh z(N{g`M3Qc1q!VSu-o6c*TCYMVO}6ip)_pK-zr8y~3d^lK(%WdaJ+Ix-YtYw>s~TZ6 zGH4_VH6%#yETH@XSP)M-iKN|)bdpHd=GZ=$rY;mkrvfe%oAozq+!WmNlv= zAB~%RaaGS75zf@;aRTC2;%qII!IY?-vR&I*l`m^QJphL%!I!4 zZ}$1v8o;5DR9U9EF-&FA180kBGpF;~oxBElJmxLx{`vrWP8^!26)n&NxFrR z-YnAk*~sD6W}i>0oLOqe(vPZy<;5PN?}6HP5Kh9i;oVe^rMCSTiYT1N2BgknsP-{3 zdD2@*T5qJch*WQQFPuQF)KMD9_|^z#rU=7+oz(K|wg?xDLs*g@5w=r$=BYd`>a?pA z55qbm#dzsSr;zm9<+W}#MeX$4XOP=DGZ3nFw7XW{co=*g{1$nr{gZ5?fbUB%X7akX6b%<4cRg~#JbZzJi} zMtYk_H+dBKd>fRh=B~1a^GQ(+ONZ7a*%epK;eE9H7jap8v7~Idg`+4Zd;V*Nl#{fW z{f-IzFi$#-q~mOTbs9;(f8-x-r`6+ktj+yau$7fpSjyAyb@A$FpSv(UMRyGrnF~apRrZI9>G769q)=2LpX*%dNcU`(KTdOopy9}DNGx>7P6g9qDKI~B{ zwc)fS-gy!}+2;XCZGT+ZhJ`-jgv!K)4g@cRoiUdB9qm)@tf?Pa#c_z1~Wn6#dVKTz;6X z$f?(fu?}bTwu}4qE0JP`=1K1+X)hzaTcmrn;JUs+k7_v=60Jx!OhmkV5<>R}d698i zgJpRi`qlPIU_CYZHk}q+6?g^VlQp+yAX3a5J?RXR?qH-dNLslcJt`Ufu-95M3h|U{ zRb3||ZtvNURO`g*`xkO#`+{j~p9s_R;l0|(MjKiQ*NW5+{bLzliowp-bQ*4 zNz;!ixMI+qypH)aY88j|rKi#66Z5R?RNo%y*D50{oQ<%0nAcFHeM1;0SZlsv`d(!(zx|5OKC(?6CTDaD0)gHO>KuGFXUb(fvPE5(1 z_3mAZ>R?;1A=wx4@J$xCAH_*>j2c<9@9twg!jsM<>CQ$vlcZC&Sl*4@#g)JFn)=T` z{N70}tgQJW;yZCHQa(-W*Zd9W!j$)sW+2mqUp^hhp0;{3u2tW!p3Jz)cMHU|2cy1h zWr|f2PkKK|`xxo{D$`TgE9L~Nmd)(xZYJ*Zbz$$a_d1l1M(}PpTV?IfA$vmmZ>4q& z&f1r_l)e@cJ1afxS8jf;c8awdPx=5!cQMijNSe-?3mvE3?=|Vy*2~OoE`8-(iR{Xh zB%Lt@@$OervZvQj7>2k!f6=*l{gR~ZDLKGMv7+QjA0+9nM*5)2w9I^(*&e0U)*)CH zEvz-!q+E&ABOh5zdrqkysPfuMTnZgQwu{C}lM=ysLV=X_05w$ zMAE)S`jALF&4iBCX}v{SIhI;E3U#;u@oBDNL+tc!|%2hifRgDioJ{>MbSR54O*@1D^wMfh7LZV%&(omp< z<-Q9iNZeW5>k*Q&Mqqv4oSBjN+0wYD^s--(QQqgAu0QT8!!IY=KvLV$4fp3cr+rL9g#g2kv$%fJrR*T z8Ie5|kv0wJxIfK7Uw9)J`K#wZ zQXY!X{Q4n?tH-4S5!YC;D{bH4ODO5%)97pVP1Ivog}u-E9n)t|-O(#N>7yiVFw#dw zx@b18c%2@Xv=+#yxz)lkIIC4*oweD>#*kk_i!z5+tiU@k4Ts}w5?U15K4VO9R{m?Y z(-wWzlg=jTUPd}wqyt`t*8fzfo0_!VRG=R-z6^PKsz0kaZE-(HmX&{gBjRTJsG*sq zS>YYn$Tu+1AUnv=-Jd)dSP)P87)kpX>0=`8&UHzBHA5w0Z&9+;ipMjDw$_qmR8sw_ zX2Ue{X6o9~IU4-=F#Gy4?3yQioTPgj>Ej|DGZFg2UkgnRfkd+uc}@9Q67$&zY1}tR zkWw>~dd5j%Z(?`%lBGT&&Q^n9Z9VA|B)xh?tpqJ^D6*jTfw2nLHdYmoF z>nDYM3!Wp~2h(u2GL~UKgznFU!&uh((upKF4@RSx!b7e0F$Q?jCrP@GmFbfz)6duv zlS_R*_U3H?lJrE%!x@uusD-?!_SnEQfxlwyXH&{`e_evOBnq>67Dgsd`V>j`HPWX< z+I1>)jJn!uvai|GE39(uv?vzomXAbFyY)O?br{1Pyawl&IGwp!LfgJCZP~s+jF+Bt z4oUYj(mAUA*^ff&U4cEV(0Znv)wN?wD5zw`sP@SF(B6Elzv)Sw>RKybHs{e*wZVO; z?~~oxW%YfG;-2(rlJ0M$PpeEvbN1GevlQjiMEj(5{VGc>x00uv>5q;Yf&BGOM(&H& zdqZC0+K08%jv=XI!XLuyt$X+up7a@#_BYaJRHi?^1sxkbflycLz3(m;L9!o5gm6Va z?a!3EBka_S@X4DI76UF_yIgSh)^bIs85Zx@eMdrN3XjK=K1%$`1tqsAAUQ-*6Stt2gI7NmOb0X?Qc z?T7M8W~JaAdeY}edZ3l*b0jTa{XTSbr&X0Ey{F!v7HFw()SE>b`IiT!k-Hl_kDQMp7aHh4lvReMEW1r{?#+Q zrj)bh0&P|OSjbysrIbS*Q*uQ`&)u|-QES}F-+sCCAZ!k}${g{Aoll*tgIs@8 z-|vdEZZ@gf$E?GXzDUwTjPym7X@xDZq+Y>Nv-vXpj_Oe67S-Z_BVS@8IHIb zueRg0N>7i*SrJEPeqcMsvnLjq3whF)NV>_I>iaK=bmNJ<;u40`TBNfW?X;xQ;aFt8>K;L!8#B)Spx@tZ7)FWwY38q%6Ru<>wSfjPD$Hsh zb8Jug8c7El>1!k{{bPaCQQZ0suc_Z8#P!?3wY0V)ukmN)Nf!q~vhDo{3$*ji;${B& ziqw<|yowe+w?41F&py^+l+`|F{+{%8k{)iPud7VQOohIdp!RJalx+3sIGbAwB#XYM zIr%cOkUCt0wdX9X6>Br<>AE%yGyfFp5uS7&Ne3C}Jd&pJQ1ouSw2q=3)U0^b@w^Y& zD&@d>*RGUxZo=96(Fk)r>NrY{M`$)Fv|%A>Hs8l8i6?!7q(>O(8!FRZUv~P^)(W*! z$9U%KzSHRP89otVI-FUf)-=#Z|VJ(h*EU4O++4j$z$>uD{hVB};j6-^bdG zCw-HoM;hsyBE9AoT({_QpO5X0=?F+hBVXm(6DA8%UCS3Zy&c zJtf(9fv}?FN#7#rQAYZfYJY{NKy=4lp0q^UlN<<1J!`)j_(?V&?uoPC^DYOB)yDdCx>?+yp$r@JQJn1_mJ=#d$5$S|!$e|M0A$#h~oEMB>{`+_e z%ZF#@(R0zA9I5&cZ)Z%4pbv9RJiZww``YuU_80ottEe?9kQKU129yNn)*8LWW zyMxzQzgqpXzOe)3DZ|=35bw>qEOMk$nm)Y0MY5+VJB@OR%VKrGwQkpdNU>7sN#7&s zF-H2H%JiSpaYc8IsmiCMJUQl6&%)W{P=+dtgmI4AH7wJl5fZUWLo$$QLd#SPH6+j} zZCg0fKk|Kms=MPQp98!fk$n)6eHf9=kH|iX$Uct9K8eT{L}Z^vWS>Q3pGRb0L}Xt^ zWM4&OUq@uE5!p8p*|!ndcM;k55!nwB*^d#~PZ8O|i0pq6+0PN#FA>?Ii0s#h?6-*Q z_a$U_4uJOOdt8-0?pW(_RrR<(&p=;jy21B|%E^cq=^GYCGS0b`^%33JJH8%1A2ugeV?Sq8R`2ZO)sDoJNYr_mZk#Nfd;3L^rVkc z)TpN3d=TW7fe8EFjd1)pgeliMq@fS5EmM!ptwOI`jI?5l{Q~q=Px=8#k2lf}MEdn? zV;8U!;0Byzye{mX3amcSG1Lt6vPxDu-G~3iQOvC7uoag5H#D z6q$Q%>4`@Akw`b;>cb*>qPl(c2@r z`N=?DbyPsd^j5waZ4;bb>=$4R@T4D;^duwwSnYJbpWGFdsq?*7eTTV7zo51P`AHM~ zSwCrT@&S);xSQ8~nGNEpwxZqEO#Ou>XdgxM?`PtpE|R(FJ(S!-R3o==q-tRpU8z8FH5qpDv`~YlC!;yZ$!Mrz85}QDbrS1IkE)vZ`UR6 zD%)+HJ*$Qv=1IRG=`bVxLhbZpjx*y&Fn_Y7CB(H7q2F6k30f--TAWs5E4;I$HqfBi z%dTFMds@j{Ok4JS0CuM&oa_) zMOvaA%su(y>WY<)@{E)SS^6+!i#98%{M)A2{poBzRGDIi=1IRJ>Dfm59ZAzOo^kPTMuA6P4|Udcbse=#Eq0!WxGN#Z}gDXs*#m~%BEV6^zSwDa?!BnNJ98|NkkMlUzzRfaCf)Z5U zPt<;ORVRNRcE@ZFZr-EX#~j;}{z%dhM*5@5bPmV#))NCw^gh(?%CuFv5k{o6F%{lH zu^+DuOHFowX^e|&hZYyR{FH2r!pz^3{zTGqjr1px?*9_<>3@$WZ8#5cdum2+r6I5k ziRMUT*_LH`)-6b%vS*4#-??toRU!)QsU$3AXQ@@DSdZ|e3rRZCNEec{_z--l;&m;^ zP5Ja3hq%5_au5CNQGqYj)QGcu6D-wxnJ;rZZlqiq+EGLCa_VGhmWF!$sx9@*%4tT5 zRT5A7Ka!qjr2kWy_P7H&2Gbu>KE=bSl|5v^If$owQKDK4M#?EyL9Tt-;jolCAZ$bIj;&y6~{_2=6G0r z^Q6C$^g<*3m88Y@-hz&;XM0WBN71_plD@Yi)Hf4#AM)Od`$K;5y$F}R6=8ZjLZ#8W zWCO1Al0wPH?bpk?L*jN{h!ksrp7b}8jyBTYM7r=@cSXA56JFCumalql&t}M5RF5nL zeUrb^0Qo!jBixlEaU~d$v|lV-KeVxc8q7nWm2zKY5-C;?a%kPWTj=? zzs6XPOIBLe{VQ3E{$Sy3-y>{gOnrp?E_|at^!;bj(pBY;ZR9m1J0hO*y=e)o&#K2M z%;v7>6`ph%lAgY{)~%Ki>DMnn>sRztq-hRE13d>ge=_qAdwCrtT;)yaQ_LDqN#F%& z<*juTsK19n{Gx53*t%tMAA!)^iLvPhT~B9ecgg; zyeH_&w5Yi^ZUerE=Bexy+|4eC>t2m3m}Q!T8Ww-q5O&RzE=ST!jdVGZrmxM0 z)-za-(xJC2G>0o($vlT5bYmmJdWJhAJeFme(sQ)d&HJcmphJ<<;%DX(o z$`sbtlP*uvCL>*5WqNr9Iz|Rh)~f1VCqq8vGK9rL5V}8v-5BT0x|XCZ>{ns`DRO?G z_lxbSZ2}FtV}@?z(`bt^z>}^((#wo=1(A;DINNZ#*JL{wJ3wN7*AD({Vl#V4D)a=) z19?_Gjdx@9&bu*Em7wl546~IBj7*+%MUq}_q$`Sa)i;sP5f3vr>Uf-Gq*Z}urcfUE zrrLk4esw74Ei>;%n#$o`gVr%C!zp3k)4R(?EmD?5;TS7ZjF+CY9ZAO;X*-eb@jUd^ z(W*+*%#o02r({>HU!TN0l|w;s7p50IiueN6eqWy^Js9!aOrpI%YrUSNi)Yyw#Xadt zBpqj@E0Hwq@f37Sp6WHFoQ>2pLNb9pN_%~B^+;cS7>n#Y`$LH(Yt~*A%BKc&UB)0x z2P3p^F))pNi<{$^)x^e3BMk~!`|fFyNa2Th(p5=%m65J0(x18dU~8AkN0y(@Bo=aH zb*%|3mJj1>tzWUfHU5{9-GVfGQm12{M4qePj&S*p5w1<&Ks{kR``ChuoxEX<|GBWTE3HQ}=P*o@{xBO?{qq5Y z+I3sKoN>_=5tpsFXO@*Id{$4oI!UiK($!U_gIF#__9B&9;V@{@p2Mb78K-V5({_+( zyy~v}PoX5R?fN=vr9mkZr0){M#j7y$rQk_>(ltnWjghV)($_eS4(4i!SgiHab4xfP zz;Acz<)6s8g1755_^0?P%qwTL+`_$-E9Q9R#t5%{`R~|EWHtTW4a6N{zA*IG-^eg z8!6^Oo^&meUT36hiS%vSMExGHv}(tPo>W!Y_ake%v@wIO0ZWtoQ}%ahDDhtPolPU% zl+ZGHdAX5yt*QLN((TGWttnoRcmZz zdY;j!zP}Unh*Z0TQ|S@WQaow5vqJ3@vsq92XOfnU^v@zqFGCLYjeTkD!#ukqv@bkt zNr}!XBx#W)o*u-rL78e^5_+ummTRa%@oaq+b8Jt#4oPn`(se{SpFXth@6^>AO*d!$ zT5YTkNLlY%6RP35QBnS051+0C>=K1Fb8|vCf6UBC;OGwwbT752}dEeVvV@Q z6g^el_}P4Jn4EQy~#+|6KTzKkm+*k=pJLsA~avue3It326%=Fsb_ z;fNGI)6!nbn$rTEwL#qUB*-`WA{;cNVsY9p z$S3GgBV{+}#n`*`)ZjdM-0`u&Rc*&8@n&Bv#yXcL?MTvFjI^UjH=wuHk?qlGcR5rz z!srcU?X0t>zS6BSrDxnoYwOOCC*x!wZJJppFv$X4omrIi#Z!!#P@3P({cuHZhDi(0YMBT}ph zdeRL@daIFcK+@u(*P(CKhrHG)?8|dGQXXHXTrE*~%Fc2<=VRXG!?z$!xa+2JJ|rJ- zoHj1?I%!bIQckn)RA8mjlm3mQQ;qa*D$`-NLhA%_NvnC6y&yOLbXUfegXTZXXB^v1 zMP(OQDeXQqTcxYix)oQbQ5j>@ANd@h;O=)-NenI`f~6xaVmVTF*dA^)mHYo3(~xbm*;xJ+9uY7#{X0pg8R_3ey5^h6XYNdd%BT0` zh?h9#_NO1EckpyJ>4mfO`_f+?Lwv+kgvA39DoxFah=*U`Oy~`p2Kh9U6pu4f^i@w< zOVZnow3ejyC4++=@%i+>0`cle2+wXt*oXGh^3g1`r<135Jd3jj-iy%ohq1iMXG78; zuTWflAu$cIUtJ(^vpJ0nupplFA0)lQNdKWS-JPE6D}lYWuL01;>bnWKHS2_V((3l) zNL`dyxNX3)GvekQklkiyii=%gwi*Px=1Dt|^iCt~B+~CW4u#(ewH34dk()g&=E&Q& zMEZ_LnknZZwDE*2=>d>b2O?bj3STE+&ZaCQJKK@@vjzv#*Rr{5u!3r9f#Jxf8V^Yo&)!_X7~n}elk_el?M%`__b*+} z#Z_Kn{=E9LiHKi9kKhVg2K%)==_WNxEq(K8mok05g7jtjySf{#E{tGrl&4Y}Nc}3u zTE@B3F)VxU8Y7b@{TE568|lAPrg|<`;hfq^E%1x%nHpQAoef%9I*fVl!!Rs0u^?~! zF=U#Ygz|RQqcC22(k>*u+eo{RG(GlF=;*`}l-4;ZB<@*)3$@y(b$!c|mQ-tdU(lY8 zp&z5?eoCXcxxRh%f49@cYb+SWJ?VxdonfRKiu8-QAiAH{NcjwA4{4>R-)IR6n8J{@49D+kPs-L^D;gX#cZWJ4z~hF^!QXNKbp33@}o7 zJf8I5B)!*2|E+eq>J!j0n_jF~>du6up%Gz$y*oJqah;U~N?5WT$k>HrS~%mcvUgR2 zRfOCQH?{N{=v=%S1V7A^b|vY3M%q=RWm@lJnVVRW{?x&~S=4MVED`0yKK2E#(v!gK zT@{y~#@gJkG0Os&erZUMi`(C>+J|@ON&iFAnMV2_k?L1XYsT|B){cEYWjjdbvCZ24 zN}jdS*%W8>7JKz@#KSdf?Q{xfv-utO2^dA1y|V_N)st>a()*2cW07vi8P*_<^}1)Z zGOeiV7dOJ$o{fv`LDz8_LR<0N4RL9(mJp6?8ZUUSN@F&myOk+CX-~QdNgpuMO+?y$ zB628P;PcU!ALQMoXHd?TkjsIstdS#rsl+s#cUzh|O4MgW7se&YT9IlW{=FxyBk6-i zT1V1!<=N2s@kHvTj#l<`+5C>_1#{SsP;o&L;0}X4WkW{MnE7 zIoguyjyqeKVut2PHzVo8M!K0u`(Fd1y3~`Zr>l<_Y5&7#rdDgLeSJ4feLwdW#Wv6u zvfEXuH6fy=qszj?}t&HA#LSNNtU-@i=t46UV_@1Tv zBsTSsMc)#U=U`W{wPfwbF}Xjc-_FVuvsq8NIY}!WyBKdqUWb@~#LMe-98d ze^0svNoO1B7An)y`M9DwgjX{k+dIcT6WUfQ5!HTYrdR3jz_=vRpgEO@Bni(-gTm|y zFxDeHX+23FGtzpJrr*p)KHmo(N+bJwg%mBkkCZLfNL7#Ban+E?2+M3a)PTXRgcO%6s+BN(yd7PgpqC~(&J`A-P8@5 zJsRQos}Y9p-`J?R3*>j-jj;X(gy9N&Q5rOMk+d4L4YRGReYYl{zK?Y-Pui2DPZ?=X zk+xoke40Y9w*eCU)?mYlj0ZIv<}>(0oGtU7a?g8Z$-41ck}lQqXYT@G_05xRL((}$ zx{XNRp&inhX}>_LSg6VBnq0b%EJXT}N^@&ot9GaSYblW(k|eZPk|=E5 zPPLDfN>92SNuM#&?L_+K9nh+MX+|-S`LGYzyFhzVBHhZf4w43zsl5%dxlg0MpIeve z;?G(x(gQ2?M?MEAx;tL-Il%T2S+9s}hls3qM7Co@wo^p5b41oBBHJY*+chHFEh6h1 zk?kIl?Gcgf8Id(aWP3$q{UWlxBeH!WvV9}6{UWmcBeMPx*#QyRff3n35!rxFe9??7$aasDF^th66p2d{_tp+WejFcVd z7lixU^&H;57^8k#>-AfYqvcrqG!wnTlWtGaxkkFZNITDkj{T;2P1^Gz|3mLJ*zR=Y zDVs&FzeHQTkmH=}vnVuH$gW5d@hoU7-Tldmp|5(D11S+#FMrn7J~aMh zYk{z9p0qbfUog_%s{Lv7mugP+nlww&ZqCwR%Ip1E8{s)()tp5+?1XpPs z;C)!hDxP`Tu(qCbN0PP}>5d{D@;vl?-0ZdLtw60q4ZRlf;_?2h`BXbVQacl2g=xZ> zYUvorLy7hiEWwC0Sv$oT;7NBP>5E3XlStQNTk9|ex=qurjB~WDIhk=uR0^9?!ZIDs zR$QR}YI9Mg*_&y4GgR%fwd6=u%3E5G!pP)FcP8meM!K^|tG+*r{>`Y= zpG|gQoPD`w4&t5J28x^qsMM-WkeAi=S$1LjvC?O)q}iJb7{xv5E+l=$NOw`0cANpN zE$mmy$4ZJd*nb4h7U|1c-E9nsRtkr4HlSyddi%@L?1MD6MhF7?ZAd#SiNb8h4SWkv zx+_UvHPT&0I-4tO4V+I&Q#u6sR7wcjor}=gfONAg^q$Rt%W<|$4>&ieAt)X@yj+bq12+p==oFzMX0^;^-Y~|MC{Kkf*%C{$vLCPQ z>@_5{jMoJc>to51C7aC&;2nC>-AOvnNOu?MkcXgeG{+*{ZRG?=Qm&RS(r6kyTd{Y9 zIjhol&h*SZw4N2Vaog9bJL?XeR+^H~GA#Z*Yxu05bPtlgVWfMIv^u*LIyQLKYr1kW z;@e`?DSe@Wc$0h(<{*k9T5Tlvkp(X7fIhX(!E5w{e8&6-lL*EXN^I}`KsPsO%DhtHe;OQQtd>< zM~$FlOP{84FyckFR^3^+0%K*smf-3}{wd}{p0poH-!amDA|1psZP9o_QnTS3F=zGt zfWk%?jy&4As+OD7dQ$uCWsMQi8O9}1n2n~Gp?T81N%~*=HS@hix(-`tYv7@z`!mlv zg!*0koF^oEN~@zMhfTwfGW6#mW@(Mo+pAN#C_H-AAOo zn|Q@O45?L5)f0M`_B5bvK9X=n(Ar~Q=WQ>*?p~+Wgs8(X+q;h0tS8-+Ie!s1FVAwK^Of3}X+sDu$W?f*H#&adOF)>_pDuSY$ly`P3$ z9zrXvft4xmvdF&LG{MRgb8Jt#A4#i5x}VDQ?;uL_JMq#~Y-A2BFMa=^5_%|Vv#i-V zdMNWoBE8L8SYEaUEU!x?*n>J1S6D;I)<%k%zbD8>=1?v%>v_DBdFw*`ay_q{WTATbm7mi0< zGhuxlJm*WPCy-QME2&c*Z09w|53~1KMAyxqH7iB=;`u&SNj&KRB>m7x4-l#5CAl@_ zt*NyRq4}8XT~^}CnY_g_kj9=$*77QyRcVHOU-GtLR;F0H@uUZmbiR=uDAEPjA&2lS zP(54H3P|%wI2-OlFzdqFOlgHHvTDKI*uKhO7LeOb7xHE+!B|o9qz94oBO^UXqRUv)=c)=4&(g7s>*hmM6 zbOOhyI$Ce5-<^Cu=^(~8WoY>@PEze-Fz-WjN+Yh^RSE9iGz9UC6svEZ^k9;HVx$L) zw0;6|Zao{JG*u2nT>fV9WXkLPS+n6BYn#r5+@2Asb(2N=1U32_UE4BM-_Q2_VNKAJ z9zxOuMtX=y``?S)uAk^xN*e1~oBF+^a><{y_fyzs(rYQF=N+!0q=!)+Sc4>N8@wB{ z0NH#WE0vz~P?COXq=$-ht7d4mH;<^p#(k9$d$&oHgX**=t}2o=r9T_`2D1EV;7f(~ z5&BZ@TM~clbAXb&<0YR192SucjK~g;$Oc7ZM?_>tMr21tWP>BJqa(5*5!o>j*|8DX zaS_?^5!ne5Sz|obu3$$@=hY^Qky%&pJB< z8fcAk_`Jn3O1{oF_o6Y1c`kwd2`KA-ZLh&OPYoj(roQlmesu}yvb za$cqPZ$q!J%5m1-2hf*-^#P<9$Zxj;vsLggAo?QlO9geFOBqYlBP#J105gTsu#+*L~Ho^xpK3cKb>2a)tEBORnN zl?PM00D0kDV$ug?4om9CZ7w!Qq_G9|G;HtKxt?nS3yTaOf(j!Rv zwUHhnQhi79wtKzSnu`!u%?`ei@^F?!A3GsSH-nPLp^q(_pp)ku#Nsh;@d)^WR#PWtv_JnYv&Zs|atm1PJ^O`bN(-Rh}r z-V&0AcU9`pp_9az62t?Ua)5q7q6@=Hkb+f$H)7PVY`($<}70G9?$XEo^diw$~K#_MN4Py zw^yX6JMwityh!1PdD3G^`lFE^E7EH#xZ-i$KXufd28rI6su_oPp@h)#?94cO_u!il zFVU(ceSDhY{)}s8pti|7GYyg`%)Yx0@6eMTN7A2+^f-~uKY(@xA+LN9@(*GIh2_hXj5n97t1r@e_jpOc{ zv+is{i(+{yAKIP@$D*c_m`2u~XSHjgG?4NjeNKbq**9$9-+R(VlKyO@jUpY%e%dM` zU0q}jtWE8>&&}tQhOMk7Mar~+>FXHkY!AkHH%7PAmS8;!vkp&sB1wNS(i2HKY|js=}9WnRUX6@eQ9rW|1GCL(xTCkEwQLxtn$)|WILppdksSU zE`zP8E6q`m>lYebuXOR;uL!HxGo|Z|vQn6#dD4?f`m2$iEYh21Leqe&sE=2dk7JyE z=qQd+xo0b6)Vn=BXxl1W574t1-K*_TY4AGrK9;ov-Hmv&cPub(^rS;c`kRpsC24xk z)6n-B$0cbhv-Qb7=~pBxM+SLzW1Ma9rTY+HZX7~;^HcZA^o2%$m9=FtDpbqOcG_Y# zyGHW6W5fLK6p|*(>iepvkhFNhhtT)i{a$O~EXG+Pjh7)_AiM6vd6Z6)?0|6eD=tiX zJ&JhEP|8Jm1mfY$D)b7ZN6(I&ol)&$j_pZLCFwFoda7!_ay7Izv2BJr^v-r+2=m{F zp~^yGEhKuE*;d#nkp}w;r{=gy&pNQPlBo8xy+4@wd(zWLx~!3&Cej^dAkUQT(KPiZ zS9^pFDk=HX%0cav*0Y(tyG-Atcp$G*nqG{DmP!3xXBCPx+q;hS2v0hUq<=EfVIsAW zFX)fPE26gYFt`6Zjn0PY+s3o!|5zpQq^FZ~IU_w?q}Shy`>(2PQj>iPh&`uz8cQb} zqr}cKYNl;1$#Y`MwY%)et9E24y0&F1c~+)ayYZxFkaT$?J%gm_O;14I9QGXLQyEU!=5 zLiD7nI1*=DPj_Lp`)7!|uVlJ#3hlC5NRKikgXBxpBCgdIYd^Gq)~?4|nPR2Vlb%h| zm5ualm8n)wnnppNG?i3q^^nw4u9>stqjK2{XD8F1mQ*WSdkyxbk76JpZ%%{C9lyK& zN4^h`x;tL-Ilws)*@%ej+=y&sM0Q?8c78;5K}0qxBD*jm8y%5d6p@XI$S#h^E{Vu4 zjmVlJvdbc}%OkR}5!twi?23r&%82Z$h-`dBc6CH{O++|#Sy7Fi>T9xAwC+7=12osRcOR8T=`{jK zqW)!Z$K?LlAG?}uK(Fwm=a6(&BRxl?`U?0=tv*nbp0{f^STikZZiPgob;zg8F|4>3 z;<+{J-ASQ&j_7JBQ9KMYzW{yJla3(iYDPLjq!syn%-PDcBek+jZ6!Kq^_@oif%I6W z)JjJO#zi3wg+LP0h4IYSf(7xU=aO`FBRyB7S~1J-rwelEqIe()^Uq*ZeX^oMdC(@Z?a7E}TrM;*_wLge)D_N&2%aiw!a#w-P1;g6!#H$pF zQQF$_X5R?M7~o0IC+V6-dOk^u>(gKQiC(Pkyf_y5=&K-l>M&;%b0(d3CUZ8M?#6lV z;AWg{3ap2AtJ;b>>1;o%o(n6(UZz&|@nPc-A9bS(+tuJ1LUHgsNP6%&i|)1k1CVI8Q8@td{-Y7< zti5k=CM2soY@`@3J?SWtu4QF9O0{3O4Oc7-tW>fewRT2Wl0Ds(5|xPTAlt+Dv{L%r z3wy_1X;kl_l?rQL{Y`B-d+!>fxF@}kq-z`Lg(OWozX*z_W_XqbTytxo2en)ixr12Mu*S$Y;0kPcfAHznO8`OadGBjyFf%2mainLo6PdVaKg^Sk zA?cs3OvjM4vd>${;r;u4KGhM3i+2w1Bau~=?s}%&8R6^CB0P|_Qp35GSc-i9QdE0a z+4bdB(x8xSxiHXbAKsxSy_lry80p0-(;;kY;V;Ebr4899t zi+bIrL7D>N>~(e(>ma8={VH3thR^CrFCpo=MtX@z`*MDihNV_yKJ1&eCe^m?cyA`1hW)iKKrq(k7CoBW5F?+;@T-AkpsWGRxZh zK;@wFVu=*ly0x1j_hlIMrLaBd+Ax&O&7M|b*5OGnBk6iZdYQ_!a1*!&k02d2S>LDU zX1fr=cB)#VO`328uCg~Tckvo*mwia8ng~f1&pZ^&g*@ryBwgP~FBhpsd98R@D+_JX zUd%u28_JXIu5~od+8jLO(%mQ&Q5cs*EjN3zh8dbC9ZS-VMmkoceags9UXe&`&4guI z(@0WTCgq@zeYvKIqz5xixE9!hlCT`x_DSiIUsag(eS>N8W)}`|0 z-4qVDzK=P!C%uxSe>2i6Nm^N_3a!sp5K7Z9TFD|kl#U#u(xLvWzT;-g} zK%YiWI2uMuf-rpB#(3F6oNbep!pz^3UPaP^kzQr(l=iep3m_dSYg~J5^h>JQxaf4b zKju##q?tZxJ$>l#>04nC(}dPwJ4#e57DD3YwIaoOgeM(O(!U$&c#<}M^Mkvh^5mOd z)2Jzok3v|v7vVhmf!Z5WJQ0%gXcv|mIbZmS_gZ%ry_%%8MtZf%)OI7YFDsv%x26)b(CIQ3OWAhhA*r1W<87^!&SrB{tlfCh zYe@PJBfUnXHLSa8*t?a#>>c}+o=vvRfBZQp7d=DIrKyEHcgLZ{%28XHVnxZ5UQ5zW zMtUttD-$_Kn#TSsmJ;*VQ;PQVm8*l9vr1tr#JL|P{dzXyPkKE`|7E1ti*%2NkV6A~4c)EnjG~QcIhXl2 z1Qd0M>siSgKg8al_b!tT(a5U@obQgMX3oVg)t=H5BP(w4UlE`XWw_ovTfYy+T+JPdbUDU5#`SNz=*n z>1<~j@7cap#}RWd=lbDDYC9FlwdD-3*q5Vxvf%U2<-@jNa}t(L&a)z2F8xv^Mha`|NpB+Q#zuORNblm@ zqtAJs$maL#S2Y@Kck*W~fA*g~Y%}vxo(=s1wUE7otJ>bN`a$LwU<~l2HJt~W4zX?<{oVEjauPTsi|C)14s2Htp^;)Ys2xHv&P)JK=gPbrQFHN6eE)-y@jN8 zMtX}#3lAcnK|$ZII|UN03h3?cgzYZOC+&qaFVS=D%4@@~D#&`|`l0+4-D`Nq-Ha6D zr6-+2(oKzYib%&_h&*$9Awzpw&$Ed_rwf0JLwk!|wY;=a3(|+zE{@B8#VGDcZzX9r zBfXWR>HJ4QvD0LPx?1~z^gFitMF!h}r99Q*4nq3gwf@yOG`|(tRd?qIr10vMb|kS;fN{4{cbGPb2$bk@u1F zv^BnV4|Hlo(zRijji&I!Jn1x&Zf>O0MEcn@=nKEKR92a83VGwn%xwpT%0Xq+4U(2? z5mt_6*x=J>HfcK!b(QABA*0H)&T1dtp(nkaq&XS=uho zkd*n%yAD^`orR>Tm9UT1dHuO|n%PtMte*4^l5Sz7caSuF@l&VcoaNjP5xL`BcZ_t$ zdG0vh9T&J`lshhT$7pw4jw{@8r8};2$9Q*K z?T%~QajiQhxZ^r^T+);MNjqaG}j!EvA?2envK+_{1Fx-0`V9 zK6A$x?)dfh-+%wo{r@X>eC>`_cYNcHZ{6{oJHB_v5AOKU9Y48ap*#NPj-TD}i#ry% z<5ze5=8oUpk+`RV=`XW=OVStqv^(@6uCWyZzo4iViCK8%@;7kR^al`@wBo_mTp0|B zePu<~swX7YM%jYXUXaX8txsVl=&$Cjvon$M%9JaBVG;c zy7g(=rhm~IYsEW!>Qgx$S9LfSq0t3B&LkZF+$f<@3iCTp+Dy_djkH;$gSZlu?(eml z6{n4_96@>8aXW#00mou{YN#=RWooOiwwmAw+@IHPq)M4RSI4Z=lio$rt&H?8_5OQb zgpQdvdQI~BWzn0jg52$fXKo3?TE@3`Vfx);h)>s89NcS>bx^UIVEP^m?LHFdp^aVq z+c205d(!D7-P%Z}t4uedMb+1$b+@)JmSt2NiX75jK|aCw_;49=+u^=jkVbaBCXnbV zBc)ttv!{TVp?lK1N!rs$?-psznY=FaghQLH8Vn_to70dC4+&Ib1SuobJtX`FAo2UiU~AE8?-U96!vgmKNm zb!Xf9v&OErpM4b!s~Mj39+GZrr1yx_t;M?>%!86vj_RgwN9NGBN7X`JL$6!!hUC7( z**1OH5|m38s_$cs#gpDk((R1&UXqSKKXE&F(l_5H5wE_N-dro!-8Xm|^45tw%iQ$! zP<}(M`sQbl*RxOdrybD!b-Dub4zwzo%{HdgAUgW$ReCmc7nqg8%8w_#kEBH-y-#Jj z>J89QGu&&kr%|*k_8cl~#mbGo){G`xCEqZ&pMh)eRx3)+o}QCPo;_K`dXy)fNz(0& zbf!pOqRn@|&F1oyCi8@;$y!A(e^%{OyP}#|YUQJGHVxD4%JgA>4_g#9+iW0vvWitQ zPkKK|dl~8dBrOhk7g~R1zY^)3v5>T|lsjC5c>kd83MELAgIt(i!zZi7G9)$UP)>?6 zueG};Z|;o%k@iIT(m<H9dmHJ4B5h?pxt>c#Ba%I3UowgEVOV0l z+e+b5(%4mPN!btFS@nIab9&NQB;C*RslKn99LBTC zSv5lH4vuRYblJ0C}`iMw3 zqJR3u)zr;=8b!z4Mvfze+5pd5?QahGyN@9(F-_qFuOU(Et_vh~ZQ{~fd33>9x3B1r zeGXJ{cf90tphqLJ*%8@e5!vGr*%J}jlM&fd5!sxG?CFT?nTYJ!h-_{|_FP2vd_?v_ zMAj0Ky%>?b6p_6gk-ZX;y&93d7LmOkkz$HbgO@*4D)KJ>3-8~(pWtgzq7T4bI!dW9!_ zl%%^D>7yb|u0@{BXCqXvP5U!mi_pHP(6*Pe_xBlzG(}mxqSs*GvXf;F?#!%0$eTR} zLSOZyvq`$Ek-%VXbZdMNgpR^Un6~7q`SNXeY0=&T1Q=mc!eI<_*)Q9kMn2KofxO* zJf(uTzT;Tw7o-`CcscYn+WP98;S>%tuMpPOlRiPx-Hr4Kk`}Lg8Ctb7Tz6}}0Ly3w z>o+~rQ&^eq;w0%qPeZ=y1ca$-LZ!yL$^E+Y#(@T)>mo>|WXL%p3^n2_#*xK5MB+w(xxzNsv6yv2QokP+F zBb_7Cr=GwS>cwKIIh8u-qjX_e7YCYFm(q6rur`mqAM&co9qj>s2vw#LcAnK8(4SxY z3>c%hCw-cvdl~7|BAqu0IcTj+`4ofG@NuIj|+ z0ZA{fL7sN*+c!B6I6+C&BE4I!Rqey$@ubg^bZ;YlR-}8*#uZhrQ>aXZ|olDYvjC8JQU%#|n z3`=cGYGwV}v;VerM@fefOgVsI$i-{5Q(t#){<#=)p^?Hn^rX*`bYCNVj-=&NKX&<~ zm$6@2nbJPaIS={&%(1p0BIZy%8}bx(tJsC3#z*&1auPym&`MG|P7;P;Nw6=;+PGg9 zQJKPL^`y^}bU!0~UZltU>NHjMdS6;y>O|lCNJm1l+8l(Pf>zv2>K2@>PW=#P7m;_J zGU6hg(}eh_(UKr6{@0(?*H_ZRAZfhFNa0C)(icd&zmdM6+Sil3#-U!5?J8*piS~Zm zIyK8wEcP^jM7Gi)%cL|cwVbc0_7G~YxRJuY_oOW(?Qf(lA}x#uQCPp$XW8zoo#uKj z?};OoeeJxh*GIb%Sw+Z^Qcq^3FzfK7FOu{CBYjb%%du5fWD}*SFLkIj9l>~4hG9Ok z0GC6astp!`H0oU{SzQ&zLp>QO=0cwIC6XR!q%Vo|?c0z;HK=`iK0)108n3zs6w0R- zlFuemEv2St-nBJ?X0?eZfdy73nbMmh(VWj?%q1N!fq$ zr33lk3lZ8|qPdpHt5hq-m4K^lJX^EI9NUw=M$#4|eNCj(u4ZogNjLO`>*Qrxy*VD9RQg5d(ziQ`l6A(F48e19h~wy<)AfPmQi{LNVu%5+8b{WnOOUhoa{^?lB3?K}zb z2A1+|vk-)uXU> z<4NBn>C5hNSgAKvrt3Wlec>+y*&Kfl$cJ;hw31bct901whTefR{jWrrgtPktC{g?6 zRbksVQq@_uqY5iZp7bq}zT(t^^evJWpKpQI!IP<*TAR*6T;6jlt!+i4kVt9IwK}vW z@3QVDUfauS&|7YGjb0LY!;152w|=ZL#X6TKeVe4O8tL0A)2CU#;g_H6TM!&UH8*wo z+(lLv;^o=5njtT+ZRB=TY4i=Pa5#cVLk+HVSBVs>Z=UoWlD=l7?}&8llenUKGeWWG zJ;ih{Na{u)EFbC5nqRdGB)8s+aM)!CD`>f_LpI;XnxH3rm!z*d zC8+&(MY`$~Xf0@*;oWM_u0|oP3bxdXQc0mbcH*SLo2-^m1)wSdD7~XSvrY&h;mTPlB>#f!i4KW`o6g|s6G<* zNz+*u+=uk2XW}b0f8=+es_u@Ld=Bt_MD{^M_F+UeKO*}mBKtTZ`y?V;5RrWvk$o1C zeIAj05s`fvk$n}BeI1dtMr7YaWZy<)-$i8KM`S-lWIsk^KSg8nQ^`^w!afsXR3Tb>i2om{M{pb-a z%Q37FtQPBcdh}+abmrFRR1&neZdFzz1Ny2b{eYxzxr|_MKM?7-spJY)gKQ?l5vX_y z&gQ-jrLx-?a(#s{IU4bt?U()9j@PO*YlFBXvc}n*02aiPen`@{jr2p2)|0eAUqJU? z7)-6QsFH`XY>~1=9;eq(B|p8 z$CWpFO)0(7Vn0ag&PA9W?9bY26vvGod`d8n{&upDPg6J^@o-OLDfEE?(#5;&U~N6= zMr&8r4!q!zC)xEH&S{^V;{m*{jcY>ftOP#Q4-RH zEkUI0hi>&s?G$5xC;gbD?-}XGByCB5by`a+&8Keaczhb-dgK4;rx9;=GtaUo%sUV9 zDkv(mK0*9CuCUcLF%9cfzn9g2Bqj19gZt2`cX|ZQ&cD$}F*145Pe@vI2~eh=sP<>d zr(=Ctsj;_MoGmW50;Limb$TXQvzpZ~jjeWxS67AiA!_=si{EF)DDFu=CFuu7 z`l(3UO+Y@yGdxS^GrK2W?reUo%xQE}FUa+*qH+||u;p4!gj^zJ9oSisD$Je%!ng3G zpON%Kmj!D7Gm)PEDDqh}mbp=@twPfKTgbkjn|sLKY=iV`&Oq3OYaiiTI`*r#K+@bu`Q{8e1!>qDb8S;xx>oHW z)1!6@|K5|flJrv}Z53%NNBo5&d_MN&dFrzjHkPkS$DTkl=lQf4Hg*O*-F~w(Bns~% z#jn4x*n?@0QEk$xxAVX~y52dWlI>g>sXkWWyj`c0lx-bWxe z7HRmu!)$hfd7~%&o}^zI>GvWXKugmUt}55nA++DLyC>BhADEy21~5|pW}oAn9u(H$^sDMP-1 zzCrH0w<A$e|M6v+ODJvE6B5e^5R=+d6`DgBj`$g0rqJoaP8!cn6t1#oCQ0{h6fS8R^d? zE$;gw_1)&R>I?Q-S)Il)y-53*<%yIW)6>--MSSjc2*b5>J*6!k<8_9=9AkReirtO} z)jn2~Jn1ha{oY7_QJF4x3-k>;-)l`87-x%5#n>}At5Rd%?@0?+E%EF@K^l1iL3_yU z36%zg*lli7m4(3_N9X6ZoJxTC|i80Ua?g`p}J#TZ+s)0Ttf^zvNTP9k$g&Somd7%5gNJ?ZZxU1+4gt4yC@ zKKiXZwe=>JV3F;v=`7|cYd{K(qw)-gO~%<_wEVUwm1#7Kw!Ln;s;!mUh?;kBq<`dd z0Jjv|<~hJJ5!td4*`Fe^BeE4DvK1q;b`jZ15!uQS*(wp)su9_05!vby*%}d9 zO+>b4M7CB$wsu6;J|g>bM7B;uwr)h$AtL)rM7CZ;wths`F(UhGM7BXh_O~Tucn*O7 ze2+_3UdH|Ff7as?_tPvc`oc44`2*;wsK@D-)+_xWA4#vFav0(|YwHp8%-4UIX*740 zhsOS;d6w;PP><`-MgzyN;-O|6&?`LYG9>-kWeN{w8Iq=dTXCta4LzZmJVD$_kQCeRXD zsVScXxwV{%Fh3eOjqW4JkiW|@%*FwY(PF8?S)1ibBCD&og-nx;wy+?c^iL#R+YUufM*zE(IQZ_o7fEbQ)U0}U!uv3IdDg|3YHr%nLuk}}kdY#oH zecY|8xvR7X(mfwg?Zeuxk^JUPpnok-((~-?yX94;`g&3LjYTvF`NriNwXBEoBc-BraGI`P!Nt)D%bVZS_^dRyaQzj90lm{}-ob}uyT$Rw9 z6Iu(@7jUY2UbTzYkZ86OTBfkXMXLKKTJ2-J^rY=bx{Q&w6X}o{$YK8VKA*}U#z|Tk zfw--)D+kK8&UXp#&wVw+rOCZRqxA!|6J1s7^;=7z9`{WrwNs4Zo^&OWE^DMKiF7FE zEwe5QG^uphbL<)K&i<^ujnN&Fxz{4B4&>R;AKR1?m8?j^@|8qon(YpOZ{bN-Ch4Dy zbY+p&T@0KoJ{A6sQ)HazHKHqT=pYmrS*35re>DzC5~O5Qfi=C1H~Jn1SVUCu~X z5ot;DlfX|-da*>P)mCuXf2`J277XnTb#a9wQd^>>NwRe-_+g%ORgx}mq^pW_ll#Fn zgrkjE3WG_?+Mkmm?nY-9${OhV)%s>wf40*iEm`gfuttF{yh@B42l0?PdvgKap(kC9 zq$?QdY9cM10Ugc)gGD+t7BX(*XxmmsyJhR}39oINCL~f#gc8NGGKJ6TNmnQ7iblG+ zNS|bB>Wj-p+Lt*~cX1%&+cL~_Cf8w8!galQy?#K&A|3piB#nqmgCY$v%U}i-jmjl zbR{FL5oy1P$Zaq!fXcMkpIo&Fi)^#@{7DqbpWcUl>)zH2H|JGKqcT+}N!zv|J=t>r z%sM>jnj~G>NY@nUfV+^x@Ssc+d85?S*vS0DGG%Edw4Nol9DVmbSNm=IkFFAR7-pj> z=0cuyEt0Ncq-%+^hJC*#!zR2i7)1(#%R> zj_pa;A?X@Mx{gTogkNjv(qzv7sn5!{HXv1=YQ?lq=1GSwQH)_ZhVd9FX8xXZU6R%q z>AE7-ZrR)u3wa#WXS-7C15#12uG32)x93&is-^5xNEgOK(rg}u^$1Vefuw61X$O%W ze;;yNKzn2MbfD*|aI8%{ZC8W(0Gi4(t0YJA0}gwo{cUOU-`yNQ@yV@ACia8DQp1VV%p9b|mR& zn?-jN>CE%MXsgU5&3(K4Al^Y(kLnwglvMkw_obDZbS^E-#(k{5dD6d<^v_nNeY5!qG| z+13$R&xmZBh-}-4Y`Z07Sf@n$^F6M>9=ERbxPp3I@oe_E(CZKS*HUNM?02@tqERih z$&y$Pbp-B@{WK?$JdtfcukfUQCus*G{kupzj)RWk$$=)>25H@$@(#gSPc%!`WGXu73uIYD7swaS&I8HPMfI}jnJdD(qXylO*r?AAEhQg zM)_+-7|siG_nNSj8D?V`EQlxl2TAc&Bdi4fL!{bg7mh%=_iUAan2&0fw$y5(H%W6f zPKl`h?=bTVVAnipCz5tuO{ASfI+F9OR3p5!((228+b+v4LC%3+uul`^nuFH{Y1+2R zaFkFkl4M>XtgR>gCrQ_{+W)6WZ|3~E;oKmfUOukzDcpH&V-?%-E4<69dSloU3)B$O zg=a;oF#7^0#sE*+nWXC*X=jnXHv?KVhfz6}j)O!#b|WoA!smfHYi~4mM;h(9aL@SB z?s_t0{Ay(Y(MbO#()!DggMA~AI&4p;;`=cFwjN(C zk&7%x3(7n1(fNV|yiv}WYl;T(jfX%8Q_Jz-)| z4hlJI{Fbw`mP?pEXx)(=vdz$L0h8{!&!4?tmiX(y` zVv8W+brL}kEJ;K}#6b`QTSOcLN4$byd&m2DHXh})w~w^dHf`NjTW#WdRQAH>ntIXqV}IVtq4&3|W2y9ulxs3mZvBmCtdji!hW zBk5)&Z8p-)WYY&0p&reZOq2Q#TVh?l()SjP0?jyUIq!#k=cY_vlG-Tet?ZAgjM994 z6)|fh-JGP~Hqy;S+Bq9FWD{LIUaKM$uUmJPe#>^asckflxQ%CdiP}Rxnj(^pq(2~O zKO_BtNMGYx;25`ZVG)Oj)K1-pxdfK0zO5M6<=jXLQtnen7>g1R+dlt_c!j!GW+D~s>(yvry@>NUBIwI*7B;CYF zw-9O90@Pz`y3(-)Yi8cwSLzofHk$HYkDd#;c{NX}yyx|K)ncjjD9nW->6Rq@u90p@ z((1$?huX58pN=fHcYZfW7IIa~?-=gUy&i$117AQoh#uK^S-*Br*mEHnyweywLanR1N5x-=cs9&JCW}|tH>rjgZwj;i1bVMLDCIh(KG3{$Z!1w zQhSSm*Kr*0(}%Qyo~~9DEr?Y1ZNpjDc3L~d%s-NDL(=|6x{YkQ0poV`$Nc9w`@JzzhY0m)~Yvx_H zzZEObP$;7-a71d|jihBXill={x`mMrCTUjVIJ4vy@apUu=cc0TuNOzD;f4TrVRyr?Y@g_$qJ&i8R z_tm2Y;;iMG_^KysRXqo2c3dqk&+99!21p`Ow9`-WIY1>`@!HP;c23BK zBxJiJWJ43OT@$il3E6H5+3qZ6`&60(C6vO^NGF$vkB3E9|$?69?Dcn*N}7kgZVJ?`=^Ykjq% z9{1)$=pCmp_E(>(Xl;*sSC-Gf(fSdw2URu8-5HV(Zbq6Z%JKW$=s7BqtABZKT#njG zyITZ7mQOcjHDJ{(aYH1{L{=pH7Fjep!}evNbURA{%SNzc)G^X zR!8&oRd|p{x(i9SG16T`+I9wNv!}vhad*djZ^3_}yzE$)r`0&%eSaetuiGrHT9oE- z0sLAd9ZJ$cMmkiaBbK3Ny@Ozyb|;HQ+hdrg1$8vrpAuT|4~vo4sOI9$6?t4N1lhS~}dVB5l0`_2>)Cq6=>rLpMj&_DReuHdGC|vt*ybT@7We!46(%nhAgOTno(!p$}*(r|H-N#B}J5`-*8w*Hk{=vtup4xMz^75yM zEh6b2B;CyRD>2Q?sMyNToTwSx05aQuqp++OLi_TCh=)mlP=?o=CbUNp~{R zJw@6!3tYAW#j}0sAQNz8uH3ijtiG4fgjfL?Msm{Z=EpB>7)ALv$EP_a^DiM!L61 z`?Bx1Vs!`qkZu$67JU@vqCCp$Xqkt+eff;sNHg|Pu6{FQjbk}I*HJl6DngRWmU8^Vh|MR&`5#LABHj)lC(l(Kf=KR`X z4QZA4B$3Up3lyYg8?>*qXsq>jUsqFLbk|yxt4Cqh5lQzY>8?h)uSgGg3OZizikey& zJ?nc8!_S4>-uGbr7LRb$+U!mo)q9!#eO0|vYr9CqrDy1#aS+Z8Ba28e7mB1KNjl6( zM~bwx1ZVV_gVgTb@R+Y^jZpQ-QfjAc5AU-#>Y5UxX~MFBCa*=*`Kl#mXpwY3lI~`t z`-xQVfK|psI{O!ZMc2{7GKCgWA`#`@j*a=eonqb?Nk@@%xRH($>C8)^ z&-Q&v)84Lz(abx)Wp>{ca(i|pQeQ?_=56Zp1zx-Rn9WAg{YkpJk?v2@`WN0ro%`2G zL>+auQ~iaIjd_2|XU3!LjA*h^kbLiPq+=H$_51WSHv6wI_`M-^t?Yr}nUdNm=Gc++ z0Fv%uqzA~R-?#zB57^&=@ zzqN#!eh5DbB9e|K z>0U-UTBQ0)P4^T>s@bP>A4s_$3q(Ouo6)K*ORj5eY^RdwXff5@$0|uAJ&2@x8|gtJ zUBh-~Ghyk_${$JXYXi;hI&=jbqdvHV@;#VRVt2MgiMONA7f7w0V(li99!$~^MtZPF zYmB7*H*E49C#-EO)2*4R2F+aQVf7c*teyI(Po$Ox0{rVGHBzi7Mbbk^x{r|_BGMW6 zfnxTRNTsh-(_DP2Z?;b3wI&EQW4|!QG?zR zOvKiu(#N$(|Hp6GU`;TRjwR_xBONQ!+j;i~vtNm{b~x)~@7CW5F3eZt!^$XgFYo>u zMq?$8TGC)oG`%A9Ng{PID6 zvSSjmi3!=U3E6Q8+3^Y42?^PW30ZqWHYp*SoRFQAkWER*PEN>9Nytu3$fhP_rzK>k zCuC@OkM`ny;>-S47goNxHw09xl?~(l@mGwLsOWk$ep6 z^c0eFY;C#%N9{SH@BNKj{-}{sb3TTluSU{wBt5`L$B}gCo?j39SjxA5KBV{;((gO~ z9c^<$nw|SL@(1#Hw^mpF^cW;vh+XOnK0?0ZVWjKbfK(cu=ZH9d0VVWqh4lvd#4^Y9 zZ$55g7(7TMJ%XeM8tDQzybeGjAs5?hl}+@~4_uq30eg^CJCMTylv zh!Q_C_!vQY)E@FV0laM_J(8pc8R?NC9m8=*$H4~Cr+~rr;)J|!m9<9pC%D!zX z-%MU{=`7`aS~ia$&;K8|7w)ogFHTDR7=yiI$v zpl4K>eD6BO%Sbwbq+^V9f=IKAapksmMVhptqWlQjg)PC_V2Ki1e9gJYSK27?eTGN# z@}*Fw*L?mI2%~r;J%*%*8tE}2?N5K|zZGijl-FEk)LmHVQBUCAoZSINdvA0Ad3AlV zueYqvtBlfo?>b_ONIH?EV~up8NPqJvYFOSG>uH+AJXuEbIgfvbRC~m=%Vr~vZ*3>D zyl)|cDN!m$^*Ya}dy{{E6%kJ)J(i@08R@YiZJG53}fu!S%^aPPUaSLkJUwzZ{`~IUH6xIeXMjXYb(T-7i zdP{SgBEFBL?IayRAR zdlKjED34X>MNYp+mF5u&W@wT0B$6I&q$i0~-z#0sSi|lYJ&^JiOSQUsL_z;Bd=};V zG9|ld@a@`jHRkiE5A()II)$VYjC6`fAL4yqadl*|ufdQd(|Dz)f~?1$?X;l$;7+9W z-r_z{gMA@tBPa3KDqAbfV=2sLBk9Q`J;q2+7U>i8G_8IfHJmlD9K5~Va*JuNj9Yw>^WBB zy<`7r;(jrEDmWl&u(6|0l;q=UpuxYG=1;$VMk@Pf@9&eGX6ypGVSIQHrEzkn}_&Jwv3&u}96G?X(Vc`Eks14Eee> zq-8}Yp48$Ir>8fY=AIwxT#hz=VHDbDLuIEs~x|(n&^orbsuYf9jHl*V$rW-k$I@I|}jg{^}jv(t$kc zdz5dX(phpEOcKc8Rpn2yCKyT2BI#r!JxiqJr=X+hwx~(-B6-O&BNTgjt{UV$4?y`V zmLaWkE^XJuGP1JG1a+2g8r=?R>h*4*8%*xd((?Ub;{ zIOqzG3?NrJbUw>yto3v6W|r}GZ1h`_pznW@&jGS<#cMwYI42>So{-H*$Yv&F=O$#c z60-9Wve^mQ`3c#agzSQZY;Hn!VL~=9A-gCc>qy8hPRK4v$SzID<|kyAC1jT;WLG3) z3lg#`6SAukva1uag$da;3E8y?*>!8l@Eic`FZQ^MJ?i5>mLVbC}CvE?Kn)_Syib#46Nv9a;IU=>4NK@6DS&v`W(fG8bJF1!) z7koGea{K2#8wY^2jgs&B*=b}#QtF4k7p+||$ZH5$>E zRWg$9$MVfgRlj*xC+Tgh$VuTrBIyj0E;D~SL!^5xfWG$0POIV-TA@CQ^1}KUCG_j| z*I_kQ_>tc%=yd7|e5x`zDg0U_ok`MD%%(F%s=u<>r1d;$vdD_{?9J4V3|1TD)pj0L zd4I>%5_-Gio;TlX32z%o&n4-pMtZJD`(29K%2QaUbT}@pQ5JSfseW2eBcJVIC_4?U zE-#(_s3*-=E-(f}(pe;(YNWG7+Qm7+nrTk=ZZU6fR5adMw$`%Z9#MF@W@_*@_4yPj zMy5!59!XC#((^=`O^4Q+_flJkl<6K!eZN+nj1x1>7YDP9x0*;x(o+ih^EnUmDN>A= zk#sgmPdC!pBCVeReKmO_>F``T;AnBBRJB1~7pYpPe1bGITCh=)^C~LDC>}}AC+QhR zdcH_&Gg+sfXPHewl!&5LC%IZr!nyWVt-n5R&76o=44vU0Qe(FnA!3V2I)|jwjC2l3 zE8qHcsI78McSub~jq#|SSl`kKxgu26pugCejfZ^v8%SSS!E-H^ECoro=CordCzp*5 zj#^I=+NT>SBA!Tk0ZGp^(hFqM((TlzCr{EUAIe_TF7IV+02DT}-xO!9x)!OuNun8! zSmgPsLDy&RwK-Cg=c_@8!y@Til0Islf38T&7oawK2SJ)zAd#m0Z_-7Hk+N;tt{`29 z=jy#xeyrI@b1#MHFp^$K(zDE_7m8HxF}Jz3K=Y4HptJW@T+6lg#iK15uRvq1x2dQ- zug`nS=Ia57StIE@lAdj(^F;dXI%+#^3G1Ye`YFs0M!G#UiIe5N^{bgLCtAbPyVC<`s#;K z?qU{uGQhsyMpApT$*;n>@r1}x`*tm&LQ9|?<29RN-WW;elXRw$&KKzimxHTq3R1gfXAv7s zErw?eyRszPKy5Da*6Vt^zedD!8}qqMF`JE~myz^bBfU(dEjOaJ)w7Wr>2T(07u(C~ ztZch1c(jZC(DvbS)G`ga*J{y5=k$Bt{O_(~jvYxaC+RFBy|D9mW{3GcVBt6eauMp`(dK&Gkk=F8& zv7U}e%#+JTC$>1P1Xnw7v_2N8|0;+5?X4D`3xc)2*F%Z?R=%4K>k*N30ZC^Y=>m~X z)qQ7dWY_O)A;v~;$h&X-P`$pl-YwEb4U*@pmRKc;q*s#kd?US5r1NQ)>TwlZxz2Wx zW?~nD%CHTtW^8M3;rsjB*!TYxDb{Wx=~X11W29G!^smo@@d33~Qq&dc4S>9bEm7ZF z)OBQ4$hF_+FApI9^~Fg2S8B8?-`;m)Ybj|BL09RnHM|+2(G)96k@RYkt{>FmJHS_q zboMONQ$K;VNr%R9TGpPL`F<_yP|~4jp~7?Bod{O~_Cnt;LE=esUXfy*E0QiG=>=xf zg(5B83$2x_shek4k7i!|cRKR+%u+|$PP86RTkehNN?i^cs=Qp+DW|l1OULc=;?yzOwNC1jlskpzAx2*HPuUE&|h+3Ou{5bbC^@ z<$NzC)&wKzwIn@uBi;RLNt!+L66$%45tXjiKYO0Q{$_I&)}t?#>hD@*_v2jsgcSgDMp*OBx>v*~rRY1`STt$a9AyD!ZyPYV{_mQWw3 zMJn>PYS-RNsTX;!-tt(N`XrwN)WQ|7{T$%>glthlc0)q8I3c?+AzPA=-IS1ZCS*4! zWVa+_w-nVBUFsTW{wG zw0t^`YL?(57#|NxXRm(E{4G34B)x&89Y%VCNSAWUbTLUUHqyl+Rb*9Ix6){!aa%Ex=zI;dpsi?&h~;w% zvj01zrIPMGylo`Ck))Rx>5U?Nk$tIY8g-M!|1F5J_O<%EsryK-&P#FD8bw?jJ&m;S zUKg$-FySB4+@=@v-lITdnyCq%kOvgAOdO+0J% zIh3?9RhhdyqU|55OoMNpB|U-0~{_ zuSgMxMbf1tondo=r6TP+2ep;`dVububZceR+f+64jyFx`6{x&#iM?}0dq_{d5{&3D zlHNwrnMQh>NH^lVWj*#QS;46LfueRg(l8hPxQ23-d0OySi;%Z{nge1P`v$J>W7Jl# zvRcSi*7p&!M$+3!y2S4O?IbN9@$*na_QYIiB4V%)IteG{~F8@JMV)u^T zK>Mt1)rVHjTO!MQJNmq5&-YYdE)+?Zk@US_FsueG6RCY`X`Evz$GnYB1&W~2zN1%R zo3Xax?bsWaXUy}mDQ0Mq^e&QKWj4J_q_yefQp}{Y8GYDONkz$xq~z+J#B+6YJLau^ zpD(d3HA*D6s1NhTNP0I(uQt-VMOxu%U+qMv$zpy=_G3EO9hJRk_wF+xFN~=LQg@bo zk{vCPooOERVKy5{?;+`}=B4ft>1Vs4Z&?kgT3MO<5456QzL;`Fda8#Joz|q<9>&q{ zFGFgrm1T6)u0UrMR@+Lbi&q@RH{E^Au_NidBwc7Wy;r0f5wpWln@9`$_=i&NTCT0J z(<)FBI!dUU1X#W+1+O>WuuKKTqJG#RAe{EnYK_-XNy9wEQYsv5&0PQdKxH@~> zjn?Dp>TzB4wB`fU3+PL&Unnk+KhRNmG3u_GP?B6Ju}ed8CcL8c81`=}kuZm`F3t2KI1t z-a1=R?j@>|lAduqD*x<957GU5sYY9PkVyJCNjr`7agi>cgW7t0RJbGSCy_nZR-~Ys zMJ+Ck(R!-k?bw?I8`<;q0Qj{?`UFXDHqs|VI$=7v>=~6bX)TaM_61HqhKZt?S2K~R z7=4)%<(n{-&feJbyAN+0NuMO?Ek^pJNCz-3Sfl7qS}Ux9x@`}GpC!2!m`=rm>Rm04 zOQgNgsTQSq1cNakl0HS!TaEN7kydM{Vdc589^1Ddn~tY^P&{g@K|HE2Z);~uAwt#I z>aE;3+Uh#;T}&96BI(m4U23FHi*%+|f~Pu`!OTn3NalUNmhE(uZQPzs`ZDI#oKA1Y zVqQH8<7FgWNz&Vlbfri)yaoDZ&UadE9t(+LXN);ivuzY&s@~dc-lGs( zMABzTdWVrdE7B(xpteD?S*Iw5Gtb(L)b}XW*@7~9lf+uCY%LAV(&lvb?rmjLL_Cr7 zIg)l6>2oBlx4Z&<3-5_q?QI+0FU6*|uZcan%8^2=YEM6kvqoRdbN$-K0hIVTqJOIF zJVV&eB~rv;k@R_z-f5)I%ck8oL#y6g)BW=MK6~0(=RQnjFWq;>(rxUGwz9dYE2DPm z?O1k4rAPNBe?uJ6VI+Nlq|1!-1(9YMblB58>ENBURwnQ1>$E)2(nu_OHMZs6+NNsB zQ`rD@;9l1LX^i+Xydvo>kX$19MP^WAosbwtvaNqVo5 zzAVxvdhhBPm3aLvF<;-GdA}wlpU-;w@ad41k=*PRHQ3encK36Cin&lEeTAg=8R;t` zopTekwrgBuJ(UAl4|SI(Gq08?3R#er&FG73<57BlbK(!3-^uzDm;N zM*1pAv-9W^FXwJ+UBB&-U~PkDlHw?)szF4YwS0qTRTTMacAzqv1&CJ?Kh{dZ9{BOD zP|O=6>1!mt-$-ARO}!v~3Zh%lfqZr-(%IKg?&dD`EyF#7JUi({9KHE2q!sl& zUB?lS`29o{Kj^4Z_Q0@%TmBR?|48~nlCCh)AIhc^S#CaNsJw`d%hBk^@vEiillGaQ}tCM9e){WGtWpCYhTn<-w#I% zf5C`7LF>^I*x&S)r2j6b?oAK(y!SYi*Jhbti@niHJ3ypm6s|( zQdjTVIUWu78SK1wgD*i|?WFMRh;}c`SJak8=hGIu`&he)q;HY*A-nr;iL^gswze}J z%Mj&BF`lXK*BWa%%j?$l={iIw3R%$G(dRwsCPs=CrAYcVNgp=Sw?+Eu3a~UULaO^! z8N)n#>#7WSYXhvoRwGC^?lzW`CmR?wm?x9<#nl)I=xF|hc&u|p(sxMuh>^Y{QuUeA zajqVX^0b0|k9L4Ns+xJ!c7n(Q74C0Cc~313mYPkm`W8ulMAEvE{z#3w&giWa}k5I5C7)jqH>7z#au1F7F4#th?0d)6m z{|qf_`~HTajE-85;^;qoDdcsHrp>O5=77HCHjbuhxjULou~HdH-y`W`M*5yeH@bqg zofGTH8*=^^Hyr-WP7Ft3HS1B%O@G0J_{v@9R^n@#3`#Hdm z6SAKqWdDWbY?rze&h`n~?o3AzPD>{XQZ4 zLqhh)gzSTa?0*xoKP6;;PRKq?$o`U${WT%`TSE3xLiYEB>>ml)Ki87sIRM&U>~THp zagSS%>rsyzJ{>)%uq)K{X5obJgpvMOq-FZAwv(MEjSQ+mF@pD&>gANo=K8AM#4E%FM(2onljIQ$`f4Qo2}z$c z(w~U5!YHKh#KPh`uxFZO7km(}iIUm$wAnF~_^XlK{aOC5cSYPjg7SWgevuX_%Mqz~K1hYRA-uG5g`IG6q5apX15*&CZ=X*v~h%^o!JS$rW< z*V0R)jTGKClKzaO&lu^?L^|SiXnpT~q|#bre5J8Uf2XVDTCwJ38RM}_pTJpb<{_;d z6g9N+KG{xj*_ZQ6>9@3u@?kAOvlom3k@V*zebz{SuDk#CJvgI!QLLw==$dy^-(2v2 zFT(b*@a_*}Tu`0BbNy(mmhK{<@E5j2Ed^59H(#^H$P`I`LDJ`p^cS*eOC34}-V!z0 zcSG6wR?@!JBjV8#iS%`o)4A#~i2bVMX5#kk9>wG$+S+N5M7G|^Y>M$RlCCD{^G3Q_ zHeGTrbnI1&n!Il<)4sOq!Wz`~jd+4L0N_X(FrO%>g1wk&(<+7^%6Q|)~rDPKyt)`2|BAj&t5XQjpk z9W|RG;)$fcCh3bt`fHKy#CEza`-ZO8VtlUm$lqk+U7c(XviNaqr%meV<6If#U4OTk zIB4(>sqTKh8iY73lD<#UmyGm%k+$588s6ayRyyQ?)XJLVpIjT%mshp_`cG`#J*PoK zX;-GAP^|7p<+3|!yp-g#Y($5V^fx5!HqzgSbl@F0qwMZ}kM2HKD6+{oY9qU9U@z9* z!EVm8vT-Prf9ojJSF)Ie?Z+%gZI+jwqD>LAM$+Gs^kpOctw=XmgnIgVe>wsZwXC|v zbnh!^9mQBRMkpm&&~s^g_5QTcrXtPXu|OmpNq1q3imqD&IYg=dvgvd0;*6W0<9TG6P2W?Y_a3ZpXRxvytk15zfXfR~hM_L^|(1oN+kYfbPp6?VqheUcU}$pXo?-bS2wnEBnk>o`rnjjYumjuQC=l z9v{yt#QY-Vb%cJayN{WFB>gi<-!#%ci}amN=<9o4)M{VOqCSg~-3V@dV<(jVfY)I= zaJF03tnp-A6-6Z$rPENazPsT9RM&k>=X@hEkdk49cm z%rAK-&RPVCeLajUdJiJ&Z5GKgdTvk|Yc|CyNhJLXN#8cozlij$$5GGRYmw^S^_<8& zy-`)RmX}ryvhU_7bN2&CZ3I)?sxs_vg{NtoM*XVA(tMW^)@~x{UrG9ok^YsW**f(3 zf4Vhl(%-1n^OOl}vz5bmRQHR~p!&>14?*5N9jUy5>aQLJNp&L6B75O0F}fP{xBT06 zSW$|keNJX$&sdHp4sgSwE{JK5nrhP+5E z{->Xl#O8@&^yxNs_p#0uNk1a#A3iP8k97B&A43g;>BFT}GkU$r*=IJ6X0(xxDuynx z4c>k;j#d=I?uoq0*sAw#QId%H`|xP~jYX`!Mbf{M^hb90|1Q!G*?&7Y7g9au4Rz&W zY;kp#nCCosINOGz>O!mR&ocfjc~9x|Y3}*4CKyToLDF}P^dBPaV6E&C==#apX_sh(&rnW1FVyft(%a2 zDj{1hA^UVf_L+q2vk6(BgzR$(+4>3D=M%CG60-kD$i9$}eK8?xO31#HkZqWdeK{f9 zC?WewLiW{!>^~E-z6sga60)x+WdD_rZJdz(cS81!gzTGZ$*`h|_7{6x>GSJ^|Ld_H zSNi#D6&4e?3RO>=2&2FVl6x zxU+8feJcFc3%^f?-)F+_v*Fh#{5}_c>xbXx!*7G|`;YMZLil|#{F=h=OX0U+_+l;Ge%plKpzzx^ z{I(0f?ZayM^EI@Y_B7_6WZ{!*8$f z+dKS5gx@~l*A{;JhTq8W+b{e^h2Q?+cR=_Z7=EL}@1XEIIQ$L?zcJx=X!wl{zr(_> z8h(d|-?;EQBK*dO-;v>WRQMeoeiOp)nDCnze#eI2@!|LPfBy5ICxri=7=G>HH!1uk zhu=xzHzoW|4!={v@6_;{8h)pR-|69ZM)*w&zca({tnfQK{Ic*Ft({)BZK_= zyYSVqrLN1C`V(uZ>$0WRFM2=dtNiXAr}awY2hBq|kUj2!T0A9LIdT3UxjH?bcPkJ^aMo=`u<##@Xak@Qm}{U0O!lzRWMPeI32#!a$_^{H(jAI{jO zu*Rl3hvMk$iPK%tc^N46p=D&w=b6O9giw%*1I=rxSF77w°#WVffS^hdaY5pVtF+e2! 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