Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UNDERC depth data and crosswalk, Isle Royale hypso data and crosswalk #327

Merged
merged 13 commits into from
Apr 15, 2022
Merged
15 changes: 15 additions & 0 deletions 1_crosswalk_fetch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ targets:
- 1_crosswalk_fetch/out/Iowa_lake_pts_sf.rds.ind
- 1_crosswalk_fetch/out/UniversityofMissouri_2017_2020_Profiles_sf.rds.ind
- 1_crosswalk_fetch/out/ned_centroid_elevations.feather.ind
- 1_crosswalk_fetch/out/UNDERC_lakes_depths_sf.rds.ind

# create the trigger file, which will not be checked into git
# I see no reason to have different trigger files for different sections of the pipeline
Expand Down Expand Up @@ -127,6 +128,16 @@ targets:
command: slice_iadnr_contour(target_name,
contour_ind = '1_crosswalk_fetch/out/iadnr_contours_sf.rds.ind')

1_crosswalk_fetch/out/isro_contours_sf.rds.ind:
command: fetch_isro_lakes(target_name,
use_geoms = I('Multi Polygon'),
gdb_filename = I('ISRO_GLKN_BathymetricData.gdb'),
zip_ind = '3_params_fetch/in/ISRO_GLKN_Bathymetric_FinalData.zip.ind')

1_crosswalk_fetch/out/isro_lakes_sf.rds.ind:
lindsayplatt marked this conversation as resolved.
Show resolved Hide resolved
command: slice_isro_contour(target_name,
contour_ind = '1_crosswalk_fetch/out/isro_contours_sf.rds.ind')

1_crosswalk_fetch/out/mo_usace_sampling_locations_sf.rds.ind:
command: fetch_mo_usace_points(target_name,
xlsx_ind = '1_crosswalk_fetch/in/Missouri_USACE_samplingLocations.xlsx.ind')
Expand All @@ -135,6 +146,10 @@ targets:
command: fetch_navico_points(target_name,
csv_ind = '1_crosswalk_fetch/in/Navico_lakes_depths.csv.ind')

1_crosswalk_fetch/out/UNDERC_lakes_depths_sf.rds.ind:
command: fetch_UNDERC_points(target_name,
csv_ind = '1_crosswalk_fetch/in/Solomon_LAKES_10.25390_caryinstitute.7438598.v5.csv.ind')

1_crosswalk_fetch/out/Norfork_temperature_locations_sf.rds.ind:
command: fetch_norfork_points(target_name,
csv_ind = '1_crosswalk_fetch/in/Norfork_temperature_locations.csv.ind')
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
hash: 081f492d59015d37ae7450614d522442

2 changes: 2 additions & 0 deletions 1_crosswalk_fetch/out/UNDERC_lakes_depths_sf.rds.ind
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
hash: 9cb72b2f1e93d1bb4b4fa58e273601e4

2 changes: 2 additions & 0 deletions 1_crosswalk_fetch/out/isro_contours_sf.rds.ind
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
hash: 2107f8fbe980a0ef310e8feb07d4657e

2 changes: 2 additions & 0 deletions 1_crosswalk_fetch/out/isro_lakes_sf.rds.ind
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
hash: c69d99d4dea64e34c67290145c574485

73 changes: 73 additions & 0 deletions 1_crosswalk_fetch/src/fetch_crosswalk.R
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,54 @@ process_wbic_lakes <- function(file_out = '1_crosswalk_fetch/out/wbic_lakes_sf.r
saveRDS(wbic_lakes, file = file_out)
}

