From 67c721c364372031cb9e5a9a3c1a9343f725cddd Mon Sep 17 00:00:00 2001 From: afwillia Date: Thu, 8 Feb 2024 09:34:16 -0800 Subject: [PATCH 01/72] WIP: add data compliance dashboard back to UI and uncomment the server code. --- server.R | 28 ++++++++++++++-------------- ui.R | 1 + 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/server.R b/server.R index 21177f24..648b61ca 100644 --- a/server.R +++ b/server.R @@ -554,20 +554,20 @@ shinyServer(function(input, output, session) { }, ignoreInit = TRUE) ######## Dashboard ######## - # dashboard( - # id = "dashboard", - # syn.store = syn_store, - # project.scope = selected$project, - # schema = selected$schema, - # schema.display.name = reactive(input$dropdown_datatype), - # disable.ids = c("box_pick_project", "box_pick_manifest"), - # ncores = ncores, - # access_token = access_token, - # fileview = selected$master_asset_view(), - # folder = selected$project(), - # schematic_api = dca_schematic_api, - # schema_url = data_model() - # ) + dashboard( + id = "dashboard", + syn.store = syn_store, + project.scope = selected$project, + schema = selected$schema, + schema.display.name = reactive(input$dropdown_datatype), + disable.ids = c("box_pick_project", "box_pick_manifest"), + ncores = ncores, + access_token = access_token, + fileview = selected$master_asset_view(), + folder = selected$project(), + schematic_api = dca_schematic_api, + schema_url = data_model() + ) manifest_url <- reactiveVal(NULL) diff --git a/ui.R b/ui.R index a9488286..380a31be 100644 --- a/ui.R +++ b/ui.R @@ -165,6 +165,7 @@ ui <- shinydashboardPlus::dashboardPage( class = "btn-primary-color" ) ), + dashboardUI("dashboard"), ), ), tabItem( From 6c36b42da82a0b7c706bc0ac91026328fd7c93c9 Mon Sep 17 00:00:00 2001 From: afwillia Date: Thu, 8 Feb 2024 15:51:59 -0800 Subject: [PATCH 02/72] Add dashboard after selecting data type --- ui.R | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui.R b/ui.R index 380a31be..1c775ada 100644 --- a/ui.R +++ b/ui.R @@ -164,9 +164,8 @@ ui <- shinydashboardPlus::dashboardPage( actionButton("btn_project", "Next", class = "btn-primary-color" ) - ), - dashboardUI("dashboard"), - ), + ) + ) ), tabItem( tabName = "tab_folder", @@ -207,7 +206,8 @@ ui <- shinydashboardPlus::dashboardPage( "Skip to validation", class = "btn-primary-color" ) - ) + ), + dashboardUI("dashboard") ), ), tabItem( From 5cc0b819819ca0b95b82f2f233354df3477dfb4d Mon Sep 17 00:00:00 2001 From: afwillia Date: Thu, 8 Feb 2024 15:52:59 -0800 Subject: [PATCH 03/72] use schema name instead of direct input to label dashboard --- server.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.R b/server.R index 648b61ca..aab560b2 100644 --- a/server.R +++ b/server.R @@ -559,7 +559,7 @@ shinyServer(function(input, output, session) { syn.store = syn_store, project.scope = selected$project, schema = selected$schema, - schema.display.name = reactive(input$dropdown_datatype), + schema.display.name = selected$schema(), disable.ids = c("box_pick_project", "box_pick_manifest"), ncores = ncores, access_token = access_token, From 6c5d77af8374a5a4dc39b3bcd04c175c1c37cac3 Mon Sep 17 00:00:00 2001 From: afwillia Date: Thu, 8 Feb 2024 15:53:53 -0800 Subject: [PATCH 04/72] Update schematic REST API functions --- R/schematic_rest_api.R | 75 +++++++++++-------- functions/schematic_rest_api.R | 128 +++++++++++++++++++++++---------- 2 files changed, 134 insertions(+), 69 deletions(-) diff --git a/R/schematic_rest_api.R b/R/schematic_rest_api.R index 794c1afa..5e9d60a6 100644 --- a/R/schematic_rest_api.R +++ b/R/schematic_rest_api.R @@ -14,33 +14,33 @@ check_success <- function(x){ #' @param url URI of API endpoint #' @param access_token Synapse PAT #' @param asset_view ID of view listing all project data assets -#' @param dataset_id the parent ID of the manifest +#' @param manifest_id the parent ID of the manifest #' @param as_json if True return the manifest in JSON format #' @returns a csv of the manifest #' @export -manifest_download <- function(url = "http://localhost:3001/v1/manifest/download", access_token, asset_view, dataset_id, as_json=TRUE, new_manifest_name=NULL) { +manifest_download <- function(url = "http://localhost:3001/v1/manifest/download", access_token, manifest_id, as_json=TRUE, new_manifest_name=NULL) { request <- httr::GET( url = url, httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), query = list( - asset_view = asset_view, - dataset_id = dataset_id, + manifest_id = manifest_id, as_json = as_json, new_manifest_name = new_manifest_name ) ) check_success(request) - response <- httr::content(request, type = "application/json") + response <- httr::content(request, type = "text") + response <- fromJSON(gsub('NaN', '"NA"', response)) # Output can have many NULL values which get dropped or cause errors. Set them to NA - nullToNA <- function(x) { - x[sapply(x, is.null)] <- NA - return(x) - } - df <- do.call(rbind, lapply(response, rbind)) - nullToNA(df) - + # nullToNA <- function(x) { + # x[sapply(x, is.null)] <- NA + # return(x) + # } + # df <- do.call(rbind, lapply(response, rbind)) + # nullToNA(df) + response } #' schematic rest api to generate manifest @@ -115,8 +115,8 @@ manifest_populate <- function(url="http://localhost:3001/v1/manifest/populate", #' @export manifest_validate <- function(url="http://localhost:3001/v1/model/validate", schema_url="https://raw.githubusercontent.com/ncihtan/data-models/main/HTAN.model.jsonld", #nolint - data_type, file_name, restrict_rules=FALSE, project_scope = NULL, - access_token, asset_view = NULL) { + data_type, file_name = NULL, restrict_rules=FALSE, project_scope = NULL, + access_token, asset_view = NULL, json_str = NULL) { flattenbody <- function(x) { # A form/query can only have one value per name, so take @@ -137,16 +137,31 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", }, names(x), x, USE.NAMES = FALSE, SIMPLIFY = FALSE)) } - req <- httr::POST(url, - httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), - query=flattenbody(list( - schema_url=schema_url, - data_type=data_type, - restrict_rules=restrict_rules, - project_scope = project_scope, - asset_view = asset_view)), - body=list(file_name=httr::upload_file(file_name)) - ) + if (all(is.null(json_str), is.null(file_name))) { + stop("Must provide either a file to upload or a json") + } + + req <- ifelse(is.null(json_str), + httr::POST(url, + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), + query=flattenbody(list( + schema_url=schema_url, + data_type=data_type, + restrict_rules=restrict_rules, + project_scope = project_scope, + asset_view = asset_view)), + body=list(file_name=httr::upload_file(file_name)) + ), + httr::POST(url, + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), + query=flattenbody(list( + schema_url=schema_url, + data_type=data_type, + restrict_rules=restrict_rules, + project_scope = project_scope, + asset_view = asset_view, + json_str = json_str)) + )) # Format server error in a way validationResult can handle if (httr::http_status(req)$category == "Server error") { @@ -154,12 +169,12 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", list( list( "errors" = list( - Row = NA, Column = NA, Value = NA, - Error = sprintf("Cannot validate manifest: %s", - httr::http_status(req)$message) + Row = NA, Column = NA, Value = NA, + Error = sprintf("Cannot validate manifest: %s", + httr::http_status(req)$message) ) - ) - ) + ) + ) ) } check_success(req) @@ -258,7 +273,7 @@ storage_project_datasets <- function(url="http://localhost:3001/v1/storage/proje asset_view=asset_view, project_id=project_id) ) - + check_success(req) httr::content(req) } diff --git a/functions/schematic_rest_api.R b/functions/schematic_rest_api.R index c2db54ad..5e9d60a6 100644 --- a/functions/schematic_rest_api.R +++ b/functions/schematic_rest_api.R @@ -14,33 +14,33 @@ check_success <- function(x){ #' @param url URI of API endpoint #' @param access_token Synapse PAT #' @param asset_view ID of view listing all project data assets -#' @param dataset_id the parent ID of the manifest +#' @param manifest_id the parent ID of the manifest #' @param as_json if True return the manifest in JSON format #' @returns a csv of the manifest #' @export -manifest_download <- function(url = "http://localhost:3001/v1/manifest/download", access_token, asset_view, dataset_id, as_json=TRUE, new_manifest_name=NULL) { +manifest_download <- function(url = "http://localhost:3001/v1/manifest/download", access_token, manifest_id, as_json=TRUE, new_manifest_name=NULL) { request <- httr::GET( url = url, + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), query = list( - access_token = access_token, - asset_view = asset_view, - dataset_id = dataset_id, + manifest_id = manifest_id, as_json = as_json, new_manifest_name = new_manifest_name ) ) check_success(request) - response <- httr::content(request, type = "application/json") + response <- httr::content(request, type = "text") + response <- fromJSON(gsub('NaN', '"NA"', response)) # Output can have many NULL values which get dropped or cause errors. Set them to NA - nullToNA <- function(x) { - x[sapply(x, is.null)] <- NA - return(x) - } - df <- do.call(rbind, lapply(response, rbind)) - nullToNA(df) - + # nullToNA <- function(x) { + # x[sapply(x, is.null)] <- NA + # return(x) + # } + # df <- do.call(rbind, lapply(response, rbind)) + # nullToNA(df) + response } #' schematic rest api to generate manifest @@ -61,6 +61,7 @@ manifest_generate <- function(url="http://localhost:3001/v1/manifest/generate", strict_validation = FALSE) { req <- httr::GET(url, + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), query = list( schema_url=schema_url, title=title, @@ -69,7 +70,6 @@ manifest_generate <- function(url="http://localhost:3001/v1/manifest/generate", dataset_id=dataset_id, asset_view=asset_view, output_format=output_format, - access_token = access_token, strict_validation = strict_validation )) @@ -115,14 +115,53 @@ manifest_populate <- function(url="http://localhost:3001/v1/manifest/populate", #' @export manifest_validate <- function(url="http://localhost:3001/v1/model/validate", schema_url="https://raw.githubusercontent.com/ncihtan/data-models/main/HTAN.model.jsonld", #nolint - data_type, file_name, restrict_rules=FALSE) { - req <- httr::POST(url, - query=list( - schema_url=schema_url, - data_type=data_type, - restrict_rules=restrict_rules), - body=list(file_name=httr::upload_file(file_name)) - ) + data_type, file_name = NULL, restrict_rules=FALSE, project_scope = NULL, + access_token, asset_view = NULL, json_str = NULL) { + + flattenbody <- function(x) { + # A form/query can only have one value per name, so take + # any values that contain vectors length >1 and + # split them up + # list(x=1:2, y="a") becomes list(x=1, x=2, y="a") + if (all(lengths(x)<=1)) return(x); + do.call("c", mapply(function(name, val) { + if (length(val)==1 || any(c("form_file", "form_data") %in% class(val))) { + x <- list(val) + names(x) <- name + x + } else { + x <- as.list(val) + names(x) <- rep(name, length(val)) + x + } + }, names(x), x, USE.NAMES = FALSE, SIMPLIFY = FALSE)) + } + + if (all(is.null(json_str), is.null(file_name))) { + stop("Must provide either a file to upload or a json") + } + + req <- ifelse(is.null(json_str), + httr::POST(url, + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), + query=flattenbody(list( + schema_url=schema_url, + data_type=data_type, + restrict_rules=restrict_rules, + project_scope = project_scope, + asset_view = asset_view)), + body=list(file_name=httr::upload_file(file_name)) + ), + httr::POST(url, + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), + query=flattenbody(list( + schema_url=schema_url, + data_type=data_type, + restrict_rules=restrict_rules, + project_scope = project_scope, + asset_view = asset_view, + json_str = json_str)) + )) # Format server error in a way validationResult can handle if (httr::http_status(req)$category == "Server error") { @@ -130,12 +169,12 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", list( list( "errors" = list( - Row = NA, Column = NA, Value = NA, - Error = sprintf("Cannot validate manifest: %s", - httr::http_status(req)$message) + Row = NA, Column = NA, Value = NA, + Error = sprintf("Cannot validate manifest: %s", + httr::http_status(req)$message) ) - ) - ) + ) + ) ) } check_success(req) @@ -161,12 +200,11 @@ model_submit <- function(url="http://localhost:3001/v1/model/submit", use_schema_label=TRUE, manifest_record_type="table_and_file", file_name, table_manipulation="replace", hide_blanks=FALSE) { req <- httr::POST(url, - #add_headers(Authorization=paste0("Bearer ", pat)), + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), query=list( schema_url=schema_url, data_type=data_type, dataset_id=dataset_id, - access_token=access_token, restrict_rules=restrict_rules, json_str=json_str, asset_view=asset_view, @@ -230,13 +268,12 @@ storage_project_datasets <- function(url="http://localhost:3001/v1/storage/proje access_token) { req <- httr::GET(url, - #add_headers(Authorization=paste0("Bearer ", pat)), + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), query=list( asset_view=asset_view, - project_id=project_id, - access_token=access_token) + project_id=project_id) ) - + check_success(req) httr::content(req) } @@ -254,9 +291,9 @@ storage_projects <- function(url="http://localhost:3001/v1/storage/projects", access_token) { req <- httr::GET(url, + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), query = list( - asset_view=asset_view, - access_token=access_token + asset_view=asset_view )) check_success(req) @@ -280,13 +317,12 @@ storage_dataset_files <- function(url="http://localhost:3001/v1/storage/dataset/ full_path=FALSE, access_token) { req <- httr::GET(url, - #add_headers(Authorization=paste0("Bearer ", pat)), + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), query=list( asset_view=asset_view, dataset_id=dataset_id, file_names=file_names, - full_path=full_path, - access_token=access_token)) + full_path=full_path)) check_success(req) httr::content(req) @@ -302,9 +338,9 @@ get_asset_view_table <- function(url="http://localhost:3001/v1/storage/assets/ta access_token, asset_view, return_type="json") { req <- httr::GET(url, + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), query=list( asset_view=asset_view, - access_token=access_token, return_type=return_type)) check_success(req) @@ -317,3 +353,17 @@ get_asset_view_table <- function(url="http://localhost:3001/v1/storage/assets/ta } +#' @param url URL of schematic API endpoint +#' @param schema_url URL of data model +#' @param relationship Argument to schematic graph_by_edge_type +#' @export +#' @importFrom httr GET content +graph_by_edge_type <- function(url = "https://schematic-dev.api.sagebionetworks.org/v1/schemas/get/graph_by_edge_type", + schema_url, relationship = "requiresDependency") { + req <- httr::GET(url = url, + query = list( + schema_url = schema_url, + relationship = relationship + )) + httr::content(req) +} From b1f185a8472893a427f366e3d832694fe1663243 Mon Sep 17 00:00:00 2001 From: afwillia Date: Thu, 8 Feb 2024 15:54:40 -0800 Subject: [PATCH 05/72] Update dashboard functions for updated schematic REST API --- functions/dashboardFuns.R | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/functions/dashboardFuns.R b/functions/dashboardFuns.R index 0aeca5dd..437402de 100644 --- a/functions/dashboardFuns.R +++ b/functions/dashboardFuns.R @@ -12,7 +12,7 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= file_view <- switch(schematic_api, reticulate = syn.store$storageFileviewTable, rest = get_asset_view_table(url = file.path(api_uri, "v1/storage/assets/tables"), - input_token = access_token, + access_token = access_token, asset_view=fileview) ) %>% filter(grepl("synapse_storage_manifest_", name) & parentId %in% datasets) @@ -39,7 +39,6 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= ) cols <- setNames(rep("", length(cols)), cols) metadata <- bind_rows(cols)[0, ] - lapply(file_view$parentId, function(dataset) { # get manifest's synapse id(s) in each dataset folder manifest_ids <- file_view$id[file_view$parentId == dataset] @@ -56,9 +55,8 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= info <- synapse_get(id = id, auth = access_token) manifest <- manifest_download( url = file.path(api_uri, "v1/manifest/download"), - input_token = access_token, - asset_view = fileview, - dataset_id = info$parentId, + access_token = access_token, + manifest_id = info$id, as_json = TRUE ) @@ -76,6 +74,10 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= } }) + manifest_info <- bind_rows(manifest_info) + manifest_info <- unique(manifest_info) + manifest_info <- split(manifest_info, manifest_info$id) + if (length(manifest_info) > 0) { metadata <- parallel::mclapply(seq_along(manifest_info), function(i) { if (schematic_api == "reticulate"){ @@ -100,7 +102,7 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= } else if (schematic_api == "rest"){ info <- manifest_info[[i]] # extract manifest essential information for dashboard - manifest_path <- info["Path"] + manifest_path <- info$Path # See above - don't read from file, read from object #manifest_df <- data.table::fread(manifest_path) manifest_df <- manifest_dfs[[i]] @@ -110,15 +112,15 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= manifest_df$Component[1], NA_character_ ) metadata <- tibble( - SynapseID = info["id"], + SynapseID = info$id, Component = manifest_component, - CreatedOn = as.Date(info["createdOn"]), - ModifiedOn = as.Date(info["modifiedOn"]), + CreatedOn = info$createdOn, + ModifiedOn = info$modifiedOn, ModifiedUser = paste0("@", modified_user[[i]]), Path = manifest_path, - Folder = names(datasets)[which(datasets == info["parentId"])], - FolderSynId = info["parentId"], - manifest = manifest_df + Folder = names(datasets)[which(datasets == info$parentId)], + FolderSynId = info$parentId, + manifest = list(manifest_df) ) } }, mc.cores = ncores) %>% bind_rows() @@ -142,7 +144,8 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= #' @param metadata output from \code{get_dataset_metadata}. #' @param project.scope list of project ids used for cross-manifest validation #' @return data frame contains required data types for tree plot -validate_metadata <- function(metadata, project.scope, schematic_api, schema_url) { +validate_metadata <- function(metadata, project.scope, schematic_api, schema_url, + access_token) { stopifnot(is.list(project.scope)) if (nrow(metadata) == 0) { return(metadata) @@ -175,7 +178,8 @@ validate_metadata <- function(metadata, project.scope, schematic_api, schema_url rest = manifest_validate(url=file.path(api_uri, "v1/model/validate"), data_type=manifest$Component, schema_url = schema_url, - json_str = jsonlite::toJSON(manifest$manifest)) + access_token = access_token, + json_str = jsonlite::toJSON(manifest$manifest[[1]])) ) # clean validation res from schematicpy clean_res <- validationResult(validation_res, manifest$Component, dashboard = TRUE) From 2405502ab28c9b892757b791d85399385a63963a Mon Sep 17 00:00:00 2001 From: afwillia Date: Thu, 8 Feb 2024 15:55:20 -0800 Subject: [PATCH 06/72] WIP: update dashboard for schematic API changes --- modules/dashboard/dashboard.R | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/modules/dashboard/dashboard.R b/modules/dashboard/dashboard.R index b59f9184..4cbd7648 100644 --- a/modules/dashboard/dashboard.R +++ b/modules/dashboard/dashboard.R @@ -77,16 +77,16 @@ dashboard <- function(id, syn.store, project.scope, schema, schema.display.name, hide("toggle-btn-container") shinydashboardPlus::updateBox("box", action = "restore") }) - # retrieving data progress for dashboard should not be executed until dashboard visiable + # retrieving data progress for dashboard should not be executed until dashboard visible # get all uploaded manifests once the project/folder changed observeEvent(c(project.scope(), input$box$visible), { req(input$box$visible) # initiate partial loading screen for generating plot - dcWaiter( - "show", - id = ns("tab-container"), url = "www/img/logo.svg", custom_spinner = TRUE, - msg = "Loading, please wait...", style = "color: #000;", color = transparent(0.95) - ) + # dcWaiter( + # "show", + # id = ns("tab-container"), url = "www/img/logo.svg", custom_spinner = TRUE, + # msg = "Loading, please wait...", style = "color: #000;", color = transparent(0.95) + # ) # disable selection to prevent changes until all uploaded manifests are queried # make sure to use asis, otherwise it will add module's namespaces @@ -97,7 +97,7 @@ dashboard <- function(id, syn.store, project.scope, schema, schema.display.name, "rest" = storage_project_datasets(url=file.path(api_uri, "v1/storage/project/datasets"), asset_view = fileview, project_id=folder, - input_token=access_token), + access_token=access_token), "reticulate" = storage_projects_datasets_py(syn.store, project.scope()) ) folder_list <- list2Vector(folder_list) @@ -113,7 +113,8 @@ dashboard <- function(id, syn.store, project.scope, schema, schema.display.name, ) metadata <- validate_metadata(metadata, project.scope = list(project.scope()), - schematic_api = schematic_api, schema_url=schema_url) + schematic_api = schematic_api, schema_url=schema_url, + access_token=access_token) # update reactive value uploaded_manifests(metadata) }) From dbb528e99d0198f9de23ced7587004ff9fd28e88 Mon Sep 17 00:00:00 2001 From: afwillia Date: Fri, 9 Feb 2024 07:35:01 -0800 Subject: [PATCH 07/72] Pass schema name to dashboard without () --- server.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.R b/server.R index aab560b2..9b6451b4 100644 --- a/server.R +++ b/server.R @@ -559,7 +559,7 @@ shinyServer(function(input, output, session) { syn.store = syn_store, project.scope = selected$project, schema = selected$schema, - schema.display.name = selected$schema(), + schema.display.name = selected$schema, disable.ids = c("box_pick_project", "box_pick_manifest"), ncores = ncores, access_token = access_token, From 8a58ba646ddae9a9c906d2b7a8f1ed2b26f6f8be Mon Sep 17 00:00:00 2001 From: afwillia Date: Fri, 9 Feb 2024 07:35:32 -0800 Subject: [PATCH 08/72] Move json_str logic inside an if/else statement --- R/schematic_rest_api.R | 44 ++++++++++++++++---------------- functions/schematic_rest_api.R | 46 ++++++++++++++++++---------------- 2 files changed, 47 insertions(+), 43 deletions(-) diff --git a/R/schematic_rest_api.R b/R/schematic_rest_api.R index 5e9d60a6..800a2f31 100644 --- a/R/schematic_rest_api.R +++ b/R/schematic_rest_api.R @@ -141,27 +141,29 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", stop("Must provide either a file to upload or a json") } - req <- ifelse(is.null(json_str), - httr::POST(url, - httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), - query=flattenbody(list( - schema_url=schema_url, - data_type=data_type, - restrict_rules=restrict_rules, - project_scope = project_scope, - asset_view = asset_view)), - body=list(file_name=httr::upload_file(file_name)) - ), - httr::POST(url, - httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), - query=flattenbody(list( - schema_url=schema_url, - data_type=data_type, - restrict_rules=restrict_rules, - project_scope = project_scope, - asset_view = asset_view, - json_str = json_str)) - )) + if (is.null(json_str)) { + req <- httr::POST(url, + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), + query=flattenbody(list( + schema_url=schema_url, + data_type=data_type, + restrict_rules=restrict_rules, + project_scope = project_scope, + asset_view = asset_view)), + body=list(file_name=httr::upload_file(file_name)) + ) + } else { + req <- httr::POST(url, + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), + query=flattenbody(list( + schema_url=schema_url, + data_type=data_type, + restrict_rules=restrict_rules, + project_scope = project_scope, + asset_view = asset_view, + json_str = json_str)) + ) + } # Format server error in a way validationResult can handle if (httr::http_status(req)$category == "Server error") { diff --git a/functions/schematic_rest_api.R b/functions/schematic_rest_api.R index 5e9d60a6..eacc41aa 100644 --- a/functions/schematic_rest_api.R +++ b/functions/schematic_rest_api.R @@ -141,28 +141,30 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", stop("Must provide either a file to upload or a json") } - req <- ifelse(is.null(json_str), - httr::POST(url, - httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), - query=flattenbody(list( - schema_url=schema_url, - data_type=data_type, - restrict_rules=restrict_rules, - project_scope = project_scope, - asset_view = asset_view)), - body=list(file_name=httr::upload_file(file_name)) - ), - httr::POST(url, - httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), - query=flattenbody(list( - schema_url=schema_url, - data_type=data_type, - restrict_rules=restrict_rules, - project_scope = project_scope, - asset_view = asset_view, - json_str = json_str)) - )) - + if (is.null(json_str)) { + req <- httr::POST(url, + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), + query=flattenbody(list( + schema_url=schema_url, + data_type=data_type, + restrict_rules=restrict_rules, + project_scope = project_scope, + asset_view = asset_view)), + body=list(file_name=httr::upload_file(file_name)) + ) + } else { + req <- httr::POST(url, + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), + query=flattenbody(list( + schema_url=schema_url, + data_type=data_type, + restrict_rules=restrict_rules, + project_scope = project_scope, + asset_view = asset_view, + json_str = json_str)) + ) + } + # Format server error in a way validationResult can handle if (httr::http_status(req)$category == "Server error") { return( From 9f4e0d46198ceaddaa84b87f6a0fb332e3304b80 Mon Sep 17 00:00:00 2001 From: afwillia Date: Fri, 9 Feb 2024 07:52:54 -0800 Subject: [PATCH 09/72] specify encoding as UTF-8 in manifest download to silence a message. --- R/schematic_rest_api.R | 2 +- functions/schematic_rest_api.R | 36 +++++++++++++++++----------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/R/schematic_rest_api.R b/R/schematic_rest_api.R index 800a2f31..b58a9d61 100644 --- a/R/schematic_rest_api.R +++ b/R/schematic_rest_api.R @@ -30,7 +30,7 @@ manifest_download <- function(url = "http://localhost:3001/v1/manifest/download" ) check_success(request) - response <- httr::content(request, type = "text") + response <- httr::content(request, type = "text", encoding = "UTF-8") response <- fromJSON(gsub('NaN', '"NA"', response)) # Output can have many NULL values which get dropped or cause errors. Set them to NA diff --git a/functions/schematic_rest_api.R b/functions/schematic_rest_api.R index eacc41aa..b58a9d61 100644 --- a/functions/schematic_rest_api.R +++ b/functions/schematic_rest_api.R @@ -30,7 +30,7 @@ manifest_download <- function(url = "http://localhost:3001/v1/manifest/download" ) check_success(request) - response <- httr::content(request, type = "text") + response <- httr::content(request, type = "text", encoding = "UTF-8") response <- fromJSON(gsub('NaN', '"NA"', response)) # Output can have many NULL values which get dropped or cause errors. Set them to NA @@ -143,28 +143,28 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", if (is.null(json_str)) { req <- httr::POST(url, - httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), - query=flattenbody(list( - schema_url=schema_url, - data_type=data_type, - restrict_rules=restrict_rules, - project_scope = project_scope, - asset_view = asset_view)), - body=list(file_name=httr::upload_file(file_name)) + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), + query=flattenbody(list( + schema_url=schema_url, + data_type=data_type, + restrict_rules=restrict_rules, + project_scope = project_scope, + asset_view = asset_view)), + body=list(file_name=httr::upload_file(file_name)) ) } else { req <- httr::POST(url, - httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), - query=flattenbody(list( - schema_url=schema_url, - data_type=data_type, - restrict_rules=restrict_rules, - project_scope = project_scope, - asset_view = asset_view, - json_str = json_str)) + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), + query=flattenbody(list( + schema_url=schema_url, + data_type=data_type, + restrict_rules=restrict_rules, + project_scope = project_scope, + asset_view = asset_view, + json_str = json_str)) ) } - + # Format server error in a way validationResult can handle if (httr::http_status(req)$category == "Server error") { return( From 4e0107597a2f4a1a307c3414ab57f29dcdb67999 Mon Sep 17 00:00:00 2001 From: afwillia Date: Fri, 9 Feb 2024 07:56:01 -0800 Subject: [PATCH 10/72] Add waiter --- modules/dashboard/dashboard.R | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/dashboard/dashboard.R b/modules/dashboard/dashboard.R index 4cbd7648..d5c0cb15 100644 --- a/modules/dashboard/dashboard.R +++ b/modules/dashboard/dashboard.R @@ -82,11 +82,11 @@ dashboard <- function(id, syn.store, project.scope, schema, schema.display.name, observeEvent(c(project.scope(), input$box$visible), { req(input$box$visible) # initiate partial loading screen for generating plot - # dcWaiter( - # "show", - # id = ns("tab-container"), url = "www/img/logo.svg", custom_spinner = TRUE, - # msg = "Loading, please wait...", style = "color: #000;", color = transparent(0.95) - # ) + dcWaiter( + "show", + id = ns("tab-container"), url = "www/img/logo.svg", custom_spinner = TRUE, + msg = "Loading, please wait..." + ) # disable selection to prevent changes until all uploaded manifests are queried # make sure to use asis, otherwise it will add module's namespaces From a537def20d2ad6edb0ed8074fcd20d1d3a238ce0 Mon Sep 17 00:00:00 2001 From: afwillia Date: Fri, 9 Feb 2024 10:38:59 -0800 Subject: [PATCH 11/72] WIP: Update validation endpoint for dashboard --- R/schematic_rest_api.R | 61 +++++++++++++++++++++++++++------- functions/schematic_rest_api.R | 61 +++++++++++++++++++++++++++------- 2 files changed, 98 insertions(+), 24 deletions(-) diff --git a/R/schematic_rest_api.R b/R/schematic_rest_api.R index b58a9d61..a3996b43 100644 --- a/R/schematic_rest_api.R +++ b/R/schematic_rest_api.R @@ -143,15 +143,31 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", if (is.null(json_str)) { req <- httr::POST(url, - httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), - query=flattenbody(list( - schema_url=schema_url, - data_type=data_type, - restrict_rules=restrict_rules, - project_scope = project_scope, - asset_view = asset_view)), + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), + query=flattenbody(list( + schema_url=schema_url, + data_type=data_type, + restrict_rules=restrict_rules, + project_scope = project_scope, + asset_view = asset_view)), body=list(file_name=httr::upload_file(file_name)) ) + # req <- httr2::request(url) |> + # httr2::req_method("POST") |> + # httr2::req_error(is_error = \(resp) httr2::resp_status(resp) == 510) + # resp <- req |> + # httr2::req_headers( + # Authorization = sprintf("Bearer %s", access_token) + # ) |> + # httr2::req_url_query( + # schema_url=schema_url, + # data_type=data_type, + # restrict_rules=restrict_rules, + # project_scope = project_scope, + # asset_view = asset_view + # ) |> + # httr2::req_body_file(file_name) |> + # httr2::req_perform() } else { req <- httr::POST(url, httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), @@ -163,25 +179,46 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", asset_view = asset_view, json_str = json_str)) ) + # req <- httr2::request(url) |> + # httr2::req_method("POST") |> + # httr2::req_error(is_error = \(resp) httr2::resp_status(resp) == 510) + # resp <- req |> + # httr2::req_headers( + # Authorization = sprintf("Bearer %s", access_token) + # ) |> + # httr2::req_url_query( + # schema_url=schema_url, + # data_type=data_type, + # restrict_rules=restrict_rules, + # project_scope = project_scope, + # asset_view = asset_view, + # json_str = json_str + # ) |> + # httr2::req_perform() + } # Format server error in a way validationResult can handle - if (httr::http_status(req)$category == "Server error") { + #if (httr2::resp_is_error(resp)) { + if (httr::http_error(req)) { return( list( list( "errors" = list( Row = NA, Column = NA, Value = NA, Error = sprintf("Cannot validate manifest: %s", - httr::http_status(req)$message) + httr::http_status(req)$message + ) ) ) ) ) } - check_success(req) - annotation_status <- httr::content(req) - annotation_status + #httr2::resp_body_json(resp) + httr::content(req) + # check_success(req) + #annotation_status <- httr::content(req) + #annotation_status } diff --git a/functions/schematic_rest_api.R b/functions/schematic_rest_api.R index b58a9d61..a3996b43 100644 --- a/functions/schematic_rest_api.R +++ b/functions/schematic_rest_api.R @@ -143,15 +143,31 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", if (is.null(json_str)) { req <- httr::POST(url, - httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), - query=flattenbody(list( - schema_url=schema_url, - data_type=data_type, - restrict_rules=restrict_rules, - project_scope = project_scope, - asset_view = asset_view)), + httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), + query=flattenbody(list( + schema_url=schema_url, + data_type=data_type, + restrict_rules=restrict_rules, + project_scope = project_scope, + asset_view = asset_view)), body=list(file_name=httr::upload_file(file_name)) ) + # req <- httr2::request(url) |> + # httr2::req_method("POST") |> + # httr2::req_error(is_error = \(resp) httr2::resp_status(resp) == 510) + # resp <- req |> + # httr2::req_headers( + # Authorization = sprintf("Bearer %s", access_token) + # ) |> + # httr2::req_url_query( + # schema_url=schema_url, + # data_type=data_type, + # restrict_rules=restrict_rules, + # project_scope = project_scope, + # asset_view = asset_view + # ) |> + # httr2::req_body_file(file_name) |> + # httr2::req_perform() } else { req <- httr::POST(url, httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), @@ -163,25 +179,46 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", asset_view = asset_view, json_str = json_str)) ) + # req <- httr2::request(url) |> + # httr2::req_method("POST") |> + # httr2::req_error(is_error = \(resp) httr2::resp_status(resp) == 510) + # resp <- req |> + # httr2::req_headers( + # Authorization = sprintf("Bearer %s", access_token) + # ) |> + # httr2::req_url_query( + # schema_url=schema_url, + # data_type=data_type, + # restrict_rules=restrict_rules, + # project_scope = project_scope, + # asset_view = asset_view, + # json_str = json_str + # ) |> + # httr2::req_perform() + } # Format server error in a way validationResult can handle - if (httr::http_status(req)$category == "Server error") { + #if (httr2::resp_is_error(resp)) { + if (httr::http_error(req)) { return( list( list( "errors" = list( Row = NA, Column = NA, Value = NA, Error = sprintf("Cannot validate manifest: %s", - httr::http_status(req)$message) + httr::http_status(req)$message + ) ) ) ) ) } - check_success(req) - annotation_status <- httr::content(req) - annotation_status + #httr2::resp_body_json(resp) + httr::content(req) + # check_success(req) + #annotation_status <- httr::content(req) + #annotation_status } From acab7d4c29710add76fb9926732455a710b50a93 Mon Sep 17 00:00:00 2001 From: afwillia Date: Fri, 9 Feb 2024 10:39:43 -0800 Subject: [PATCH 12/72] Write manifest to temp file and send in body of validation request. --- functions/dashboardFuns.R | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/functions/dashboardFuns.R b/functions/dashboardFuns.R index 437402de..709123ff 100644 --- a/functions/dashboardFuns.R +++ b/functions/dashboardFuns.R @@ -42,8 +42,6 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= lapply(file_view$parentId, function(dataset) { # get manifest's synapse id(s) in each dataset folder manifest_ids <- file_view$id[file_view$parentId == dataset] - - if (length(manifest_ids) > 0) { # in case, multiple manifests exist in the same dataset for (id in manifest_ids) { if (schematic_api == "reticulate"){ @@ -59,10 +57,14 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= manifest_id = info$id, as_json = TRUE ) + manifest_tempfile <- tempfile( + pattern = id, fileext = ".csv" + ) + readr::write_csv(manifest, manifest_tempfile) # refactor this not to write files but save in a object #tmp_man <- tempfile() - info$Path <- NA_character_ + info$Path <- manifest_tempfile #write_csv(manifest, tmp_man) manifest_dfs[[id]] <<- manifest manifest_info <<- append(manifest_info, list(unlist(info))) @@ -71,7 +73,6 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= } } - } }) manifest_info <- bind_rows(manifest_info) @@ -104,8 +105,8 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= # extract manifest essential information for dashboard manifest_path <- info$Path # See above - don't read from file, read from object - #manifest_df <- data.table::fread(manifest_path) - manifest_df <- manifest_dfs[[i]] + manifest_df <- readr::read_csv(manifest_path) + #manifest_df <- manifest_dfs[[i]] # keep all manifests used for validation, even if it has invalid component value # if manifest doesn't have "Component" column, or empty, return NA for component manifest_component <- ifelse("Component" %in% colnames(manifest_df) & nrow(manifest_df) > 0, @@ -150,7 +151,6 @@ validate_metadata <- function(metadata, project.scope, schematic_api, schema_url if (nrow(metadata) == 0) { return(metadata) } - lapply(1:nrow(metadata), function(i) { manifest <- metadata[i, ] if (is.na(manifest$Component)) { @@ -179,7 +179,7 @@ validate_metadata <- function(metadata, project.scope, schematic_api, schema_url data_type=manifest$Component, schema_url = schema_url, access_token = access_token, - json_str = jsonlite::toJSON(manifest$manifest[[1]])) + file_name = manifest$Path) ) # clean validation res from schematicpy clean_res <- validationResult(validation_res, manifest$Component, dashboard = TRUE) From a49c88546ed3766a641525d6954136bbe9cb2cb1 Mon Sep 17 00:00:00 2001 From: afwillia Date: Fri, 9 Feb 2024 10:54:19 -0800 Subject: [PATCH 13/72] Remove commented code --- R/schematic_rest_api.R | 42 +++------------------------------- functions/schematic_rest_api.R | 42 +++------------------------------- 2 files changed, 6 insertions(+), 78 deletions(-) diff --git a/R/schematic_rest_api.R b/R/schematic_rest_api.R index a3996b43..7e31e818 100644 --- a/R/schematic_rest_api.R +++ b/R/schematic_rest_api.R @@ -152,22 +152,6 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", asset_view = asset_view)), body=list(file_name=httr::upload_file(file_name)) ) - # req <- httr2::request(url) |> - # httr2::req_method("POST") |> - # httr2::req_error(is_error = \(resp) httr2::resp_status(resp) == 510) - # resp <- req |> - # httr2::req_headers( - # Authorization = sprintf("Bearer %s", access_token) - # ) |> - # httr2::req_url_query( - # schema_url=schema_url, - # data_type=data_type, - # restrict_rules=restrict_rules, - # project_scope = project_scope, - # asset_view = asset_view - # ) |> - # httr2::req_body_file(file_name) |> - # httr2::req_perform() } else { req <- httr::POST(url, httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), @@ -179,27 +163,9 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", asset_view = asset_view, json_str = json_str)) ) - # req <- httr2::request(url) |> - # httr2::req_method("POST") |> - # httr2::req_error(is_error = \(resp) httr2::resp_status(resp) == 510) - # resp <- req |> - # httr2::req_headers( - # Authorization = sprintf("Bearer %s", access_token) - # ) |> - # httr2::req_url_query( - # schema_url=schema_url, - # data_type=data_type, - # restrict_rules=restrict_rules, - # project_scope = project_scope, - # asset_view = asset_view, - # json_str = json_str - # ) |> - # httr2::req_perform() - } # Format server error in a way validationResult can handle - #if (httr2::resp_is_error(resp)) { if (httr::http_error(req)) { return( list( @@ -214,11 +180,9 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", ) ) } - #httr2::resp_body_json(resp) - httr::content(req) - # check_success(req) - #annotation_status <- httr::content(req) - #annotation_status + check_success(req) + annotation_status <- httr::content(req) + annotation_status } diff --git a/functions/schematic_rest_api.R b/functions/schematic_rest_api.R index a3996b43..7e31e818 100644 --- a/functions/schematic_rest_api.R +++ b/functions/schematic_rest_api.R @@ -152,22 +152,6 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", asset_view = asset_view)), body=list(file_name=httr::upload_file(file_name)) ) - # req <- httr2::request(url) |> - # httr2::req_method("POST") |> - # httr2::req_error(is_error = \(resp) httr2::resp_status(resp) == 510) - # resp <- req |> - # httr2::req_headers( - # Authorization = sprintf("Bearer %s", access_token) - # ) |> - # httr2::req_url_query( - # schema_url=schema_url, - # data_type=data_type, - # restrict_rules=restrict_rules, - # project_scope = project_scope, - # asset_view = asset_view - # ) |> - # httr2::req_body_file(file_name) |> - # httr2::req_perform() } else { req <- httr::POST(url, httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), @@ -179,27 +163,9 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", asset_view = asset_view, json_str = json_str)) ) - # req <- httr2::request(url) |> - # httr2::req_method("POST") |> - # httr2::req_error(is_error = \(resp) httr2::resp_status(resp) == 510) - # resp <- req |> - # httr2::req_headers( - # Authorization = sprintf("Bearer %s", access_token) - # ) |> - # httr2::req_url_query( - # schema_url=schema_url, - # data_type=data_type, - # restrict_rules=restrict_rules, - # project_scope = project_scope, - # asset_view = asset_view, - # json_str = json_str - # ) |> - # httr2::req_perform() - } # Format server error in a way validationResult can handle - #if (httr2::resp_is_error(resp)) { if (httr::http_error(req)) { return( list( @@ -214,11 +180,9 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", ) ) } - #httr2::resp_body_json(resp) - httr::content(req) - # check_success(req) - #annotation_status <- httr::content(req) - #annotation_status + check_success(req) + annotation_status <- httr::content(req) + annotation_status } From 2d96ba3d89d768433de77187a6ae7de4aebc1528 Mon Sep 17 00:00:00 2001 From: afwillia Date: Mon, 12 Feb 2024 08:37:43 -0800 Subject: [PATCH 14/72] Hide dashboard by default and show if use_compliance_dashboard env var is TRUE. --- server.R | 4 ++++ ui.R | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/server.R b/server.R index 9b6451b4..a06b32f7 100644 --- a/server.R +++ b/server.R @@ -194,6 +194,10 @@ shinyServer(function(input, output, session) { sass_file("www/scss/main.scss"))) }) + if (isTRUE(dcc_config_react()$dca$use_compliance_dashboard)) { + shinyjs::show("dashboard-toggle-btn-container") + } + dcWaiter("hide") dcWaiter("show", msg = paste0("Getting data. This may take a minute."), color = primary_col()) diff --git a/ui.R b/ui.R index 1c775ada..d7194580 100644 --- a/ui.R +++ b/ui.R @@ -207,7 +207,7 @@ ui <- shinydashboardPlus::dashboardPage( class = "btn-primary-color" ) ), - dashboardUI("dashboard") + shinyjs::hidden(dashboardUI("dashboard")) ), ), tabItem( From 4f7370da832798477d3cf96b1475e993318f7319 Mon Sep 17 00:00:00 2001 From: afwillia Date: Tue, 13 Feb 2024 12:26:58 -0800 Subject: [PATCH 15/72] Add a js message to enable dashboard based on dcc config. --- server.R | 10 +++++----- ui.R | 8 ++++++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/server.R b/server.R index a06b32f7..5a5bd539 100644 --- a/server.R +++ b/server.R @@ -193,10 +193,6 @@ shinyServer(function(input, output, session) { sidebar_col=dcc_config_react()$dca$sidebar_col, sass_file("www/scss/main.scss"))) }) - - if (isTRUE(dcc_config_react()$dca$use_compliance_dashboard)) { - shinyjs::show("dashboard-toggle-btn-container") - } dcWaiter("hide") dcWaiter("show", msg = paste0("Getting data. This may take a minute."), @@ -304,6 +300,10 @@ shinyServer(function(input, output, session) { shinyjs::hide(select = "li:nth-child(4)") shinyjs::hide(select = "li:nth-child(5)") shinyjs::hide(select = "li:nth-child(6)") + session$sendCustomMessage( + "compliance_dashboard", + dcc_config_react()$dca$use_compliance_dashboard + ) dcWaiter("hide") } @@ -486,7 +486,7 @@ shinyServer(function(input, output, session) { updateSelectInput(session, "header_dropdown_folder", choices = selected$folder()) }) - + observeEvent(data_list$files(), ignoreInit = TRUE, { warn_text <- NULL if (length(data_list$folders()) == 0) { diff --git a/ui.R b/ui.R index d7194580..e62af869 100644 --- a/ui.R +++ b/ui.R @@ -119,7 +119,11 @@ ui <- shinydashboardPlus::dashboardPage( tags$head( tags$style(sass(sass_file("www/scss/main.scss"))), singleton(includeScript("www/js/readCookie.js")), - tags$script(htmlwidgets::JS("setTimeout(function(){history.pushState({}, 'Data Curator', window.location.pathname);},2000);")) + tags$script(htmlwidgets::JS("setTimeout(function(){history.pushState({}, 'Data Curator', window.location.pathname);},2000);"), + "Shiny.addCustomMessageHandler('compliance_dashboard', function(x) { + Shiny.setInputValue('compliance_dashboard', x); + }); + ") ), uiOutput("sass"), # load dependencies @@ -207,7 +211,7 @@ ui <- shinydashboardPlus::dashboardPage( class = "btn-primary-color" ) ), - shinyjs::hidden(dashboardUI("dashboard")) + conditionalPanel("input.compliance_dashboard", dashboardUI("dashboard")) ), ), tabItem( From 05f103e489cc93c7be349dcfdfded97faade6779 Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 14 Feb 2024 09:07:41 -0800 Subject: [PATCH 16/72] update rlang --- renv.lock | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/renv.lock b/renv.lock index 465387e6..4a81c6f1 100644 --- a/renv.lock +++ b/renv.lock @@ -942,14 +942,8 @@ }, "rlang": { "Package": "rlang", - "Version": "1.0.6", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "utils" - ], - "Hash": "4ed1f8336c8d52c3e750adcdc57228a7" + "Version": "1.1.3", + "Source": "Repository" }, "rmarkdown": { "Package": "rmarkdown", From 9c48feaf16ed1aa84d2ab3fb16c819aa364b2bb5 Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 14 Feb 2024 09:08:59 -0800 Subject: [PATCH 17/72] use httr2 to perform syn get with retries --- R/synapse_rest_api.R | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/R/synapse_rest_api.R b/R/synapse_rest_api.R index 54da3cdb..f65e6001 100644 --- a/R/synapse_rest_api.R +++ b/R/synapse_rest_api.R @@ -54,21 +54,17 @@ synapse_is_certified <- function(url="https://repo-prod.prod.sagebase.org/repo/v #' @param auth Synapse PAT #' #' @export -synapse_get <- function(url = "https://repo-prod.prod.sagebase.org/repo/v1/entity/", +synapse_get <- function(url = "https://repo-prod.prod.sagebase.org/repo/v1/entity", id, auth) { if (is.null(id)) stop("id cannot be NULL") - req_url <- file.path(url, id) - req <- httr::GET(req_url, - httr::add_headers(Authorization=paste0("Bearer ", auth))) - - # Send error if unsuccessful query - status <- httr::http_status(req) - if (status$category != "Success") stop(status$message) - - cont <- httr::content(req) - dplyr::bind_rows(cont) - + req <- httr2::request(file.path(url, id)) + resp <- req |> + httr2::req_retry() |> + httr2::req_throttle(rate = 1) |> + httr2::req_headers(Authorization = sprintf("Bearer %s", auth)) |> + httr2::req_perform() + resp |> httr2::resp_body_json() } From 6f6bdf26a983e9a7b825beeecfa8c8675f7d12e6 Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 14 Feb 2024 09:09:39 -0800 Subject: [PATCH 18/72] use httr2 to perform manifest download with retries --- R/schematic_rest_api.R | 31 ++++++++++++------------------- functions/schematic_rest_api.R | 31 ++++++++++++------------------- 2 files changed, 24 insertions(+), 38 deletions(-) diff --git a/R/schematic_rest_api.R b/R/schematic_rest_api.R index 7e31e818..66817a4e 100644 --- a/R/schematic_rest_api.R +++ b/R/schematic_rest_api.R @@ -19,28 +19,21 @@ check_success <- function(x){ #' @returns a csv of the manifest #' @export manifest_download <- function(url = "http://localhost:3001/v1/manifest/download", access_token, manifest_id, as_json=TRUE, new_manifest_name=NULL) { - request <- httr::GET( - url = url, - httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), - query = list( + + req <- httr2::request(url) + resp <- req |> + httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> + httr2::req_url_query( manifest_id = manifest_id, as_json = as_json, new_manifest_name = new_manifest_name - ) - ) - - check_success(request) - response <- httr::content(request, type = "text", encoding = "UTF-8") - response <- fromJSON(gsub('NaN', '"NA"', response)) - - # Output can have many NULL values which get dropped or cause errors. Set them to NA - # nullToNA <- function(x) { - # x[sapply(x, is.null)] <- NA - # return(x) - # } - # df <- do.call(rbind, lapply(response, rbind)) - # nullToNA(df) - response + ) |> + httr2::req_retry() |> + httr2::req_throttle(rate = 1) |> + httr2::req_perform() + resp |> httr2::resp_body_string() |> + gsub('NaN', '"NA"', x = _) |> + jsonlite::fromJSON() } #' schematic rest api to generate manifest diff --git a/functions/schematic_rest_api.R b/functions/schematic_rest_api.R index 7e31e818..66817a4e 100644 --- a/functions/schematic_rest_api.R +++ b/functions/schematic_rest_api.R @@ -19,28 +19,21 @@ check_success <- function(x){ #' @returns a csv of the manifest #' @export manifest_download <- function(url = "http://localhost:3001/v1/manifest/download", access_token, manifest_id, as_json=TRUE, new_manifest_name=NULL) { - request <- httr::GET( - url = url, - httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), - query = list( + + req <- httr2::request(url) + resp <- req |> + httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> + httr2::req_url_query( manifest_id = manifest_id, as_json = as_json, new_manifest_name = new_manifest_name - ) - ) - - check_success(request) - response <- httr::content(request, type = "text", encoding = "UTF-8") - response <- fromJSON(gsub('NaN', '"NA"', response)) - - # Output can have many NULL values which get dropped or cause errors. Set them to NA - # nullToNA <- function(x) { - # x[sapply(x, is.null)] <- NA - # return(x) - # } - # df <- do.call(rbind, lapply(response, rbind)) - # nullToNA(df) - response + ) |> + httr2::req_retry() |> + httr2::req_throttle(rate = 1) |> + httr2::req_perform() + resp |> httr2::resp_body_string() |> + gsub('NaN', '"NA"', x = _) |> + jsonlite::fromJSON() } #' schematic rest api to generate manifest From 549da9adcd30ff158f6e707fe42b502f126331dc Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 14 Feb 2024 09:10:51 -0800 Subject: [PATCH 19/72] for parallel processing, use available cores minus 1 --- global.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global.R b/global.R index 846a01cb..5a1b4bfa 100644 --- a/global.R +++ b/global.R @@ -27,7 +27,7 @@ suppressPackageStartupMessages({ }) # Set up futures/promises for asynchronous calls -ncores <- availableCores() +ncores <- availableCores() - 1 message(sprintf("Available cores: %s", ncores)) plan(multicore, workers = ncores) From 715a28f7caf28e64be63b035f10f667bf1ea3aab Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 14 Feb 2024 09:18:35 -0800 Subject: [PATCH 20/72] download manifests in parallel --- functions/dashboardFuns.R | 63 ++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/functions/dashboardFuns.R b/functions/dashboardFuns.R index 709123ff..f0a1dda7 100644 --- a/functions/dashboardFuns.R +++ b/functions/dashboardFuns.R @@ -39,41 +39,44 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= ) cols <- setNames(rep("", length(cols)), cols) metadata <- bind_rows(cols)[0, ] - lapply(file_view$parentId, function(dataset) { + metadata_list <- parallel::mclapply(file_view$parentId, function(dataset) { # get manifest's synapse id(s) in each dataset folder manifest_ids <- file_view$id[file_view$parentId == dataset] # in case, multiple manifests exist in the same dataset - for (id in manifest_ids) { - if (schematic_api == "reticulate"){ - info <- syn$get(id) - manifest_info <<- append(manifest_info, info) - user <- syn$getUserProfile(info["properties"]["modifiedBy"])["userName"] - modified_user <<- append(modified_user, user) - } else if (schematic_api == "rest"){ - info <- synapse_get(id = id, auth = access_token) - manifest <- manifest_download( - url = file.path(api_uri, "v1/manifest/download"), - access_token = access_token, - manifest_id = info$id, - as_json = TRUE - ) - manifest_tempfile <- tempfile( - pattern = id, fileext = ".csv" - ) - readr::write_csv(manifest, manifest_tempfile) - - # refactor this not to write files but save in a object - #tmp_man <- tempfile() - info$Path <- manifest_tempfile - #write_csv(manifest, tmp_man) - manifest_dfs[[id]] <<- manifest - manifest_info <<- append(manifest_info, list(unlist(info))) - user <- synapse_user_profile(auth=access_token)[["userName"]] - modified_user <<- append(modified_user, user) - } + manifests <- parallel::mclapply(manifest_ids, function(id) { + if (schematic_api == "reticulate"){ + info <- syn$get(id) + manifest_info <<- append(manifest_info, info) + user <- syn$getUserProfile(info["properties"]["modifiedBy"])["userName"] + modified_user <<- append(modified_user, user) + } else if (schematic_api == "rest"){ + info <- synapse_get(id = id, auth = access_token) + manifest <- manifest_download( + url = file.path(api_uri, "v1/manifest/download"), + access_token = access_token, + manifest_id = info$id, + as_json = TRUE + ) + manifest_tempfile <- tempfile( + pattern = id, fileext = ".csv" + ) + readr::write_csv(manifest, manifest_tempfile) + # refactor this not to write files but save in a object + info$Path <- manifest_tempfile + list( + manifest_df = manifest, + manifest_info = info, + modified_user = info$modifiedBy + ) } - }) + }, mc.cores = ncores) + manifests + }, mc.cores = ncores) + + manifest_dfs <- lapply(seq_along(metadata_list), function(x) metadata_list[[x]][[1]]$manifest_df) + manifest_info <- lapply(seq_along(metadata_list), function(x) metadata_list[[x]][[1]]$manifest_info) + modified_user <- lapply(seq_along(metadata_list), function(x) metadata_list[[x]][[1]]$modified_user) manifest_info <- bind_rows(manifest_info) manifest_info <- unique(manifest_info) From 75a003f7d2a0edd2664d2439f78144e1e326b8a7 Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 14 Feb 2024 10:01:24 -0800 Subject: [PATCH 21/72] add max retries to syn get and remove throttle --- R/synapse_rest_api.R | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/R/synapse_rest_api.R b/R/synapse_rest_api.R index f65e6001..e5956e62 100644 --- a/R/synapse_rest_api.R +++ b/R/synapse_rest_api.R @@ -60,8 +60,10 @@ synapse_get <- function(url = "https://repo-prod.prod.sagebase.org/repo/v1/entit if (is.null(id)) stop("id cannot be NULL") req <- httr2::request(file.path(url, id)) resp <- req |> - httr2::req_retry() |> - httr2::req_throttle(rate = 1) |> + httr2::req_retry( + max_tries = 5, + is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503) + ) |> httr2::req_headers(Authorization = sprintf("Bearer %s", auth)) |> httr2::req_perform() resp |> httr2::resp_body_json() @@ -274,6 +276,6 @@ synapse_download_file_handle <- function(dataFileHandleId, id, auth, filepath=NU download_url <- httr::content(request) destfile <- ifelse(is.null(filepath), tempfile(), filepath) download.file(download_url, destfile) - if (is.null(filepath)) readr::read_csv(destfile) + if (is.null(filepath)) readr::read_csv(destfile, show_col_types = FALSE) } From cb88371575ae5d4367235ce5d8519f1e29cc55c3 Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 14 Feb 2024 10:01:40 -0800 Subject: [PATCH 22/72] add max retries to manifest download and remove throttle --- R/schematic_rest_api.R | 8 +++++--- functions/schematic_rest_api.R | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/R/schematic_rest_api.R b/R/schematic_rest_api.R index 66817a4e..6a58c426 100644 --- a/R/schematic_rest_api.R +++ b/R/schematic_rest_api.R @@ -28,8 +28,10 @@ manifest_download <- function(url = "http://localhost:3001/v1/manifest/download" as_json = as_json, new_manifest_name = new_manifest_name ) |> - httr2::req_retry() |> - httr2::req_throttle(rate = 1) |> + httr2::req_retry( + max_tries = 3, + is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503) + ) |> httr2::req_perform() resp |> httr2::resp_body_string() |> gsub('NaN', '"NA"', x = _) |> @@ -343,7 +345,7 @@ get_asset_view_table <- function(url="http://localhost:3001/v1/storage/assets/ta if (return_type=="json") { return(list2DF(fromJSON(httr::content(req)))) } else { - csv <- readr::read_csv(httr::content(req)) + csv <- readr::read_csv(httr::content(req), show_col_types = FALSE) return(csv) } diff --git a/functions/schematic_rest_api.R b/functions/schematic_rest_api.R index 66817a4e..6a58c426 100644 --- a/functions/schematic_rest_api.R +++ b/functions/schematic_rest_api.R @@ -28,8 +28,10 @@ manifest_download <- function(url = "http://localhost:3001/v1/manifest/download" as_json = as_json, new_manifest_name = new_manifest_name ) |> - httr2::req_retry() |> - httr2::req_throttle(rate = 1) |> + httr2::req_retry( + max_tries = 3, + is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503) + ) |> httr2::req_perform() resp |> httr2::resp_body_string() |> gsub('NaN', '"NA"', x = _) |> @@ -343,7 +345,7 @@ get_asset_view_table <- function(url="http://localhost:3001/v1/storage/assets/ta if (return_type=="json") { return(list2DF(fromJSON(httr::content(req)))) } else { - csv <- readr::read_csv(httr::content(req)) + csv <- readr::read_csv(httr::content(req), show_col_types = FALSE) return(csv) } From f45897185ae0325cbd1a3b2a0d20b8bbd5698347 Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 14 Feb 2024 10:02:10 -0800 Subject: [PATCH 23/72] run dashboard validation in parallel --- functions/dashboardFuns.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/functions/dashboardFuns.R b/functions/dashboardFuns.R index f0a1dda7..4635c05c 100644 --- a/functions/dashboardFuns.R +++ b/functions/dashboardFuns.R @@ -154,7 +154,7 @@ validate_metadata <- function(metadata, project.scope, schematic_api, schema_url if (nrow(metadata) == 0) { return(metadata) } - lapply(1:nrow(metadata), function(i) { + parallel::mclapply(1:nrow(metadata), function(i) { manifest <- metadata[i, ] if (is.na(manifest$Component)) { data.frame( @@ -195,7 +195,7 @@ validate_metadata <- function(metadata, project.scope, schematic_api, schema_url WarnMsg = if_else(is.null(clean_res$warning_msg[1]), "Valid", paste(clean_res$warning_msg[1], collapse = "; ")) ) } - }) %>% + }, mc.cores = ncores) %>% bind_rows() %>% cbind(metadata, .) # expand metadata with validation results } From 9cbb92fa452bfaa1839969bc57a3d79b36bb7544 Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 14 Feb 2024 10:08:32 -0800 Subject: [PATCH 24/72] suppress column type message when reading manifests in dashboard --- functions/dashboardFuns.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/dashboardFuns.R b/functions/dashboardFuns.R index 4635c05c..467de970 100644 --- a/functions/dashboardFuns.R +++ b/functions/dashboardFuns.R @@ -108,7 +108,7 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= # extract manifest essential information for dashboard manifest_path <- info$Path # See above - don't read from file, read from object - manifest_df <- readr::read_csv(manifest_path) + manifest_df <- readr::read_csv(manifest_path, show_col_types = FALSE) #manifest_df <- manifest_dfs[[i]] # keep all manifests used for validation, even if it has invalid component value # if manifest doesn't have "Component" column, or empty, return NA for component From da6bcbfc277d0ace8839351c16621d95112efb65 Mon Sep 17 00:00:00 2001 From: afwillia Date: Thu, 15 Feb 2024 09:31:37 -0800 Subject: [PATCH 25/72] Use httr2 for schematic validate and model component endpoints --- R/schematic_rest_api.R | 89 ++++++++++++++++++---------------- functions/schematic_rest_api.R | 89 ++++++++++++++++++---------------- 2 files changed, 96 insertions(+), 82 deletions(-) diff --git a/R/schematic_rest_api.R b/R/schematic_rest_api.R index 6a58c426..e999f6e8 100644 --- a/R/schematic_rest_api.R +++ b/R/schematic_rest_api.R @@ -137,47 +137,59 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", } if (is.null(json_str)) { - req <- httr::POST(url, - httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), - query=flattenbody(list( - schema_url=schema_url, - data_type=data_type, - restrict_rules=restrict_rules, - project_scope = project_scope, - asset_view = asset_view)), - body=list(file_name=httr::upload_file(file_name)) - ) + req <- httr2::request(url) + resp <- req %>% + httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> + httr2::req_url_query( + schema_url=schema_url, + data_type=data_type, + restrict_rules=restrict_rules, + project_scope = project_scope, + asset_view = asset_view + ) |> + httr2::req_body_multipart(file_name=curl::form_file(file_name)) |> + httr2::req_retry( + max_tries = 3, + is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503) + ) |> + httr2::req_error(is_error = \(resp) FALSE) |> + httr2::req_perform() } else { - req <- httr::POST(url, - httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), - query=flattenbody(list( - schema_url=schema_url, - data_type=data_type, - restrict_rules=restrict_rules, - project_scope = project_scope, - asset_view = asset_view, - json_str = json_str)) - ) + req <- httr2::request(url) + resp <- req %>% + httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> + httr2::req_url_query( + schema_url=schema_url, + data_type=data_type, + restrict_rules=restrict_rules, + project_scope = project_scope, + asset_view = asset_view, + json_str = json_str + ) |> + httr2::req_retry( + max_tries = 3, + is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503) + ) |> + httr2::req_error(is_error = \(resp) FALSE) |> + httr2::req_perform() } # Format server error in a way validationResult can handle - if (httr::http_error(req)) { + if (httr2::resp_is_error(resp)) { return( list( list( "errors" = list( Row = NA, Column = NA, Value = NA, Error = sprintf("Cannot validate manifest: %s", - httr::http_status(req)$message + httr2::resp_status_desc(resp) ) ) ) ) ) } - check_success(req) - annotation_status <- httr::content(req) - annotation_status + httr2::resp_body_json(resp) } @@ -231,22 +243,17 @@ model_component_requirements <- function(url="http://localhost:3001/v1/model/com schema_url, source_component, as_graph = FALSE) { - req <- httr::GET(url, - query = list( - schema_url = schema_url, - source_component = source_component, - as_graph = as_graph - )) - - check_success(req) - cont <- httr::content(req) - - if (inherits(cont, "xml_document")){ - err_msg <- xml2::xml_text(xml2::xml_child(cont, "head/title")) - stop(sprintf("%s", err_msg)) - } - - cont + req <- httr2::request(url) + resp <- req |> + httr2::req_url_query( + schema_url = schema_url, + source_component = source_component, + as_graph = as_graph + ) |> + httr2::req_retry(max_tries = 3) |> + httr2::req_perform() + resp |> + httr2::resp_body_json() } diff --git a/functions/schematic_rest_api.R b/functions/schematic_rest_api.R index 6a58c426..e999f6e8 100644 --- a/functions/schematic_rest_api.R +++ b/functions/schematic_rest_api.R @@ -137,47 +137,59 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", } if (is.null(json_str)) { - req <- httr::POST(url, - httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), - query=flattenbody(list( - schema_url=schema_url, - data_type=data_type, - restrict_rules=restrict_rules, - project_scope = project_scope, - asset_view = asset_view)), - body=list(file_name=httr::upload_file(file_name)) - ) + req <- httr2::request(url) + resp <- req %>% + httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> + httr2::req_url_query( + schema_url=schema_url, + data_type=data_type, + restrict_rules=restrict_rules, + project_scope = project_scope, + asset_view = asset_view + ) |> + httr2::req_body_multipart(file_name=curl::form_file(file_name)) |> + httr2::req_retry( + max_tries = 3, + is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503) + ) |> + httr2::req_error(is_error = \(resp) FALSE) |> + httr2::req_perform() } else { - req <- httr::POST(url, - httr::add_headers(Authorization = sprintf("Bearer %s", access_token)), - query=flattenbody(list( - schema_url=schema_url, - data_type=data_type, - restrict_rules=restrict_rules, - project_scope = project_scope, - asset_view = asset_view, - json_str = json_str)) - ) + req <- httr2::request(url) + resp <- req %>% + httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> + httr2::req_url_query( + schema_url=schema_url, + data_type=data_type, + restrict_rules=restrict_rules, + project_scope = project_scope, + asset_view = asset_view, + json_str = json_str + ) |> + httr2::req_retry( + max_tries = 3, + is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503) + ) |> + httr2::req_error(is_error = \(resp) FALSE) |> + httr2::req_perform() } # Format server error in a way validationResult can handle - if (httr::http_error(req)) { + if (httr2::resp_is_error(resp)) { return( list( list( "errors" = list( Row = NA, Column = NA, Value = NA, Error = sprintf("Cannot validate manifest: %s", - httr::http_status(req)$message + httr2::resp_status_desc(resp) ) ) ) ) ) } - check_success(req) - annotation_status <- httr::content(req) - annotation_status + httr2::resp_body_json(resp) } @@ -231,22 +243,17 @@ model_component_requirements <- function(url="http://localhost:3001/v1/model/com schema_url, source_component, as_graph = FALSE) { - req <- httr::GET(url, - query = list( - schema_url = schema_url, - source_component = source_component, - as_graph = as_graph - )) - - check_success(req) - cont <- httr::content(req) - - if (inherits(cont, "xml_document")){ - err_msg <- xml2::xml_text(xml2::xml_child(cont, "head/title")) - stop(sprintf("%s", err_msg)) - } - - cont + req <- httr2::request(url) + resp <- req |> + httr2::req_url_query( + schema_url = schema_url, + source_component = source_component, + as_graph = as_graph + ) |> + httr2::req_retry(max_tries = 3) |> + httr2::req_perform() + resp |> + httr2::resp_body_json() } From 2289448ac892f1b63a84aaf63bd5c2b5c99c1752 Mon Sep 17 00:00:00 2001 From: afwillia Date: Thu, 15 Feb 2024 09:33:32 -0800 Subject: [PATCH 26/72] Run dashboard validation in parallel --- functions/dashboardFuns.R | 63 +++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/functions/dashboardFuns.R b/functions/dashboardFuns.R index 467de970..32e2f9e4 100644 --- a/functions/dashboardFuns.R +++ b/functions/dashboardFuns.R @@ -154,7 +154,7 @@ validate_metadata <- function(metadata, project.scope, schematic_api, schema_url if (nrow(metadata) == 0) { return(metadata) } - parallel::mclapply(1:nrow(metadata), function(i) { + m2 <- parallel::mclapply(1:nrow(metadata), function(i) { manifest <- metadata[i, ] if (is.na(manifest$Component)) { data.frame( @@ -171,32 +171,45 @@ validate_metadata <- function(metadata, project.scope, schematic_api, schema_url WarnMsg = "'Component' is missing" ) } else { - validation_res <- switch(schematic_api, - reticulate = manifest_validate_py( - manifestPath = manifest$Path, - rootNode = manifest$Component, - restrict_rules = TRUE, # set true to disable great expectation - project_scope = project.scope - ), - rest = manifest_validate(url=file.path(api_uri, "v1/model/validate"), - data_type=manifest$Component, - schema_url = schema_url, - access_token = access_token, - file_name = manifest$Path) - ) - # clean validation res from schematicpy - clean_res <- validationResult(validation_res, manifest$Component, dashboard = TRUE) - - data.frame( - Result = clean_res$result, - # change wrong schema to out-of-date type - ErrorType = if_else(clean_res$error_type == "Wrong Schema", "Out of Date", clean_res$error_type), - errorMsg = if_else(is.null(clean_res$error_msg[1]), "Valid", paste(clean_res$error_msg[1], collapse="; ")), - WarnMsg = if_else(is.null(clean_res$warning_msg[1]), "Valid", paste(clean_res$warning_msg[1], collapse = "; ")) + validation_res <- tryCatch( + switch(schematic_api, + reticulate = manifest_validate_py( + manifestPath = manifest$Path, + rootNode = manifest$Component, + restrict_rules = TRUE, # set true to disable great expectation + project_scope = project.scope + ), + rest = manifest_validate(url=file.path(api_uri, "v1/model/validate"), + data_type=manifest$Component, + schema_url = schema_url, + access_token = access_token, + file_name = manifest$Path) + ), silent = TRUE ) + if (!inherits(validation_res, "try-error")) { + # clean validation res from schematicpy + clean_res <- validationResult(validation_res, manifest$Component, dashboard = TRUE) + + data.frame( + Result = clean_res$result, + # change wrong schema to out-of-date type + ErrorType = if_else(clean_res$error_type == "Wrong Schema", "Out of Date", clean_res$error_type), + errorMsg = if_else(is.null(clean_res$error_msg[1]), "Valid", paste(clean_res$error_msg[1], collapse="; ")), + WarnMsg = if_else(is.null(clean_res$warning_msg[1]), "Valid", paste(clean_res$warning_msg[1], collapse = "; ")) + ) + } else { + data.frame( + Result = "Fail", + # change wrong schema to out-of-date type + ErrorType = "Unknown Error", + errorMsg = "Server Error", + WarnMsg = " " + ) + } + } - }, mc.cores = ncores) %>% - bind_rows() %>% + }, mc.cores = ncores) + m2 <- bind_rows(m2) %>% cbind(metadata, .) # expand metadata with validation results } From a584e92a16879078126a4af97263462253218ab7 Mon Sep 17 00:00:00 2001 From: afwillia Date: Fri, 16 Feb 2024 09:36:20 -0800 Subject: [PATCH 27/72] Use anonymous function in pipe instead of _ to avoid R package build error --- R/schematic_rest_api.R | 6 +++--- functions/schematic_rest_api.R | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/R/schematic_rest_api.R b/R/schematic_rest_api.R index e999f6e8..d4025ffd 100644 --- a/R/schematic_rest_api.R +++ b/R/schematic_rest_api.R @@ -34,7 +34,7 @@ manifest_download <- function(url = "http://localhost:3001/v1/manifest/download" ) |> httr2::req_perform() resp |> httr2::resp_body_string() |> - gsub('NaN', '"NA"', x = _) |> + (function(d) gsub('NaN', '"NA"', x = d))() |> jsonlite::fromJSON() } @@ -150,7 +150,7 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", httr2::req_body_multipart(file_name=curl::form_file(file_name)) |> httr2::req_retry( max_tries = 3, - is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503) + is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503, 504) ) |> httr2::req_error(is_error = \(resp) FALSE) |> httr2::req_perform() @@ -168,7 +168,7 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", ) |> httr2::req_retry( max_tries = 3, - is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503) + is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503, 504) ) |> httr2::req_error(is_error = \(resp) FALSE) |> httr2::req_perform() diff --git a/functions/schematic_rest_api.R b/functions/schematic_rest_api.R index e999f6e8..d4025ffd 100644 --- a/functions/schematic_rest_api.R +++ b/functions/schematic_rest_api.R @@ -34,7 +34,7 @@ manifest_download <- function(url = "http://localhost:3001/v1/manifest/download" ) |> httr2::req_perform() resp |> httr2::resp_body_string() |> - gsub('NaN', '"NA"', x = _) |> + (function(d) gsub('NaN', '"NA"', x = d))() |> jsonlite::fromJSON() } @@ -150,7 +150,7 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", httr2::req_body_multipart(file_name=curl::form_file(file_name)) |> httr2::req_retry( max_tries = 3, - is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503) + is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503, 504) ) |> httr2::req_error(is_error = \(resp) FALSE) |> httr2::req_perform() @@ -168,7 +168,7 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", ) |> httr2::req_retry( max_tries = 3, - is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503) + is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503, 504) ) |> httr2::req_error(is_error = \(resp) FALSE) |> httr2::req_perform() From f0446dd0b1dae4539867597ce1794e8a0a8455f6 Mon Sep 17 00:00:00 2001 From: afwillia Date: Mon, 19 Feb 2024 09:23:28 -0800 Subject: [PATCH 28/72] Add test output to validate function --- R/schematic_rest_api.R | 41 ++++++++++++++++++++-------------- functions/schematic_rest_api.R | 41 ++++++++++++++++++++-------------- 2 files changed, 48 insertions(+), 34 deletions(-) diff --git a/R/schematic_rest_api.R b/R/schematic_rest_api.R index d4025ffd..570af6e8 100644 --- a/R/schematic_rest_api.R +++ b/R/schematic_rest_api.R @@ -112,7 +112,8 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", schema_url="https://raw.githubusercontent.com/ncihtan/data-models/main/HTAN.model.jsonld", #nolint data_type, file_name = NULL, restrict_rules=FALSE, project_scope = NULL, access_token, asset_view = NULL, json_str = NULL) { - + a <- paste0(sample(1000, 1), "-") + cat(paste0(a, "-validate func ", data_type, " ", file_name, "\n")) flattenbody <- function(x) { # A form/query can only have one value per name, so take # any values that contain vectors length >1 and @@ -137,8 +138,15 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", } if (is.null(json_str)) { - req <- httr2::request(url) - resp <- req %>% + reqs <- httr2::request(url) |> + httr2::req_retry( + max_tries = 3, + is_transient = \(reqs) httr2::resp_status(reqs) %in% c(429, 500, 503, 504) + ) |> + httr2::req_error(is_error = \(reqs) FALSE) |> + httr2::req_throttle(1) + cat(paste0(a, "-validate func requesting", unlist(reqs), "\n")) + resp <- reqs %>% httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> httr2::req_url_query( schema_url=schema_url, @@ -148,14 +156,11 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", asset_view = asset_view ) |> httr2::req_body_multipart(file_name=curl::form_file(file_name)) |> - httr2::req_retry( - max_tries = 3, - is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503, 504) - ) |> - httr2::req_error(is_error = \(resp) FALSE) |> httr2::req_perform() + cat(paste0(a, "-validate func response", unlist(resp), "\n")) } else { - req <- httr2::request(url) + req <- httr2::request(url) |> + httr2::req_throttle(1) resp <- req %>% httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> httr2::req_url_query( @@ -166,15 +171,16 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", asset_view = asset_view, json_str = json_str ) |> - httr2::req_retry( - max_tries = 3, - is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503, 504) - ) |> - httr2::req_error(is_error = \(resp) FALSE) |> + #httr2::req_retry( + # max_tries = 3, + # is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503, 504) + #) |> + #httr2::req_error(is_error = \(resp) FALSE) |> httr2::req_perform() } # Format server error in a way validationResult can handle + cat(a, "-validate func response", "\n") if (httr2::resp_is_error(resp)) { return( list( @@ -243,14 +249,15 @@ model_component_requirements <- function(url="http://localhost:3001/v1/model/com schema_url, source_component, as_graph = FALSE) { - req <- httr2::request(url) - resp <- req |> + reqs <- httr2::request(url) |> + httr2::req_throttle(1) + resp <- reqs |> httr2::req_url_query( schema_url = schema_url, source_component = source_component, as_graph = as_graph ) |> - httr2::req_retry(max_tries = 3) |> + #httr2::req_retry(max_tries = 3) |> httr2::req_perform() resp |> httr2::resp_body_json() diff --git a/functions/schematic_rest_api.R b/functions/schematic_rest_api.R index d4025ffd..570af6e8 100644 --- a/functions/schematic_rest_api.R +++ b/functions/schematic_rest_api.R @@ -112,7 +112,8 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", schema_url="https://raw.githubusercontent.com/ncihtan/data-models/main/HTAN.model.jsonld", #nolint data_type, file_name = NULL, restrict_rules=FALSE, project_scope = NULL, access_token, asset_view = NULL, json_str = NULL) { - + a <- paste0(sample(1000, 1), "-") + cat(paste0(a, "-validate func ", data_type, " ", file_name, "\n")) flattenbody <- function(x) { # A form/query can only have one value per name, so take # any values that contain vectors length >1 and @@ -137,8 +138,15 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", } if (is.null(json_str)) { - req <- httr2::request(url) - resp <- req %>% + reqs <- httr2::request(url) |> + httr2::req_retry( + max_tries = 3, + is_transient = \(reqs) httr2::resp_status(reqs) %in% c(429, 500, 503, 504) + ) |> + httr2::req_error(is_error = \(reqs) FALSE) |> + httr2::req_throttle(1) + cat(paste0(a, "-validate func requesting", unlist(reqs), "\n")) + resp <- reqs %>% httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> httr2::req_url_query( schema_url=schema_url, @@ -148,14 +156,11 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", asset_view = asset_view ) |> httr2::req_body_multipart(file_name=curl::form_file(file_name)) |> - httr2::req_retry( - max_tries = 3, - is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503, 504) - ) |> - httr2::req_error(is_error = \(resp) FALSE) |> httr2::req_perform() + cat(paste0(a, "-validate func response", unlist(resp), "\n")) } else { - req <- httr2::request(url) + req <- httr2::request(url) |> + httr2::req_throttle(1) resp <- req %>% httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> httr2::req_url_query( @@ -166,15 +171,16 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", asset_view = asset_view, json_str = json_str ) |> - httr2::req_retry( - max_tries = 3, - is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503, 504) - ) |> - httr2::req_error(is_error = \(resp) FALSE) |> + #httr2::req_retry( + # max_tries = 3, + # is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503, 504) + #) |> + #httr2::req_error(is_error = \(resp) FALSE) |> httr2::req_perform() } # Format server error in a way validationResult can handle + cat(a, "-validate func response", "\n") if (httr2::resp_is_error(resp)) { return( list( @@ -243,14 +249,15 @@ model_component_requirements <- function(url="http://localhost:3001/v1/model/com schema_url, source_component, as_graph = FALSE) { - req <- httr2::request(url) - resp <- req |> + reqs <- httr2::request(url) |> + httr2::req_throttle(1) + resp <- reqs |> httr2::req_url_query( schema_url = schema_url, source_component = source_component, as_graph = as_graph ) |> - httr2::req_retry(max_tries = 3) |> + #httr2::req_retry(max_tries = 3) |> httr2::req_perform() resp |> httr2::resp_body_json() From 8cde1357e5eb82aea5186dee6ad608fc01a44ead Mon Sep 17 00:00:00 2001 From: afwillia Date: Mon, 19 Feb 2024 09:24:03 -0800 Subject: [PATCH 29/72] Hard code schematic endpoint in dashboard --- modules/dashboard/dashboard.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/dashboard/dashboard.R b/modules/dashboard/dashboard.R index d5c0cb15..387715ee 100644 --- a/modules/dashboard/dashboard.R +++ b/modules/dashboard/dashboard.R @@ -94,7 +94,7 @@ dashboard <- function(id, syn.store, project.scope, schema, schema.display.name, # get all datasets from selected project folder_list <- switch(schematic_api, - "rest" = storage_project_datasets(url=file.path(api_uri, "v1/storage/project/datasets"), + "rest" = storage_project_datasets(url=file.path("https://schematic-dev.api.sagebionetworks.org/v1/storage/project/datasets"), asset_view = fileview, project_id=folder, access_token=access_token), @@ -123,7 +123,7 @@ dashboard <- function(id, syn.store, project.scope, schema, schema.display.name, selected_datatype_requirement <- eventReactive(c(schema(), input$box$visible), { req(input$box$visible) get_schema_nodes(schema(), schematic_api = schematic_api, - url=file.path(api_uri, "v1/model/component-requirements"), + url=file.path("https://schematic-dev.api.sagebionetworks.org/v1/model/component-requirements"), schema_url = schema_url) }) @@ -134,7 +134,7 @@ dashboard <- function(id, syn.store, project.scope, schema, schema.display.name, # remove rows with invalid component name metadata <- uploaded_manifests() %>% filter(!is.na(Component), Component != "Unknown") get_metadata_nodes(metadata, ncores = ncores, schematic_api=schematic_api, - schema_url = schema_url, url = file.path(api_uri, "v1/model/component-requirements")) + schema_url = schema_url, url = file.path("https://schematic-dev.api.sagebionetworks.org/v1/model/component-requirements")) }) # render info/plots for selected datatype From 8a867faa81dc0f50f1b3cae52ce658aa54c23486 Mon Sep 17 00:00:00 2001 From: afwillia Date: Mon, 19 Feb 2024 09:24:46 -0800 Subject: [PATCH 30/72] Add messaging to validation function. Run serially. --- functions/dashboardFuns.R | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/functions/dashboardFuns.R b/functions/dashboardFuns.R index 32e2f9e4..83feed95 100644 --- a/functions/dashboardFuns.R +++ b/functions/dashboardFuns.R @@ -11,7 +11,7 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= # get data for all manifests within the specified datasets file_view <- switch(schematic_api, reticulate = syn.store$storageFileviewTable, - rest = get_asset_view_table(url = file.path(api_uri, "v1/storage/assets/tables"), + rest = get_asset_view_table(url = file.path("https://schematic-dev.api.sagebionetworks.org/v1/storage/assets/tables"), access_token = access_token, asset_view=fileview) ) %>% @@ -58,7 +58,7 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= as_json = TRUE ) manifest_tempfile <- tempfile( - pattern = id, fileext = ".csv" + pattern = paste0(id, Sys.getpid()), fileext = ".csv" ) readr::write_csv(manifest, manifest_tempfile) @@ -154,8 +154,9 @@ validate_metadata <- function(metadata, project.scope, schematic_api, schema_url if (nrow(metadata) == 0) { return(metadata) } - m2 <- parallel::mclapply(1:nrow(metadata), function(i) { + m2 <- lapply(1:nrow(metadata), function(i) { manifest <- metadata[i, ] + cat(paste0("validating ", manifest$Path, "\n")) if (is.na(manifest$Component)) { data.frame( Result = "invalid", @@ -171,7 +172,7 @@ validate_metadata <- function(metadata, project.scope, schematic_api, schema_url WarnMsg = "'Component' is missing" ) } else { - validation_res <- tryCatch( + validation_res <- switch(schematic_api, reticulate = manifest_validate_py( manifestPath = manifest$Path, @@ -179,17 +180,21 @@ validate_metadata <- function(metadata, project.scope, schematic_api, schema_url restrict_rules = TRUE, # set true to disable great expectation project_scope = project.scope ), - rest = manifest_validate(url=file.path(api_uri, "v1/model/validate"), + rest = manifest_validate(url=file.path("https://schematic-dev.api.sagebionetworks.org/v1/model/validate"), data_type=manifest$Component, schema_url = schema_url, access_token = access_token, file_name = manifest$Path) - ), silent = TRUE ) + cat(paste0(unlist(validation_res), "\n")) if (!inherits(validation_res, "try-error")) { # clean validation res from schematicpy clean_res <- validationResult(validation_res, manifest$Component, dashboard = TRUE) - + cat("iteration ", i, " : ", unlist(clean_res), "\n") + clean_res[which(sapply(clean_res, is.null))] <- NA + if (grepl("Cannot validate manifest", clean_res$error_msg[[1]])) { + clean_res <- bind_cols(clean_res) + } data.frame( Result = clean_res$result, # change wrong schema to out-of-date type @@ -208,7 +213,7 @@ validate_metadata <- function(metadata, project.scope, schematic_api, schema_url } } - }, mc.cores = ncores) + }, mc.cores = 1) m2 <- bind_rows(m2) %>% cbind(metadata, .) # expand metadata with validation results } @@ -234,7 +239,7 @@ get_schema_nodes <- function(schema, schematic_api, url, schema_url) { if (length(requirement) == 0) { # return data type itself without name - return(as.character(schema)) + return(schema=as.character(schema)) } else { # return a list of requirements of the data type return(list2Vector(requirement)) @@ -268,7 +273,6 @@ get_metadata_nodes <- function(metadata, ncores = 1, schematic_api, return(list()) } ) %>% list2Vector() - source <- as.character(nodes) target <- names(nodes) From bd6cafa76a1db747bdbdb2a79e3fb76f2364b1cb Mon Sep 17 00:00:00 2001 From: afwillia Date: Mon, 19 Feb 2024 10:51:11 -0800 Subject: [PATCH 31/72] add schematic and venv to Rbuildignore --- .Rbuildignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.Rbuildignore b/.Rbuildignore index dcae32c1..bf1de74f 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -1,3 +1,5 @@ ^\.pre-commit-config\.yaml$ ^renv$ ^renv\.lock$ +^.venv +^schematic$ \ No newline at end of file From c33b0c394b1a79d2c127cd83fa26e29205d81165 Mon Sep 17 00:00:00 2001 From: afwillia Date: Mon, 19 Feb 2024 11:02:57 -0800 Subject: [PATCH 32/72] remove debugging messages from manifest_validate --- R/schematic_rest_api.R | 4 ---- functions/schematic_rest_api.R | 4 ---- 2 files changed, 8 deletions(-) diff --git a/R/schematic_rest_api.R b/R/schematic_rest_api.R index 570af6e8..3200ddd5 100644 --- a/R/schematic_rest_api.R +++ b/R/schematic_rest_api.R @@ -113,7 +113,6 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", data_type, file_name = NULL, restrict_rules=FALSE, project_scope = NULL, access_token, asset_view = NULL, json_str = NULL) { a <- paste0(sample(1000, 1), "-") - cat(paste0(a, "-validate func ", data_type, " ", file_name, "\n")) flattenbody <- function(x) { # A form/query can only have one value per name, so take # any values that contain vectors length >1 and @@ -145,7 +144,6 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", ) |> httr2::req_error(is_error = \(reqs) FALSE) |> httr2::req_throttle(1) - cat(paste0(a, "-validate func requesting", unlist(reqs), "\n")) resp <- reqs %>% httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> httr2::req_url_query( @@ -157,7 +155,6 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", ) |> httr2::req_body_multipart(file_name=curl::form_file(file_name)) |> httr2::req_perform() - cat(paste0(a, "-validate func response", unlist(resp), "\n")) } else { req <- httr2::request(url) |> httr2::req_throttle(1) @@ -180,7 +177,6 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", } # Format server error in a way validationResult can handle - cat(a, "-validate func response", "\n") if (httr2::resp_is_error(resp)) { return( list( diff --git a/functions/schematic_rest_api.R b/functions/schematic_rest_api.R index 570af6e8..3200ddd5 100644 --- a/functions/schematic_rest_api.R +++ b/functions/schematic_rest_api.R @@ -113,7 +113,6 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", data_type, file_name = NULL, restrict_rules=FALSE, project_scope = NULL, access_token, asset_view = NULL, json_str = NULL) { a <- paste0(sample(1000, 1), "-") - cat(paste0(a, "-validate func ", data_type, " ", file_name, "\n")) flattenbody <- function(x) { # A form/query can only have one value per name, so take # any values that contain vectors length >1 and @@ -145,7 +144,6 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", ) |> httr2::req_error(is_error = \(reqs) FALSE) |> httr2::req_throttle(1) - cat(paste0(a, "-validate func requesting", unlist(reqs), "\n")) resp <- reqs %>% httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> httr2::req_url_query( @@ -157,7 +155,6 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", ) |> httr2::req_body_multipart(file_name=curl::form_file(file_name)) |> httr2::req_perform() - cat(paste0(a, "-validate func response", unlist(resp), "\n")) } else { req <- httr2::request(url) |> httr2::req_throttle(1) @@ -180,7 +177,6 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", } # Format server error in a way validationResult can handle - cat(a, "-validate func response", "\n") if (httr2::resp_is_error(resp)) { return( list( From 1083faa7521c3725edf3ce35fec7f31fb50e19fd Mon Sep 17 00:00:00 2001 From: afwillia Date: Mon, 19 Feb 2024 11:03:07 -0800 Subject: [PATCH 33/72] Add httr2 to renv.lock --- renv.lock | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/renv.lock b/renv.lock index 4a81c6f1..0ea6f44b 100644 --- a/renv.lock +++ b/renv.lock @@ -555,6 +555,11 @@ ], "Hash": "f6844033201269bec3ca0097bc6c97b3" }, + "httr2": { + "Package": "httr2", + "Version": "1.0.0", + "Source": "Repository" + }, "igraph": { "Package": "igraph", "Version": "1.4.1", From 64fd3a4177b8d48c8be2f706e0064c31318ed32f Mon Sep 17 00:00:00 2001 From: afwillia Date: Mon, 19 Feb 2024 11:03:20 -0800 Subject: [PATCH 34/72] Use mclapply with 1 core for validate --- functions/dashboardFuns.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/dashboardFuns.R b/functions/dashboardFuns.R index 83feed95..7221decc 100644 --- a/functions/dashboardFuns.R +++ b/functions/dashboardFuns.R @@ -154,7 +154,7 @@ validate_metadata <- function(metadata, project.scope, schematic_api, schema_url if (nrow(metadata) == 0) { return(metadata) } - m2 <- lapply(1:nrow(metadata), function(i) { + m2 <- parallel::mclapply(1:nrow(metadata), function(i) { manifest <- metadata[i, ] cat(paste0("validating ", manifest$Path, "\n")) if (is.na(manifest$Component)) { From a98cb4787fe1c971c468200c0616a2cd521083ff Mon Sep 17 00:00:00 2001 From: afwillia Date: Tue, 20 Feb 2024 07:36:28 -0800 Subject: [PATCH 35/72] Remove cat() debugging statements in dashboard --- functions/dashboardFuns.R | 3 --- 1 file changed, 3 deletions(-) diff --git a/functions/dashboardFuns.R b/functions/dashboardFuns.R index 7221decc..be6c6c5d 100644 --- a/functions/dashboardFuns.R +++ b/functions/dashboardFuns.R @@ -156,7 +156,6 @@ validate_metadata <- function(metadata, project.scope, schematic_api, schema_url } m2 <- parallel::mclapply(1:nrow(metadata), function(i) { manifest <- metadata[i, ] - cat(paste0("validating ", manifest$Path, "\n")) if (is.na(manifest$Component)) { data.frame( Result = "invalid", @@ -186,11 +185,9 @@ validate_metadata <- function(metadata, project.scope, schematic_api, schema_url access_token = access_token, file_name = manifest$Path) ) - cat(paste0(unlist(validation_res), "\n")) if (!inherits(validation_res, "try-error")) { # clean validation res from schematicpy clean_res <- validationResult(validation_res, manifest$Component, dashboard = TRUE) - cat("iteration ", i, " : ", unlist(clean_res), "\n") clean_res[which(sapply(clean_res, is.null))] <- NA if (grepl("Cannot validate manifest", clean_res$error_msg[[1]])) { clean_res <- bind_cols(clean_res) From a654407d41a11432953f7b3683a299fc7a6d69e7 Mon Sep 17 00:00:00 2001 From: afwillia Date: Tue, 20 Feb 2024 07:44:51 -0800 Subject: [PATCH 36/72] Use shiny-base release-1.9 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 454198a0..e444fe18 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ghcr.io/afwillia/shiny-base:release-1.8 +FROM ghcr.io/afwillia/shiny-base:release-1.9 # add version tag as a build argument ARG DCA_VERSION From a535183a5bf6e7fa4d651846dda7de80eceb1447 Mon Sep 17 00:00:00 2001 From: afwillia Date: Tue, 20 Feb 2024 08:37:18 -0800 Subject: [PATCH 37/72] Don't run dashboard in parallel --- functions/dashboardFuns.R | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/functions/dashboardFuns.R b/functions/dashboardFuns.R index be6c6c5d..3171c9aa 100644 --- a/functions/dashboardFuns.R +++ b/functions/dashboardFuns.R @@ -70,9 +70,9 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= modified_user = info$modifiedBy ) } - }, mc.cores = ncores) + }, mc.cores = 1) manifests - }, mc.cores = ncores) + }, mc.cores = 1) manifest_dfs <- lapply(seq_along(metadata_list), function(x) metadata_list[[x]][[1]]$manifest_df) manifest_info <- lapply(seq_along(metadata_list), function(x) metadata_list[[x]][[1]]$manifest_info) @@ -122,12 +122,12 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= ModifiedOn = info$modifiedOn, ModifiedUser = paste0("@", modified_user[[i]]), Path = manifest_path, - Folder = names(datasets)[which(datasets == info$parentId)], + Folder = names(datasets)[which(datasets %in% info$parentId)], FolderSynId = info$parentId, manifest = list(manifest_df) ) } - }, mc.cores = ncores) %>% bind_rows() + }, mc.cores = 1) %>% bind_rows() } # add empty dataset ids even if there are no manifests @@ -284,7 +284,7 @@ get_metadata_nodes <- function(metadata, ncores = 1, schematic_api, folder_id = c(manifest$FolderSynId), n_miss = c(n_miss) ) - }, mc.cores = ncores) %>% bind_rows() + }, mc.cores = 1) %>% bind_rows() } } From 829ae32cd1318fa99d90a340825e08ed85949098 Mon Sep 17 00:00:00 2001 From: afwillia Date: Tue, 20 Feb 2024 09:13:14 -0800 Subject: [PATCH 38/72] Edit error handling for manifest download --- R/schematic_rest_api.R | 22 +++++++++++++--------- functions/schematic_rest_api.R | 22 +++++++++++++--------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/R/schematic_rest_api.R b/R/schematic_rest_api.R index 3200ddd5..c2573c84 100644 --- a/R/schematic_rest_api.R +++ b/R/schematic_rest_api.R @@ -20,7 +20,12 @@ check_success <- function(x){ #' @export manifest_download <- function(url = "http://localhost:3001/v1/manifest/download", access_token, manifest_id, as_json=TRUE, new_manifest_name=NULL) { - req <- httr2::request(url) + req <- httr2::request(url) |> + httr2::req_retry( + max_tries = 3, + is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503) + ) |> + httr2::req_error(is_error = \(r) FALSE) resp <- req |> httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> httr2::req_url_query( @@ -28,10 +33,6 @@ manifest_download <- function(url = "http://localhost:3001/v1/manifest/download" as_json = as_json, new_manifest_name = new_manifest_name ) |> - httr2::req_retry( - max_tries = 3, - is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503) - ) |> httr2::req_perform() resp |> httr2::resp_body_string() |> (function(d) gsub('NaN', '"NA"', x = d))() |> @@ -140,10 +141,9 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", reqs <- httr2::request(url) |> httr2::req_retry( max_tries = 3, - is_transient = \(reqs) httr2::resp_status(reqs) %in% c(429, 500, 503, 504) + is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503, 504) ) |> - httr2::req_error(is_error = \(reqs) FALSE) |> - httr2::req_throttle(1) + httr2::req_error(is_error = \(reqs) FALSE) resp <- reqs %>% httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> httr2::req_url_query( @@ -246,7 +246,11 @@ model_component_requirements <- function(url="http://localhost:3001/v1/model/com as_graph = FALSE) { reqs <- httr2::request(url) |> - httr2::req_throttle(1) + httr2::req_retry( + max_tries = 3, + is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503) + ) |> + httr2::req_error(is_error = \(r) FALSE) resp <- reqs |> httr2::req_url_query( schema_url = schema_url, diff --git a/functions/schematic_rest_api.R b/functions/schematic_rest_api.R index 3200ddd5..c2573c84 100644 --- a/functions/schematic_rest_api.R +++ b/functions/schematic_rest_api.R @@ -20,7 +20,12 @@ check_success <- function(x){ #' @export manifest_download <- function(url = "http://localhost:3001/v1/manifest/download", access_token, manifest_id, as_json=TRUE, new_manifest_name=NULL) { - req <- httr2::request(url) + req <- httr2::request(url) |> + httr2::req_retry( + max_tries = 3, + is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503) + ) |> + httr2::req_error(is_error = \(r) FALSE) resp <- req |> httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> httr2::req_url_query( @@ -28,10 +33,6 @@ manifest_download <- function(url = "http://localhost:3001/v1/manifest/download" as_json = as_json, new_manifest_name = new_manifest_name ) |> - httr2::req_retry( - max_tries = 3, - is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503) - ) |> httr2::req_perform() resp |> httr2::resp_body_string() |> (function(d) gsub('NaN', '"NA"', x = d))() |> @@ -140,10 +141,9 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", reqs <- httr2::request(url) |> httr2::req_retry( max_tries = 3, - is_transient = \(reqs) httr2::resp_status(reqs) %in% c(429, 500, 503, 504) + is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503, 504) ) |> - httr2::req_error(is_error = \(reqs) FALSE) |> - httr2::req_throttle(1) + httr2::req_error(is_error = \(reqs) FALSE) resp <- reqs %>% httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> httr2::req_url_query( @@ -246,7 +246,11 @@ model_component_requirements <- function(url="http://localhost:3001/v1/model/com as_graph = FALSE) { reqs <- httr2::request(url) |> - httr2::req_throttle(1) + httr2::req_retry( + max_tries = 3, + is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503) + ) |> + httr2::req_error(is_error = \(r) FALSE) resp <- reqs |> httr2::req_url_query( schema_url = schema_url, From 94f1d21ce343dba64195b17528f07ceb4870dd54 Mon Sep 17 00:00:00 2001 From: afwillia Date: Tue, 20 Feb 2024 09:13:36 -0800 Subject: [PATCH 39/72] Download manifests in parallel --- functions/dashboardFuns.R | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/functions/dashboardFuns.R b/functions/dashboardFuns.R index 3171c9aa..bc076aea 100644 --- a/functions/dashboardFuns.R +++ b/functions/dashboardFuns.R @@ -70,9 +70,9 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= modified_user = info$modifiedBy ) } - }, mc.cores = 1) + }, mc.cores = ncores) manifests - }, mc.cores = 1) + }, mc.cores = ncores) manifest_dfs <- lapply(seq_along(metadata_list), function(x) metadata_list[[x]][[1]]$manifest_df) manifest_info <- lapply(seq_along(metadata_list), function(x) metadata_list[[x]][[1]]$manifest_info) @@ -127,7 +127,7 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= manifest = list(manifest_df) ) } - }, mc.cores = 1) %>% bind_rows() + }, mc.cores = ncores) %>% bind_rows() } # add empty dataset ids even if there are no manifests @@ -284,7 +284,7 @@ get_metadata_nodes <- function(metadata, ncores = 1, schematic_api, folder_id = c(manifest$FolderSynId), n_miss = c(n_miss) ) - }, mc.cores = 1) %>% bind_rows() + }, mc.cores = ncores) %>% bind_rows() } } From bb54db57069ecdaecc0f84b8eeccb09c3e1810d1 Mon Sep 17 00:00:00 2001 From: afwillia Date: Tue, 20 Feb 2024 09:13:55 -0800 Subject: [PATCH 40/72] Use rlang backtrace for errors --- global.R | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/global.R b/global.R index 5a1b4bfa..226387bf 100644 --- a/global.R +++ b/global.R @@ -32,6 +32,10 @@ message(sprintf("Available cores: %s", ncores)) plan(multicore, workers = ncores) options(shiny.maxRequestSize=32*1024^2) +options( + rlang_backtrace_on_error = "branch", + error = rlang::entrace +) # import R files source_files <- list.files(c("functions", "modules"), pattern = "*\\.R$", recursive = TRUE, full.names = TRUE) From 80115b6ae9880ac4a87e5225d2e5352c93b54b2e Mon Sep 17 00:00:00 2001 From: afwillia Date: Tue, 20 Feb 2024 13:27:38 -0800 Subject: [PATCH 41/72] Add options to one statement --- global.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global.R b/global.R index 226387bf..2e17e23d 100644 --- a/global.R +++ b/global.R @@ -31,8 +31,8 @@ ncores <- availableCores() - 1 message(sprintf("Available cores: %s", ncores)) plan(multicore, workers = ncores) -options(shiny.maxRequestSize=32*1024^2) options( + shiny.maxRequestSize=32*1024^2, rlang_backtrace_on_error = "branch", error = rlang::entrace ) From 1cfe29282f7792f0a359486267c694a4238178a4 Mon Sep 17 00:00:00 2001 From: afwillia Date: Tue, 20 Feb 2024 13:28:05 -0800 Subject: [PATCH 42/72] Add more error handling to model_component_requirements --- functions/dashboardFuns.R | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/functions/dashboardFuns.R b/functions/dashboardFuns.R index bc076aea..6880a45b 100644 --- a/functions/dashboardFuns.R +++ b/functions/dashboardFuns.R @@ -14,8 +14,8 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= rest = get_asset_view_table(url = file.path("https://schematic-dev.api.sagebionetworks.org/v1/storage/assets/tables"), access_token = access_token, asset_view=fileview) - ) %>% - filter(grepl("synapse_storage_manifest_", name) & parentId %in% datasets) + ) + file_view <- filter(file_view, grepl("synapse_storage_manifest_", name) & parentId %in% datasets) # datasets don't have a manifest ds_no_manifest <- datasets[which(!datasets %in% file_view$parentId)] @@ -122,12 +122,13 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= ModifiedOn = info$modifiedOn, ModifiedUser = paste0("@", modified_user[[i]]), Path = manifest_path, - Folder = names(datasets)[which(datasets %in% info$parentId)], + Folder = names(datasets)[which(datasets == info$parentId)], FolderSynId = info$parentId, manifest = list(manifest_df) ) } - }, mc.cores = ncores) %>% bind_rows() + }, mc.cores = ncores) + metadata <- bind_rows(metadata) } # add empty dataset ids even if there are no manifests @@ -187,6 +188,13 @@ validate_metadata <- function(metadata, project.scope, schematic_api, schema_url ) if (!inherits(validation_res, "try-error")) { # clean validation res from schematicpy + if (!length(validation_res) == 2) { + validation_res <- list(list( + "errors" = list( + Row = NA, Column = NA, Value = NA, + Error = "Cannot validate manifest" + ))) + } clean_res <- validationResult(validation_res, manifest$Component, dashboard = TRUE) clean_res[which(sapply(clean_res, is.null))] <- NA if (grepl("Cannot validate manifest", clean_res$error_msg[[1]])) { @@ -210,9 +218,9 @@ validate_metadata <- function(metadata, project.scope, schematic_api, schema_url } } - }, mc.cores = 1) - m2 <- bind_rows(m2) %>% - cbind(metadata, .) # expand metadata with validation results + }, mc.cores = ncores) + m2 <- bind_rows(m2) + cbind(metadata, m2) # expand metadata with validation results } #' create a list of requirements for selected data type @@ -233,7 +241,7 @@ get_schema_nodes <- function(schema, schematic_api, url, schema_url) { return(list()) } ) - + if ("status" %in% names(requirement)) return(schema=as.character(schema)) if (length(requirement) == 0) { # return data type itself without name return(schema=as.character(schema)) @@ -253,7 +261,7 @@ get_metadata_nodes <- function(metadata, ncores = 1, schematic_api, if (nrow(metadata) == 0) { return(data.frame(from = NA, to = NA, folder = NA, folderSynId = NA, nMiss = NA)) } else { - parallel::mclapply(1:nrow(metadata), function(i) { + mn <- parallel::mclapply(1:nrow(metadata), function(i) { manifest <- metadata[i, ] # get all required data types nodes <- tryCatch( @@ -267,9 +275,12 @@ get_metadata_nodes <- function(metadata, ncores = 1, schematic_api, ), error = function(e) { warning("'get_metadata_nodes' failed: ", sQuote(manifest$Component), ":\n", e$message) + cat(paste0("'get_metadata_nodes' failed: ", sQuote(manifest$Component), ":\n", e$message)) return(list()) } - ) %>% list2Vector() + ) + if ("status" %in% names(nodes)) nodes <- list() + nodes <- list2Vector(nodes) source <- as.character(nodes) target <- names(nodes) @@ -284,7 +295,8 @@ get_metadata_nodes <- function(metadata, ncores = 1, schematic_api, folder_id = c(manifest$FolderSynId), n_miss = c(n_miss) ) - }, mc.cores = ncores) %>% bind_rows() + }, mc.cores = ncores) + mn <- bind_rows(mn) } } From 406050976b98e6da4b0dda6ee577fd9a89d12c6d Mon Sep 17 00:00:00 2001 From: afwillia Date: Tue, 20 Feb 2024 13:28:36 -0800 Subject: [PATCH 43/72] Remove error handling from API wrapper functions, put in other functions --- R/schematic_rest_api.R | 29 ++++++++++++++--------------- functions/schematic_rest_api.R | 29 ++++++++++++++--------------- 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/R/schematic_rest_api.R b/R/schematic_rest_api.R index c2573c84..ad317c57 100644 --- a/R/schematic_rest_api.R +++ b/R/schematic_rest_api.R @@ -113,7 +113,6 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", schema_url="https://raw.githubusercontent.com/ncihtan/data-models/main/HTAN.model.jsonld", #nolint data_type, file_name = NULL, restrict_rules=FALSE, project_scope = NULL, access_token, asset_view = NULL, json_str = NULL) { - a <- paste0(sample(1000, 1), "-") flattenbody <- function(x) { # A form/query can only have one value per name, so take # any values that contain vectors length >1 and @@ -177,20 +176,20 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", } # Format server error in a way validationResult can handle - if (httr2::resp_is_error(resp)) { - return( - list( - list( - "errors" = list( - Row = NA, Column = NA, Value = NA, - Error = sprintf("Cannot validate manifest: %s", - httr2::resp_status_desc(resp) - ) - ) - ) - ) - ) - } + # if (httr2::resp_is_error(resp)) { + # return( + # list( + # list( + # "errors" = list( + # Row = NA, Column = NA, Value = NA, + # Error = sprintf("Cannot validate manifest: %s", + # httr2::resp_status_desc(resp) + # ) + # ) + # ) + # ) + # ) + # } httr2::resp_body_json(resp) } diff --git a/functions/schematic_rest_api.R b/functions/schematic_rest_api.R index c2573c84..ad317c57 100644 --- a/functions/schematic_rest_api.R +++ b/functions/schematic_rest_api.R @@ -113,7 +113,6 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", schema_url="https://raw.githubusercontent.com/ncihtan/data-models/main/HTAN.model.jsonld", #nolint data_type, file_name = NULL, restrict_rules=FALSE, project_scope = NULL, access_token, asset_view = NULL, json_str = NULL) { - a <- paste0(sample(1000, 1), "-") flattenbody <- function(x) { # A form/query can only have one value per name, so take # any values that contain vectors length >1 and @@ -177,20 +176,20 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", } # Format server error in a way validationResult can handle - if (httr2::resp_is_error(resp)) { - return( - list( - list( - "errors" = list( - Row = NA, Column = NA, Value = NA, - Error = sprintf("Cannot validate manifest: %s", - httr2::resp_status_desc(resp) - ) - ) - ) - ) - ) - } + # if (httr2::resp_is_error(resp)) { + # return( + # list( + # list( + # "errors" = list( + # Row = NA, Column = NA, Value = NA, + # Error = sprintf("Cannot validate manifest: %s", + # httr2::resp_status_desc(resp) + # ) + # ) + # ) + # ) + # ) + # } httr2::resp_body_json(resp) } From 3e28afb81b38305603e2e1441693bd3df3a147c1 Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 21 Feb 2024 09:08:22 -0800 Subject: [PATCH 44/72] Update how validate and component manifest return errors --- R/schematic_rest_api.R | 11 ++++++++--- functions/schematic_rest_api.R | 11 ++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/R/schematic_rest_api.R b/R/schematic_rest_api.R index ad317c57..9d52915e 100644 --- a/R/schematic_rest_api.R +++ b/R/schematic_rest_api.R @@ -143,7 +143,7 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503, 504) ) |> httr2::req_error(is_error = \(reqs) FALSE) - resp <- reqs %>% + resp <- reqs |> httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> httr2::req_url_query( schema_url=schema_url, @@ -157,7 +157,7 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", } else { req <- httr2::request(url) |> httr2::req_throttle(1) - resp <- req %>% + resp <- req |> httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> httr2::req_url_query( schema_url=schema_url, @@ -246,7 +246,7 @@ model_component_requirements <- function(url="http://localhost:3001/v1/model/com reqs <- httr2::request(url) |> httr2::req_retry( - max_tries = 3, + max_tries = 5, is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503) ) |> httr2::req_error(is_error = \(r) FALSE) @@ -258,6 +258,11 @@ model_component_requirements <- function(url="http://localhost:3001/v1/model/com ) |> #httr2::req_retry(max_tries = 3) |> httr2::req_perform() + if (httr2::resp_is_error(resp)) { + warning(sprintf("model/component-requirement failed for %s. returning empty list. %s", + source_component, httr2::resp_body_json(resp)$title)) + return(list()) + } resp |> httr2::resp_body_json() diff --git a/functions/schematic_rest_api.R b/functions/schematic_rest_api.R index ad317c57..9d52915e 100644 --- a/functions/schematic_rest_api.R +++ b/functions/schematic_rest_api.R @@ -143,7 +143,7 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503, 504) ) |> httr2::req_error(is_error = \(reqs) FALSE) - resp <- reqs %>% + resp <- reqs |> httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> httr2::req_url_query( schema_url=schema_url, @@ -157,7 +157,7 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", } else { req <- httr2::request(url) |> httr2::req_throttle(1) - resp <- req %>% + resp <- req |> httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> httr2::req_url_query( schema_url=schema_url, @@ -246,7 +246,7 @@ model_component_requirements <- function(url="http://localhost:3001/v1/model/com reqs <- httr2::request(url) |> httr2::req_retry( - max_tries = 3, + max_tries = 5, is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503) ) |> httr2::req_error(is_error = \(r) FALSE) @@ -258,6 +258,11 @@ model_component_requirements <- function(url="http://localhost:3001/v1/model/com ) |> #httr2::req_retry(max_tries = 3) |> httr2::req_perform() + if (httr2::resp_is_error(resp)) { + warning(sprintf("model/component-requirement failed for %s. returning empty list. %s", + source_component, httr2::resp_body_json(resp)$title)) + return(list()) + } resp |> httr2::resp_body_json() From 25d9056795dd8fc0527fc35e09cb59b64d519793 Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 21 Feb 2024 09:08:57 -0800 Subject: [PATCH 45/72] Update how dashboard handles missing validation errors --- functions/dashboardFuns.R | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/functions/dashboardFuns.R b/functions/dashboardFuns.R index 6880a45b..f49643ba 100644 --- a/functions/dashboardFuns.R +++ b/functions/dashboardFuns.R @@ -186,7 +186,6 @@ validate_metadata <- function(metadata, project.scope, schematic_api, schema_url access_token = access_token, file_name = manifest$Path) ) - if (!inherits(validation_res, "try-error")) { # clean validation res from schematicpy if (!length(validation_res) == 2) { validation_res <- list(list( @@ -204,21 +203,21 @@ validate_metadata <- function(metadata, project.scope, schematic_api, schema_url Result = clean_res$result, # change wrong schema to out-of-date type ErrorType = if_else(clean_res$error_type == "Wrong Schema", "Out of Date", clean_res$error_type), - errorMsg = if_else(is.null(clean_res$error_msg[1]), "Valid", paste(clean_res$error_msg[1], collapse="; ")), - WarnMsg = if_else(is.null(clean_res$warning_msg[1]), "Valid", paste(clean_res$warning_msg[1], collapse = "; ")) + errorMsg = if_else(is.na(clean_res$error_msg[1]), "Valid", paste(clean_res$error_msg[1], collapse="; ")), + WarnMsg = if_else(is.na(clean_res$warning_msg[1]), "Valid", paste(clean_res$warning_msg[1], collapse = "; ")) ) - } else { - data.frame( - Result = "Fail", - # change wrong schema to out-of-date type - ErrorType = "Unknown Error", - errorMsg = "Server Error", - WarnMsg = " " - ) - } + #} else { + # data.frame( + # Result = "Fail", + # # change wrong schema to out-of-date type + # ErrorType = "Unknown Error", + # errorMsg = "Server Error", + # WarnMsg = " " + # ) + #} } - }, mc.cores = ncores) + }, mc.cores = 1) m2 <- bind_rows(m2) cbind(metadata, m2) # expand metadata with validation results } @@ -241,7 +240,6 @@ get_schema_nodes <- function(schema, schematic_api, url, schema_url) { return(list()) } ) - if ("status" %in% names(requirement)) return(schema=as.character(schema)) if (length(requirement) == 0) { # return data type itself without name return(schema=as.character(schema)) @@ -261,8 +259,8 @@ get_metadata_nodes <- function(metadata, ncores = 1, schematic_api, if (nrow(metadata) == 0) { return(data.frame(from = NA, to = NA, folder = NA, folderSynId = NA, nMiss = NA)) } else { - mn <- parallel::mclapply(1:nrow(metadata), function(i) { - manifest <- metadata[i, ] + mn <- parallel::mclapply(1:nrow(metadata), function(n) { + manifest <- metadata[n, ] # get all required data types nodes <- tryCatch( switch(schematic_api, @@ -275,11 +273,9 @@ get_metadata_nodes <- function(metadata, ncores = 1, schematic_api, ), error = function(e) { warning("'get_metadata_nodes' failed: ", sQuote(manifest$Component), ":\n", e$message) - cat(paste0("'get_metadata_nodes' failed: ", sQuote(manifest$Component), ":\n", e$message)) return(list()) } ) - if ("status" %in% names(nodes)) nodes <- list() nodes <- list2Vector(nodes) source <- as.character(nodes) target <- names(nodes) From 20ea386cd09e0db72c9d6bf17d57d63b4e30b980 Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 21 Feb 2024 12:12:17 -0800 Subject: [PATCH 46/72] Update synapse get api call with httr2 --- functions/synapse_rest_api.R | 204 ++++++++++++++++++++++++++++++++--- 1 file changed, 192 insertions(+), 12 deletions(-) diff --git a/functions/synapse_rest_api.R b/functions/synapse_rest_api.R index 09b6773f..e5956e62 100644 --- a/functions/synapse_rest_api.R +++ b/functions/synapse_rest_api.R @@ -54,21 +54,19 @@ synapse_is_certified <- function(url="https://repo-prod.prod.sagebase.org/repo/v #' @param auth Synapse PAT #' #' @export -synapse_get <- function(url = "https://repo-prod.prod.sagebase.org/repo/v1/entity/", +synapse_get <- function(url = "https://repo-prod.prod.sagebase.org/repo/v1/entity", id, auth) { if (is.null(id)) stop("id cannot be NULL") - req_url <- file.path(url, id) - req <- httr::GET(req_url, - httr::add_headers(Authorization=paste0("Bearer ", auth))) - - # Send error if unsuccessful query - status <- httr::http_status(req) - if (status$category != "Success") stop(status$message) - - cont <- httr::content(req) - dplyr::bind_rows(cont) - + req <- httr2::request(file.path(url, id)) + resp <- req |> + httr2::req_retry( + max_tries = 5, + is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503) + ) |> + httr2::req_headers(Authorization = sprintf("Bearer %s", auth)) |> + httr2::req_perform() + resp |> httr2::resp_body_json() } @@ -99,3 +97,185 @@ synapse_access <- function(url = "https://repo-prod.prod.sagebase.org/repo/v1/en } +#' @title Get children of a synapse entity +#' https://rest-docs.synapse.org/rest/POST/entity/children.html +#' @param url Synapse api endpoint +#' @param auth Synapse token +#' @param parentId Synapse ID of parent folder +#' @param nextPageToken Synapse next page token +#' @param includeTypes Types to return +#' @param sortBy Variable to sort by +#' @param sortDirection sort direction +#' @param includeTotalChildCount boolean include count of children +#' @param includeSumFileSizes boolean include sum of file sizes +synapse_entity_children <- function(url = "https://repo-prod.prod.sagebase.org/repo/v1/entity/children", + auth, parentId=NULL, nextPageToken=NULL, includeTypes="project", sortBy="NAME", + sortDirection="ASC", includeTotalChildCount=FALSE, includeSumFileSizes=FALSE) { + + output <- list() + req <- httr::POST(url, + httr::add_headers(Authorization=paste0("Bearer ", auth)), + body = + list(parentId=parentId, + nextPageToken=nextPageToken, + includeTypes=includeTypes, + sortBy=sortBy, + sortDirection=sortDirection, + includeTotalChildCount=includeTotalChildCount, + includeSumFileSizes=includeSumFileSizes), + encode="json") + + resp <- httr::content(req) + output <- resp$page + + while (!is.null(resp$nextPageToken)) { + req <- httr::POST(url, + httr::add_headers(Authorization=paste0("Bearer ", auth)), + body = + list(parentId=parentId, + nextPageToken=resp$nextPageToken, + includeTypes=includeTypes, + sortBy=sortBy, + sortDirection=sortDirection, + includeTotalChildCount=includeTotalChildCount, + includeSumFileSizes=includeSumFileSizes), + encode="json") + resp <- httr::content(req) + output <- c(output, resp$page) + } + bind_rows(output) + +} + +#' @title Get projects a user has access to +#' +#' @param url Synapse api endpoint +#' @param auth Synapse token +#' @param nextPageToken Synapse next page token +synapse_projects_user <- function(url = "https://repo-prod.prod.sagebase.org/repo/v1/projects/user", auth, nextPageToken=NULL) { + principalId <- synapse_user_profile(auth = auth)[["ownerId"]] + hreq <- httr::GET(url = file.path(url, principalId), + query = list(nextPageToken=nextPageToken)) + output <- list() + resp <- httr::content(hreq) + output <- resp$results + while (!is.null(resp$nextPageToken)) { + hreq <- httr::GET(url = file.path(url, principalId), + query = list(nextPageToken=resp$nextPageToken)) + resp <- httr::content(hreq) + output <- c(output, resp$results) + } + dplyr::bind_rows(output) +} + +#' @title Get projects within scope of Synapse project +#' +#' @param url Synapse api endpoint +#' @param id Synapse ID +#' @param auth Synapse token +synapse_get_project_scope <- function(url = "https://repo-prod.prod.sagebase.org/repo/v1/entity/", + id, auth) { + if (is.null(id)) stop("id cannot be NULL") + req_url <- file.path(url, id) + req <- httr::GET(req_url, + httr::add_headers(Authorization=paste0("Bearer ", auth))) + + # Send error if unsuccessful query + status <- httr::http_status(req) + if (status$category != "Success") stop(status$message) + + cont <- httr::content(req) + unlist(cont$scopeIds) +} + +#' @param title Query a Synapse Table +#' https://rest-docs.synapse.org/rest/GET/entity/id/table/query/async/get/asyncToken.html +#' @param id Synapse table ID +#' @param auth Synapse token +#' @param query An sql query +#' @param partMask The part of the Synapse response to get. Defaults to everything. +synapse_table_query <- function(id, auth, query, partMask=0x7F) { + url <- file.path("https://repo-prod.prod.sagebase.org/repo/v1/entity",id, "table/query/async/start") + req <- httr::POST(url = url, + httr::add_headers(Authorization=paste0("Bearer ", auth)), + body = list( + query = list(sql=query), + partMask = partMask + ), + encode = "json" + ) + httr::content(req) +} + +#' @param title Get results of synapse_table_query +#' https://rest-docs.synapse.org/rest/GET/entity/id/table/query/async/get/asyncToken.html +#' @param id Synapse table ID +#' @param async_token Token from synapse_table_query +#' @param auth Synapse token +synapse_table_get <- function(id, async_token, auth) { + url <- file.path("https://repo-prod.prod.sagebase.org/repo/v1/entity", id,"table/query/async/get", async_token) + req <- httr::GET(url = url, + httr::add_headers(Authorization=paste0("Bearer ", auth))) + httr::content(req) +} + +#' @title Get column names from a Synapse table +#' https://rest-docs.synapse.org/rest/GET/entity/id/table/query/async/get/asyncToken.html +#' Uses a table query to get the column names from a Synapse table +#' @param id Synapse ID of table +#' @param auth Synapse token +get_synapse_table_names <- function(id, auth) { + query <- sprintf("select id from %s limit 1", id) + request <- synapse_table_query(id, auth, query, partMask = 0x10) + Sys.sleep(1) + response <- synapse_table_get(id, request$token, auth) + vapply(response$columnModels, function(x) x$name, character(1L)) +} + +#' @title Get storage projects within a Synapse table +#' https://rest-docs.synapse.org/rest/GET/entity/id/table/query/async/get/asyncToken.html +#' @param id Synapse ID of table +#' @param auth Synapse token +#' @param select_cols Columns to get from table +synapse_storage_projects <- function(id, auth, select_cols = c("id", "name", "parentId", "projectId", "type", "columnType")) { + table_cols <- get_synapse_table_names(id, auth) + select_cols <- intersect(select_cols, table_cols) + select_cols_format <- paste(select_cols, collapse = ", ") + query <- sprintf("select distinct %s from %s", select_cols_format, id) + request <- synapse_table_query(id, auth, query, partMask = 0x1) + Sys.sleep(1) + response <- synapse_table_get(id, request$token, auth) + + setNames( + tibble::as_tibble( + t( + vapply( + response$queryResult$queryResults$rows, function(x) { + unlist(x$values) + }, + character(length(select_cols))))), + select_cols) +} + +#' @title Download a synapse file from its URL +#' https://rest-docs.synapse.org/rest/GET/file/id.html +#' @param dataFileHandleId The dataFileHandleId from an entity +#' @param id The synapse ID of the file to download +#' @param auth Synapse token +#' @param filepath Optional path to download data. If NULL, return a data frame. +synapse_download_file_handle <- function(dataFileHandleId, id, auth, filepath=NULL) { + url <- sprintf("https://repo-prod.prod.sagebase.org/file/v1/file/%s", dataFileHandleId) + request <- httr::GET(url = url, + httr::add_headers( Authorization=paste0("Bearer ", auth)), + query = list( + redirect = FALSE, + fileAssociateId = id, + fileAssociateType = "FileEntity" + ) + ) + download_url <- httr::content(request) + destfile <- ifelse(is.null(filepath), tempfile(), filepath) + download.file(download_url, destfile) + if (is.null(filepath)) readr::read_csv(destfile, show_col_types = FALSE) + +} From f4a2ad02b9e41c09737bdb6aa84ad5c09ab408a5 Mon Sep 17 00:00:00 2001 From: afwillia Date: Thu, 22 Feb 2024 08:39:17 -0800 Subject: [PATCH 47/72] Loop through unique parentIDs in manifest fileview, in case of duplicate entries. --- functions/dashboardFuns.R | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/functions/dashboardFuns.R b/functions/dashboardFuns.R index f49643ba..7384c26f 100644 --- a/functions/dashboardFuns.R +++ b/functions/dashboardFuns.R @@ -16,7 +16,8 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= asset_view=fileview) ) file_view <- filter(file_view, grepl("synapse_storage_manifest_", name) & parentId %in% datasets) - + file_view$contentType <- NA + file_view <- as_tibble(lapply(file_view, unlist)) # datasets don't have a manifest ds_no_manifest <- datasets[which(!datasets %in% file_view$parentId)] @@ -39,7 +40,7 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= ) cols <- setNames(rep("", length(cols)), cols) metadata <- bind_rows(cols)[0, ] - metadata_list <- parallel::mclapply(file_view$parentId, function(dataset) { + metadata_list <- parallel::mclapply(unique(file_view$parentId), function(dataset) { # get manifest's synapse id(s) in each dataset folder manifest_ids <- file_view$id[file_view$parentId == dataset] # in case, multiple manifests exist in the same dataset From a3d937f92d3a3dbe20f8194b08d2cee0e10a6d2e Mon Sep 17 00:00:00 2001 From: afwillia Date: Mon, 26 Feb 2024 15:02:52 -0800 Subject: [PATCH 48/72] Add throttling to validation and manifest download --- R/schematic_rest_api.R | 5 +++-- functions/schematic_rest_api.R | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/R/schematic_rest_api.R b/R/schematic_rest_api.R index 9d52915e..8244c0b1 100644 --- a/R/schematic_rest_api.R +++ b/R/schematic_rest_api.R @@ -23,7 +23,7 @@ manifest_download <- function(url = "http://localhost:3001/v1/manifest/download" req <- httr2::request(url) |> httr2::req_retry( max_tries = 3, - is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503) + is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503, 403) ) |> httr2::req_error(is_error = \(r) FALSE) resp <- req |> @@ -140,8 +140,9 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", reqs <- httr2::request(url) |> httr2::req_retry( max_tries = 3, - is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503, 504) + is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503, 504, 403) ) |> + httr2::req_throttle(1/2) |> httr2::req_error(is_error = \(reqs) FALSE) resp <- reqs |> httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> diff --git a/functions/schematic_rest_api.R b/functions/schematic_rest_api.R index 9d52915e..8244c0b1 100644 --- a/functions/schematic_rest_api.R +++ b/functions/schematic_rest_api.R @@ -23,7 +23,7 @@ manifest_download <- function(url = "http://localhost:3001/v1/manifest/download" req <- httr2::request(url) |> httr2::req_retry( max_tries = 3, - is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503) + is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503, 403) ) |> httr2::req_error(is_error = \(r) FALSE) resp <- req |> @@ -140,8 +140,9 @@ manifest_validate <- function(url="http://localhost:3001/v1/model/validate", reqs <- httr2::request(url) |> httr2::req_retry( max_tries = 3, - is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503, 504) + is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503, 504, 403) ) |> + httr2::req_throttle(1/2) |> httr2::req_error(is_error = \(reqs) FALSE) resp <- reqs |> httr2::req_headers(Authorization = sprintf("Bearer %s", access_token)) |> From bfbabec6502888baa7d112a85a7f7e96a5328946 Mon Sep 17 00:00:00 2001 From: afwillia Date: Mon, 26 Feb 2024 15:04:00 -0800 Subject: [PATCH 49/72] add endpoint for downloading an asset view --- R/synapse_rest_api.R | 46 ++++++++++++++++++++++++++++++++---- functions/synapse_rest_api.R | 46 ++++++++++++++++++++++++++++++++---- 2 files changed, 82 insertions(+), 10 deletions(-) diff --git a/R/synapse_rest_api.R b/R/synapse_rest_api.R index e5956e62..21435858 100644 --- a/R/synapse_rest_api.R +++ b/R/synapse_rest_api.R @@ -62,8 +62,9 @@ synapse_get <- function(url = "https://repo-prod.prod.sagebase.org/repo/v1/entit resp <- req |> httr2::req_retry( max_tries = 5, - is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503) + is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503, 403) ) |> + httr2::req_throttle(1/2) |> httr2::req_headers(Authorization = sprintf("Bearer %s", auth)) |> httr2::req_perform() resp |> httr2::resp_body_json() @@ -214,9 +215,17 @@ synapse_table_query <- function(id, auth, query, partMask=0x7F) { #' @param auth Synapse token synapse_table_get <- function(id, async_token, auth) { url <- file.path("https://repo-prod.prod.sagebase.org/repo/v1/entity", id,"table/query/async/get", async_token) - req <- httr::GET(url = url, - httr::add_headers(Authorization=paste0("Bearer ", auth))) - httr::content(req) + request <- httr2::request(url) + response <- request |> + httr2::req_retry( + max_tries = 5, + is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503, 202, 403) + ) |> + httr2::req_throttle(1/2) |> + httr2::req_headers(Authorization = sprintf("Bearer %s", auth)) |> + httr2::req_perform() + httr2::resp_body_json(response) + } #' @title Get column names from a Synapse table @@ -243,7 +252,6 @@ synapse_storage_projects <- function(id, auth, select_cols = c("id", "name", "pa select_cols_format <- paste(select_cols, collapse = ", ") query <- sprintf("select distinct %s from %s", select_cols_format, id) request <- synapse_table_query(id, auth, query, partMask = 0x1) - Sys.sleep(1) response <- synapse_table_get(id, request$token, auth) setNames( @@ -279,3 +287,31 @@ synapse_download_file_handle <- function(dataFileHandleId, id, auth, filepath=NU if (is.null(filepath)) readr::read_csv(destfile, show_col_types = FALSE) } + +#' @title Download the storage manifest records from an asset view table +synapse_get_manifests_in_asset_view <- function(id, auth) { + request <- synapse_table_query( + id = id, + auth = auth, + query = paste("select * from", + id, + "where name like 'synapse|_storage|_manifest|_%' escape '|'"), + partMask = 0x11) + response <- synapse_table_get( + id = id, + async_token = request$token, + auth = auth) + # Format the query results by reshaping the results list and getting column + # names. partMask 0x11 gets queryResults and column names + setNames( + tibble::as_tibble( + t( + vapply( + response$queryResult$queryResults$rows, function(x) { + null_ind <- which(sapply(x$values, is.null)) + x$values[null_ind] <- NA + unlist(x$values) + }, + character(length(response$columnModels))))), + vapply(response$columnModels, function(x) x$name,character(1L))) +} diff --git a/functions/synapse_rest_api.R b/functions/synapse_rest_api.R index e5956e62..21435858 100644 --- a/functions/synapse_rest_api.R +++ b/functions/synapse_rest_api.R @@ -62,8 +62,9 @@ synapse_get <- function(url = "https://repo-prod.prod.sagebase.org/repo/v1/entit resp <- req |> httr2::req_retry( max_tries = 5, - is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503) + is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503, 403) ) |> + httr2::req_throttle(1/2) |> httr2::req_headers(Authorization = sprintf("Bearer %s", auth)) |> httr2::req_perform() resp |> httr2::resp_body_json() @@ -214,9 +215,17 @@ synapse_table_query <- function(id, auth, query, partMask=0x7F) { #' @param auth Synapse token synapse_table_get <- function(id, async_token, auth) { url <- file.path("https://repo-prod.prod.sagebase.org/repo/v1/entity", id,"table/query/async/get", async_token) - req <- httr::GET(url = url, - httr::add_headers(Authorization=paste0("Bearer ", auth))) - httr::content(req) + request <- httr2::request(url) + response <- request |> + httr2::req_retry( + max_tries = 5, + is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503, 202, 403) + ) |> + httr2::req_throttle(1/2) |> + httr2::req_headers(Authorization = sprintf("Bearer %s", auth)) |> + httr2::req_perform() + httr2::resp_body_json(response) + } #' @title Get column names from a Synapse table @@ -243,7 +252,6 @@ synapse_storage_projects <- function(id, auth, select_cols = c("id", "name", "pa select_cols_format <- paste(select_cols, collapse = ", ") query <- sprintf("select distinct %s from %s", select_cols_format, id) request <- synapse_table_query(id, auth, query, partMask = 0x1) - Sys.sleep(1) response <- synapse_table_get(id, request$token, auth) setNames( @@ -279,3 +287,31 @@ synapse_download_file_handle <- function(dataFileHandleId, id, auth, filepath=NU if (is.null(filepath)) readr::read_csv(destfile, show_col_types = FALSE) } + +#' @title Download the storage manifest records from an asset view table +synapse_get_manifests_in_asset_view <- function(id, auth) { + request <- synapse_table_query( + id = id, + auth = auth, + query = paste("select * from", + id, + "where name like 'synapse|_storage|_manifest|_%' escape '|'"), + partMask = 0x11) + response <- synapse_table_get( + id = id, + async_token = request$token, + auth = auth) + # Format the query results by reshaping the results list and getting column + # names. partMask 0x11 gets queryResults and column names + setNames( + tibble::as_tibble( + t( + vapply( + response$queryResult$queryResults$rows, function(x) { + null_ind <- which(sapply(x$values, is.null)) + x$values[null_ind] <- NA + unlist(x$values) + }, + character(length(response$columnModels))))), + vapply(response$columnModels, function(x) x$name,character(1L))) +} From fcfd7a7c943896424eeccf735ed790b68f220c24 Mon Sep 17 00:00:00 2001 From: afwillia Date: Mon, 26 Feb 2024 15:04:43 -0800 Subject: [PATCH 50/72] limit the file view query in dashboard --- functions/dashboardFuns.R | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/functions/dashboardFuns.R b/functions/dashboardFuns.R index 7384c26f..bc168cd2 100644 --- a/functions/dashboardFuns.R +++ b/functions/dashboardFuns.R @@ -11,13 +11,12 @@ get_dataset_metadata <- function(syn.store, datasets, ncores = 1, schematic_api= # get data for all manifests within the specified datasets file_view <- switch(schematic_api, reticulate = syn.store$storageFileviewTable, - rest = get_asset_view_table(url = file.path("https://schematic-dev.api.sagebionetworks.org/v1/storage/assets/tables"), - access_token = access_token, - asset_view=fileview) + rest = synapse_get_manifests_in_asset_view( + id = fileview, + auth = access_token + ) ) file_view <- filter(file_view, grepl("synapse_storage_manifest_", name) & parentId %in% datasets) - file_view$contentType <- NA - file_view <- as_tibble(lapply(file_view, unlist)) # datasets don't have a manifest ds_no_manifest <- datasets[which(!datasets %in% file_view$parentId)] From 4bcfca921dd762ac9bae24507d38e9dbb3e29dfb Mon Sep 17 00:00:00 2001 From: afwillia Date: Tue, 27 Feb 2024 09:32:11 -0800 Subject: [PATCH 51/72] remove throttling from table get --- R/synapse_rest_api.R | 2 -- functions/synapse_rest_api.R | 2 -- 2 files changed, 4 deletions(-) diff --git a/R/synapse_rest_api.R b/R/synapse_rest_api.R index 21435858..ea390b94 100644 --- a/R/synapse_rest_api.R +++ b/R/synapse_rest_api.R @@ -64,7 +64,6 @@ synapse_get <- function(url = "https://repo-prod.prod.sagebase.org/repo/v1/entit max_tries = 5, is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503, 403) ) |> - httr2::req_throttle(1/2) |> httr2::req_headers(Authorization = sprintf("Bearer %s", auth)) |> httr2::req_perform() resp |> httr2::resp_body_json() @@ -221,7 +220,6 @@ synapse_table_get <- function(id, async_token, auth) { max_tries = 5, is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503, 202, 403) ) |> - httr2::req_throttle(1/2) |> httr2::req_headers(Authorization = sprintf("Bearer %s", auth)) |> httr2::req_perform() httr2::resp_body_json(response) diff --git a/functions/synapse_rest_api.R b/functions/synapse_rest_api.R index 21435858..ea390b94 100644 --- a/functions/synapse_rest_api.R +++ b/functions/synapse_rest_api.R @@ -64,7 +64,6 @@ synapse_get <- function(url = "https://repo-prod.prod.sagebase.org/repo/v1/entit max_tries = 5, is_transient = \(resp) httr2::resp_status(resp) %in% c(429, 500, 503, 403) ) |> - httr2::req_throttle(1/2) |> httr2::req_headers(Authorization = sprintf("Bearer %s", auth)) |> httr2::req_perform() resp |> httr2::resp_body_json() @@ -221,7 +220,6 @@ synapse_table_get <- function(id, async_token, auth) { max_tries = 5, is_transient = \(r) httr2::resp_status(r) %in% c(429, 500, 503, 202, 403) ) |> - httr2::req_throttle(1/2) |> httr2::req_headers(Authorization = sprintf("Bearer %s", auth)) |> httr2::req_perform() httr2::resp_body_json(response) From 0e87fd7bfa33efc4965cdb017c0f46a473f6503e Mon Sep 17 00:00:00 2001 From: afwillia Date: Mon, 4 Mar 2024 10:24:23 -0800 Subject: [PATCH 52/72] Remove extra closing brackets from the last merge. --- server.R | 1 - 1 file changed, 1 deletion(-) diff --git a/server.R b/server.R index e5b168ea..6120cfc6 100644 --- a/server.R +++ b/server.R @@ -313,7 +313,6 @@ shinyServer(function(input, output, session) { ) }) }) - }) updateTabsetPanel(session, "tabs", selected = "tab_project") From 8e79740eb7f87e861e0a5e11221ee696bbde205c Mon Sep 17 00:00:00 2001 From: afwillia Date: Mon, 4 Mar 2024 10:37:21 -0800 Subject: [PATCH 53/72] Add data_model_labels parameter to template config functions --- R/template_config.R | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/R/template_config.R b/R/template_config.R index f421bd8c..080c0502 100644 --- a/R/template_config.R +++ b/R/template_config.R @@ -22,9 +22,14 @@ get_display_names <- function(qlist) { } #' @export -create_template_config <- function(data_model, include_schemas = NULL, exclude_schemas = NULL) { +create_template_config <- function( + data_model, + include_schemas = NULL, + exclude_schemas = NULL, + data_model_labels = "class_label") { + if (!is.null(include_schemas) && !is.null(exclude_schemas)) stop("include_schemas and exclude_schemas cannot both have values") - edges <- graph_by_edge_type(schema_url = data_model) + edges <- graph_by_edge_type(schema_url = data_model, data_model_labels = data_model_labels) schema_names <- format_edge_type(edges) nl <- setNames(as.list(schema_names$schema_name), rep("node_list", length(schema_names$schema_name))) dnames <- get_display_names(c(schema_url = data_model, nl)) |> httr::content() @@ -44,8 +49,13 @@ create_template_config <- function(data_model, include_schemas = NULL, exclude_s } #' @export -create_dca_template_config <- function(data_model, include_schemas = NULL, exclude_schemas = NULL) { - df <- create_template_config(data_model, include_schemas, exclude_schemas) +create_dca_template_config <- function( + data_model, + include_schemas = NULL, + exclude_schemas = NULL, + data_model_labels = "class_label") { + + df <- create_template_config(data_model, include_schemas, exclude_schemas, data_model_labels) schematic_version <- httr::GET("https://schematic-dev.api.sagebionetworks.org/v1/version") |> httr::content() list( @@ -57,7 +67,13 @@ create_dca_template_config <- function(data_model, include_schemas = NULL, exclu #' @export #' @description Create a DCA-specific template generation function -write_dca_template_config <- function(data_model, file, include_schemas = NULL, exclude_schemas = NULL) { - df <- create_dca_template_config(data_model, include_schemas, exclude_schemas) +write_dca_template_config <- function( + data_model, + file, + include_schemas = NULL, + exclude_schemas = NULL, + data_model_labels = "class_label") { + + df <- create_dca_template_config(data_model, include_schemas, exclude_schemas, data_model_labels) jsonlite::write_json(df, file, pretty = TRUE, auto_unbox = TRUE) } From 54aef6441473ef611d86f6377bcf7b28b03e3ac0 Mon Sep 17 00:00:00 2001 From: afwillia Date: Mon, 4 Mar 2024 10:38:42 -0800 Subject: [PATCH 54/72] Pass data_model_labels to get_display_names --- R/template_config.R | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/R/template_config.R b/R/template_config.R index 080c0502..17dfba65 100644 --- a/R/template_config.R +++ b/R/template_config.R @@ -32,7 +32,12 @@ create_template_config <- function( edges <- graph_by_edge_type(schema_url = data_model, data_model_labels = data_model_labels) schema_names <- format_edge_type(edges) nl <- setNames(as.list(schema_names$schema_name), rep("node_list", length(schema_names$schema_name))) - dnames <- get_display_names(c(schema_url = data_model, nl)) |> httr::content() + dnames <- get_display_names( + c(schema_url = data_model, + nl, + data_model_labels=data_model_labels) + ) |> + httr::content() config <- data.frame(display_name = unlist(dnames), schema_name = unlist(nl)) |> dplyr::left_join(schema_names, by = "schema_name") |> dplyr::mutate(type = ifelse(file_based, "file", "record")) |> From 9e3c6899d140ed927889a3a60822f3e2cb6fd8f2 Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 6 Mar 2024 08:05:57 -0800 Subject: [PATCH 55/72] Instead of raw google sheet URL, display link as metadata type, project, and folder. --- server.R | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/server.R b/server.R index 6120cfc6..8ab1bec4 100644 --- a/server.R +++ b/server.R @@ -738,7 +738,18 @@ shinyServer(function(input, output, session) { # generate link output$text_template <- renderUI( - tags$a(id = "template_link", href = manifest_data(), list(icon("hand-point-right"), manifest_data()), target = "_blank") + tags$a( + id = "template_link", + href = manifest_data(), + list( + icon("hand-point-right"), + sprintf("%s metadata for %s - %s", + selected$schema(), + names(selected$project()), + names(selected$folder()) + ) + ), + target = "_blank") ) if (dca_schematic_api == "offline") { From 0b5fd5064ce6e91296c8854e20687bc7511d75f2 Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 6 Mar 2024 08:14:25 -0800 Subject: [PATCH 56/72] Add trivy container scan to end of docker build workflow --- .github/workflows/docker_build.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/docker_build.yml b/.github/workflows/docker_build.yml index dbd369cd..333e0dc1 100644 --- a/.github/workflows/docker_build.yml +++ b/.github/workflows/docker_build.yml @@ -54,4 +54,12 @@ jobs: build-args: | DCA_VERSION=${{ env.DCA_VERSION }} + - name: Run Trivy vulnerability scanner + uses: aquasecurity/trivy-action@master + with: + image-ref: '${{ env.IMAGE_PATH }}:${{ env.DCA_VERSION }}' + format: 'table' + exit-code: '1' + ignore-unfixed: true + severity: 'CRITICAL,HIGH' From bae7d0c6db7e140aa0630713ab5aac1bfd7b6091 Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 6 Mar 2024 08:39:26 -0800 Subject: [PATCH 57/72] Fix bug where app errors after selecting an asset view and project then selecting a different asset view. This was caused by an extra observeEvent() nested inside observeEvent('btn_project'). This made the app download the folders when the project list changed, instead of only when the project button is clicked. --- server.R | 52 +++++++++++++++++++++++++--------------------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/server.R b/server.R index 6120cfc6..61c0e89b 100644 --- a/server.R +++ b/server.R @@ -375,36 +375,34 @@ shinyServer(function(input, output, session) { shinyjs::disable("btn_project") selected$project(data_list$projects()[names(data_list$projects()) == input$dropdown_project]) - observeEvent(input[["dropdown_project"]], { - # get synID of selected project - project_id <- selected$project() + # get synID of selected project + .project_id <- selected$project() - .asset_view <- selected$master_asset_view() + .asset_view <- selected$master_asset_view() - promises::future_promise({ - try( - { - folder_list_raw <- switch(dca_schematic_api, - reticulate = storage_projects_datasets_py( - synapse_driver, - project_id - ), - rest = storage_project_datasets( - url = file.path(api_uri, "v1/storage/project/datasets"), - asset_view = .asset_view, - project_id = project_id, - access_token = access_token - ), - list(list("DatatypeA", "DatatypeA"), list("DatatypeB", "DatatypeB")) - ) + promises::future_promise({ + try( + { + folder_list_raw <- switch(dca_schematic_api, + reticulate = storage_projects_datasets_py( + synapse_driver, + .project_id + ), + rest = storage_project_datasets( + url = file.path(api_uri, "v1/storage/project/datasets"), + asset_view = .asset_view, + project_id = .project_id, + access_token = access_token + ), + list(list("DatatypeA", "DatatypeA"), list("DatatypeB", "DatatypeB")) + ) - folder_list <- list2Vector(folder_list_raw) - folder_list[sort(names(folder_list))] - }, - silent = TRUE - ) - }) %...>% data_list$folders() - }) + folder_list <- list2Vector(folder_list_raw) + folder_list[sort(names(folder_list))] + }, + silent = TRUE + ) + }) %...>% data_list$folders() }) observeEvent(data_list$folders(), ignoreInit = TRUE, { From 78b9df6966888b86fba20a4799a1d5ae287e6e0c Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 6 Mar 2024 09:11:33 -0800 Subject: [PATCH 58/72] show empty folder warning when downloading templates. --- ui.R | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ui.R b/ui.R index e62af869..fcb2e85a 100644 --- a/ui.R +++ b/ui.R @@ -246,6 +246,11 @@ ui <- shinydashboardPlus::dashboardPage( id = "div_template_xls", height = "100%", htmlOutput("text_template_xls") + ), + div( + id = "div_template_warn", + height = "100%", + htmlOutput("text_template_warn") ) ) ), From 82f10629c584d3df7f640daddff9daf6d06b3c8c Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 6 Mar 2024 09:34:51 -0800 Subject: [PATCH 59/72] Show warning message for folders that don't contain any files when downloading a file-based manifest. The existing code for this wasn't triggering because it checked for NULL file list, but the value is NA. Move the logic into the observer for the template selection instead of file list, so we can only trigger the warning for file-based templates. --- server.R | 55 +++++++++++++++++++++++++++---------------------------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/server.R b/server.R index 6120cfc6..e333e764 100644 --- a/server.R +++ b/server.R @@ -455,6 +455,33 @@ shinyServer(function(input, output, session) { selected$schema(data_list$template()[input$dropdown_template]) shinyjs::show(select = "li:nth-child(5)") shinyjs::show(select = "li:nth-child(6)") + warn_text <- NULL + if (length(data_list$folders()) == 0) { + # add warning if there is no folder in the selected project + warn_text <- paste0( + "please create a folder in the ", + strong(sQuote(input$dropdown_project)), + " prior to submitting templates." + ) + } + if (is.na(data_list$files()) & selected$schema_type() == "file") { + # display warning message if folder is empty and data type is file-based + warn_text <- paste0( + strong(sQuote(input$dropdown_folder)), " folder is empty, + please upload your data before generating manifest.", + "
", strong(sQuote(input$dropdown_template)), + " requires data files to be uploaded prior to generating and submitting templates.", + "
", "Filling in a template before uploading your data, + may result in errors and delays in your data submission later." + ) + } + + # if there is warning from above checks + if (!is.null(warn_text)) { + # display warnings + output$text_template_warn <- renderUI(tagList(br(), span(class = "warn_msg", HTML(warn_text)))) + show("div_template_warn") + } updateTabsetPanel(session, "tabs", selected = "tab_template" ) @@ -528,34 +555,6 @@ shinyServer(function(input, output, session) { }) observeEvent(data_list$files(), ignoreInit = TRUE, { - warn_text <- NULL - if (length(data_list$folders()) == 0) { - # add warning if there is no folder in the selected project - warn_text <- paste0( - "please create a folder in the ", - strong(sQuote(input$dropdown_project)), - " prior to submitting templates." - ) - } - if (is.null(data_list$files())) { - # display warning message if folder is empty and data type is file-based - warn_text <- paste0( - strong(sQuote(input$dropdown_folder)), " folder is empty, - please upload your data before generating manifest.", - "
", strong(sQuote(input$dropdown_template)), - " requires data files to be uploaded prior to generating and submitting templates.", - "
", "Filling in a template before uploading your data, - may result in errors and delays in your data submission later." - ) - } - - # if there is warning from above checks - if (!is.null(warn_text)) { - # display warnings - output$text_template_warn <- renderUI(tagList(br(), span(class = "warn_msg", HTML(warn_text)))) - show("div_template_warn") - } - dcWaiter("hide") }) From b7d22751ec241c1e7bdb7e5c468c679c4eb3d1c3 Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 6 Mar 2024 10:06:35 -0800 Subject: [PATCH 60/72] Use the docker image label instead of git tag to reference the container, since it will omit the leading 'v' --- .github/workflows/docker_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker_build.yml b/.github/workflows/docker_build.yml index 333e0dc1..1ca29ebf 100644 --- a/.github/workflows/docker_build.yml +++ b/.github/workflows/docker_build.yml @@ -57,7 +57,7 @@ jobs: - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@master with: - image-ref: '${{ env.IMAGE_PATH }}:${{ env.DCA_VERSION }}' + image-ref: '${{ env.IMAGE_PATH }}:${{ steps.meta.outputs.version }}' format: 'table' exit-code: '1' ignore-unfixed: true From 8b54f6500b2ead4ef0c56694310e1423a367dd3b Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 6 Mar 2024 10:24:20 -0800 Subject: [PATCH 61/72] Workflow is failing because trivy can't find image. Try adding github PAT. --- .github/workflows/docker_build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/docker_build.yml b/.github/workflows/docker_build.yml index 1ca29ebf..589db778 100644 --- a/.github/workflows/docker_build.yml +++ b/.github/workflows/docker_build.yml @@ -62,4 +62,5 @@ jobs: exit-code: '1' ignore-unfixed: true severity: 'CRITICAL,HIGH' + github-pat: ${{ secrets.GITHUB_TOKEN }} From b684f1e0fe5bb69b44cc2e3a387e30a0f4dc1e9f Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 6 Mar 2024 10:46:30 -0800 Subject: [PATCH 62/72] Trivy image scan is case sensitive, set image path to lowercase --- .github/workflows/docker_build.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker_build.yml b/.github/workflows/docker_build.yml index 589db778..761ab291 100644 --- a/.github/workflows/docker_build.yml +++ b/.github/workflows/docker_build.yml @@ -54,13 +54,16 @@ jobs: build-args: | DCA_VERSION=${{ env.DCA_VERSION }} + - id: Lowercase image name for trivy + uses: ASzc/change-string-case-action@v6 + with: + string: ${{ env.IMAGE_PATH }} + - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@master with: - image-ref: '${{ env.IMAGE_PATH }}:${{ steps.meta.outputs.version }}' + image-ref: '${{ steps.string.outputs.lowercase }}:${{ steps.meta.outputs.version }}' format: 'table' exit-code: '1' ignore-unfixed: true severity: 'CRITICAL,HIGH' - github-pat: ${{ secrets.GITHUB_TOKEN }} - From cd71ff50e5ab7679b52ac38f28a263c18eb85805 Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 6 Mar 2024 10:48:06 -0800 Subject: [PATCH 63/72] give step a name and fix id --- .github/workflows/docker_build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker_build.yml b/.github/workflows/docker_build.yml index 761ab291..88be5420 100644 --- a/.github/workflows/docker_build.yml +++ b/.github/workflows/docker_build.yml @@ -54,7 +54,8 @@ jobs: build-args: | DCA_VERSION=${{ env.DCA_VERSION }} - - id: Lowercase image name for trivy + - name: Lowercase image name for trivy + id: string uses: ASzc/change-string-case-action@v6 with: string: ${{ env.IMAGE_PATH }} From 40c6fb850dd2833f3cf6dc49e859251addeb9f6e Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 6 Mar 2024 11:00:42 -0800 Subject: [PATCH 64/72] Remove exit code for containers that have vulnerabilities, since these are often known --- .github/workflows/docker_build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/docker_build.yml b/.github/workflows/docker_build.yml index 88be5420..ee3eb6e7 100644 --- a/.github/workflows/docker_build.yml +++ b/.github/workflows/docker_build.yml @@ -65,6 +65,5 @@ jobs: with: image-ref: '${{ steps.string.outputs.lowercase }}:${{ steps.meta.outputs.version }}' format: 'table' - exit-code: '1' ignore-unfixed: true severity: 'CRITICAL,HIGH' From 57309a8a1e3dde2957bddcfdb9edde4b1f0cf75d Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 6 Mar 2024 12:24:58 -0800 Subject: [PATCH 65/72] Update sage logo --- functions/dcWaiter.R | 8 ++++---- www/img/sage-loader.svg | 15 +++++++++++++++ www/img/sage_logo_mark_only.png | Bin 0 -> 5723 bytes 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 www/img/sage-loader.svg create mode 100644 www/img/sage_logo_mark_only.png diff --git a/functions/dcWaiter.R b/functions/dcWaiter.R index be5c537f..7b6c1c8f 100644 --- a/functions/dcWaiter.R +++ b/functions/dcWaiter.R @@ -32,7 +32,7 @@ dcWaiter <- function(stage = c("show", "update", "hide"), if (stage == "show") { waiter_show_on_load( html = tagList( - img(src = "img/Logo_Sage_Logomark.png"), + img(src = "img/sage_logo_mark_only.png"), h4("Logging into Data Curator App") ), color = col2rgba("#2a668d", 255*0.9) @@ -40,7 +40,7 @@ dcWaiter <- function(stage = c("show", "update", "hide"), } else if (!isCertified) { # when user is not certified synapse user waiter_update(html = tagList( - img(src = "img/Logo_Sage_Logomark.png", height = "120px"), + img(src = "img/sage_logo_mark_only.png", height = "120px"), h3("Looks like you're not a synapse certified user!"), span( "Please follow the ", @@ -54,7 +54,7 @@ dcWaiter <- function(stage = c("show", "update", "hide"), } else if (!isPermission) { # when user is not certified synapse user waiter_update(html = tagList( - img(src = "img/Logo_Sage_Logomark.png", height = "120px"), + img(src = "img/sage_logo_mark_only.png", height = "120px"), h3("Fileview/Project Access Denied!"), span("You may not have sufficient permissions for curation. Please contact your team and project administrators.") @@ -62,7 +62,7 @@ dcWaiter <- function(stage = c("show", "update", "hide"), } else { # success loading page; userName needed to provide waiter_update(html = tagList( - img(src = "img/Logo_Sage_Logomark.png", height = "120px"), + img(src = "img/sage_logo_mark_only.png", height = "120px"), h3(sprintf("Welcome, %s!", userName)) )) Sys.sleep(sleep) diff --git a/www/img/sage-loader.svg b/www/img/sage-loader.svg new file mode 100644 index 00000000..5c34fe71 --- /dev/null +++ b/www/img/sage-loader.svg @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/www/img/sage_logo_mark_only.png b/www/img/sage_logo_mark_only.png new file mode 100644 index 0000000000000000000000000000000000000000..127ffadd35014bf8991e601370b3434dda28151f GIT binary patch literal 5723 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 Date: Wed, 6 Mar 2024 12:26:53 -0800 Subject: [PATCH 66/72] Remove unused logos --- www/img/ADKnowledgePortal.png | Bin 41928 -> 0 bytes www/img/HTAN_text_logo.png | Bin 22707 -> 0 bytes www/img/INCLUDE DCC Logo-01.png | Bin 185531 -> 0 bytes www/img/Logo_Sage_Logomark.png | Bin 4873 -> 0 bytes www/img/loading.gif | Bin 57353 -> 0 bytes www/img/logo.svg | 16 ---------------- www/img/synapse_logo.png | Bin 45777 -> 0 bytes www/img/synapse_logo_blk.png | Bin 20190 -> 0 bytes 8 files changed, 16 deletions(-) delete mode 100644 www/img/ADKnowledgePortal.png delete mode 100644 www/img/HTAN_text_logo.png delete mode 100644 www/img/INCLUDE DCC Logo-01.png delete mode 100644 www/img/Logo_Sage_Logomark.png delete mode 100644 www/img/loading.gif delete mode 100644 www/img/logo.svg delete mode 100644 www/img/synapse_logo.png delete mode 100644 www/img/synapse_logo_blk.png diff --git a/www/img/ADKnowledgePortal.png b/www/img/ADKnowledgePortal.png deleted file mode 100644 index 9baf7ef954ee8a4675897377b68c003f32ef70ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41928 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 diff --git a/www/img/HTAN_text_logo.png b/www/img/HTAN_text_logo.png deleted file mode 100644 index a32ecbb977bff1450178e16ebbb4a0b762c378a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22707 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 NKT&>MC~X}0{{Ua2|3?4- diff --git a/www/img/Logo_Sage_Logomark.png b/www/img/Logo_Sage_Logomark.png deleted file mode 100644 index 722ee5c483c83ec4c29d7858f84f4384d96b1796..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4873 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 vKow;x&CDH0qUB$_8w;6lGp&=_iX diff --git a/www/img/loading.gif b/www/img/loading.gif deleted file mode 100644 index 3d5adabe825dd6251216bada4ad9e1d7fcae637f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57353 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