fetch_isro_lakes <- function(out_ind, zip_ind, remove_IDs = c(), gdb_filename, use_geoms){
lindsayplatt marked this conversation as resolved.
Show resolved Hide resolved
outfile <- as_data_file(out_ind)

zip_file <- sc_retrieve(zip_ind)

gdb_path <- tempdir()
unzip(zip_file, exdir = gdb_path)


st_layer_info <- st_layers(file.path(gdb_path, gdb_filename))
layer_info <- tibble(layer_name = st_layer_info$name,
geom_type = unlist(st_layer_info$geomtype),
n_feature = st_layer_info$features,
n_col = st_layer_info$fields)

# could replace this comment with sprintf for "use_geoms"
message('...dropping any layer that is not Multi Polygon, likely more than five lost...')

use_layers <- layer_info %>% filter(!is.na(geom_type) & n_feature > 1 & geom_type == use_geoms) %>%
# all but one remaining have 8 cols (one has 9)
# depth field is "Avg_Depth" for many even though that name is misleading, seems an int
# or "Depth_calc" when 9 cols
mutate(depth_col = case_when(
n_col == 9 ~ "Depth_calc",
n_col == 8 ~ "Avg_Depth"
)) %>%
dplyr::select(layer_name, depth_col)

data_clean <- purrr::pmap(use_layers, function(layer_name, depth_col){
# get "Beaver" from "Beaver_CntrPolys" etc:
lake_name <- strsplit(layer_name, '_')[[1]][1]

st_read(file.path(gdb_path, gdb_filename), layer_name, quiet = TRUE) %>%
sf::st_zm() %>% st_transform(crs = 4326) %>%
rename(geometry = Shape) %>%
mutate(site_id = sprintf('isro_%s', lake_name)) %>%
lindsayplatt marked this conversation as resolved.
Show resolved Hide resolved
dplyr::select(site_id, m_depth = one_of(depth_col)) %>%
arrange(m_depth) %>%
group_by(site_id, m_depth) %>%
# some depth intervals don't have much of a footprint, why?
# e.g., filter(site_id == 'isro_Beaver' & m_depth == 1)
summarize(geometry = sf::st_union(geometry), .groups = 'drop')
}) %>% bind_rows() %>%
saveRDS(file = outfile)

gd_put(out_ind, outfile)

}

#' we're using this contour shapefile because the other lake shapefile doesn't really
#' have lake IDs, since most are empty. See issue here: https://github.com/USGS-R/lake-temperature-model-prep/issues/155
Expand Down Expand Up @@ -94,6 +142,18 @@ slice_iadnr_contour <- function(out_ind, contour_ind){
gd_put(out_ind, outfile)
}

#' get the top/shallow layer as a single polygon to represent the lake surface
slice_isro_contour <- function(out_ind, contour_ind){
outfile <- as_data_file(out_ind)

# need to merge/dissolve all, since these contours are filled polygons
contours_sf <- sc_retrieve(contour_ind) %>% readRDS() %>%
group_by(site_id) %>%
dplyr::summarize(geometry = st_union(geometry)) %>%
saveRDS(file = outfile)

gd_put(out_ind, outfile)
}

fetch_mndow_lakes <- function(ind_file, layer, dummy){
data_file <- scipiper::as_data_file(ind_file)
Expand Down Expand Up @@ -241,6 +301,19 @@ fetch_navico_points <- function(out_ind, csv_ind) {
gd_put(out_ind, outfile)
}

fetch_UNDERC_points <- function(out_ind, csv_ind){
outfile <- as_data_file(out_ind)

scipiper::sc_retrieve(csv_ind) %>%
read_csv(col_types = 'dcccccdddccc') %>%
filter(!is.na(lat) & !is.na(long)) %>%
st_as_sf(coords = c('long','lat'), crs=4326) %>%
mutate(site_id = sprintf("UNDERC_%s", lakeID), .keep="unused", .before=1) %>%
saveRDS(file = outfile)

gd_put(out_ind, outfile)
}

fetch_norfork_points <- function(out_ind, csv_ind) {
outfile <- as_data_file(out_ind)

Expand Down
22 changes: 22 additions & 0 deletions 2_crosswalk_munge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,13 @@ targets:
- 2_crosswalk_munge/out/lake_to_state_xwalk.rds.ind
- 2_crosswalk_munge/out/ndgf_nhdhr_xwalk.rds.ind
- 2_crosswalk_munge/out/iadnr_nhdhr_xwalk.rds.ind
- 2_crosswalk_munge/out/isro_nhdhr_xwalk.rds.ind
- 2_crosswalk_munge/out/mo_usace_nhdhr_xwalk.rds.ind
- 2_crosswalk_munge/out/navico_nhdhr_xwalk.rds.ind
- 2_crosswalk_munge/out/norfork_nhdhr_xwalk.rds.ind
- 2_crosswalk_munge/out/Iowa_nhdhr_xwalk.rds.ind
- 2_crosswalk_munge/out/univ_mo_nhdhr_xwalk.rds.ind
- 2_crosswalk_munge/out/UNDERC_nhdhr_xwalk.rds.ind

2_crosswalk_munge/out/gnisname_nhdhr_xwalk.rds.ind:
command: scmake(I('gnisname_nhdhr_xwalk.rds.ind_promise'), '1_crosswalk_fetch_nhd_tasks.yml')
Expand All @@ -51,6 +53,20 @@ targets:
intersect_ind_file = '2_crosswalk_munge/out/mglp_nhdhr_intersect.rds.ind',
poly1_ID_name = I("MGLP_ID"))

2_crosswalk_munge/out/isro_nhdhr_intersect.rds.ind:
command: crosswalk_poly_intersect_poly(
target_name,
poly1_ind_file = '1_crosswalk_fetch/out/isro_lakes_sf.rds.ind',
poly2_ind_file = '1_crosswalk_fetch/out/canonical_lakes_sf.rds.ind',
poly1_ID_name = I("ISRO_ID"),
crs=I(26915))

2_crosswalk_munge/out/isro_nhdhr_xwalk.rds.ind:
command: choose1_poly_intersect_poly(
target_name,
intersect_ind_file = '2_crosswalk_munge/out/isro_nhdhr_intersect.rds.ind',
poly1_ID_name = I("ISRO_ID"))

2_crosswalk_munge/out/iadnr_nhdhr_intersect.rds.ind:
command: crosswalk_poly_intersect_poly(
target_name,
Expand Down Expand Up @@ -204,6 +220,12 @@ targets:
points_ind_file = '1_crosswalk_fetch/out/Iowa_lake_pts_sf.rds.ind',
points_ID_name = I("Iowa_ID"))

2_crosswalk_munge/out/UNDERC_nhdhr_xwalk.rds.ind:
command: crosswalk_points_in_poly(target_name,
poly_ind_file = '1_crosswalk_fetch/out/canonical_lakes_sf.rds.ind',
points_ind_file = '1_crosswalk_fetch/out/UNDERC_lakes_depths_sf.rds.ind',
points_ID_name = I("UNDERC_ID"))

2_crosswalk_munge/out/univ_mo_nhdhr_xwalk.rds.ind:
command: crosswalk_points_in_poly(target_name,
poly_ind_file = '1_crosswalk_fetch/out/canonical_lakes_sf.rds.ind',
Expand Down
2 changes: 2 additions & 0 deletions 2_crosswalk_munge/out/UNDERC_nhdhr_xwalk.rds.ind
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
hash: 79e49e12760800fba5a1ecd0d054b8ab

2 changes: 2 additions & 0 deletions 2_crosswalk_munge/out/isro_nhdhr_intersect.rds.ind
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
hash: a3743c121762e8cd8d788347acc26ea1

2 changes: 2 additions & 0 deletions 2_crosswalk_munge/out/isro_nhdhr_xwalk.rds.ind
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
hash: 984f497ca299b230d559862397f2fbdf

16 changes: 16 additions & 0 deletions 4_params_munge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ sources:
- 4_params_munge/src/munge_cd_from_nlcd.R
- 4_params_munge/src/munge_wbic.R
- 4_params_munge/src/munge_contours.R
- lib/src/generic_utils.R

targets:
4_params_munge:
Expand All @@ -34,13 +35,15 @@ targets:
- 4_params_munge/out/wbic_bathy.rds.ind
- 4_params_munge/out/ndgf_bathy.rds.ind
- 4_params_munge/out/iadnr_bathy.rds.ind
- 4_params_munge/out/isro_bathy.rds.ind
- 4_params_munge/out/mglp_depths.rds.ind
- 4_params_munge/out/wbic_depths.rds.ind
- 4_params_munge/out/ndgf_depths.rds.ind
- 4_params_munge/out/NY_manual_depths.rds.ind
- 4_params_munge/out/lagos_depths.rds.ind
- 4_params_munge/out/lagos_secchi.rds.ind
- 4_params_munge/out/navico_depths.rds.ind
- 4_params_munge/out/UNDERC_depths.rds.ind


4_params_munge/out/toha_varying_kw.rds.ind:
Expand Down Expand Up @@ -82,6 +85,11 @@ targets:
navico_depth_ind = '1_crosswalk_fetch/out/Navico_lakes_depths_sf.rds.ind',
navico_xwalk_ind = '2_crosswalk_munge/out/navico_nhdhr_xwalk.rds.ind')

4_params_munge/out/UNDERC_depths.rds.ind:
command: munge_UNDERC_depths(target_name,
UNDERC_depth_ind = '1_crosswalk_fetch/out/UNDERC_lakes_depths_sf.rds.ind',
UNDERC_xwalk_ind = '2_crosswalk_munge/out/UNDERC_nhdhr_xwalk.rds.ind')

4_params_munge/out/lagos_secchi.rds.ind:
command: munge_lagos_secchi(target_name,
lagos_secchi_ind = '3_params_fetch/out/LAGOS_NE_secchi.csv.ind',
Expand Down Expand Up @@ -130,6 +138,14 @@ targets:
iadnr_surface_ind = '1_crosswalk_fetch/out/iadnr_lakes_sf.rds.ind',
xwalk_ind = '2_crosswalk_munge/out/iadnr_nhdhr_xwalk.rds.ind')

4_params_munge/out/isro_bathy.rds.ind:
command: munge_isro_bathy(
out_ind = target_name,
contour_ind = '1_crosswalk_fetch/out/isro_contours_sf.rds.ind',
surface_ind = '1_crosswalk_fetch/out/isro_lakes_sf.rds.ind',
xwalk_ind = '2_crosswalk_munge/out/isro_nhdhr_xwalk.rds.ind')


4_params_munge/out/indnr_bathy.rds.ind:
command: munge_indnr_bathy(
out_ind = target_name,
Expand Down
2 changes: 2 additions & 0 deletions 4_params_munge/out/UNDERC_depths.rds.ind
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
hash: 1bda1cb3ed5bcd9b60e01e1ff9a1a79b

2 changes: 2 additions & 0 deletions 4_params_munge/out/isro_bathy.rds.ind
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
hash: 624c991f831c5db0382108fac698762d

2 changes: 1 addition & 1 deletion 4_params_munge/out/wbic_depths.rds.ind
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
hash: 21f36f8fecab701c5d1ce6098bec355f
hash: 333fa10baccf6ac2fa973c4e14414c4c

19 changes: 19 additions & 0 deletions 4_params_munge/src/munge_bathy.R
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,25 @@ munge_navico_depths <- function(out_ind, navico_depth_ind, navico_xwalk_ind) {
gd_put(out_ind, data_file)
}

munge_UNDERC_depths <- function(out_ind, UNDERC_depth_ind, UNDERC_xwalk_ind){
data_file <- scipiper::as_data_file(out_ind)

xwalk <- sc_retrieve(UNDERC_xwalk_ind) %>% readRDS() %>%
dplyr::select(site_id, UNDERC_ID)

sc_retrieve(UNDERC_depth_ind) %>%
readRDS() %>%
filter(!is.na(maxDepth)) %>%
st_drop_geometry() %>%
rename(UNDERC_ID = site_id) %>%
inner_join(xwalk, by = 'UNDERC_ID') %>%
# confirmed this field is in "m" as "Maximum depth of the lake" from columnNames_allDatabaseTables_20210423.csv
dplyr::select(site_id, UNDERC_ID, z_max = maxDepth) %>%
saveRDS(data_file)

gd_put(out_ind, data_file)
}

collapse_multi_bathy <- function(data_in){
bathy_data <- purrr::map(unique(data_in$site_id), function(x){

Expand Down
45 changes: 45 additions & 0 deletions 4_params_munge/src/munge_contours.R
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,51 @@ munge_indnr_bathy <- function(out_ind, contour_zip_ind, layer, lake_surface_ind,
}


#' get ISRO (Isle Royale) bathymetry into the normal hypsographic format
#'
munge_isro_bathy <- function(out_ind, contour_ind, surface_ind, xwalk_ind){
# we now use sf > v1.0, which causes issues with some NHD polygons and the spherical coordinates
# see info on the change: https://r-spatial.org/r/2020/06/17/s2.html#sf-10-goodbye-flat-earth-welcome-s2-spherical-geometry

# to avoid these NHD issues, we'd either need to edit the files or avoid the error by avoiding use of the
# S2 engine. We do that by toggling off use of S2 here.
sf::sf_use_s2(FALSE)
on.exit(sf::sf_use_s2(TRUE))
xwalk <- sc_retrieve(xwalk_ind) %>% readRDS()

lake_surface <- sc_retrieve(surface_ind) %>% readRDS %>% group_by(site_id) %>%
summarise(depths = 0, areas = sum(as.numeric(st_area(geometry)))) %>%
st_drop_geometry()


contours <- sc_retrieve(contour_ind) %>% readRDS %>%
rename(depths = m_depth) %>%
# remove the top contour, since that is what was used for the zero area:
arrange(site_id, depths) %>% group_by(site_id) %>% slice(-1) %>%
group_by(site_id, depths) %>%
summarise(contour_area = sum(as.numeric(st_area(geometry)))) %>%
st_drop_geometry() %>%
group_by(site_id) %>%
# these are area slices (donuts) so we also have to sum the areas of deeper:
arrange(site_id, desc(depths)) %>% mutate(areas = cumsum(contour_area)) %>%
# add the dissolved full surface area polys:
bind_rows(lake_surface) %>%
arrange(site_id, depths) %>%
ungroup() %>%
dplyr::select(ISRO_ID = site_id, depths, areas) %>%
# join with crosswalk to get this into NHDHR ids:
left_join(xwalk, by = 'ISRO_ID') %>% filter(!is.na(site_id)) %>%
rename(other_ID = ISRO_ID)

data_file <- scipiper::as_data_file(out_ind)

collapse_multi_bathy(contours) %>%
saveRDS(data_file)
gd_put(out_ind, data_file)

}



munge_iadnr_bathy <- function(out_ind, iadnr_contour_ind, iadnr_surface_ind, xwalk_ind){
# we now use sf > v1.0, which causes issues with some NHD polygons and the spherical coordinates
Expand Down
2 changes: 1 addition & 1 deletion 4_params_munge/src/munge_wbic.R
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ munge_wbic_depths <- function(out_ind, wbic_wbodies_ind, wbic_xwalk_ind){

wbic_depths <- sc_retrieve(wbic_wbodies_ind) %>% read_tsv(col_types = 'ccccdcccdddddc') %>%
mutate(WBIC_ID = sprintf("WBIC_%s", WBIC), depth = str_remove(OFFICIAL_MAX_DEPTH, " FEET"),
z_max = as.numeric(depth)) %>% filter(!is.na(z_max)) %>%
z_max = convert_ft_to_m(as.numeric(depth))) %>% filter(!is.na(z_max)) %>%
inner_join(wbic_xwalk, by = 'WBIC_ID') %>% dplyr::select(site_id, WBIC_ID, z_max)

data_file <- scipiper::as_data_file(out_ind)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
hash: 38429943e03bca25bcb3842ebf5f814a

1 change: 1 addition & 0 deletions 6_temp_coop_fetch/log/6_temp_coop_fetch_tasks.ind
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@
6_temp_coop_fetch/in/scott_mnlakedata_historicalfiles_manualentry.xlsx.ind: 7e19017fc2dd9bb045247b116b277d9b
6_temp_coop_fetch/in/SD_Lake_temp_export.xlsx.ind: 4655921d0e9c0d95a1c1061e13988e77
6_temp_coop_fetch/in/sherburne_stearns_mnlakedata_historicalfiles_manualentry.xlsx.ind: dd4811be002ecc25e7d3c89e0f5ec87e
6_temp_coop_fetch/in/Solomon_LIMNO_PROFILES_10.25390_caryinstitute.7438598.v5.csv.ind: e7eea853f91dc67682b71c9af3ef801c
6_temp_coop_fetch/in/South_Center_DO_2018_09_11_All.csv.ind: 53c461f1613a7721f02c810fdd9a69ed
6_temp_coop_fetch/in/steele_swift_mnlakedata_historicalfiles_manualentry.xlsx.ind: a7f59f44169e053d721ea8d561225196
6_temp_coop_fetch/in/stlouis_mnlakedata_historicalfiles_manualentry.xlsx.ind: bb55c84374031d83f489f9bba698ffab
Expand Down
4 changes: 2 additions & 2 deletions 6_temp_coop_fetch/out/coop_all_files.rds.tind
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
hash: d8cb0b68087f64c853279e299edfcbcf
freshened: 2022-04-04 08:59:17 -0500
hash: 86ecd90e2747baa92e7a0379bdf09e9c
freshened: 2022-04-15 08:09:47 -0500

2 changes: 2 additions & 0 deletions 7_config_merge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,10 @@ targets:
'4_params_munge/out/ndgf_bathy.rds.ind',
'4_params_munge/out/iadnr_bathy.rds.ind',
'4_params_munge/out/indnr_bathy.rds.ind',
'4_params_munge/out/isro_bathy.rds.ind',
'4_params_munge/out/DRB_reservoirs_bathy.rds.ind',
'4_params_munge/out/mglp_mi_perc_bathy.rds.ind',
'4_params_munge/out/UNDERC_depths.rds.ind',
'4_params_munge/out/navico_depths.rds.ind',
'4_params_munge/out/lagos_depths.rds.ind',
'4_params_munge/out/wbic_depths.rds.ind',
Expand Down
2 changes: 1 addition & 1 deletion 7_config_merge/out/nml_H_A_values.rds.ind
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
hash: c733634fab0e58f2970a8e9b774adb15
hash: 2cc666cdcc86a4c93518ba5f48449949

2 changes: 1 addition & 1 deletion 7_config_merge/out/nml_lake_depth_values.rds.ind
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
hash: 8ec106a20a58e53be205225b0e419573
hash: 3365c8edb5ab297d6b62b330ee024ee2

2 changes: 1 addition & 1 deletion 7_config_merge/out/nml_layer_thick_values.rds.ind
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
hash: be94734d905187035820c7719a4ea4dc
hash: 289e750936beb0495128ce8688034b12

2 changes: 1 addition & 1 deletion 7_config_merge/out/nml_list.rds.ind
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
hash: addcb29725f3dcb3f1c98a17bc2c216b
hash: 8b0bdf9db6b97208bd6a85cf898b3358

2 changes: 1 addition & 1 deletion 7_config_merge/out/nml_meteo_fl_values.rds.ind
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
hash: 999c9045af97a7df4cdb20bcce10a0ad
hash: e1de6840a72796fe1cf1c066cf6bc709

Loading