!z_ 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 - - - Synapse Logo - - - - - - - - - - - - \ No newline at end of file diff --git a/www/img/synapse_logo.png b/www/img/synapse_logo.png deleted file mode 100644 index e3659920721a15cf3820ef9c71cd7476c8781d45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45777 zcmZU(19W9U(v2EM7Z5xw`lZkEHP9~Vxww;_e-+#Y%-@n$|Yc+Ov zRdrQ&RW+j&uXRMV0@hFaN>?9L&F1E8Qj>3=B!qN<>6aN<@TI(b>V= z%GL}FOfo7>16EaK96wh_S;{g9P7=O5id-@ST{wo6RILszSx`8Ng)DL<$qY-kGcvHF zu#!Bw20F3Xm?_5CgMkTKRegCl7&(pedw%6{x5rk%%+%-IEO6W4hsPBXn0GT@IU8UJ zmefF*R3;M1EKWhjB8eCr$}kY=BM3f$DWhS3-vlf*=ool7?PiI57@ZY;{(cLhg@Gu@ z27sXhoJs^|W+OaFz&yVj(9(ego*+K9EFk`-k#@i$9iKGtXLfA8UeN|DzT>~$js`YFD z^=ERAjqjTQjO7@u$s(c-|L|?af*J`yI(PS&kOG8;MNy_o@DX?j4I{+t$CKQ3=7I3_oq;&m$o1SqXvtkGxYYuzGKBqMxHYIv zlDd6ze`fS(QX{CXxoyl;F!o>^(_;shXY3Bf7yZ?qs4?5eZ5cpvNr}9DpbpK{)QTv) zBJ5}tW3uJ2pWkQYVwYD8-G|BLF9PFalk%gtQH%o$zWq=gOpu#N7W-y-Y4&;-{&dN-o#!nvPM@|D1AoLCDuHUQROo@yp^i3f| zTkaaBVX-Le46l8MW$2X@|Db;x;gNnkzZLTa&U$Fu>v&M}-cTjZuhv9FE>^t=cgO4$ zSrdIQ%4mqj7-}Amb1>uvj1T6Ctj=qvr)^uX$>0J$0iGxnHq-`+a(5ZiDe5B2SJRMQ zQ5b->md)BbgXa-grSC~Y4EIXLIWsgJNFadVZM@$<*NU^~+>}(=07`!+;r3N?t0o%G z304kQ6sD2io>_F8f5bOcT6#D~uri(|tfI4UJkSAU*U~Zs&Yn0h)Q7F;U$D6&@x~Ah z{Q^hi4Q@8XsS}~)Yl|i>*O(7%g>vI-Pn7t`0p>23RwO$=!#p!SC;Y01FiNrxfXXia zgZIO!r7UnboVPb|IPE3^VB*#0(*~LU7H`>7t|9yQ3~rSBUZ^7oO{(~3dpqDJhVcy& z?7a#+pSJgekZJG|?CQ}X{T{19I1WX_4N4H&`zG!Obb22)SHCY`ASWCc87W~bxDzS- z@1XIz3G%jFGee%A&_^LZ6v5Mjmh$m!!Ls@|>M$<5GVs!)A~uxxS43fcB7^9MgmNYcae+1G5>Vp zk?{T;)gR0z%BJe3q9&at4OgDcAYx&KQk=Prx%1P})8~_GSGrN7~1yGrh(0<x)ZY*0Q>lmk|ZQbTh zRlkZzazThuTR~slqGQUg(_jQrtkL8S^Ghsr>~w5OtUN_wQW4r;n$fZW%TlFIrG)x| zTbg~$ee!+$eUTAqsu5R1=S;7u;wk>A^C^G`eRy32Tm(J-AFhMD#8xU1IbqpQsza(y z*_upWX0y!jtfOCyoOT@DHsM+AKjT=l>|3@jerr7|78QVtyoyXlT;aV%a9dv)=Nbwu z_@=x<-|HjF#7H8R4{OKlV{fL*PNGf{PO7CxFmzVostc(bSE{K?RDGG^HLg_gsbif( zRgSK0@JwhMb~T^nP*Jv=~PtL+NEF8u5+vt^U`(JyEk6oUwqY-uDq|s zT>M?hYY8~tIY~UbDH3TMRFS}ts4=NG3E3y2?og>)U@PS*t(+0HFgVsdcALr2Rm5S! zNs@`16w_E-T35U1m}xe_HTt>DJYLsf#JOQ*lefoHM})|O1LT7fgKLAxgDHcRgV$m!qNWmTq7S0pVl%OP_+pXK z@!G_0AvXPoF6Zt1CcYz6#4hB&uyb(rh(1Y2D8;cCc(93h%`YbEJ&Z3+DC?)4NaG1w ze_YvjnS3<8Y>%Lg4kuLNJ#!hE4pfCMM8yt$k6Opr{uV~XAlH#|ky<5bFEcNb`BORX zj)R@vO{~KCBl5O!G*5w52BWn3cgi1?Kdrx?<>B(`yoHZNYop9CY89NbRoPB2OdH3& zQUG%ESp!)OoFR!xzv}t-DVX9lM$e}Y%$LodZn!_#KP-Y#`)P$Tm=)WEU%t^X+lVbM zT=ZR}t?CsTDixRMOrdGS7#xTm+Kzc;5oC0-w*r~i9W(^EffS&?A;n}mZk8oy>-j~L z^2#RJitHnx-D4B6R+DWEVUj{}D<*C~F?<` z6dpVVFG5!rV;A2`lYF7Riil*|XI5Q|B!C0$H6xiYnQRRX+AS{&XAgt#T(GXN(y&Ny z?s4+otqv5_fR9Y$+JAZ$eNNxZhRl-9{${{3ZMO^(2dsEY7c9x^_)GPeXpEV zkFVIM3-1uG7uUj4S!!6ezienGsT5oKYb|W!zVz!aV})O*eBIUETjFCJ0X>JR?aNK$ z%W)O~1t-T6_oA9TxjpU1gQv^H(L(RbmvZm0t;}$`f)1rl+B$kmPT6yL?Y4c7pB3a< zzU9dpi_>UvjuEd8{w6->mGM=@3bH$$JLuJBr1tN#=(W}Qd1tFr-e=F+XYA*poa91m zNv^q4V*_P%@qXV=NV{tA>h}PGul41SWmp>&JQ8j1pWbZ`j-aGHif)NwiOvKw5}y^0 z;>)Mo+tJ!wT#v#}(}!`^QgV4B;Ix3>f$UCZh{fkDG1swA&1={5YYC!0&J*bB@%_vF z`l%#F07r-MRnPhochl*``R33>W1uFxW1`#pOZ%cZ{(Ste!`4qv5ib?T`_t+!9i}gu zkD}|RF5XbyLyyO6^)1$3jc2CgfJI>08NGhkO}FJv9?3drM62EMImz5V=ZyNg;% zc`GGW0Jw{}>b{QB`y`P9B}?-vm9;a6bct8k3C8uOJAW02Xi_U65K z-m>+w<>PR-{m{)2VDV* zJUs!ibEpn>Vg<&`*nd9=HO;TU5P4)@A-)4Nn$}Zf*aBl4h&XGT;YR4QUm-javR_e^ zc>IkT=!IFjLjH5?HvC>gMsmR^8Cx%nYkK~dfM6AyYP7Olm8C{&%gYCikZks{|Cg? zhM!zhPLWi^!P$(Ioso@^nOp#Yl$4au+0>jzSycSL=>Pus$t_)79eJ3TJUl!YJy;nX zoGqAGxVgERn13++_`&cGg2Bbh-qpyH!QO@9{}B0q>4=)Sm^fQGx>`Bdlm3UUk+FlD zD?d5;e;WF~-~Zv$%+u=sYsuc_zheCpkm)})Oe~DdO#hemKUBW|l=3KAd79a3idxy3 z*}ME}L*NG+7vKND|NmwilBb(a7F zAJhNsdI5x76mf%pqd{mTs-XHWh4|0V{QKPh1)Be+|ML393FPAYU|@n^Qldhtp5PbV zu%5bqlc?S}@sabB@VPA@NWqTisiKs|)zi(SS_s`QGFR~u27hmII`H$}AB8zQcT3GU zr)G~#Xf;SmV>bSDfx!iX5S`)f0o5X|X#V;wh-w*(DTuo1_r9g`yjb2_A)mujs#|&W zH6jQG!;Fd==>O&N2ni0(`0#kU#2)Cc0S55~yW@QS8Ho7Ay3^IB`!^+>sFNw7)?JWX5QMT zj8fDV_u{_lgb(sw}=F=;Van`nK?k5)3>t~+hwNduRS!Ng|SkJ`4Wjo5`JCQ$|1m( zitRjiMydxb++40~fw>2NwR8C&31%Pv5k_n}a!2e!*MvUA6m0b9%9ZrUhEPGk?%Qu& z&P#b1cG_S32BJQ6puauVcAMoSbfv2+5hT#FZQsX6$*?-Ag;e&L1j-xA(jf0VH#|5u z%0Zs+`+b0SoZ#zB8ZUr67%{&hs(2i%!7^TPz*EltD{=iuo((&=d?cEQXeRlZXr&;X zgf@_ek&q`ZyVrdFQ5`J3_!#~ue9{eP&26-xtn>AnCn10NCHojKc6J}H3VyV8uAcHh z{R;dZV3Gj*ThYk{18@vB9LfaOjU`4197k*&BVgzfv;vxYK}&0UK^ylk9F>8Ytyoynn_CMizwe|j&2Pj+H^Wq-E$OuwXp$2_Dj zeO*@kzP4fYz***jjS2@fZHlMQ1V-Ka5ur?KY3*gbW}(@8kfm#6twWoU3#$)|;*LZA z*h0ps*u2igEk^2Xr29V>x2^e)ArkxJGDS@CEwD zz{^0bI&5)vtfP%^5*WQV|B}XzG>a-9mkBw0VDI7c9fBtjh7r}N!d<{WpV z;tkIDo2iwq!`PO^TD#lE2FXGnDWd?lq6)>6(RXD*TiJfcXOaB%KMH+uYZ1jbgcC$v z$*_~T$-Xm=K=-*QMn_-Cpr|dHt=^TlycT~?u7gfHd41&7aE2Y*n6>K0!6|RJju~mG z#5#70^Ctj!mHity4w8B$u=(Hyqvm?&l26ZRHY5oL*=nD76)^lSYq~e1EH8gyA>QEZUia8~ zIZzUz)4{Rzy)?NG-$-NZ#>)rjw!i0_OJbeCTX7!`^yqqM*|l%~Lf9Y6hJDB_U46-- zK20YljsCBN3=MGYI8fqbK{?jh_Ok@bjkPo>C#xK+m((4W@JdpBi;^X9u?gyc*>8B~ ztB|oHtkqdT^D*3teOAQG8TCxAYBrQ38Xzf0?CFg`!V7lrH3vVMo$goA2S#~p zZ_jcptSh~*b_l>QV5ulZ)VD8x3H;EE2yZpmMsCjAh0}lc`O+busR}J;7)Eg@6Dp?(Zh+up!6#nrdC<8XT}f+tklpY^IL%jtEreH!NL{5m^1Js zv1EiDSrNwEv%$XiVpw;kZd>z+dd$5hvnh3Jolp;n8cHdBBmQnF2wK%Uv9^hcQiw7$$ieRn2u{>yoR9e*~1+U)qB=0iKL zyG`l3Y%2Vu=0bWcEY5?M1ofmr(;#sLzeedar7|6CiFJN8sKJ|+JS-F>! zNI}j)$od=&%KZ=J_31ut9UyAKLB!^Y`u6;Jrl_C*E3emqCpoLN$oo9&sNNGIWd0Oc zLc~$PUnMyjGD60F;_1B;WP(w6b7-{`dC4H=tH|Wt!MjuZ$MvwLPeH)7pzu4`^9Boa z_s6agcu8zqUuvfLou`b<$}(I}r7=RN(8Kgl=E3JMa^!#b7%0og1HqcKQGNJ46R${&td zh!!&%+f8?zM;``$01q|FKas%3hI9gZnp8x4OEy*7*^Q`Qyvy1+W6&AQ%mvx%6&jYu zKEYZG)_jD0eD?wn2CYeVj%;CmW*v*KIn&!W3qx zcm^$8jrbr#zbplG+1R-T69ue%y#w0`J*cyTOI@jTG1Z~jF%^+AJD`AD1W`Go)^p2S z49l`@Pw$N&O4Ob@u&SR}3Dk|Vh1CzgZ+ZKOA~`0M#WtjU&o6oIDi+YNC-#f)I4$If z)6Os-Y(E8p-+bo&PJ&V6oySBC=x>L->{gD>%MQ;iF>vR;+;QrEcvQE?#K?JiApRP! zI0IJyFq%?T-bd22>^N>}z)v}ElPf|S!v;`moK7w9+!D`NW(`wy}hq_#5mzyraKAP zPvmu`oNJvvXy|A`XSt|sp+~!!kV#wy`mDyUoj%jPRWoJcuG0dZJZE$3t3iU~Jbb07 z*Sb^v@2~`l+6(de(Ho-wmY>JHm*Z5Z(lW|{W+P@nhw?TZlPIUmz;*0#({9Q}xSOF; zdX5F1DgIVMxANO&vJZ@$XqRn?Zx3og-Wi$7Vim3JzwyF0S5e(R>HJAj~%JyHJ%Ex?$`d(1F(Z$KE5M$(<{a8*K~srO`yE%J>sVgE zc~UpXzgI81*1VUzGrmkh?sRUi226S`XuYLxW3Z=-Qb3c28P$BeENBQGR{~7Q3#|DI zb@g12wGY!tIV$05Q!R`J3&d5I-L*$jzjv@$1Cg=z$U|qWP1NY?#oKg~VE(1Ok;O(#vvCEuiH3y_rp8?+vx zbVKY%#9wj4CCN%^g6*$2W11NUYw!Iv`ztd9s6Q8+-$-Dmt%{hj5xx3twl5)})abcB z2CCCL!1o=z(PKDRVx1@ArNCqHNLh{+3kd}1pnVb#=f(mvn@Y)u}(GmuUk+`p=HPGA| zdDSBevuZ%@mNGRAE;K?yw5Zh-(aY@-N_M;A>~7qPi^~mgY_RDM7gMfwQlyvPx{^V^ z5v&KKQ+vo9K57u8Q0wlh$7CCAlHjun2yhD=A_%Pw=m4`y>lG6(uqgWV65_+fJ-KQL1k8B! zc`-tWjvL&W&RKfDUT1Wz(r;_r^jO9i!n8i50`Bsy-d7=@GHrd|KDnL zk}hUW=*fn)dbR@en!A(}V;F5sQCw@te~wB3{#*g7uqOUqRUT*Jcn3&J-a%)sgNcy; z=hnjSVU@L^p0ovFaseMraolxfMm{u5qHr}M0r^;@zLAg6>@W?JO9EV`_iXeI^JURG z=3b^?Q9_K5NF$1A#$#V8uiMfZ|7d7wcV>gwlNL}Aq7tAFL#H#4Qh#pD?9L|Nf1A>D z;2V0I4_teirIj9RIDnaY)Dx7Hf#%`fCdNb$4f;0Ys7h@(Dn{}|!dPS>AtIWf$_rH) zc_g|Iid+k*T!c-CL>eTil@iikcmLL*Gru|@`Q414+=f3qy^NCngR)O;0W^h^z@p;(D$3tM51X5nj^@rva4ZfDhDPDUt zMzKIwmPm6~D(MD0FU(|-e8JNx7)ezqg~8dDCY>R@-~&^y2?IBO`){B} zD2n0$nMGL8AB%L><_89-Rt;vasx17B1!kprE?j3`|E4SQGwt`eg~2}jVp&gS8N2kj zywlm09btaz?Gb%8FY05t7#ptcQWtjL-Jb&+Bp8~0v#c*U`j<=!N$r1ptbF_kyNY^n z(LPa+3}&;^qnVgag3lk`F?rf!>>pq}=W}=vXNjW+w;+$FHi-al-txn`HH%+N0`=&v zZe7rv40%~y?r1~A+N~oS3Ofc{H4$dO24@Udl*6Ua3=(^cumd z3&q4L}AUQn}-&4DV+u`!#-Hw|A_+OBWI2{Ye`|m!! zTtk+Z)7p8uTf={Q+aM5mw#8soxVd4a%!HZ4#0sq^248^wPUzEecB=Sa<+DA`!?qvu z57Ms0+7|7AJ7Tt`TlvhG0AOmk-usLSNBNrVj`gp2KjAXe4^9z3PcQ6ygoT^KS2;N2 z3MYeJTgwS~ zYJl7+i@%)UeAT&tHa*2ctrplS2jaK8w#_Uis#%1In=1r-=O>%06KYC{{a%6O@I=;Y z(zZ@`zfFGMZ{mTa%u=CrW%|Aeh+1nuw`)cTP2Qxx#-}6uGM0xZZU;JbE3^hbU)u&I zF@k4EsVW|3M`!;UkoshE^=U5jDt!dpT?tRQU5cuDu%|e;l>|m{C)L+;UE~HC1gzMg zJ=;Hp0N+5~hu0+)0R5jSky_*Yp2q6D_z9Q4>Bbh7Vdl;@qG(QIhwmkP+cecgPJZ>u z1!;iE2~sh`^Px0f(gpQH(0r)BEN$=^T*!7y+uTFMcb*i|fz&7ZZ|rzdg}8DQ9t{@| zg&U2lF`aWuGsAB40|3V^8kG8?#tQJ>=M%OF48cKd;cZ%;pQc>yX|DM-=_b1@`6TF= zk=$WXn#lrz>nRiSo_qQAj9hF;(`4gZ%W2`Q@?K6?wpi;Ic~9?IAS2na*NtS!-%rFM z_MX&h1lB9tx>L!#kW9HZ#d_e~I2r15%Rj9B}^$LYtT#~qAv4S=SZ?LXI-g#xM{@=))zU8Yc z8W=%Eey^T>`&urN;_F{nljen_2lVQuuKA@8sB7!%XahN_T`E6AUDiSdtEE*w(WAe4F`4Bm{9 zb5?A=^%c*tGmu~5K1%ejzsUgPpH;LI&78%zJ7qQi-J zL%2QqLLuZ?2xg=TiR>Lw|E}o8gSn`a1JWYIuE{+dtcavIsXnR`EgTZ9s30cUs-5ZU zFhL4W{+^KnJdFQo-~oByFt7}pH|{!G%TR*F-3(4Fj0s8Tb4O`9Li^$9fZ1}%A2VYw z=P+JSl2t|;+D+0#(-Dr8q2fokO#O^H=f%D8v7^F@=5i#)mVuMiy0>@hukdZ+C)#sS zTwGa2Rj2iPQ4z%rr-6Rdiwl!c{t+8P-N*|RL$#yf{N~GW5}a>cHN`CxqoQ4qXeEGns%fD2eFMof=aaqlGRe$*eWfmc zNR}|R4FmKx#VF3Tq{)$yJ~ZCZn85L&ihHrInx|{y0lJt37&XNj;Xp6)a-$^Ro_R79#&5!`sR=Q~mK z5&^n~K8n5fkCtW*w7_4U!8>>!{RwJcm3mocPi@|Nw$)azm=y`RQ@(WV@)kYHDH#?# zrx6Pi55M0ov9L;Yjb7iQ@||@#@IA{H7Qf?p{PKPQ8l8o}I_0&jn-A^Z<5BO})0@1} zWlF@Y;-CkGV`^VMuPZsHM-f}sK*bDL%Tk0;ou@pTSj)ro+?GC*7QS$vbUH%$O(UmU zqL)mQ;_$}@_!q%Ysu9i659LfcJ8dtbG+lZJ=>S{N+GO|5tgReusbKC%`amy-WT~mC zHir9}nB|(Ms)&s8cL8l5{B7nu>Y_w~qW4}%j`#mwDdEhtgzvmdG%9TkxM3%2OgI5E z;0Z8byJgEIgR%qUN*=XTjO>Y76>{@NgFzUD0-na91PKS6#$Lkg9lx^L+xby*xuGpO zRc?&@@bx#xbe$JWY=7XHR>bSa9oA%FV_tZ9-t;zYjW!Fs;^cM^w3>l`m-A8dG39-0 zuOshU3K=`FT`Z{)v~*-1m~1WB-C)6}0-vdkFq;v#xuCBynL9bm;JoEx;LsCB_8QWF z{zLW3#Ov+#iU@e#ySG`WW8S0hn7KL>#|F2&Lh5@~IM~r-@PI|wlO?cNqSqI?Rxxq& zlHRMpr4J)J{q)P}sow`7*8+00RuX1SGfXOKSC?UYeCHjHYx)p`LM{2&~3~92yx(9+xKhnslQcT23aoDQ?;4Q zfC%(SKI(&c_>!jMP}Xrbj0D^tDuBWV9}+h=CIJaY*zF0J%s+$!bE^~txQ=CuOK!7E z@@rM|{4Oh?UmDqsELWav9-5ukziXj<7Ol=n>WU9y5yqEMCKRyV+kZTR?n}8`!gZ)_ zw}PAH>&Ws=bg5ngpkH-*YdITJ0r-~fk@o+&s$?xd(QclF&v`jB)64_D?# zO+I!?G8BwC)rK?Fv=sEl$4$+9Q21Y1fJNj-(D!Cf=1St~DU@V0_!*th#KVC2(tt1G zWxEyrA%qU*RF1fA*h5_tEaz~(UBbe0F>B3S{u5d5APH9S2H}ukIjXgG(~D}&yp3ti zk-xxJLRKEm{O19wi8v_9AkEuy9Pl1f=bt`Zt&2Y?Jr)9xBBRAt8i2zt>*v#At@#X@ zY+59_T}8Uc!nXlQy@_+AA4@pthSG;JCk|D=HJ_aP`A}!me;W;Qll(=Uqd66xFbI7L zx4C3qWpj{hIHP{eVt(w;DCSs5&R81=13v<5TeMB&La&=V*Km~eV(mxRjM6{^Sj5=FO zX7xoGkvzX0*wYTEUj4oseKsR&wddFV8M=Gq@4%S;Y=ta8e3T2#Ww4&mOUoB~)EI#Z z^uh91(+=ePdpY{I$Cr9f9)vD+MdjM!goVY)1Go3NNAkw>(mzSL;?#t`#6F$!xV!0x z$qo3CJaChDofrIYwq2NML&~QcwY)YP9O+i>`Q`adLdcl`UNgSdtP5JvZ)RM&f3;Ef z)Kb#?Y5Q96(zjMj)URcd+3Z((Z(b*1=8ydI;{1lJ2iP~y`UAbICH65;XcfTUz=+^z zxV3<}iFi7D1m18dy3Op_Aia>9TI_krebIm82dGH8MVT~cMP&%2 zjzAFdWHM0!1ds1}kZvdaGL_&0m@cozA~@tr#t$zy0;3rYfT709z+uyJJ$kdPU&+EQTw zTqWBe%Guj}0UyVOF`q6*7H_cG)Y2ODwNdd!RBrF);VvrTMP;%MUMKD{va!RO6Xb_y zL3XXvE`VA9FdLLH(OZu6l+(ymh@p{;-md=j{%hw988edygK^Dl2UE zyWJQ5UAg_^I`snWBleRSvm?~#@f1CkP~ewxQ%~pOY?B0kO*hA<8QMy5pK%?`-4b>$ z6=b4^dx0x)BOxTD=4-wm7YCSKJ+FY*+G+TOBFI~6z#+x{fQ@BMMMz8(K`wJ1!*KP) z2isR3iT&@+F>RxGc=9pIjaFh%27PY40#&Y_hFXsO^A# z7JZqpzdWsSeKUZy4S`)S>;qbpk55u)+WF<`s{2wo*=xrz6W^p4Vfy|XI?_{4D?SzE zUkS*~%n2W&oV1mYISdClcKvaE;F`%}Bx7dp9UI|+iHLKg=Vm#l0sGQxWCJLS*dMBj zrm~?p$U`1D{@c zHoR%m^InY~4KN^S%9uGwwhnES6zp+Ts*9u!Y|a3f6jFugK%Pi&O0f3R=Q2w<6#29A zX5rXgEtuDt|;S=yaoYpSOU|C2z8L{ADmCUfAu7;ou> zzm;TjQTLbhg^Sa;@rd@vq=Qa&K{R=Ts(Cur@Ds8_fU+=s?w9iqMtfiETd&5OB8*e0 zm*E840Md*?fyXE-%_Adm-AAobgR#CuN0JGQ>jA)4^=LcdhC=RwgYtw%VF2q5FciGe zYXRei`kvdz(HqfQZ7NnKxf3SXiOQS%>(LD#8$~CTT<+G{G{&$cOcs-h^Vx7VH#v5l z_;FWv;k&lpBl;5hyG&3+^>)Eu7m9;fgU5ao%|{lqal6O^804f}f9#NbSNT~mND=-j zGOY0268zL_V0`!)zN`BK`fs*l%wLmB)c7SkjM8#biYSUD z#?y}84PNqci4#UG9!X8|ag#OyOqY}ZC&uVBaqF2J5e+$p8A4u>FC~-YOmm9}PigkDe^WGs_jHxyM$%UF1F=2( zMxS3R_tO()sfhwct7J{w=n?uO|wO3v3x!Ov0)jv;)YcaNL4;Dw%drwpHRgv5YM=_M%zM?}T1x-LSSYE{2 zKSw`k#VxW*lI9W$d_ax0<^|rHv#7jo96bT_MCTrAJcETcmY@kUR%X8)($->gEqyyF zxkEy+VLdEX!1cxTfV_R0uEFSO%egJc5D>=;x-a==C?$>~kTf6obRRJ{iqKFn&%(8x z5$Jc>?rAhRydCFWT^pwn|4|MqJ)oknQ)ec3>6l;CvT-{uB=?20juU&V7r5B+1!pBb z>WF^vw|&h`=V&zRhyWh`M>*4`QyN^s8=M;)y(iVPxt*iAJIH8$X2!%8@;!(S?Fx%g zLcrg_#b=&Ro(M0i?yt-@j$o~04gOnEH7C2_NG>SvGxK*~DKNTI+?l;Gz!*v!}te&#a#&rV!Y63&wDj6)(|g6gqgMnB#@K zov`%4@pZ64u!hJF{#7@BFRH|}H*_ZBa89^ImRQr$&S-xXo-=%x5C(?Z^yGa?Q!#LX z=K>LdT))EII@`$(Y1T-lhG}DBjO)ouF<3WCl??PJB;ZBiCMojHgsb;t9EQkuB#Yb7x2TAi}rON6pnJZm}9vN#_KstRwTKd*~$I#Ru0^{PzqaW_M# zu9z{=&xG6`R4)t+rVAr>9!#+oB4L^Ll>p@EdMi&1H5^X15eA2|4v+mIgM*13j>LB* zM|+FQ3^d%zvT-BWtSd)FVDecSfvHwuRcz&8%0SjNP2Sjama0lmVd5CT6sFhcwRKRbT6NTi<2Gi2xb_M|`p; z;17-_y`^wiLH%1?S;E)YXG|TrA!`@IF?XyXX%PGHV9~zPuSe#d&keNHzt4^|1N7yS zO?e@BEn#-dV-?88se4EWC@6h6Sm72u=^+)5KoN-1ooy4pIyWDhz`yffG~R}Y7Qc5~ z#MDlB@5wAAEHm0lx;UAUme5#l79fqdbO!b?emh934#M3%iQflsd+hoBXoU)*Uqqdv z%;wK_f=fUW+gy~mot@1S@zR6kY*kcDQZ92YeHf}j4M#QzgeA$0NME_Xam;JMu36m2 z78#SA6x#P^da`4XU^vtu{)-Aa<{Ob_hlgDG;FoCm*zylpf_?tcNNYB)dmzsweEXiI z=o>rl68&vBaU&m9k*3Jk$n&9GVaL-2*grN+Y>8`D-GJd&#_x*6+j6nL;>Vmh{Ig6Z zCqJcq6!YYx%k<-RPhd#H!M(*fIT7PRl4b}IOXYT*AzQytITP-2eCcar!}TLW4XH1C z1&sd)Or`>=jUO(j1s~*M!;C^W4-@0e5Q-5-R@*J$qpC{de~YtPc7V%gey00zqxfTM zb5stBX}6aUyPX9AVLWHiwTS4?F5Mi!n5?&!zZuCzTVLdOSef7qjySi@@gl(sZu>1k z!Y3JvAxLBu;E)`2tE=~tEo)3%zu;3W zEc2%ir^m$UcXNE^_n6WN3`tR{r{2wAmEl9xiB$6=S1w5QO~jv%<$~IdhU=~E8Xw4( zz5g66EURFu|GMwNEd9{WafV-Wmal(HhmfkEn=rW2xD!8~4RJ3U2*FK66i88&Qj`n1Fy{q_j9f z31^g7=ZEId*`uRZUvybKp2v7F((8V3n6wAAlXH4K-}bkYq3?Uf1Gif0#!3Y}Jsr*? zUt`cCSQ|-JD;QmbK)*+>*5AgtFSv6F4_>#EwN6MqLJOv>x7{M;o(W*R=pc!OuZL96 zk0r?4n_SbtPaP5to8s77&;V^_Bsqe9=W3dz}v#zqBp{mrW(V!cWe%{F2DpKDWx@7%YXf zmb6kbNDuR#LrDv10kz!&p=91v8il|ZMsLq#M4jI1>;Q51j}8Cce|qZJl_QUs%V~oz zZ?_i98W9bTYauZ2M7hcW^X;4@7`E*==--ptG6mxcX7@dCtuvq{G>GLwZ@ z{u#+Sw#ykNIp?l|=t)c3Nl zyvK4d(K)g0H@(N6gUDp@o&=BgVgbqk^$tk~n$agP_r&Y$+w3TI1=m1N{>T1iBfYl| zudzH<$kJB(fy|Jp-whIu#0Sz3>|!bUi6Ji^wy8@`a|o`E8t6=W190ByW&A#g<3D~C z8ZE=t*X*(doZzhx6o#g=0GZOD?|4{vepGarV?D;3HcnjbbA2wKq z$l^sjb$-|Ln2{OYIH8?N=#G4IakY5;&BFak?~XIWkWji82guH`VY4Ta`HBdG-fi!l z86Eb>qwKR_iO#hJ!zs0m@#a!jN{QugRVCEL~Gp2X(kwOXJpYnjcY-xd>XXOz=!c$EVGUJ*3UjxXhR^WDpeCYu#GcM&O@ zcHe)eDeE@->vUgz0-nu-=?j)M0WOAaiQ0qJs)(5Z2{08iM98V3u9nS8xdWddWM=RU z1!-!q_Ae_V^GUQ#W-eRLNKwNE$L8V7nfa-kZnUU=!4@KoMq#hx7Ul-AMl>Fpn&XnA zeyR|mf$KMGWApvE{el&>jp(;<^#%ETA%pK_v!9o$FsuF(q8XVlS4pn6D;j=sA0%?` zjejthDO!*drcD-RE(Ik@or#5&DuuB&rRYifD$29TiKIXYq5itQ--vS#2dc(m;2ao^ zvt26><6%u_htEqji<{|jk7vIZM5oK?uTb7``p6SIV|&lxsfR50h@0OyRaVyFzVN8j zU3W{TW;8kN!+86KII|>wopDWc3>S+6oyYYFV-65wZ``}RGLm-NLF5HDFsw?n@WP!PqyJ+s_*Mf@N`5gWV|lD=50*mYjkj|4bh!6gvAWW9 zncvZu8{A}|R)y4spx@5x zJ(6Y_DER(uUhQ>-H^X$l@l_U|yFF&XdV??sq?^5B4+={zPaCdht?tvtK`kn8b z=fBELF7~_k%-%Dz)~uoCBU*r(E_4QLJGlzuLfvEz$9rbwb(#FD31lD8{jcQC;2CCY zHOHBh_c7zOM&dBR`O!*_00}?{FI)_C)X1Ca%6_+;Ak=rgDV`M>k-(Xs((?E^x20Kv zj?0ZWK!XR_ppmN69(J0$w-pqgLd#W+M6!zJ6<^3TP=n=a`i*hp+d0BYGl~}<1kew3 zn@$L%+_c>DPkq6jruKq9my0)l7j-yiQ#KL8EEaH*zRJ_IY^W+0_tNmgI&TK@Pc*sO zt8U%%5`45NspEO$4DRa?a@`_)@UUyBBAnpgFZ$-D7|4REH~#0++0P~k7nRZ%Z*JfX zA6A6=0bb(I5W)AwrVuFOT$8)L){>qnjr9#*@Z$`4&G>!fUO(5%Vt4}nw-b*HFWjv) zoeKoadkZ*CEUI`b#Nkcz=4@B?y@?`B5gv96i~4ML%>-BbCKLM=B^=cjgIk{f8sOj= zXXs{!EzUW{`fDd&VI@4fHuctCamJDUjmV1*<0xBV&A9kew=D- zYcZhn^dR59R63V~w}Q%BZ*zRX4Zgk3AFgH}7dTS^ocVt*l#YFe;%+Ov*Py0k??3%$ z#98=tm?{(qA)HPL=3Vu5c~LkfIyNbVae`pWndmzCqsbSwVkz-mSLZ;?+Kq(@l%^k$=5Pl!yY!jha=OU z4nH0Nzo3G{&EH{aRjQyLoni_&jy5|{?3lcl$rnN+_lXdv!sr10C-Q3OgMq)Z3VR_(W~2=!aqc5BW9yWx zmv*Gh7`uf8zx1V0AD0dJ=wvO<&kb!YLq!?mETo^Y0)!G-;4xzkN~1sa98w8yru*(j z=Nqs#E~8$?g!r;K<*`AB=(t(+(P!eV8TD<`FJh2Fw^=UUJ*;GUx2WQ(-uIz0#pb47 zN<5xA&q6@M$tR7ddK)v6!#XUzCL@g@K2lAlVh z`N`V+?(R~j08U;K@wK~|@Z&I$SH!`YKTNjp-M@$uLW7Zh9g|fX1dCC%=gzf#rikwpd6H%6Im}2c_#}?mBL#R>Z9?pwaz!xVmdF z8*QV`SKW1k8b$^%Pfn^~^oM*qV|I2ch%C}(!scZov+}9C^t5?{L&e&6NM-bW?I4DY zbM?o>2f0GwLvm1aH@U^}l4m0>lkQvfh4K8$T4sAzd6=Jlh!g=r0g84zo&q{;l^;HZE|Z+2G$Exgm9+CX;Rzw zr1dd*hYpIh+S?zOEBI@<3sL!82M{*lPNfTSaf(glCgBZ_P$_$VyBffz{hdtWy`cQUxN7W>$u0iUmDq{)h0dlc*lw(BV5L_=G<~cv zC8jcSeQO@kc-28ivfgweb*L5KD~ia(3Qk2BIBLwl{_RrwvcLD+Y`O0v^O?|~@9h-1 znI)x?aG}rjpPMAIOc9;aeuqI_Xjl^v$H;v@-!A>H+-=ucneEZRqmSqb0WRD}_En6! z_rsdlO$oEghf$oCSFyJniXXun9U52X|+Rd1XHE`BwLT@ zjyD^)Fx2E64#M92nA3>2iDV{F8lUm}MsTU$XUNe*j}7)Fs1$GPz9R!|k!&9NI5W1s zY$>E8I|D9(B`|E@%)yBhR1npR2&_ML9cnY5dd^-D;M$(+h_agn_G|y9C5=CVDMs+k zr=Q8`IQ7jH;HTL&lX%nHb(=$VeUI!bY9AG?-t8~y&RIi)t4`+-1+V~R@AIikmWYVj z1bN!_ujI}*kZlOy1|RJ_u?)x0Csvip(|-H%2R>$mgVyq<{f~d7*-yp^8iae8sP$qzo#@GQ zE$T8>k?qcfg~f^0m3`M=&OIG*D=bo5FOrT~@9t)K+qgKJQyqbL>B7dM=V{S74hI}G zeqpTBDIPV#pJoziHX^`#wOgMrUT+!V1}vp9-jKkmiy`V`1wghtdex>sI9{cb<~xcI zYGUHx{AHU|AP@^DxyBUjnK!kD^cIDt)9U>ObU%#kI2Cce9e9r0S&QT?DHKur?E4vf zWytKhI`^s__>&yfIp;oprg&Nh`7G@=6KW63fC*s|T|nm$ptsY6RxKqtPXOby!w9Tz zvkB_;La*0r_R0)p(ZO0fw+nr?*;i}jXyTHdj72nuV=>%gpg}U$IM4Z28Vy~oP-7J z{bnj?$dsCz3ye8UotDX>EiXr(yOiQ+d9u|Ic$tqY5_3!j?>Rvr%36-5g#ONb;n;1$ zXkC&oDN%LD)7-fxpAsW~lNw4S@&|^++PXV0ZYZc0elz&x?4w4Yh*MJ{ZAF6JbMXvh zI|gdOa0|;EVFJY&==+m7w-9Y=L*0)#07_X*)XPdC4+*!QwLP^pIA8gQ1Qzb%`2%)n zen>D#V3^lU{C+zidS9`IMYth=Zbkkqq_)wkNc1k^u9i*14O73xV{SqWL>VX5sJ)Ov zY3@w&=gAnfXR!uHE;b(z+>u_GG8qe^C+5vhA9$ws(XLI_UBzz2GNb(Vc-_>GzluE_ ziTh|MTkrV65|>2(`m_;yShaony#DpWlPd(+aVx(9b0acWIw*?HWF+SRLh~=0z+3uG z8Lg%`mRv@6V+&{Q)1PznJJ{AmI^TH_k)QAciD5Mjx z3R?kYghrD$m)o9WjhY*Dsbz5J*Ezn0$t%Go+AQDw$$d?U9CP%AII{@!Rj6>mO@O#< zA;ryxxtO1YlaYuFiD$q*kXMShdfRG1@pqcM(&mqWSNl#2bcr>4i1ttSrtL$M|Bk{> zf&=_w!@N_3d-&=y;aTtLmn1rSRk85z^3mA0?gi!+^N1rR+DsVtjVvgzl|-`1Ivg$B zG@>2+Qz~-|SB1fxQtv-|BvN^gEj$ai@ zq65ZYPai|UIV^rEMZ(AqHt8*dp#BkY>4lPoIQ{*5lDc<1#sNQp@QRpDInM#lXOC&W z%=Jzp5b2!j*dIfq;At`r9sON%S{+jo)dB1PEqV9R_i$|hDvN(w0N?`g#{%3+2{&`X z^j4!I^ZJgAlGvEo!I3fNm)%WZ&g3x)3V*i7>%g55vPC79((e_hiluM=KEWGu-zvyL zIF|dq%dnegjALJ^J)0Cq8#lxn2yiE;oc1hUSg<<-X1X@+N9i&exey~+SEp9iqPU6> zy#!nFmoq~JO~m=WJOOsO9a@L9KDQnvmz^9!t@1|&$4(nQ3-JM6Q`oIl?1Yl<^7wHS zGXz7@>~CBGKsfrB1?_;tU;GaAN=o@7w`81P%fA@!XTcg|w|G@DfDZz1qIEdUN9+jG z+n%RKtbO0}as@o^l0;Y|{pu#3K(*|o^X6wNf3T14Sw|yK-P+8=mo)UTHNORgz|tAp zn$MXccHX`m7bv?goA?jh$Du<`9lAVI#?we+>f2ItHpT`dR6Z^>Rb}J5X_KXOzvSH6 zywCfNVAXPjeFQA_`-4HA##@Kwjb!2yu%0Q*^EH4dY zdx8yaPFntq;qcjT_k(>R6JG-Dd?(0+^{sM3(s*aX$J&J1^$5Z!Ck6lPar3i>YA35- zFHag`W^gx{mSEITrWp7aJOZB8RTHLzot~?le;>YWdBJvqSzjF@WR8(mgZnjJlX;Yc z@DPu0hv8z?o^8GLs}8mo9k~G2iC^RSb1V2LDz_zr$6CtICFs3gAD^9owski1UAK5g zQ4d=!JW}_EGA!$>$nE3Unx#*Djz>FMv%yo+x0{c?MP+Zc;)U1T<4emj?(L$>A}3*a z@ZZJ1$MHk0DXa22ZupZ*?AA^PMQN(VQL8WS0+q8FabOLGe4;(ewKja$f^$#|6KX?p z7W1*gWEJ>(7yweGsN-%fuz<5#Y7V!Zvb`8hpqd{PUP0>1zYYF`lv&mwjN+T^Bux-aI2H5Nq^=263JX7q(}r5Q%*s+9 z_6WL}+)fW|-p%|=;aW77Gm$3`gwtJC$`B>ID`XK>08%dWL`&qW6w8)k@q3D+BW>2jKHp&vZMF=# zjl{5bhQ7x~ALx4RJme1>{oFjjnmV(=Zs|Y7Kj3sq1wN-ibsJ!xs~F2I{4cxbO1;6} z#GVxIx}A{zZ8eSR1m?gT`t$Z#WcPxJKtW59+1fKO0&2bQB%qTJT0A7{<>`(;SuOkD zwT@<5vSoz_FY|ut%s_x$av?IaD)+y#2dm#|a`11Gbq-_sFL-O)#0ch#du^1hZd=p@ zBWg=dzkN}>%PUOeo43;Y=4X6xzQikHjQSZT#{{$_Gs`i@8sGp^>q?H^=$Ld_gc`m? zaDdOv48^<%E`i>#;{9+s*cZndLcADuK&e^jv7^l4pr^k39tQq=S7Uz=|zn=@j4f&!TJ4Vyqn^>=0VEO@~bG6Pvste zBf8BGU9n_Ty5lVO`O;4Cc9_)w@QE? zBeL+mQ$BYv0w6o4fMMS?YF$$(vbUa+~W zv;~7oOr!X-?nusA8QG-atwD!)GeU+N`U6*nc3_mhuZuMZkqW;I36rNL;8?~s z=sj>h8-?xMFz&kB{pC`ZF^cmK^iHK4wtW^id2RY3L>q%I@)Y@r}es(qmy^EEHcOL(g|D!*pto<2QnuI|Yz(CMf zBG^@I)%PHp1acsY(O=!!*1~HKiSf@0%s9^@D5W{765+_)B|X}hSRq~pMm@YbI;=K| za@HO?Iy>&`(b>;`PWk6FJq$J8bECloY^1l4gtU?p8*24`IhAPL^d(RT^8K&rnBR}* z#?S#X0z_lq_|GX?^t?JLRiBiGSIbP{tnZ8ka2FNn4_JrDlg5ihR!8?KRK ziUcVhD!dBBJ=Yi~7;Z6u3~EOu8fo_YXmD}vP6Z42ZjGG-&%X8WMCi+yDWbm&~SaplPh|N2hqtnpekv*T(#{Z`S~Cn0UR^ju#1Z_M}ia}S0PDVBN}0_x?F3U?JX zfBoz4HHfqr<`jSyp&l$BbYkkZhefS^*Lp973gOV9Hgs%;=niH~%=niOF4@slPG*7( zZ~y4ZPV?hV7`g*y7oGb=5oS8@&vF!Q&1QqSZZMLVUB5i=W?5Gy%JX)@Q-re|hgHUh zP4HdM=f9jOnyRG2q$L1Pyyr%)s0r?xnE1OCT|xv@MaqQT!tTu2k@u@_jp8+snI?bo zY{d}~?S-?>TP^GrsN^g=xQp4$AT9l-uZA&$pMK^SuT3${WCA_Jt# zNO*J1ff~B^&{jn#f8FDZ;yA$dbXMkh8Hsys&OZ5YG3%9 z=;(N{J>=uQZZ<;xzCAdc;ioPKPibK4l;KtdWek4m7o6Pj{f0OLqm~3X&A&d#m%pY( zdYShiR!J$&6AD`Y81?aWm=`%NxV4EzO6-wlJdPETnus?Bsn}uf?lig0@62@hjxhlf zuE3=l(VB-Fi#G!M<6N5#T~b?$0HsLOI*Jgcz-+q4jfN+`lZ|f$hCprYOYv?dLLE+F z%^^AB?1m7!2X-Mu@veo)JHg6yY0HAxUvNN``BxRzll(O2o-L1)G9mA0y{Mz{yQ6JC zp^H7i|L%ygBHn@6J~x#5@iVn8C-bz0-!sf-6;@M-TUMD zLQ0gxk&h&&KO6U6_ld@$fHX5y^QP}Ef0#VR)@HuNaHb-cu?E90E5BCGwP}7@e=Sev zc~o<0_uhDGK^_r!RDDk8Z<-y9H|gs~2$99Dmh;Lb@y}#rwOHN-hY@$pbWQ(r7ynX@ zF<_LYpVl781Y6=8cauETArzht0qsvhe64$|0>F|oVc&D>_6R+lR-&mG<5HPeb1@EN z3KD+M)*A$nb$JagM@7BvzaDz~mb!irsRX{8+Ahaf3ks-RkEM4 z??rVM)~$`xpevwrIfw*aM~t|ZGiOVBncV-aM)}F`vE|dCA=u^mv*3Hxrdq)BQNwgy zLN8VL|E>xhJ=Ao90QcPwiHi@uWFl}XF%|0a@7Pe?=XX;mQc(TZKY9z%6!jg`HYDMN zXTzdQe_PHltCqc#YFr0(YdxoyJxk!n1i(Q%5Cy`Y(?W75#&J7CS-tQ0hluE|9XBZ? z=f9>Bzt-+Neb~1&i7a#@hc}U9pTA?l8Ef{>bpZl*JssP5sdtysuW()R3Vwe#yEHno zjQ8r}9cSLQ{W)76?08)Wsugd^-w#m@VhN33I5fVaXZJRt0j>I5FLmHrP3rKxDmhHL zOPR?l&J#=A*H2yL+a5>fA+EEsf&d+X{lM^SZ9OQOiz%M)z)L5*U2P|;p@=IL{MKz5iLO8(8IizR6y zLQ}*01j6`%Q8;3qP?(b85MtL+90zC@zp*~mG!V*sFuB=dn(F@TU0Bvg{UKtOp%Bdw zIQ>61LPvo7=P3H!QQ;S66Y8)XX^*2M9l=-#Q0y!&21B|B;@A9#V^p^3UB2TGjQTUR zzXG%>yi-N2y7Q1+z=xY$F}mQJB@;vqm-g=!bQo@hzA9mxv z@Jo{YEt&57KrMSOz87*PI_OfuNomA8gHC!6hyYN8(Zcvmol71l}vR={fa1 z&gVVFVJNPFb(e06l>`23QTP>jwMWrkls}xv_BHBKJpNg`TH?Fcz|(f^16ocm&rAD@ zX;BC8L4cKKanTRk!vMWNGZl(p9QRL-Lb;|i&LG@J^MapUc7-tXvj-jj%ej6bt;L0c zzcWVLhi4 zm3t;qYqE8XIW*)i!FA_M)ggVz&)Fb*pC2;6b*i*;{Kktf3Ztp4R~gYiXAVqIf&z-I zUL;|1a2a%d1|h_MAu|4t{LT9(XEZC{sYa%>Q__*6d^fUrxJm>VDCAGhYMXw@b6wnh zN+RAyoV9%D+I@}5n+4a~PC&vJUx2rQe{mb=CzLTi1v!k#@4~lps(R+-BYerQ21=3WLtV1d; zr%T&?8s%G%D8hy){}yPFt2{@aV@Qp23zFHjPR&n*-Eas-!Alp_7AZ~s@d#F=rLo8? zOC47fW|^6c7GVjiZwd#CAO|1o=IP?Qrhb~56Zdadfv#)1Y(c9WezfWSN-bATKf^TAsiMEtqb+OVn!vv_TWOUuX-`Q>LP#(_VmKo>T3$8x{+874 zS+^dztP{MAfh*%B%QXV;dN5cBIT)NE@BJ6StKjsH092(^c4ghE>AD3Cx$yK~KwyWz z&+uSbX}`LJ26_3WPw%3VLNN2a9oM>FqC^mhq@yog9J63sV??hJF zm!e}vrYl)9x60}L`Cje|GvIeXt3-R#kNTEmKk53|dhy4k6Y1)JmxPkjLk`-^^p6&| zusgw~$D~fJ#moCc;KVAKo!qEQ(ih zny5s^vh?>3pFb%nE&yMsH=s+2pDG|Xgo*QsJW1@xA`3Z9vJ$~}-ghu(@Ehh~6GMAG z;wr^ZrUvY+AZ%+}M+p=i3bY2f-N#0sIYQjr!cd!fGa6t@0g(OWpMA5>ToiM1Oi!gd z#;8&7iU!hXhmH-6OW;J)^0fs|Z%hxGVRfUn;jK*vpPhP51=n9i^$1%9>+jmANXB{j zJ2DN)p-N+nU|0{_Ogixu?r?(N81i6h-tgkbr=Wh9b0#4;vz0<{W%F@?Nopl(=T{p% zy_5w@$y&8#D#X8uP2a~u=;z(|>-y4V=zpKehih38DIp<+?(@M1FPN)d;Fk6e8@YiX zNH<+jP%dD6=>xAJ zdvC=zlwd~7`RWuS>Y5z}*S}3X{}AY~s)rrgeQ)J|-k|1()IhOm6aO{7iF#7>xya;L zUOwFH*q>E>e!%|2HzpLP+~`#VkGU_SA_mi=U*eE{_KN^ZL|MX+YP3pJM5m%&Eyd=T z$!EE7jso{-nVpA4uEKhHs0i6(WX33B2SiBm53=<+Z0G2mP3|@YcD1;TK53A1f>RcX z;}mbd4y2f=uNp@F84;}jJ`om=?WzAzdk&xF98&`2s}Dqk>){anv8azh{jvjQTZV7My>ICC(_aO|vcs#) zeW$bXOz39Ihkn+7Z6&l+5I4R--y(|ZzOl{(1D41m8XhL(dV@JASa;>}t_ks8dF7y! z2+D8Ix!m^&jci`tE4^}%J0jbgtiJ2H3q%@MICbMR5+?D-D0N0fb*2;`A;MGDBsDA( zalv}F9?!@y@D@QgN2=;(Bugh>M3AVz)r&1940JmgI<}MO0$)8(^&7NU59s_3--SVP zx@OwRh%hdg!s56g3YIVXMEmdDpzfJ=)>i$^B=01DB-gPcH_R_RZKz%col!7>8`)AE z_$^BE2)_x#nabHr#rewyVLz<}S61|`dqkNPvO}|~b#|m&cx~;5O1TfoyrZobM$Rx6 z=H-9@`JvHGi~2d)W|!5thHwCR@ZCr$F@Z%5o3NHQzWsMve}b-sR(2Ap}5tTX3Au2~idzd$x@a8F(Cj@LZ1Sk007>n1XA< zMA$^{2L47ftT^-rFcU&3Io!2<)Z1H-V^q!-*$$$O%yR|QHVqmFioU+5=ie2T30whKd|RC zDlB}GxLI3NgsCF6$G&F%X*T&>#ITjI`GSvOJqD6NlYLT{Dv9JE7a{|Xrl?4pxKn(c z`K7MD*&{0?77-I8t80L)h?CQwwmYC@|2362jLHs7x823EAqghKAR1Seo#@589T3QG ztU=3`5X|qmI;zH$UUw1nwBKcm@Ok*~{v3*{sM5H2~~nAjC@t z4D0Zxe4(}lx@xc;R4T|wC}OUBlCQ2I|FUgdpMyPkoK;!EzAI$l%0CDJ$N-0C6Kj)h z^#`cq$?aj*;D4{A#XS3)kCHusNf3rGzhpu;YV+17ksf6wCDVc;)IhL=3%- zmU*Q=AE!aUX^SsLDC-_}_(pKFb1G(9CG`t(8&7@&K9727UWV$x@WRTGSGJA?mKpfH zMw|EYv*U$Zwp;d%Z?@aSjSI>S1?IquIp$fnM)wf4(9$)w>U@c&j<-o!Qtt1um~ug% ztE*?V6WnnIU+ytO!|qwX%j>7+b~%%u_3nSqJm1S5KRX#qCPI_b^w)Pqf_w|q^n4d0 zb>PTtyo|1%Nyo}Fd~AVRUf-r9Np~d_Quh!l~dIi zzibBa@N2z4^`-8qOTZP;#pxC4DWd>E2A9G3WhyJz9qkYA3OtNp zu@qQeBTxVWIqJd(gOaHYxut0^k-WNdrxd!&`TMUEHns_}+VOv4TJOmkKgswfL>Dbj zuPsOAm)WvaJC@8_g;IR!pqSpRdxtXj%?VC^p|cFh+@~M059|bf&roUprBZb5W8E6F z@h$%(Uts1ZfxmtH$*+mVC(ass&sJceS^|<$%IcT$^1j~pO`^~Rx<%Ct%HlDWc1mD) z5_66wn(q~7tq>NZZv>Fh*-vASBE9L%`ue0V)g)c#IL{ob)*!3oqu}oH(sxCOxeRpq z#f}Pd1x*QGP}aG$5jXC3>?0fqXvs*2Q)L6XP)LNyWx2BBO&IdTN=0~reAk>+{kQa{36_n05GZV z!8KDV9aNYdgu*>yDQX#oRgj1r1?^8qAGx?=mPW|pX=vW0S6(Qhh=^2eA!||+BR=N?`UehdJ6wR*ri)_uBgR>J$bX^5z5db z`a+!uRUZYU1URTLd_XVzlL`)_PnjGMEsk{X8=Q}5ksu3__%yy4U266ll9m0n9?NCk z>*oMF|H}P~E~viKvQIt3sy;D8RQ_)eg2vZB^l}I&81X2GzlMad0!dBLcvCaY9yZ$? zafSD!$&_ueT7%M#JN+*zeNX19$~227SQg6+I!T<{5W6s)pL$FXX}07LkONmyn{rI9 z3A(o85&kAjxLhGYYD`2osRKvHk=x@p&%&9uBx$zfCEz-<8>@v6$f5@x@yS(lPcJ^- zZ!i3vv2g@F=@^AEDl4-tWuCZ1II&k39Hh>M^)qekJI%qk;x7pI0`9e0j$;bZgVn%m zwpG6N`!-RI-&ViB4va83TO51^TJX~vI`$99A!Zq+zBvZ*s&)A+U*}N5(x4_D&ulV> zO+D0`VaZj*SSaB5g!t&AL3_V;C}Aw6os5&t=AUN(<8pYRNtAqB6AsV?B6#VA3q=!K z?;xz0oB`y#FfjG!n`-kAZ~TljqkNu{h04pz zosf%2yuFMo9*UUcf}n|OYfF-`aqb08HTdC8XML*Px64}OH5ypbj)ZM%5lzA9)NcV$ZbxUca{K71Z_#Uc)$i578Q z^1<&8?6l(xykfn*o%w6{{iSDjaK|EaDDyyC`6ECz^F!3ok#)03{wKE*bdcb4sk;w{ z!4pgr2I$$uZW5Q;Rk~Eav`|6LmV{$A=#}-Kws$as5Gs8>8Jr*mCF&f}rf&y4$ChOt z;vb0qJ?KDt<+m<3(lC0lA`S9CEyMSpZQ>mebSBJf8u={W!L@(>;nQ&n}2IkMUNWTC)*Ax|4*w5cAw z0X3!{V9K{VM6kVoRM(t$QNNWof=&(s7h{@4rRtQL(wW^y%TB_z)9&9w5v3W8;EJ~> z0Q@hYea|))g@6E8O=}F_fCDisp4M>H-@&=$=gpU~R=K`Pz(?1#`+G_q2QAp!glbOosfSk&Kc#p*#b230Csrn>+fj3U%ZpP ziaDL+{H8d=jyc*`#y21DR88ih2JVO>9M`)q*CZMAm{if(&2lgM4JM#X|1%r6nn?zr zdZ)q~q+80ph)TY$D-ALg^C}KK{&&l15*1(eZ~1v?65y|4nAKy~$-;#?%3Y2rJ%`1z zc~Gb%0K1NI=1YJl{v0w2e|X|`Yp5p`NrmtRaqh4UNe`j>iAPe9k(pb}MI?TwD8(W! z-X0msks&1oIoPq)0$0or;3@bp4LK1o9Wl_=O$>H$YL7N*J8m=ygf4d8So|$JGZhJx z6?S<%?h^N(xMvy|+)={ah^6!}vQJx4-IvcE;~18MoQrw;?#dq>ze5L=LUtNI_~t(X z1;9!vWBofKyMHmI)E98yG@)x95=l@zTU;ZeZ zMD=t=+QMXRVD`7Lm%Jov#pUn?DDidOr0DPd-&*GUlihA={()8Z;yy8uocOLK6zYRD z{AdY9WT@Z3;uY?u4;41bWA00fzp=R`!xs5w2fo3iy@Z=Q-M4doChqB^FaV?sBWr#A zMYQwUtMNWA<)uxVXXv1L2Bipb`SKVcEB%fDQzA&E zk5bSCUg7QeEH4>Z9UBCwZLu=vN(36-T;*OwNA%Z{CwC`gM|#HQwTV3A6Ya}>@nKUv z6N-@b#mUc$>^(RtR)Z_GHgyFXS*<+H)ow+4zij5@2Tt8=eXHSCA7UQr=_R_E`m5A^ zyrTc;hp!M7BMEe)%U?~uI%utYHyvQJ9JvQuK04elGQD#6b`(`AS=~mo-m!k^EjAR* zDKme7aDP!DEiJ}gFDh{jV2nlR5+hb{7)%d+*fN1aRpu6&0zVKwY4W(tm(kKIpAJln zP*S``+q#qKohOP(k24f%E@0VP0Z?6Ew7T$vw#=zxs<a+cRf8L)`Lv6KI80@hrz0niB)2vuf{(Nyc|k7#i|ayhzJ1CbnD< zb&Xpl@IURlwh>tzHq@T__3cgwzBaeUQu8DCCd||ER@Jm2knHmFB#k;qR&m6VoCx@*yY?HF?qk`*o+ z8GOFD0L?%A&IgneN8eP-Mp|)*m-wIu{pQFNb))cy8t<9!Z_S|xWG-z+&Jta>OKC#I zH=*2pn=wuPo0k5297CTMlxBs${;&+;^CPZ`{0!Yuf0wvp2ZuhV#ZCW5$d|P2{}b}H zf(!XVP}<=_zMC>uv_~LW*)PPP3E`WA+#Pr1RcZ-(kc-P0fF&-jyE@>?#Ct1`e`$Rv zm-L(4*{vu=N!h-Z5@&=%>^}O>U#Ss0C5SIqp@LJ&UNvzK&4w$0>3^^1@87!020vrI zm23VfxTd?u*s{oJex{Az&Oqv_CShvBc_)~MCx)D5ec>oASlmHND>@X*-0jPm({sE_ z`S$3zI3ld^C94u511i~>Y_R3$U4Esj5|d{39$96I1zgU;#n9QzQqMuFjc@IX|I_Cq z<}lTb(Iud#EY5W})V5RSkE%%qtJA`|R=81L-P0s#wHiI7IaQ(J+fnq==FssU@oyX& z=8lE{5o(N@_{YA3zFYpIB$U;B&$|RB!Ex5^utSrc^9~T_>3#TD7!w1-)IqzMmA8i>A&H=h|`? zuX4AUzfJoX)YxLnqs=)R`;{@xKIdsvx`&#^Ev5^liv`6qf`;9G==0B+DgM?5RMN2y zTx@W;_Jll>=KE)%4uNiNYFHm=sW*_20*LnNkUOw`#_sfcV*JG%+0drRPlJx8pP46@)^Ujzlj%%WaYR(sh;TVu8Hgb zs$om<>p+nOU4+8IU9UIpv zsvxAN$vA_?>s|KrGW~U-E9~9hjX`sa2B%+*075W;g&VQ(=8+eG!H+CId?B9j5tpda z*NI!8vypQQhB*umQvFjHwE`ESB?w+UncS=hu}A&ss~h8 z(5s{@`@08c(b3#&{7AjT$|}WF=n*C^yY1lMJokN65`yz?W8_}!QzyxTgwWhY#f*+V zxKLy?eHvo4d1k7GRkwOF&RE{&u{I_Tvp5_T@Z7n5*8k3gq<1X5)Yym#!kLNw^)~DY zsQNN33lr~96JEyIyVVH^c$!g^yJCfDZSnbuG%l)4o#u@8p2AgT&rm8WntQX`L$*%o z+m}R)Cod?9yFUydd5ccoetb0xjA%L1x8Es#rXt;zb`!Ztqgz91B?;OPADf8nJDseS zb};JuZ4dK)0Q&g6>AY*%J!)1=ntgM9L`eOlhBLDOFhrPiYF=Z9c8hG&(Cy4^&I{KUWh!M0=)@QESlLfP|6 z`osn-*{$K*Cf1F(?#JKaO-^)jq*LL6m>Yn1xpl97E1O8OWe@-H%r{(E;9^&y-v+2J z#kV7}a(Qqem>;caolpwdorf9v2BTBA;#VG{tFQZv{QaK4S2LX{a8n_1QyMVV#ezK9 z4nsi{$997J<(tr&u1nv$7Sw>YIns280;In=lSwHj&{d|yW{{ibWSafo;44+0AG}op zN~*G7)V*$U+_MilBF(d%M$f&0Wr32EU)@Xe9+ziKq{5)-oYis`Ig^RYQ8UUF{yV6N z#QU_hfvg2@9WIJeX4RCadW7%N>JL^opAbN}I(ZErN2Lpg`b$QeAZF_@?#%d9ekN*6 zN2MMpIBRV8u+~g&k3PCF8RZ3K)QpjgB~#fM^A*KRJWGRL^D0= zmX+`Mo$zgl#Qd&7ST>hUk6Qa=2wp;B^{(QEnPO*8O zmn>L^VIJ_rb^S)SnT6x<6_RQ?B5%_0Q_t83v&XTOpUxyb?$RcQOz^GvJ7EB)z62++ zu9+|N12T&ev72XiG@%n< zLG1ZNZ#8Gg$Y92mhikVrwB*dSpt^w4_@D&j15w!5+P-f(Zgt~q9Ib??+Fl>s0!6(R z^cpPRx9*hVN1RLgT47>Gl55^r<$ZM{d4FG@SC)TYajo++C9(?+i9RwI-Ih{>bX_g6 ztp52@`_FeT^au9yCny>N*_+aMn4?v4NA{CF=TZ$Nw0O#ilT)izsyF@*w2fc5vaYBs z-w)PAL=n<%xcUGvh+_2}oY-f{QwFfok&?0|OWMWEHnY!vI3IHDyl-n+b6K9h!2|dU zs4nsj{E8YsM5ZmFDPr=u>IXtqDSmmjv8@2~AwbATi-OTo2zWxV=!r)yvzAc4F!eAy z$Sc5$B8lmwdG~dK?ofK&u!*DNhk(l?%E$e%oLO1Uz6?M)V|RPT3Aggq>rmbb7MRr=MCKz9NX{Q%*GWm>?WVD1oRCr)U(^pD?i%_ za4a&^zHV17*N{r>bj`ofF$NKtar~aL(`&kqv#(8De_Fk;7~4MZb&{;yl=ttZ6d9mV zJx<(bC^#KbZ@)hwwpG0r>|cd<4>zrw&k|fEg{OSgS+#Vmo|CiS)N_4DXZsor$9%iX z_!}%A3=kB-06Z?XUF{8mKBWVQPJ#L%V9k{{hksY;Bj-yRsuyZ;|5zSlABr7vo4LmO z@6_`wV|u$psuJ*-Q!0}0#fx2<5Ka%^gWFivJjJ@EzY>+cimt`nYfo56jDGFAO8Aj^ zHZCSwZdirYCe&Zy`t~biWpP=c7DBsfqGcTMS9o?>1#=>6+rBB~`*)!|5crC_$+_%9 zz%NZZqrH$m^7Uue!>$Yiy29Us+hGQl-GT+A;pI3>6$*y#qTtna=G*Z;r+~&tn_@yl zvR~21upjmGFY5(@yIvVNHO$})K;;e}X^4G-Ayh63J~z&J)m%?s?!6I8c1(4oT4l+v zyCiNLsp$$XHRpR{0<%I4F!S*ERv4Q6ly@1LNE3BB z;mhQhvefjLd7=?z2tj3dvx+-)K5cVLJ}bVpV(<1toAc$TeR!RZT^Pp%21_>U+gRiR zcySwl`}?-3XD8s{e?CCT{T*D{OV8m-DR~7kyW-D`T9Px(DD8j7)UB!6Ie@;!BiJX0 zpQntc4z~&m*6q5UhPpGEc1zD;xz2sRRRcltK5l}>l8>7<$GDp_dTJ44dtgJL&iZ@M zfGll!J>HY15;tB#aM6NXzYK_mbs@TFB*D7$L#UDOdkzC=b-O=DzU%6i%BhS$d5DG9 z<#D7 zC`fmAm$Y<9hjb1N!_XZfDcuc9hcr^s-7-iFAthZiclhq_-hammvEk7}1| z%vVKvzcELH840TM34GoKOuOi68N<`PUp=td%dOsjq2PvF_hzk{&IK&S?zeSmX+4z} zlSO(WtYF5^AVEQhD>3NPY_VOP-Cpa#=;z~iX7-RsR_9i@0HOfZai|B>x1st>WPWYH za;+1OzprxP<98oWIl5Fif(xA(JRE~fL#}@OmI@l@b9%%p-d|^ReTJ!X#85uEb=~yo zbWW)Y$89%5b8?fdv?z9dU5G7#p-0&n%QA+E8$Invat4s&@0eG{Li$5(C6{x$xitTV zw#?WC?iOwD4FaWDSWtFbf8!F6W!iN(4m9=%cJa?%vm%w6ym#q><5V1+yB#qqd~Pnt z>&!9z9KV|T@ZI7m>g@y^&4uHxw>2GN4vqS2s+TguLg(*2cL9a$VD>(^Qhy38%tltA z&R{e4hYt@b{`n!0$uVSVGLQ@~h!CFQYAO<9|`AWkd~<<7ItUc2}`|Mt+?@A6T? z^MG->fppW8ns+7eeHyyik!s4Q8ld*t)|TFKl+3jc+vwc{j^iul*sF$glCrI&DOia1 z`-K)6PMuo-$-$uRlDa(XAF>V~^;V;Mw%xUJI4i~15DzE+`d7N;ZMO!MX1yT|O?i_vO{#^32K!KwpG6V3e)P>| zHkNEO{P#W7l(O-f(?A4=@GeKh-0{JqZ(t#Yr*An|iZop`lsC0urOBOIYWMWKTaX%lN(IzYD*}h~B{r)#B_^??E>fwJdlS9b?+(Io%@qkS2W6 zYI(r-55ow!x$A!@LPslFa^wB6dy85oGl)&lkLkyi!rCq8*Kt$$IO|Ycy#tuGcu;sw zCD~9b*jxYIjq51{c04npc3F7fOLA1L``zFz`@PTwcrV9zM=eQyG7x~TbHaV9K1lt; z0pzwoZ?Vl9m08iB=D9Oza0&KQMeBxhvSObJ&H&$G2MBl=P7LW5DBIJf5Ij>IyD3}*6+cIIr5mz@`BqCyovXe(=&7SbEaRD+beckcA_L*EPnfL zWZr=J;&dKw02{qmkfZ4iM*OJX2Rp=6;!6H}S-*2@{xJ>+(>|(2-a}qYIouYs+xX!k zCS5tNSg}P|94(d_zN4Jyjh%b19&Kz-6C~>ssjM=*!b=Bfb(OY zw%S1A+b2F!?MwkMi&h!X(e`ACMp~YTa$>i-DV8`efru8*gZPrx3Sj%lsxg(el@~x0L6JRBk1VNMcBZs)^BO=HW4ZrROV@}qhrSol) zM-^?M22q7soF7!Bs?+vXZ){^lOja<6!y*-!f_9Zxv!L2&~y^GSfV3 zN<~|LYQ7U9UGD1|$tEYal|WldC(KC53;TMzJvN?CV5DNWbnXPUjwiT*%W|_!>Od~{ zu&93bGxONY#`D4%tDeH1B#rM=8YJ4#AMGY~A`zW3Z1rq-&^_kcfm#iT(~~v3+|GR` z`=R73v^ErDw1x@H>HfK|t;=CVXNAovj$E;qQ+oMNI5!)izwjkrX?uAH53f!pQTSaoFzTQlP-%!Z zFV|$&`1%HJMb0usCA|Dn#e{ZSS2P#C6nBb+pcFR(VdVnBTKQ_j#Jb=1lp=jjT&2o3wIP zS7Pc8Uk7$xRb+mOoNb9_$c?cBqd|Z7JQC0g8TsHcZh944vg&_PE1C}BSz++O#7jFbUgBI&!7+LT*u>DK)E@;OogpRUuh zHpO6dd1>rVK!V!xcMBYhwtXwRhaR^F9?udQMI-L9BLN!djg*47Kh#52F;AVK3R93Ys4xiLE)D z99P-OTquM%k+GAQbD)YEmp#oMWTWqG))6kaT^`OI2Kp0 zEi?@Ug02SgfyzqC2Xoh({~*MdgG&v;W|H}9am?rF>$)~b4-!?n|Ol22Nq7PW#Bc|^XczS~+A~pZr5NVo_ z8aOmJq&MDuMA{ZexbNab-@94n0U>X22wX9U2FR33bR>~JRUPfo`At$$)mHVz7ol`s z0(!pZnl0@0T~9sm0{-yux49K_eSh8aa5bEx5AC>YY%g9UX$IdA(?Zv;EDNheQ1u(y7R%y@2!RqRT~-XqcPIez;NHY^}8? zIJ2EEpJr#p0`JxcERQ3dGd~&ylfe>@%1akt`+tT#26RPFTo!*DPN+@dMV&wi3*uvi~+`x#&ZN=7elXH zx^i+waY&%uSX2cD+tog}lOnCKMnbz=GMz5>uP}h^PZWk2JA#G!Y zj^DMCbZBzeIla^4Te?DlZdxih$U{x}3w+EJSpQG(6)fr~jHp21Y9JhMtfqWDuv_AO zoxcf^Q+8nIH1rl@CET^kI>JW&mg6>GSsJkWMY!w>IOlXcP4GzlGupQqGus0^^ewT= zsE_#|Webd>+|39)(JHQL&ljfmH;jzmb+$dQCS5;{z>smrxw(Ble}cHujp5d~6h=T-Al( zRRi`J4Vgqi9L?d?);6Lk`cRZx=Y5yZnaGXW=G2yM^uNtZ(X=GwFOTWUX?cKOU_(zo zwHB=llz-)KzoytQgJ=9qY91qw!cyiMiXye$b2$_Iay6StmvGHbvesV9#XdS_G=(;?acobO}T*fr^m-q zzg&xol8t}GOu<3p?ML2i?aL)U+6gf?A5+k!sGZr6ZDyl~v{7oz>yW$l6s}^jmDS}y zm+#r#O+?5D4ex4Dz9f5KhUXYc zp0F#q4IaH_PYBF6DZ45@5u40K6pp}SPT*711c-Sn$~CA;Mm#UL;f_H8-zBc868lVQ zaOzZBWXG)=vD#{=-JQU=Qy!yjhNYq2=`%y8UZJ_NIGjh!8RLJyVI0zKQ}O;>CJd6m z0exhnBN}_aaUv`F=6Bpc&r7KLp@?zgY zF$`wVB*{-l2n3V}(7N8tg)X__o}8tFW#ZvhGeK(sC$#_5+1A(XcYT_l=giPIb{g>) z6_+fD2w1Z{-LstFA`Bfb!|%%zSTIry#+ycCiR3!MPIjNe)4vlpg`XRY>T8ltY(iDe zL%&9Un)&(f(X;c`HA!?#Bx*XJKA3EJB?BGqmv7`W71(m^h;*<|*0@D93#(a|8-G;p zv3X15+epbDaNrfr1ZV7kN6jL1CdezbvUhuJd^H2*A=?;C0Qi6W=w`m5fLix~g-kQu z)SXo}`1jm!{yu`ylEaxjOB7E@d(8RNOMV8yOfqlm*_*_;S8SD^Ku=)5JoLl~s z*fFcyF^`R#;PU{y(AEr+)c-sadkktOD91)b5#Vw+@DKM}_Yj_r)Q^oDO;}k_5<8NS zS(Rbi^>zeNrS*}0DLVLqnkLn8f|L2Lo@;`+&lgQBmqNt&0W0@0SObw4O|E0M+mcS2 zYGq9!5U_C=co|lV{3Ei57W2&KcvX~=-3O)D8wN+V_hvdJ)%ktXmH>H`4kDfvj zx9!&(+u6V-aNFf@(bM4ISEkNvbh?q>UEi(?TqHLUnn7ItLa3<4xek{-KmeHIAEPVR zcY~IN$f<93HX$F^&zm1U3{r~)tgVtm{2o$(UJ*kFE#{iiOwTdo$qC#cB27TxufO*1 zv&C_2+U;*Ql7uky`y>-+D(p&(ez|(n6{jkR#4EdkW(S#mq}=2I&V z4jMg@y;w7PwfqnYBWiw7rH^ETFFb{H=0(Hc;X!Q@ZK1yz?l6$Z&4!@K=%OU-q_xjzjlw#wM6Rxh_ zYqN)$HI*KDg-5nyvWirgT_L&}?><%cP~#I0DJk8_Jv}o3kRI+Uf+F$YCTxdU!R1W1CLrw?~xz zP+JiZe{HQKc6ww-Cwxp^$RD}i_uu=|&ih%+ib1*UlC3(M#l?hE1sSD`TeCOYyREe zrKBKV?OAqv_l}pb?0hA@tToL7My4U9`-B?iK=$NM5qRu05YpV z_II4}$M&O-1Q0nB%#L=#t)Nd02UN@`=mRAAb8ULcZ&MG8p{lI%*PVV$e_GTzfi#`p z1T(7~-dtIo*OEswIauPWAw}gSDWEQOs5m2%%9c^Yt8$A`@Lyp|5a0eEO^}0SL~C}e z$;8_Ua0Xo*>FYLzi2+QZACA}`yn}JC?+%MM&ubqv7kZie9Wn9U z1~9>#Z`sYqe5)VqYVAAkW^eV}1a0-S$3(3An1&}+ygm@_8?&S%kS>qA`L!Q{*O4!Y z<31_K-m8OpVRzchGY)C8f^Qh27zBvQnwyw+|Aqbm@;PZD3b*wB416&%u{_gCgFO=? zbh(O@cdxt1-5A`c$Js(uf?0F7cDEEG0&Vi2G%&&&xcxeG{eNdAZ97gx~7I3_^+;v)x3VVui-^okF0hrFOQt-nJGa?5=hu})4+3TOY;i(@gLc5aIjdHoOU z#D@d$GfA4CI01Qb@p0KQE=a}uR9fL&aGOr&z+u}|D~i~ducz8V?( zF)t`RPVLr{2ZF+$4?Owh`E%-B??KX1S9%QHaMfL@UfO8Gh?a`fMB!UV*q`^<%{#`U zteeaQb|*=J_uMYlup|U>f+QjVzv(?R$LIGp8^H-nFF^iaQ!LC(0rF$ zGC6cDx3h$x`P_YcdzdJyH@cf^_=i3VJ5JP|qie?uRn6IrJ71jM;#ZE`$ z!x)j(FIn^??ADz0XA2&x4MY-hnDJz9(dHF3*jeOeVr>Ey04;T(bSt;xsw#zFU-uNg zjA5Vov0t}eJjpn1`t9T#FDZ4#*LnmUJo&c5^Ml+8Oz&@n<*rH~(;dh<`pr>%&xZ`m z=RH)#NzH?~S>W0;N0Y*YC#$qor+dqj_s0=ko`17=?aF}$5BlB=d1Rnat7xDg+42O-= zSH3qI`Nin;>1L5O@N%XP*s^KpOQ#WWtc!a4cd^CYP7?6Kh~+*4!OMP9bsW8~GT66- z`9XW-_3UH*{{P)uh2*0{zX>Hv*+yG`uy>2dJmi&pyfGVWImB=B@-iI#UD>X*++~lW zuA3w0$V+!f?AiV;9etQG!5ieEh$`$jbyq>!TkN@JfyXwfAX!}TdJwHGj^lpOHs6Od zd!OP2^2!`^Ngg-%xic8J*>Ly+G0%4o1a*R!PTz37`c_}ezC0tV!i-z!dbD@-S1gDF zR$ek}b*?M_K4&d9#kLBvS4Npkt+aeY;p4g0*~R}vbqv6}*IGq%#)^NrPQrNhk1e@= z#kXRJmf;oNSjfbP6zq~mN6@plyc|dSU&D-^AC=ky|MJC*sj156xsI=FI6w~sCT3?c zL(vT0kGYM`aItszjgv`lN;%)mH?n9(+z?HB#qWQAGY;J^cXz$~v#Y<+8W+U zi4F%TgI9~*m2i}0SNrzW9V}m#oBa1V0Hp`IcKNHn@+%`|`?4QB*+md@ZVAa_&`SRF zikb*D_Y4?P0rRet!X?^&26D?vA(ziJnI{J)3f3~qEq0k7gM0{{yvUvqhOe$P{eGCc4}lI9rT z{4DlrV|2fzG#!e9l}$ndHeH#+D@aqi>=95=(Ou<_@cIk;b0@00Q_H5D9|5oSxjPlj zy!cz3)_(<@iDap?7bfCN1dJv?yKAO_6lWUhfcS?J?0!J<=D#e+&Su{KiPS2e^)V-834FmbnPWe%i{YIx!QZ_kWQKzq z`7z&EKR2PZ{Mk$3H9#5>Bfe^qdh^+w;CV+iIM8+iOdu+~X_F!js{i6))X3 zuYGa;PX&Pc;|W^qN>DQ_a0-1q?m4+PjK^#$tZ&VdRyh$Hpb8tm#m%|x4a+^v>qkmM z)T>HT-Fu(VU&8I05nPrCbZN|RVt%(_Ozy<~GCA8CxQ+HB*gnR%VF-mAJbE~aQ7z%i z&??t)H|Ar$#9ijkQ$U}=lb+59EIw>_ zM&!wQNvw~yfIw^V5;GA&@~`@>gb<0HdCq>x`r$HH0Px$k|IThXsPX1nh9l54_@DX6J|DPm20@Uh(#X|43Kx)BF(tP^S`$O~ltb z+mS4mtE5&3d0ZfINWm|zD(CF`RO*aeNd1qrb1IfLRQm!Gi=bG;7F`_Xyk5hfP7)h2Qw|G&iLzJbvRNUIK01y{Xq zb#f~Bk6bDFl8`}a*`>r}gpd~vci(rvHa9`g@RL~26@EEhKL)zyVTX0ayFh)2i#1pa}a}O4WrGwY_-T;3-n! z$QLRot*4rO^W|ako0Y*BTlE{FG1ne^#iJkXk)4#LDAZjW(YsTk;B`Bf{lR(09^!j) z1Vc>sr>`VVw`Y~m%+WFkN&X_PBa$|B_btee8agUIa*`L-+_NlJb-d&hf&%^*fATns z;`vFZU}`JXcqp1Ym_yT?c&VH-|+}gHZv)cAYX-@S54I-NO+$0-LJJ> zia5!GhPwm{#Tk&*sMp(d1QPnw`#stg0ImbDuHoVEAcy+0(fy(ybWU0EW1|&;%UaCL zt7nys9-qC{*u~g@I>ebtW^gDe4atbz`$}}Xvr63kl(Vd@MaI?w+Hbk0dcls}{o?cL zz{9Z$lo)L0{gvbpyl>pVNv1?`xY7u@GM>Gpg^$g1geYS}91L=!{T#|^k(_xPhe`$EaU!&bDvwnt$ZYEv>pUbbvl`ZVoWJ%N|vp=QYg$ul=|B8)?d zTh|Ytir;Q=iTJMx-As|c_$|W!A$Wpw-s4661Y1?jwZYPGx&TS4jZ)ehx>6hG`Fz%3 z#NWPpm0Q7pXW4(8V-pRT60Iu+%O(RuM(pj54cz zISh59e_hoHY=tU9ndMg262hmTF4Y6WW;S5ioh`Xn@0rRe$Ro3J+lfK8bG#=QFB8gjGJg$GYQP9u z;L3%7Is*0HUp!+bO$QEtmQ~9diStqR;~PmxNZkCg(9NkG-yl;5fzHC)n8vN2P7L-M zTQP-d7b|OOU%$I_pK3LEaQ{;I?dge4n3f+HbGciT@heo(_j^S3=;OMsu4xpF=`j<1 zFR$Lhny0DXC65?_7>GvmA;Zihv4WZUJ+nKvSk?1grBWn)r%~Df zF=25Mm2Y3eLYe||>RcO2b0wybEbkxOE(fTE{5sQLlc7XvNaj{n$;TG)7Fy#724XFj z#WigFlYC@io|4}}W& zDWO|$Pq^J8W|AeoH`>zI&0&71C~NkNk|WK;f{wU&S7!37xMqz6=& zv^J3`Ly(qDiCxD>73hdW@^EB0Ge2^!bb!trh&W^$EGojoS;_&+>#SJ_N!z|!V0RmP ze)`D$(n{$?pC#7)D&eaYvhL6j@us8o8=9KLA=|4iy1t+nW+NqTlb2UAcnOnoIO6@0NPT}>Rd)z>0 z=J0I1@}VWM)|4Ozw@;fF`M4du)Q`@jx|mqr)i;AgIo4RV#+9f1?JkG{)=jTGo-I#0 zHQmwFQHnX93!M#z&p}2;Vte0=V(UhPJnNfW0m#JElu;Fl3{<{g%0u$-InzDwwTo#D zP8KQTw1|v3b41{W^41u17TWK*Q|A)F*`Gj86$ZbIa>YT0I)k-%fWzOmzpRvs3mN$> zr-qFILYAd?yt~$q;v4xZXr!MzA5s#YHOtn_!>O80b_7;w@`Kl(oU{*yExlN~A zYIFc?5OTsG4)=*cK(o;f9-^h!ia}JoE60tpZ z$KDr`rPoV~oH$DSLfHB3ynpNC*(U`@nIo$d6@9*EY~Ot^3L!zV4n*_DBe(IoGHu)x zP-HU$P45!D_WftDi0K1-6!Tdzww|T%Q5-66DeMa-8OSwpOwuc|TnqACVc`x-p?Z$>AZ9&`s<{sxYdQ@r;&P>*dG0)I?o4xVZSUv~zo zem#|aQ%XKzqP7!G+hcbp_MI7}^2&Yph2pW00v(@8w`~Hgt{;qKisMDGwo8R4 zQIZ^o^+ezpwKa|_#ncnDOYYMsi}w!pVKGSnba;y@h9rN)f=E_#h-N#r+ayJb^UrQIwFJq zC$QfL7-5ro^vj-^+xemw5Mp3fS>HY66{3DJw8vRFfiy>8V|@(52|OOImbg_DWS2L# zCuccaz0K6=c+5yok8BYaJ)3#>LA)vZ$q?DZQ(>lE?!s!3;b@6RRsC-CIHl*yV8<4{ z=S-I-$9TM9NdDs-Mry|1c2&TfTa7b7TP4kGPqBoPqArW76aKKhZ#gsg!LH}u0pk~V z1`((cf>0cLgNsl&m$#XXJ$9KL5k*3A_nRH*Ow5#EYb>rwWxxyZ16q6|Jv#q`2 zEm)80t|TJOI;Y3CjHtd*U*kwhO;2vouyURB;9j&&|8i>g)Bf0+6dRQ>-X`oT#JD8~ zIpKmoFuA!@umE`QHeLaAX4p8!6_G7=<5nq#c^|?MMZLiu9Ty{8z>ZHIEQHj1K1&FlP-8!Zw;5QI?N|=xE^YT# z;`250@wSzfwGmF(RJCk{p;*f9Lv6~7&+7D81o6}=d@I_@tVzw``9{-$^Kn&HS7Jea zO`D{NpQm6itEOC@D*L8|F5!2p&*y+bz}WqG!@R(ujiQPz7T@Zd{@=<-3duqEg28Ng zdOzj9rWv$)3D)wmhPa`Q96OT8L(5(u-ez4|0Ks>0*vFZ67=F_sN*N%)SA6J3*TylZ ziE)WRtb_QD!*eIeuarCGVoXs>`XZpjJ^;3Hg@iZLe3Tw^l-3X#z^u@x(8W}^u->$? zF3LGe4}is6Q_Of?GDgm3X=4iezI7aU0_Y596hCKZwet?jj7XUW*W4>r z$Nl2LE3Fh(m`N|GL<+cD9bE0X>dyI-4z*Y)5)9KITg!Gqt~UkpGu(N62Km{qU#;d` zky+eZz{c)gqu${xVKNf4V=0{B^=p|Ee{*&;ndFX=0Xb za(OzNJ^#pozRE2`Ov@|F!<`Bg_%*|Rt=@CX-etMM7g0>LR@UApeWOutO(EQ9uqUA* z1^UbN#0AgQ4M`niHF(Z*m)4gITsG803;O@q&H;7YU!=}dX~=<`m?xia`aPpD2dePPZW`)$mr~2Y{F{;3M}d3}XJ4 z59Kq(ItH#J6)~FMm)!_SF7W5ZKP!l zb)O7Mj4Dgy#A~mn?;(Fpfe$qdi;E7`RU2+IKN( zPxiyshY;qA$-KlV#X(@{{BZZ|8p3&L(253iLr?ib{=}E#Ev6D0S%%)pJkK|_7v22A zR>Jq%#77``+M+*i`y7#^qbd8=jdOum-<-NTyCuxlJN?=>6W|zwGTfvt9Spo;YxB>8E=@qt=p&@L}9WS2`gHi8JrMF3NQre`LuoKzvBh}~= zy_**`m>9u1TcF~pszmlv7<*b4LYZ(gTqWWAyd0#rCe8N&sb()|%Olwub7TaKt_pYG zu2_1$XjWro-X25w@Yo;nQp0_y`q|H-c9Sryn$F4U2snO-USIV&$7_s%N*Bu0A1num zS^U;U6;9%r{b7ZCYsy_*aC@ZOd82JS6H%qoV^+?-LQKEPs{=$;4=5FWZzeS`03es(4pL4o=w%#X!}!QUKnsCw5`qg&K|9RcT!Ks$bvhs z%-naH0=r<~8-dHs%!c(w|K-3VK;;<$2x#@%81^yBoA`Rf7ZDEVw@{!$F<|;Ey!Q45 z+-}qivFY9_@&1ww6b7>^MM%u~&SUCh82@LQ^v|Z*v>NGxE*Fq3B%dkZ_#X27w4|12^b&pT?Ig&E%RhBol24Iy+-B)I$p{rxtFtgO|Nl3Z zJ>NK{6=e=O>qE-<;`BP=5AQ$WFo(SqJISPYUC=)+5F?WR%74pmX#2vGP|QfG$X;>y zX)z$E;7+e4YgS`IpKRF^-z@8pV(fo!*Lj8)^uKQ``LFQ@?;*2nWnrP!3r;}n?j>%u z#sn|KQ=i5%p1qdu)zVZ4zR_?_AZhLzbsw zF#0>i+^6r77j$(gd8sH+Jl6JtYu}|7y)k3=rOXk2ZFTnmM}F8ewocK7Zz5P_Q zcg;+DcZ8CH6cPeH0t5sEl8m&t%IEy}`JTaj{T#JZZNfe$XiE`!5eSHeIK)?Dn9pxg zQ)v}>2ncU#2#8-H5D?FwpkE*e2)FML5GO_u5Pazn5IBz6oyr2AKfapCNr^*z{P*Pd zlqG#aU|nV8C14Mr5z(md^DA~DKS5s{oE6l*Oc#1&LO{s>lMxqD^ISd8@$kg__dEiy zw9xfdgzKTe7MAE~wYfAAv8Cn8ggNd(lulxf{6!i>iclE7+>`24qbU);2`?jkxgzA^ zAHcYI-Sw3#-pqZ_H&^O5At&P@JLfX@9y=j7mzkB7wIYpHlEBEsM8zi^lAE<+M` z=yy6Vbr|?hH?W?xAW3FnXrx1;B%&!I?O%tPH}8>3j5N-m!cnRyheyRy1A3wIh$2i@ z3qvKdbR2Ns`iS(h5=AP-2G8$}T6C`Hk^LEE584_rQ|k<^nb4`h%#sh*Rw@+d>p-R1XZJ;4r;y!U1mbgN=411%goikk_{hGW4STWSrOTVC zEwK1khm}V$_Oi?MKb15SU-62UUmv@f$Rf3R@g6GfHzm4w-nHOF+l!7GBfKhV30Y$2`~~#ur^hf;ik@hZn?|%3;xP0&u~{DW zeLTNH2};g=Tr@?j-+i6R{#LAnh7cYOeNVMHN-_9{V52zRVzyo=djwmp4udE#XlS;c zi3BruusuWd{j{lVlQ;a!L!R8=*<>=&N~jW+tG-DC&!~J?Hq{ma7tq1p_dSpf{9!cO zgaKNkOB-Mc5W}Ib91b$X(3U~zUiF{s7^kasJf;v*o$x~E;8 zurx60ajk)lKSY<-FX=yx9vok zycCxXmy141YwrTFdKS-4BEtU&go*<^a>VH$ld|5BB&T5(EfbX|uws_WFXMUfib>wr zExs9KztG1xZ3YuGDHhfEN8asu45a%82T?nhIrKQ{Vl zvJUY!s9OFOqwVpGd>~Fz{Jqk|3^JtPW6sS3jYvsXc z3`ai>OfHu&Er`Ww-PN*E*f>+)WIV1Gz#@_!@-gh*w}iD$uhQbj{?(m0z-c*KSIP{! zH0Sa7G@HAXIFEo-|F%+-CqF2x1FUi`{sA5Pbqi)Ji;*a68^lVee@ZO+vx;s_C#oo%Sk|H1Suq+XvGqEw zsMvgveX$`r5s94Su6p-#OjHcP;5>!>U37z9xu2A>I~OgzXp3^e5IF0c-^VYE08|=@SDkY{V{QtIybrN z(mN9|%SvEbrp$4z?eUdw77fj8oF_K&&uzwC*evyX)IXMJs^jG?nW)=sW@brJ8LQb? z65k_m{{u|556~aJXA{1Atw*fAup?<))df}C2mHuUXi`X9&#~WC_%%9!_qMkWmV|g% zLZ(A+r5&2el7zS|s~n{DcX##rDM8wQBJyw#<&ePc@WXN1PmCAP5l^7|Qh#VWsD4a6 zfF|PQ$_F57y77}?*z|h2RUrQv3`c{KNPwViK4#KbjLT~B!K=bIfH9U^ za|xxc-J1%mNfT4#bl_23fz>`Pr~E7Z@O;^^oXiwwaf9zg?byi>U~k3JPWuc&g$Ii& zY7`|y8Kvg$(qg_&xL4Z#k@uAJXMPiyB5sJh`Ijv|5!7zhd((Q*lmniE9gpFFNuq zOB7J@0>YEb(zNpium)}7c%i<$hbcagDP1w3c@nto-`R~-`);%!3{T+IfpL~B7Orj8 zCZlF3HPlt+p1Eqzargkj|IFv3Osx|>c(JHTKyYeNInFldFNqGj6~=?nT$jo4Hh~Xk z{23!_L?UMIzh)r2W+4OHWGu1Y2uD_1Zlbxanzb5@&~Q2c{V5HwYA_PA)yfU~ttWqL zdQR@s%eHi&td>Ld~G zW7$kwPIZI9x!#T1i{@%r4JqlnY=4s>ZWjndyv?JXm=e`eQ>)5BM;q6;GYL~f*-F@- zesn!nBZLJETrf%8JS!C|*jB~*syQQzz}o8y z0FHC;go^y{IQwpja`zywD6TdI!2JDnXj#camnUA;PyN#`B+TrqL;3Iwfm<%q5PYRC zp7ljZi8+AXyA$z0;>zWvPJKDzTPp=ky1Mh9)e-x3NR6~BJy=NfQj*Gt(w1dqtXU6|;GM3U=!;aHgW;Vw>-{a6 zQ!DPN-B;o7a;G<1K>naScC5{pZMPzM0Xkzc@Y)68Xvt)^-db}|c_C49TC#Cd`SRQv zSYCk;fW^HVld=Pl_!iax6*hCA7aCqoLN`4o*-$ye`Ln<7iS=w|mCbJRcsLI*?|^T~ zi|pj4iqjiy$CIN#sKJ0%!v|gwVgPD#7_H!8dibfPebL)!PoA~ldf@XLok-qTUgT>B-VQ&@`$w5SzJZ7>{6 z5p-GE);ShmVh9Nr8U)?p}uCC&JA>5dfNHJ&!SMEzB9rTg`gCIRadK; zPdV%M&MldB4+tslTk3g*oJ6VVKe{8OqJ^`yo?OOvp-{Xfv1;}r8bO_Bol8WHOzpCh|7@D zI#?(5b#koKV=|gn-RVeB4DWWIY3R%_Dz$^CrWzMW9nq*;uYV2E#C>qHdLm37nlU|H zBFB%D0;m~ORfdm*krRi0FSZzM^>gwdl-tuZc(?*GFf1JJdJ7l zfxNLNiY8<-ud6fz`bmE7Uf9%I@(5O-gsh+!=R6gcP>~W6Bplp_S0va7soyV=+3Vmr zM9mcg8nw|TcVJZl4RK%`-CxU$c=cwu_(D)LBeU6I*m+dizfl zOofxhIlXKIA3J@>>n)%2MFI^10hRzN-j!t+gONIV%%A9FYPK@+;XP*t&dG~J}6cE9A>}V+zEX< zIT^-xxQEM;dR;YltTj*1CqST`WY%wd3=H;JX{g>!|6k2vM>DJ|QJObc%}REu6{&$L>N(3bdnORtyW`cB1XzZ8&`goWGu8b&YL zi=ZOTOIq^9J9c2uZuk)1zi1XF?yHq|>G#akxHihPN9uE}yEx}gl$<_wLCbBBi=AIO|E*B1CNLlLaM`e2%~O)Yf|xaT(*o4= z+OYFLve>$~L~7tQlLUX5?L+Cee=kYAPmoAfS1Z&aq%?Gb%{y0lyb2$PG{57I({M`{ zvi+_}V{SaQ7Pz)YGhi{Cv=B)miw}Mhf+exfhV8p_xhQen(okV(k4*W!%4U876eCSj zAe4~n_-(eOOfNT{&>8n=VK*koFL>2uOisbH***~TKd!%jU_x8 zERE<|H~qRa-K`Jvs#?$2%cOZ~O`k&O!)Rd8!$ozRt=e4MQviR~`nVl^YPT!V;#-E% z59Ssn<7d!V^WB?xSG%mNGn?|Pw5=1f;X&EW!{Fk_SjYRznSC^Mc8WA1{?8wstIE3Q@UG{qqS3Nn?S!V0j*UdVj>O4M@|rl%jU7+EQR zT@n=Ni=V2p(U>Nb8ZTt&Qx6j_M5yQD&6?~u$K!UHgRk3oxp&!rv%?y*blXkQm(OT> z91{Av(S>5Z97Er0mvv>shXARsoN!FEtap!7s&H)i=@H@AO=pT`?Zzdfl)zOOE34BN zW?rx6{;Br%xss_1a9-B3J$G?@-hiWvul!ThvxqyF%9m5P#r=d-9T`L}EDMiKfIT_h zkmrAp^bq6{qsQqZFv$++EA;sS?+Tvf$Y#YdZfu0`${oVEZ6IQlI)~oz-*$`9{!*ii1@Sb_ z+3%((MlS2c@R<}ST+)Qiw7F0@Z*5(@P-&?N%uV%&FnE!NzuI~Td`}0uM(sHs8@SRb zp^>^3t7*+yrjXfH&g#yT7kGy{fV>a*pHf6L4d>TbQyzAO|2!8eN}NXHYIrMhWS8T{M!_S=Ym*-^-` zU^v+VyGOZvs|}}{_JZTCPd@tYcu?%9*jQuoqIMs5j!1$!FPiFrqzu;<_*{0P$&*sW zu6xWZG^J*+9(tKSWTO}yiwy?edjNPF`ei?s*7A&0wzAs!{TU8k0z{OntRvGSf;-gZK%>^`Vlb%%Hf}`9*F>Nr0_S=b8>MMe%h+{EJ&M2U z{;08(*xp7b`eu}iBTvChlw7J=&EKunVpk?o(fyb!{twalQ0uMA33Ff7Q$$?EphklD zrb5htOWFL})9(m{S?#%zbUN>x&dQ%EQp${Q65!RjD+qyQ8+7?;`(PI8jEOTsTO@*n z14aLP?oVW&`dw;iJgAsX|i~T>jnRLLjzo%6R+n6 z5xotz9OM(B$VRqs`X_#rHrf4M<%b(nYgG#%;WM6L={LNoVdWR;d!mwkBNz>dZL7K5 zX#{*$*ZZ;4QluPS7)4j)RA`(hDsvw4nr21bG^V@*WzY5?MJ^Z>tG5P2GfX!IM_?E^ zwCK~rhtJKwUo$=^xe_lft4%Cr(QH5kac{oGuhzGD?ddQWFS+1e7mYfjsh{brCOrCU zB-8;*8X=e8iEO<%>^zg#N@EVLl>5(D35Fl9Tsm}~!osiX`i_TBAJCKHMI~=)*B5VY z6b3!5vG$upW4OPM>a6bmtaFhx$1fz~!( z#^_uf{2=6}aF)m4+Si#)OepAVmty2{d7iZIM#or`a$TVVZjG~vagtxG7ptkLbjfk= zK_A2$mC~3M1d9d-w+_lkt^gHv)Btp|Cf6yY+*2WRe}8nUktPQoVn>Ve&Um-PcHXk|vu$49EI!1v`E!k*SEB|Nc5 zx(*|dv~sUzVzj+batJ9O#0MEsN;{(ZBTwkYF!xXBTWV8}7l53A111lpsx0I-$RT6- zf(RwiFk&#NR zeSNvcJ#%%+VjO|QWhDAz{?t`Ca{g695b1;~^9L-ABE|$wX?%uJ};y zL%l4?`(K19kKUbZ}^ziV91r2qHhD{=zI=a&Q~{jM>?n+hJP5`p67q*s`cT; zMtY)Igd$`MRE}M*ZqR7X9eM)CYmX<2`%&`1#CtSfVuZ3=E+xU&zm7*4O8xjWbI){EV} zN%geVbIzZT9_|DKF*O^mvV4&>yKtef9xf?&sDKI2U(<0z*Kri?LYuE9N?bX}V$a_W zf0Xl)|l(|0M^cJX28uLrgV|bo}*E0pt=qa3^sP_1)D`iDp5iW`n_CGExom%{V9b~Xeq=^_#!i7nZURF;eR}I{A#RrKEufrNSouT2VQuV@{mmIPpPKaLKUMY?@ICQ+Z#$R=S!{&# z7~#wviNO)IsM8qGcjnkbm1Qff7v*J5KXOtmpS&W(oeZ2m#G|LldTU#TZSke1L{(cAm}BLfA^*>`&fRO&okG_)3qkJ>@!wZRzoZ~u=i(hV)whlx%Iu@XPs!m z5t@E_(`;mV((t_(S7ZDPfvOyi*k){o%0R(ttkvo|oQ`vkQ_sy`5tpp>O15avgkseU z8)_Y&{8d-Pby1_ig6aAC@}aieY|O>|O?#B@jx4)@X@(Iw9-V3rRK%pf2cDkTP7b-!%_8lIYh*15-ARC3OP+Nn!~T|p1JO{F{HL#gM2dm`N}7z$%T0Rk znP2b6t`t}9(0R+Hi%Wak3$48ZzjW28XrVr@XY56Z%>-+0`h1q#$87^>5{sr=DsAoA zc^qa|53P%2X|c{x7AA`#5z+=9_%v<4PimS(4M(R`{4IJHH|yMGDm!7~OX)Y_zh19D zI*WoD8`1Gos?C?OyB@c-*n3wD#!BPf1#VlmC=_qNB^uQ)n#!&}Mh+dfTZdfwoUtA3 znr_A>-qnR(YG1z2Z`%?uu|%3V+_S({U=SpUn=_BDi(4pU=@r?fTzeX&h%B7r>;0Q8 z5w6&A$%Ju%vP|#`o1kbB!S8LybVfuNlbYEn1T`k5{g49 z2&M=dpBs0?vcT}#X84-BmOL&cGy%BTO$WXPoVv)92*pp$Y8QLADtXt3jKVRkv%h+m>;NvM5e`f3pTc^e<$Ch~mwE~sngoaw=<)q!rm3)nGxW!2h2IR6FwYw~F zIWM=~-puk?^->b$eMaoF*Vtznu}#o-AG?}h07S9I!@4xc2fnV4Mmp}1MM@Tpry%1( z)53^rs`$ICJazV;Bc}@LuBd;gSZZ(32+eAkzNJnO!}YOK;LO#^yCCl;H*r(sg@@xN z@@0>MG8oeNUK=pB_FDR`CdD3Z_iMQ-vP&*XKw8vxj2+F=iupI;#J=gXzqq%21CNuA z<~q;hbfn(Gx=7<>Cl!MiYnEM`;kVw!_Htqh)TDF>0dXm)`>f{rtmk+Cen5o@ECfqU zO-db_Z#!P>lrHOd(3VLxHy9vt2di0pDGJ96i5gqr6^{n z2km5TrnV2kcPxWMyMi^A$~5eIZGVnczo7ixnV`pB%2A&bdQ@lA&C}YO6t6$~fTVtl zZj6EUk4=+OSPmH?H>$qMsEeu3r(ICBrTypU_73dxY~9-zMk>6=@klFkx*~^pvD-{< zKvvUg zGDk~Da-(l`<_Lo&g71X8&r*TjY|9tC+8j_MN{#4*|Tp;H*1sD>cJK(O}(SbwI+CfW+AFf`v9R5-ev@ zxQo`M``!KTOp<}2i*$%{scqv}AD|GK+iO#gH-lSK!Q!^roQJ}M&fUh-Pe^FRIplE3 zU@%0E|7tz{x1x96r+du`o4$Bsz}$REGhkdadSIS*2N^b{_0?B9O<&uOG2j*`4EmF{ z03X&H1%Nj4e;8lZBpw-%C;0-*1!qd-5sMx1qpx`1+T7{|ZdkzPiADm6l89>!CU5aY z!jr@e7nt4nC8YA9L>Jzurx%n3J3b0nhgxhURe~|E|Mu+f<0zwH3>TYctpLqo8E}vR z$9|Gbi0wSc0p6(WIFm4~3tqYkFlb<7MCeRh*B|bc-?VNvWB~Jbv;EnA)&iTwzW)5a z5dTcb7SWi<|?XBFOtaHv5hOcPu`@=DC)BCk|O zyeH(5)s}!^ViCx*EUgw!#lE>l3|8>2%V7C!P<;bGOBMMzh$7fr2Ku*?3oA9ZEs*ng zm`J|#MK6@t#Iz`a)}gPLM9#~yq5*~xYNzmzAkhBda`;N$l_Fs77k4T&At~|M9U;+& zv(Rr@4rB|$!Jl!I6;9u#e;9}i?+kYL+7=eLFVc#>+C1pt9~0^a|L}Jr<~8B|86;`% z1v5}MQ`@iodTacJAT>lX2!%|9)$xzo2wfHe>*gOknEprZ+gAxXcr%<- zm3`QdoDhX0ww+LJPy6MurK6o+%v70bP_t%a&dC0i-*AP9#LlXS0SNIF$%ScTxX z3MeJ-vp@3(AEC*=0?k8C7jcLHDzj*^RxzY|VFDAI(;t6IYE)-K#SvuuD}F=yho)`4 z@uNIsx;~@8e^KLbl^{=<;e)M1Zqk?>nWGDK4j>kqj4NcIoQmy z-X`o(fMG6U9!xXx%DUHMlqhA>m-VoA9|0S%kpyz5U@2nH(YQlR%|m$HYhp5XgUcCLWk6EE}-^-Fe8p!2Rqx z;}%FxiMFcjgrcMQxhT;{zo zc`jT!hpP=2mQ4GOkMsdo^R0}e1Ryrw+y|;*cpR{Ve=!{0t8I|o8YBZ4M9&Q4pZhx zf(+ENFz)@d+OJKOv0nX&93EeL-*NJ4bi-!)FY58_WM`zwW{_^zt91iE&_*#OM>sMI zVI>`dq0AK0b`ePEx99tD{s{4_ATa*48e)T%lgIKAz&df)YJ?`nu{|zSB8?{%5eWx- zSG)tBsDv=p`wvpu1&#S6XtqVs6soB75yVb|m(KAC182;6CT9|)LkfSt@p`&fpcKFf z*aNb-ej81-=g(gK1!n|7p9JTT<=RFM^yYV#)V#ntW*^c$)H2D+OHzw zzb?VntvSgcd8!yA<)P^nl83-mnMSW_3B6*&QY zea6Uo<=)}QN}OAM-gYC9FC}InA|$8F3KFH4rc)XKS=9*@L6q+_jbelgOK1j{n+8^a z$g5xVP(gu38Q(Lp7i~U~)I(H&!o2Ml?N-gyN$(tWL;|UyLHS`$#7)m3A$tef10n1c zLOhW$fnjhoij?{&A#Is*;CNx_0fxru?N7Ayj#ZV=_ym%MN-BELkTZh<{~Y~900wmX z&-OjhTvW8twI~K<4mJ3AfrbcTP}@~<(drTqU%d%3Utuei;t|5IZ>v&!BJHgr8$0D6 z^UDK0H^H;qT57^5ON8)u$aGZF^XagaDjGC6CTlYh52{=-m#%T)0 zt#NrnJ~Igpou;IAS;ae21p_QAniZ^$@7~lu;Lm3yA|NV$L2^l10o5!aJ0VpP%E_`l zuTt*Dm8Jwmd;L+t1eq6AQ_$~YFE_X@ALdrtcv>~?uJVbx$EHC1@z;MOb0w!ngM2&U z;d{LMA;|7syg>vpg;1SC7DzqK@+=buQ~OAJPaPl^J#Q-iZh^v?Yg^_r^Skp#C{D)2-iZf7fx1rS6T%%WLd~lptec z!&Yp~Nfbji(BYV}!iYh8BJnE1nQAJlkFDb1S&}FrOJ%7^+;@d-j}88ybgoG< zwy*jvzsTcj+1T1_YpyK)x^1Z#gK3V0LIM9mnTBI1B*2e|iblMvK_!UM1R1X*Rb0#D z(Y(|I?B-ueoM2JMc=uDWOj_tUe$GVKWHESt{KNTnnpXK;Z#$sg`rK6uk%ES$=sW$F zvJv?N#CUh=o_jJpz}ugyD9NP`ebKK7T(rVw;>Bcs?6&tmodqF*#9H)PA)&aIWGsNC zHjTWOzxfgZ0?i~5M?T>89IZWQ@*M~a1HafUA!gIP=T4H@H-CUAY*vlE;YQab(I2Wd zZpx^wE3frOeN-Z>U>5$=F~yMF`VUf9clua%KRv}%S08~EbdbkA2^Iyes`-K;ib86BGoe__Le$@Nrc<>4D>hga+PJiNP4d z*6i?jy#5cs9!Xb<0hFPzoLxvgU2+=#Q|J0v`;t(Ruz>6f~N%rNz&H;AkmX}Q+0n8YDve$<%1ouu`;B*9L{fb>};`#~J(Wqw17{8=X^W^tjl`;kL2tTn_j{ zfcX-vU8Llr17=evH|9=k7&XR+hZ7F&zqcX}nh{)3VX?@340y zZ0_0wR!0RMhU!U+i5?z}4iu`4d7+~He!Z{bb+NtltXg?6OSb#-tH7;U%vJ#C_DBgo zRaJ(JIW4Um1eg8$jFI3)#m>XJ29*o)Blz@!_|N%97kF^fcIH)FlCS{?1)Pc> zyy5nB`2+fa!}erjbH9#A5H^sSjo|nLKl)Wov5oE4L%Ivu)aaBkQ<7;z|GvR$zwVCW z`zU-IGtezCEvtpDP019koi8nn`oYHP2#ZHyn_;Gqzd`B?>xomwFbe&708W>G(w3Xm z1u=VqE9D%QFN;bmzPe{ss^8Z~^HU-G&G1;NBy;-TjA)?9 z`~lqw`zI>)t&G2_!9Okj)>6zCQ}SKk`k|LH`X;!0JgsDWFd(ogNwj{??05jGunZxQ zbw?3@t79QT=^OI0S=QXA;3CV-eic>w9c*0%++LdQHQtCkQaHs!!YHC+b|qKhN!Rt( zdBA6Pp(3wAGdv&vLyc)tNVx4fyHLx1k#dP5C~- zv&fk4;L5#7Ys>@&r1RACb8m3{lFXSZ6ba_I9`}3oCQbT^^AVarw6))ts$Z?^^^-t7 zk}CdQLl)_j&H~NLq|X*Vdp?XJ)ZSOBF(Njabhvh#iQZ(Z4%p;s`sQ7Mt$=h!B*5uT zD8pnDKZ|8{KsanMw$n&_E@RD}{r4L~m7!1X>cb)js)mvRS;Rn*VhrUuBSS*XtL^kN zypK4vyI^W{4e@49*8s@A3hN}a?~Bli014M15z4o+gU}pD37P~=wO>lr9NmwQ&n=!Q zMf?x-PWpFT@*$XkYO1n#N&U$9O~3w@izkC{kq?uL5M`3SjxCQPJiT4&uH3qNI&5c0 zOQ=%2tO<%)d1^4)vHTz_IwR$ev!$tYy79SQK>A|H_tf(qG3+;%zG+ zWA`@Ha;>VAA!6K`Hnc1rYxhr!-LGMGL#=9o;FBL-Y%B+KK${*2b}T(1J$PRGY00J$ zu~ct~hN(JW%NX6wUfMPjb3Z=T)nMEKOJL`hl};qQ5@LZ)lDe&FuNs0Rz4$Rz{W{*F zp|?EW>x-!9bIy?JX^i&#ong}ca~I|O1CaiWc|>|3Es5;eLRMYbTo%B2@} zKxh0!c^=*EVd0a279;(x5yRmfANvr}oz`~1_u{1-%#T<08iGFs()E?#(*np{miBn< zsHMDH?*gJal-j)ZuIJl;K&NpbGr0m3ASN8NG8dwqNp-Xzi0@Fo&Ie~+$!s|BO2FmC zNJm3Yq+1YPUHwZ8(Gy_)UWlYAwcB~%wB*~uOCk+!|JJ)L)NGph%{0YUA!5X#X85A2 z_Uj|PK`z@Yh`C(#WCQbUdb!=5k6=l3D}kl3v{<=7F7j`-?TrpD@D-}je{HZ4CP2s= zB>II+X<={p=!2w9@Ovg=9Y{QaGgVN#L#u`h-Lw##hKZ)EH;{}op*9}y2PE=^rFj;y zY$sA6Y)M7ZNru=wRg}7hU~u-5O77^j4%ik?s#M{a^0D**Jec~T=Wd5+GJSo0wR2al zVxoQyrwKjckIks7+{N5nAiK=hnN9z2kBfNa)ZA6h{=)7&!vSEzFWVDHji3RCoTX7wel@C9vOJMf^=n(HO9t{}KezW7$44V0>_?h>3;$5zGpF<}E zg;J@R5t^?g3abQbk8?F}wn36nYPSB^`_0ljoR}F+#hT&_j2+qQ{~48UE(^`u_0VWm z%4?EG?;*IE$6#+I6Zl3tavh7dQ;%UDQN}1o9$VV9U(#@!vq};WtjGNGT2rTj=xGPE zH0p_y@$~!Z*Z`l)N_r86kD-+LdnYehKOO@Z;CZ%!W3^lX1?z%<);VO~f_na|m6hxH zp*ssFwR`+hg4tCcymTM4;>VE|B+KGY^qMJYqDRO?gg^Ka1}u^-pK+Pd;@ij`b-)8q z+zJbM4_ngwTgBWsp_*?=lWds0vQnU5KWKk5u;of|)n)JXW64uo`gd7WcjEX5@fD?% z(JM}0LcujJwh%5vsr|W|dPs6*<@Qa8!?hSQaQBe!(QOPVC-Z7}Ez8TM<;pnwF5!tG z)p4jZ<~q_OgnYIn2sQAe5FJ%i1TF^7hl5bg{5||6ry>tN9r6Pumxu?$@+XCFWl-s{ z6`z)RV5wXP^DJhdJREwVt++ZSo7;~KGj-miV{S+4V;q}(9~6~im#>6z@zPk;%Sr;X z`~C!zo&V;exi~3VVcu!JdHM5}%tc;=mwr~I1_{fGs1=7UHgHMa^^RL%Ow)F*vxgWA z*6t4y5rALbXhl)0N{v`#EKlOmB(rel%0FA*Fk-mK7ardo2xMaIBz066=S)PFU_{Zx zwV1Z=W}B_0T0fpkW-W5jZgIb-yVONm%3XL!PsWjBGA3v=3nFE(Gjli}{boCa^GBy< z@k$eXQs98^tTk>~4sWd}C&sCz_^sV*);&wTDChl<_v3m+NKd(gXXD_JgGm3mp@Iv) zm}7sbg_#Se4iM$DN%FoNbMF+_!VEz#MG|r z>xz?YLs6%-9jhqb3i1fAV65wYna*NAlc_8gypdP&wnZ zkAD2O`aq!mZzY{(7zV;ICTOEEhQP@je~Lqu-Im17Mzp6CVt>AP#Tz*m%ZUz~mAe~c zu5M-i42e@j6ak@ViyZO@s|$0Rdw@vb&@!dC)3+2Ua$MfGE&IXFcv5H;H0j}WE`-nK zJDUDW*PYLZo3h67a~)8ZhhjVR*(mR*fr=(+v7Hw$-4ErHtO|gcChZF3r$L=o?wKhJ(`Pf= zg37htIWoU(Pf`VsrD{Q_0wo{w8hcV)yHHx{%VD8ry!jh%=E zK$H}4o|}Fk1Vgf(Pg9iTG=#LuuYG?cao-Dhqxi zMWvNBVzNgkEbR*xk)2@z4d~X4Tf}_UGF=jgc>lg{$3o=OxF=$w;ws@yO6whGF?^r! zv8l|{=Fm&$v0+|pl6$-d(Uij#QkZ}>X*t^5O_m20)nEJ%E}Vt);Y@!9|EBm{S-A2S zdEAH8-Q)H-9++!=%L89l?;E^)rmCLKltS75dR8r2j|4_!W9-$U^`Qd_RW7bTCRdu2 zbFnRA?++5?d+9=PLd@Z$tDLB`&D!4fFOdvUBB8W}G4>|QMhF6MnELs05lVNey(79& zP}*W$0$hRA=Q>3a)Q#MGxC!ud%~sh8TeoSnf|h&?xVO{y9mjEgIK!U|$LfJ+$&En5zzSncPH$a!)- z7vid|%rF&o>ORa^v+1n(8bt>to#DhPfaGky*L{)A7v3%Ra&Vq79n`+)uQ^E`gDb6m zjbE?f_j0;dD$4R#IqbPY@X7ut7Jddlam3?Wa-T{cqJSrgEo~mH5h@X;5ZY!Zk^iGN zc;*Y1nd8`f)nIcV3gq|Q6c64+!$5NAHMU4c4y&p0)85@+Ztkm{uocONz7Oz3Jsn4f znyKYg8_230j{G0ooSAOeCg1BV377_sETO!e-dBB7GO%Tl3q%lo>$ntbHwidDAWO z&_ZDkp$`e^ORT!xZxXvLLK<6Uf+2gJ3+!#+*+%o2PMVjo`4^4Qm2=i@5=n>_t<#;b zJ1E85c|)4TJymfd)c%k_#$it)F?dsR_V*FKM|6gi3Q4mTD+6mf3d3fLND~cG;@6t? z4SU6NfqG9{y^o&PCVce$Hbgo;S^E&&< z#(?bLS-}7ABYz~hl3U7cIW?uZ!H>GE+}*dkrf;WE6<-h@CrrWltYsh(Qp^a$d8gB| zi!lw=iL7f5h`~~zWSA5U7i-{~wlED}9q-7;u)@~bcoq=Ynw_3HyF^Jn8YBpq}lYI%#7f`+^S?h_A09CAQH$i7-O z?Q8oTgwv!B+w*}3Z>I}N6?Uw^vETDI0!0;Fqztu*_gB+$dJcIz`9%#H^Ob~Z9YXxw zuSzAcwTQ(Q2m)IFvGc-bQiocx{OWn)SKD&_k>>Uf+0ydj5QH>Y-zxXpyaohiwTV}} zw~wPvMvUd&j$}7EvAXqIaS^z{(yT1oeiH-%+}O{| z1e)coj>$#(2t@kZq2;SviX>C?K> z)D3e&046m%eB}R{dD3_&ysop)*ke>f#@K2I4Ov2#FqUjH!&tJ7kr0I%OoWE9GxjA* z#@I5l^e2i$%80BX5*o=af7zlMJ=61kdOy71-!J#mIp^NrJ^Q)$oDqpEqvJJY(!hjG z@ok2{n`No0yV>e5qJ-o(4IGW5?rKI^_r}LLOe0b|0@dCv$A`-m#TZh4S;z5Mu5><; zCK_Fo-yY~2nE&k{@ZF!frlf8JjU&ISy+F0K=7}2@6iJeSH_;q8>{v=iGU2%fxcN^B z!1^Ri2e7NyL*YxxVAm*~yKgv%9kAYI0IM4&;T4cAA{}a$zxHJ(qVIg48KAO%k2b<4 zhZaiLWFz3iuuWqi!pL7{mBl;iZ`x`O`TW`Bx1TV@n69ItanO5Lxq60V#tl_{%B_L_ zwWQ;hjS=yE06`=YnM{LW(nAXc+YAL{pB#joFT4b~a6<(2*I$?;LCDuIw}yA?#>XkN zXccS?&&!`d;;+OwX~G4SeKEZt0vwQ(Bchl3p|)+9?+RA&$j2Of@xT~Z%2ijtPQ1}D zzoT)A%+k^f04XC8-rrm2C*r1v$v@1LVRYT$t)ZkDBg}xcm06>I4=>G$=FNexDR+99 zVeqtR(|q*(@lg{(Dnl#uF82ruG&qB3;P%|@7f)ZOkuhE?fge(t?IYy%_-pu0yZBWolMr^sdJi z@d~j*oy*uKoTh0(I?=gCGI8#E&dNOc)aqxmptXFTo6tj z5&I;WZl7<K?gYwTz+{lQ0;=2WGoYpnhD5s~ z3>lK2h9)Z03ruzA~f2>wg3R#bF~o4+@}K5`}r?Z34xjrB3z43C~P>-ydCi znDaHqX+#4rbuge1{$C+<2+sqY?^FG3WtajJMVd8)!gaEU~!WGBg zR?m5fpnjqDMk9;$+{d?8$!Q@YN5vmZT|`g!PEK7Fdw9c$1L1gC(P^XXkGK?u|OAFUb3> zmQ0pNbxIw?prqY3T~8%GEYDVbx>*rbY510wt+-~S?JjSEZB3}};vttBx%R5HNPdjL zJ*7N*y(}jSg0ooS5q%(*H*SBmInX$?tVl9p$1m#R;;!F|oG%+*k0Ug8`1)BWLIee8nat&|?v#aWxv znJBq%iJh4eR)(n@psMxJhNxjlS9|`W#5GHt^%=)_$D+SOr~Uv`Rrm9a@6It{G*6i$ z7$O@&BumvOItjSP8fXXcmOGFclxCQn=ZcIQCk4Q4nY;!*?vH*`?-D(Cs(X+XFLu_y}BATK)Z%)7RPh8wd z2!1CSn-q{if1V$T^|%E-6jMQ;Ul}MD@F-K;IkoP1$Hr$1dq z?+Ccp-g|b$Mc0ec^_xRy;Wk$Er3xF7w^FJ;Z?vvXM_#Mbb8+O5F2^ic@2|7@oKko) z`5rL0cQii`8GVLJp>sZWaV6^fcU9ojkCqEPZe|6t1WCA;mF+R^;kzkDtwPpM(2Nfj z?b{8PCTLtKH$2rHQ5k5qN?JG1ePjkeiCh>haHdnesCz1MV_>+O<}`{o&l)T^>iQ}k zoo6xemztW-7E>tqE zjp*+(4ae-gO6MW*m6i9~)m`bEp&}|5OPA|ChDko{CEFc~K-LAg361OJV|*gD!NzB- zdp|P(5KC}WDGvr^jvSkMIn+zn8bIlS;FApLZpN?r*p7DXYG)k?s|(0JG(UVrdtLb_ ze}OYof>$1C*`5r17WLcK&79_f-L2AnxOj*e3)YxJ$a^3BhJXU(bcS(DqB~Ou^c2&u z>b_trVuEnPdGPBuW)0QEEn!i=9xBbg?cPD*)5V&;2F$vME zT|CwW-5#Z>%Z7`AzVFi!Q;FqlDG?3WwI+>rl<)1IEGKn&DSZ|A0E|Rig3%)Z{@T~~`1TsXn?Au568?(g+ren^3u1t{CjM&_K z0pFL+utq#?01}l_Olj+5rVEv?9y(mZ0VDWYses&z5tn*Coqk-PKfH2FO&eI%Wn8Rv zf_#iJJi=8RGUvSU4%Q_LZLvNFk?7=)wowUG0y7OJfxs1B%rojvUse7}h<_MpHrYL{ z_0zNbD%1_#)UnMTw@n!pRq~^M=vGnq;?Y^0h};rL&&o-y*1!(ZkvU{7g2eFU-qLb! z=cx4N;~u)V5Uqcnlq~#(6!Jojw~c-6&o42;t?6_8uHX5&_VoxAqOFtG?^q*1zPDg+ z2incdlN7e#UQ=GJ8BWC(>p6r9&_Sg5b4XuPivE`;K2^;1J0jl*rYAf4BNWgSK%bQ5 zmTsGX_s>sbeKt%ouZKe6F0ScgVt?RZfy={%>@auLw!9O#RQW(t~eY?{X zjZW-)owi?D@4dW*BMM4`#)?@>tIAV*KhReMyLu(8f+u-c0hQkT>_j&B_Mec9r|JIZ z^-rdIP*>SY-S@<2{+%3QO+dOP*VnvMt&#gUa$Zb-4%_zN!^wf;FCIR@?+f2DP$xx5 zt#`kY(W;Zs!eYcq^%^YBD*pCMHPr0Z2QLlPn(6{Oyl8fKszT8J zt99TH+u^XXG;vYMi#6>{9*=OsU-QI!>v-K}W!K)v)Zl8W%5ZgMRaJXcEu9NmI%@E9 oaJUW}&K~ks;eR3A47}!d{qFyba0eEY%R)G2fv_>DH^RpJ2Z|Ik82|tP From 4039e502cc17156c42683be3ad2bde27935dee61 Mon Sep 17 00:00:00 2001 From: afwillia Date: Wed, 6 Mar 2024 12:36:10 -0800 Subject: [PATCH 67/72] change default logo --- server.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.R b/server.R index 6120cfc6..df7b3994 100644 --- a/server.R +++ b/server.R @@ -218,7 +218,7 @@ shinyServer(function(input, output, session) { logo_img <- ifelse(!is.na(dcc_config_react()$dcc$logo_location), dcc_config_react()$dcc$logo_location, - "https://raw.githubusercontent.com/Sage-Bionetworks/data_curator_config/main/demo/Logo_Sage_Logomark.png" + "https://raw.githubusercontent.com/Sage-Bionetworks/data_curator_config/prod/demo/sage_logo_mark_only.png" ) logo_link <- ifelse(!is.na(dcc_config_react()$dcc$logo_link), From bca6f87732b3a5ca12a83a4faae47f413b1f161a Mon Sep 17 00:00:00 2001 From: afwillia Date: Fri, 15 Mar 2024 08:32:33 -0700 Subject: [PATCH 68/72] Add warning pop up when selected folder does not have any files and the data type is file-based. --- server.R | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/server.R b/server.R index e333e764..f14c225d 100644 --- a/server.R +++ b/server.R @@ -112,6 +112,8 @@ shinyServer(function(input, output, session) { shinyjs::hide("box_preview") shinyjs::hide("box_validate") shinyjs::hide("box_submit") + + warn_text <- reactiveVal(NULL) # initial loading page observeEvent(input$cookie, { @@ -455,33 +457,36 @@ shinyServer(function(input, output, session) { selected$schema(data_list$template()[input$dropdown_template]) shinyjs::show(select = "li:nth-child(5)") shinyjs::show(select = "li:nth-child(6)") - warn_text <- NULL if (length(data_list$folders()) == 0) { # add warning if there is no folder in the selected project - warn_text <- paste0( + warn_text(paste0( "please create a folder in the ", strong(sQuote(input$dropdown_project)), " prior to submitting templates." - ) + )) } - if (is.na(data_list$files()) & selected$schema_type() == "file") { + if (all(is.na(data_list$files())) & selected$schema_type() == "file") { # display warning message if folder is empty and data type is file-based - warn_text <- paste0( + warn_text(paste0( strong(sQuote(input$dropdown_folder)), " folder is empty, please upload your data before generating manifest.", "
", strong(sQuote(input$dropdown_template)), " requires data files to be uploaded prior to generating and submitting templates.", "
", "Filling in a template before uploading your data, may result in errors and delays in your data submission later." - ) + )) } # if there is warning from above checks - if (!is.null(warn_text)) { - # display warnings - output$text_template_warn <- renderUI(tagList(br(), span(class = "warn_msg", HTML(warn_text)))) - show("div_template_warn") - } + # if (!is.null(warn_text)) { + # # display warnings + # output$text_template_warn <- renderUI(tagList(br(), span(class = "warn_msg", HTML(warn_text)))) + # show("div_template_warn") + # nx_report_warning( + # title = "No data uploaded in folder", + # HTML(warn_text) + # ) + # } updateTabsetPanel(session, "tabs", selected = "tab_template" ) @@ -715,6 +720,16 @@ shinyServer(function(input, output, session) { shinyjs::show("div_download_data") } } + # if there is warning from above checks + if (!is.null(warn_text())) { + # display warnings + output$text_template_warn <- renderUI(tagList(br(), span(class = "warn_msg", HTML(warn_text())))) + show("div_template_warn") + nx_report_warning( + title = "No data uploaded in folder", + HTML(warn_text()) + ) + } dcWaiter("hide") }) From e0d1042962913b69e91b2eed1a16407a306480d0 Mon Sep 17 00:00:00 2001 From: afwillia Date: Fri, 15 Mar 2024 09:35:16 -0700 Subject: [PATCH 69/72] Display empty folder warning immediately after selecting a file-based template; don't wait until after manifest is downloaded. --- server.R | 101 +++++++++++++++++++++++++++---------------------------- 1 file changed, 50 insertions(+), 51 deletions(-) diff --git a/server.R b/server.R index 36087665..410a0921 100644 --- a/server.R +++ b/server.R @@ -113,8 +113,6 @@ shinyServer(function(input, output, session) { shinyjs::hide("box_validate") shinyjs::hide("box_submit") - warn_text <- reactiveVal(NULL) - # initial loading page observeEvent(input$cookie, { # login and update session @@ -446,6 +444,12 @@ shinyServer(function(input, output, session) { shinyjs::enable("btn_project") shinyjs::enable("btn_template_select") }) + + # observeEvent(input$dropdown_template, { + # req(input$tabs %in% "tab_template_select") + # type <- config_schema()[[1]]$type[which(config_schema()[[1]]$display_name == input$dropdown_template)] + # + # }) # Goal of this button is to updpate the template reactive object # with the template the user chooses @@ -455,49 +459,15 @@ shinyServer(function(input, output, session) { selected$schema(data_list$template()[input$dropdown_template]) shinyjs::show(select = "li:nth-child(5)") shinyjs::show(select = "li:nth-child(6)") - if (length(data_list$folders()) == 0) { - # add warning if there is no folder in the selected project - warn_text(paste0( - "please create a folder in the ", - strong(sQuote(input$dropdown_project)), - " prior to submitting templates." - )) - } - if (all(is.na(data_list$files())) & selected$schema_type() == "file") { - # display warning message if folder is empty and data type is file-based - warn_text(paste0( - strong(sQuote(input$dropdown_folder)), " folder is empty, - please upload your data before generating manifest.", - "
", strong(sQuote(input$dropdown_template)), - " requires data files to be uploaded prior to generating and submitting templates.", - "
", "Filling in a template before uploading your data, - may result in errors and delays in your data submission later." - )) - } - - # if there is warning from above checks - # if (!is.null(warn_text)) { - # # display warnings - # output$text_template_warn <- renderUI(tagList(br(), span(class = "warn_msg", HTML(warn_text)))) - # show("div_template_warn") - # nx_report_warning( - # title = "No data uploaded in folder", - # HTML(warn_text) - # ) - # } updateTabsetPanel(session, "tabs", selected = "tab_template" ) dcWaiter("hide") }) - observeEvent(input$dropdown_template, { - shinyjs::enable("btn_template") - shinyjs::enable("btn_template_select") - updateSelectInput(session, "header_dropdown_template", - choices = input$dropdown_template - ) - }) + # observeEvent(input$dropdown_template, { + # + # }) # Goal of this button is to get the files within a folder the user selects observeEvent(input$btn_folder, { @@ -514,7 +484,7 @@ shinyServer(function(input, output, session) { sapply(clean_tags[1:2], FUN = hide) - if (selected$schema_type() %in% c("record", "file")) { + # if (selected$schema_type() %in% c("record", "file")) { # check number of files if it's file-based template # This gets files using the synapse REST API # get file list in selected folder @@ -544,7 +514,7 @@ shinyServer(function(input, output, session) { # update files list in the folder data_list$files(list2Vector(file_list)) } - } + # } }) observeEvent(input$dropdown_folder, { @@ -583,6 +553,8 @@ shinyServer(function(input, output, session) { # update selected schema template name observeEvent(input$dropdown_template, { + req(input$tabs %in% "tab_template_select") + warn_text <- reactiveVal(NULL) shinyjs::enable("btn_template_select") # update reactive selected values for schema selected$schema(data_list$template()[input$dropdown_template]) @@ -598,6 +570,43 @@ shinyServer(function(input, output, session) { # clean all tags related with selected template sapply(clean_tags, FUN = hide) + + if (length(data_list$folders()) == 0) { + # add warning if there is no folder in the selected project + warn_text(paste0( + "please create a folder in the ", + strong(sQuote(input$dropdown_project)), + " prior to submitting templates." + )) + } + if (all(is.na(data_list$files())) & selected$schema_type() == "file") { + # display warning message if folder is empty and data type is file-based + warn_text(paste0( + strong(sQuote(input$dropdown_folder)), " folder is empty, + please upload your data before generating manifest.", + "
", strong(sQuote(input$dropdown_template)), + " requires data files to be uploaded prior to generating and submitting templates.", + "
", "Filling in a template before uploading your data, + may result in errors and delays in your data submission later." + )) + } + + # if there is warning from above checks + if (!is.null(warn_text())) { + # display warnings + output$text_template_warn <- renderUI(tagList(br(), span(class = "warn_msg", HTML(warn_text())))) + show("div_template_warn") + nx_report_warning( + title = "No data uploaded in folder", + HTML(warn_text()) + ) + } + + shinyjs::enable("btn_template") + shinyjs::enable("btn_template_select") + updateSelectInput(session, "header_dropdown_template", + choices = input$dropdown_template + ) }, ignoreInit = TRUE ) @@ -718,16 +727,6 @@ shinyServer(function(input, output, session) { shinyjs::show("div_download_data") } } - # if there is warning from above checks - if (!is.null(warn_text())) { - # display warnings - output$text_template_warn <- renderUI(tagList(br(), span(class = "warn_msg", HTML(warn_text())))) - show("div_template_warn") - nx_report_warning( - title = "No data uploaded in folder", - HTML(warn_text()) - ) - } dcWaiter("hide") }) From 0db26740fda9dfea0fdfb8fe1a3da11203c13a10 Mon Sep 17 00:00:00 2001 From: afwillia Date: Fri, 15 Mar 2024 09:42:28 -0700 Subject: [PATCH 70/72] move empty folder warning to template selection screen --- ui.R | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ui.R b/ui.R index fcb2e85a..83cfefe2 100644 --- a/ui.R +++ b/ui.R @@ -203,6 +203,11 @@ ui <- shinydashboardPlus::dashboardPage( label = NULL, choices = "Generating..." ), + hidden(div( + id = "div_template_warn", + height = "100%", + htmlOutput("text_template_warn") + )), actionButton("btn_template_select", "Download template", class = "btn-primary-color" ), @@ -246,11 +251,6 @@ ui <- shinydashboardPlus::dashboardPage( id = "div_template_xls", height = "100%", htmlOutput("text_template_xls") - ), - div( - id = "div_template_warn", - height = "100%", - htmlOutput("text_template_warn") ) ) ), From 42a44f57efa14ebace74d6fe86a5b80d70c35b0d Mon Sep 17 00:00:00 2001 From: afwillia Date: Fri, 15 Mar 2024 09:43:04 -0700 Subject: [PATCH 71/72] Instead of popup, warn users about empty folder with a message under the template selection tab. --- server.R | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server.R b/server.R index 6329b5cb..48a7c361 100644 --- a/server.R +++ b/server.R @@ -596,10 +596,10 @@ shinyServer(function(input, output, session) { # display warnings output$text_template_warn <- renderUI(tagList(br(), span(class = "warn_msg", HTML(warn_text())))) show("div_template_warn") - nx_report_warning( - title = "No data uploaded in folder", - HTML(warn_text()) - ) + # nx_report_warning( + # title = "No data uploaded in folder", + # HTML(warn_text()) + # ) } shinyjs::enable("btn_template") From 049d79d5ddcf1bc88c0747be3e403ddc966d4f2a Mon Sep 17 00:00:00 2001 From: afwillia Date: Fri, 15 Mar 2024 09:46:10 -0700 Subject: [PATCH 72/72] remove commented-out template selection observers --- server.R | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/server.R b/server.R index 48a7c361..c6702476 100644 --- a/server.R +++ b/server.R @@ -444,12 +444,6 @@ shinyServer(function(input, output, session) { shinyjs::enable("btn_project") shinyjs::enable("btn_template_select") }) - - # observeEvent(input$dropdown_template, { - # req(input$tabs %in% "tab_template_select") - # type <- config_schema()[[1]]$type[which(config_schema()[[1]]$display_name == input$dropdown_template)] - # - # }) # Goal of this button is to updpate the template reactive object # with the template the user chooses @@ -465,10 +459,6 @@ shinyServer(function(input, output, session) { dcWaiter("hide") }) - # observeEvent(input$dropdown_template, { - # - # }) - # Goal of this button is to get the files within a folder the user selects observeEvent(input$btn_folder, { dcWaiter("show", msg = paste0("Getting data"), color = primary_col())

dwx&c0B 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 J}%GZnp4+4n3wwk40m^#Rq_Ud3AaZ0MwKM!jd% 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