1 November 2021

These are the data that Jordan Watson procured for us from AKFIN. We want to take a look at the data from the fishing effort and incorporate that into the fulmar bycatch distributions.

The first goal would be to make a map that looks like the bycatch map, but shows the spatial distribution of fishing effort.

library(tidyverse)
library(dplyr)
library(adehabitatHR)
Loading required package: deldir
deldir 0.1-25
Loading required package: ade4
Loading required package: adehabitatMA
Registered S3 methods overwritten by 'adehabitatMA':
  method                       from
  print.SpatialPixelsDataFrame sp  
  print.SpatialPixels          sp  

Attaching package: ‘adehabitatMA’

The following object is masked from ‘package:raster’:

    buffer

Loading required package: adehabitatLT
Loading required package: CircStats
Loading required package: MASS

Attaching package: ‘MASS’

The following object is masked from ‘package:dplyr’:

    select

The following objects are masked from ‘package:raster’:

    area, select

Loading required package: boot

Attaching package: ‘adehabitatLT’

The following object is masked from ‘package:dplyr’:

    id
library(ggplot2)
library(magrittr)

Attaching package: ‘magrittr’

The following object is masked from ‘package:purrr’:

    set_names

The following object is masked from ‘package:tidyr’:

    extract

The following object is masked from ‘package:raster’:

    extract

The following objects are masked from ‘package:testthat’:

    equals, is_less_than, not
library(sp)
library(raster)
library(marmap)

Attaching package: ‘marmap’

The following object is masked from ‘package:raster’:

    as.raster

The following object is masked from ‘package:oce’:

    plotProfile

The following object is masked from ‘package:grDevices’:

    as.raster
library(mapdata)

library(spData)
package ‘spData’ was built under R version 3.6.2To access larger datasets in this package, install the spDataLarge
package with: `install.packages('spDataLarge',
repos='https://nowosad.github.io/drat/', type='source')`
fishing <- readRDS("extdata/longline_effort_halfdegree_bins_diana_w_hooks.RDS") %>%
  mutate(season = ifelse(month %in% c(5:9), "breeding", "nonbreeding"))

fish_by_hooks <- fishing %>%
  group_by(season, lonr, latr) %>%
  summarise(sum(hooks)) %>%
  rename(tot_hooks = `sum(hooks)`)
`summarise()` has grouped output by 'season', 'lonr'. You can override using the `.groups` argument.
ggplot(fish_by_hooks) +
  geom_point(aes(x = lonr, y = latr))

Flip the sign on the data points with the wrong longitude.

fish_effort <- fish_by_hooks %>%
  mutate(lon = ifelse(lonr > 0, (360-lonr)*-1, lonr)) 

fish_effort %>% # deal with the international date line
  ggplot(aes(x = lon, y = latr)) +
  geom_point()

Quick check: What is the max N latitude?

fish_effort %>%
  arrange(desc(latr)) # is this bec of the original data dump from Jordan?

Okay, I need to think about how to weight the number of hooks…

First, maybe look at the distribution of hooks?

fish_effort %>%
  ggplot(aes(x = lon, y = latr, color = tot_hooks)) +
  geom_point() +
  facet_wrap(~season) +
  theme_bw()

spatial data projections

### define projections
# input_proj <- "+proj=longlat +datum=WGS84" ###the input projection of track points
# desired_proj <- "+proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs" ###the desired projection for track points
# 
# ### convert data to a spatial object and reproject to desired coordinate system
# coordinates(fishing_season2) = ~lonr+latr ### define the x and y spatial fields
# proj4string(fishing_season2) <- CRS(input_proj) ### define the projection
# fish_effort_tr <- spTransform(fishing_season2, CRS(desired_proj)) ###transform to desired projection
# 
# # another quick plot
# plot(fish_effort_tr, pch = 19, cex = 0.5)

I have two forms of effort - 1. the number of vessels in a given geographic area (similar to the way the bycatch fulmars were treated) 2. the number of hooks each vessel set

I think what makes more sense is to use hooks integrated across space as our measure of effort. I’m going to need to tweak the code that I had used for the fulmar kerneling because in that case, each data point was one bird with one set of lat/lon, whereas for this, each spatial datapoint corresponds to many many hooks.

Add bathymetric map

# antimeridian region 
aleu <- marmap::getNOAA.bathy(179, -135, 50, 67, resolution = 4,
antimeridian = TRUE)
Querying NOAA database ...
This may take seconds to minutes, depending on grid size
Building bathy matrix ...
# Make it a raster
#bathy <- as.raster(aleu)

# Create a xyz table for ggplot
#bath<-fortify(aleu)

bathymetry

this mapping from: https://hansenjohnson.org/post/bathymetric-maps-in-r/

library(oce)
library(ocedata)
package ‘ocedata’ was built under R version 3.6.2
data("coastlineWorldFine")

# convert bathymetry
# bathyLon = as.numeric(rownames(aleu))
# bathyLat = as.numeric(colnames(aleu))
# bathyZ = as.numeric(aleu)
# dim(bathyZ) = dim(aleu)


# define plotting region
mlon = mean(fish_effort$lon)
mlat = mean(fish_effort$latr)
span = 2000
# fishing_season2 %>%
#   ggplot(aes(x = lonr, y = latr)) +
#   geom_point(size = 0.1) +
#   stat_density2d(
#     aes(fill = stat(level)),
#     geom = "polygon",
#     contour_var = "density",
#     contour_type = "bands",
#     alpha = 0.7,
#   ) +
#     scale_fill_gradient(low = "yellow", high = "red") + scale_alpha(range = c(0.00, 0.25), guide = FALSE)
#qBins <- quantile(fish_by_hooks$tot_hooks)
fish_effort %>%
  group_by(season) %>%
  summarise(sum(tot_hooks)) %>%
  mutate(tot_hooks_across_seasons = sum(`sum(tot_hooks)`)) %>%
  mutate(hooks_per_month = ifelse(season == "breeding", `sum(tot_hooks)`/5, `sum(tot_hooks)`/7)) 


  # mutate(prop_effort = ifelse(season == "breeding", `sum(tot_hooks)`/tot_hooks_across_seasons, `sum(tot_hooks)`/tot_hooks_across_seasons))
fish_effort %>%
  ggplot(aes(x = lon, y = latr)) +
  #geom_point(size = 0.1) +
  geom_tile(
    aes(x = lon, y = latr, fill = tot_hooks),
    alpha = 0.5,
  ) +
    scale_fill_stepsn(colors = heat.colors(5, alpha = 0.5, rev = TRUE))+
  theme_bw() +
  xlab("Longitude") +
  ylab("Latitude")

I don’t want a density map. Basically, I have a numeric variable that I want to plot as the gradient fill on the map (rather than computing the density of observations).

#plot(spdf)
# I need to fortify the data
library(broom)
require(mapdata)

aleu.fort <- marmap::fortify.bathy(aleu)

# get regional polygons
reg = map_data("world2Hires")
region = subset(reg, region %in% c('USA', 'Canada'))

# filter
ak <- region %>%
  filter(lat > 50 & lat < 65, long < 240)
# set map limits
#lons = c(-180, -135)
#lats = c(45, 65)

# plot
ggplot() +
 # add 100m contour
  geom_contour(data = aleu.fort, 
               aes(x=x, y=y, z=z),
               breaks=c(-100),
               size=c(0.3),
               colour="grey") +
  
  # add 250m contour
  geom_contour(data = aleu.fort, 
               aes(x=x, y=y, z=z),
               breaks=c(-250),
               size=c(0.6),
               colour="grey") +
  
  # add coastline
  geom_polygon(data = ak, aes(x = long, y = lat, group = group), 
               fill = "darkgrey", color = NA) +
  theme_bw()

#formatting
breaks <- c(5000, 10000, 50000, 100000, 500000, 1000000, 5000000)
custom_bins <- quantile(fish_effort$tot_hooks, probs=c(0,.2,.4,.6,.8,1))


fish_by_hooks_df <- mutate(fish_effort, hooks=cut(tot_hooks, breaks=custom_bins))
fish_by_hooks_df1 <- fish_by_hooks_df %>%
  filter(!is.na(hooks))
# get regional polygons
reg = map_data("world2Hires")
regions = subset(reg, region %in% c('USA', 'Canada')) %>%
  filter(lat > 47 & lat < 65, long < 240)

# convert lat longs
regions$long = (360 - regions$long)*-1

# set map limits
lons = c(-188, -140) #this needs to extend beyond the date line
lats = c(50, 61.75)
library(ggplot2)
# make plot
ggplot()+
  
  # add 100m contour
  geom_contour(data = aleu.fort, 
               aes(x=x, y=y, z=z),
               breaks=c(-100),
               size=c(0.3),
               colour="grey") +
  
  # add 250m contour
  geom_contour(data = aleu.fort, 
               aes(x=x, y=y, z=z),
               breaks=c(-250),
               size=c(0.6),
               colour="grey") +
  
  # add coastline
  geom_polygon(data = regions, aes(x = long, y = lat, group = group), 
               fill = "darkgrey", color = NA) + 
  
  # add hooks (fishing effort)
  geom_tile(data = fish_by_hooks_df1,
    aes(x = lon, y = latr, fill = hooks),
    alpha = 0.75,
  ) +
    #scale_fill_gradient(low = "yellow", high = "red")+
  #scale_fill_stepsn(colors = RColorBrewer::brewer.pal(5, "YlOrRd"), breaks = custom_bins) +
  scale_fill_brewer(palette = "YlOrRd") +
   # facet seasons
  facet_grid(rows = vars(season)) +
  
  # configure projection and plot domain
  coord_map(xlim = lons, ylim = lats)+

  
  # formatting
  xlab("Longitude") +
  ylab("Latitude") +
  labs(fill = "# of hooks (quantiles)") +
  theme_bw()+ 
  theme(
    axis.title.x = element_text(margin = margin(t=10)),
    axis.title.y = element_text(margin = margin(r=10))
  )

 # manually set the text for the legend. 
 
#ggsave("pdf_outputs/fishing_effort_map_season.pdf", width = 7, height = 9)

Make the same maps, but zoom in so the spatial extent matches the utilization distribution maps for the colonies:

# set map limits
lons = c(-181, -155) #this needs to extend beyond the date line
lats = c(51, 61.1)

# make plot
ggplot()+
  
  # add 100m contour
  # geom_contour(data = aleu.fort, 
  #              aes(x=x, y=y, z=z),
  #              breaks=c(-100),
  #              size=c(0.3),
  #              colour="grey") +
  # 
  # # add 250m contour
  # geom_contour(data = aleu.fort, 
  #              aes(x=x, y=y, z=z),
  #              breaks=c(-250),
  #              size=c(0.6),
  #              colour="grey") +
  # 
  # add coastline
  geom_polygon(data = regions, aes(x = long, y = lat, group = group), 
               fill = "darkgrey", color = NA) + 
  
  # add hooks (fishing effort)
  geom_tile(data = fish_by_hooks_df1,
    aes(x = lon, y = latr, fill = hooks),
    alpha = 0.75,
  ) +
    #scale_fill_gradient(low = "yellow", high = "red")+
  #scale_fill_stepsn(colors = RColorBrewer::brewer.pal(5, "YlOrRd"), breaks = custom_bins) +
  scale_fill_brewer(palette = "YlOrRd") +
   # facet seasons
  facet_grid(rows = vars(season)) +
  
  # configure projection and plot domain
  coord_map(xlim = lons, ylim = lats)+

  
  # formatting
  xlab("Longitude") +
  ylab("Latitude") +
  labs(fill = "# of hooks (quantiles)") +
  theme_bw()+ 
  theme(
    axis.title.x = element_text(margin = margin(t=10)),
    axis.title.y = element_text(margin = margin(r=10))
  )
  
ggsave("pdf_outputs/fishing_effort_map_season_zoomed.pdf", width = 7, height = 9)

# make plot
test.map <- ggplot()+
  
  # add 100m contour
  geom_contour(data = aleu.fort,
               aes(x=x, y=y, z=z),
               breaks=c(-100),
               size=c(0.3),
               colour="grey") +

  # add 250m contour
  geom_contour(data = aleu.fort,
               aes(x=x, y=y, z=z),
               breaks=c(-250),
               size=c(0.6),
               colour="grey") +

  # add coastline
  geom_polygon(data = regions, aes(x = long, y = lat, group = group), 
               fill = "darkgrey", color = NA) + 
  
  # add UD polygon
  # geom_polygon(data = prib.nob,
  #   aes(x = long, y = lat, fill = group),
  #   alpha = 0.5) +
  # 
  # configure projection and plot domain
  coord_map(xlim = lons, ylim = lats)+
  

  
  # formatting
  xlab("Longitude") +
  ylab("Latitude") +
  labs(fill = "# of hooks (quantiles)") +
  theme_bw()+ 
  theme(
    axis.title.x = element_text(margin = margin(t=10)),
    axis.title.y = element_text(margin = margin(r=10))
  )

Can I zoom in more on that?

region.zoom <- regions %>%
  filter(long < -145, long > -181, lat > 50, lat < 62)
albers.ak.map <- ggplot() +
  geom_polygon(data = region.zoom, aes(x = long, y = lat, group = group), 
               fill = "darkgrey", color = NA) +
  coord_map(projection = "albers", par=55,62) +
  theme_minimal()

albers.ak.map 

ggsave("pdf_outputs/albers_map_ak.pdf")
Saving 5.98 x 3.7 in image

# zoom in on the effort data too
fish_by_hooks_to_plot <- fish_by_hooks_df1 %>%
  filter(lon < -145, lon > -181, latr > 50, latr < 62)

albers.ak.map +
# add hooks (fishing effort)
  geom_tile(data = fish_by_hooks_df1,
    aes(x = lon, y = latr, fill = hooks),
    alpha = 0.75,
  ) +
  ylim(c(51,61.5)) +
  xlim(c(-181,-150)) +
    #scale_fill_gradient(low = "yellow", high = "red")+
  #scale_fill_stepsn(colors = RColorBrewer::brewer.pal(5, "YlOrRd"), breaks = custom_bins) +
  scale_fill_brewer(palette = "YlOrRd") +
   # facet seasons
  facet_grid(rows = vars(season)) +
  
  # configure projection and plot domain
  #coord_map(xlim = lons, ylim = lats)+

  
  # formatting
  xlab("Longitude") +
  ylab("Latitude") +
  labs(fill = "# of hooks (quantiles)") +
  theme_bw()+ 
  theme(
    axis.title.x = element_text(margin = margin(t=10)),
    axis.title.y = element_text(margin = margin(r=10))
  )

ggsave("pdf_outputs/hooks_effot_aea_proj.pdf", width = 7, height = 9)

LS0tCnRpdGxlOiAiZmlzaGluZyBlZmZvcnQgZGF0YSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKMSBOb3ZlbWJlciAyMDIxCgoKVGhlc2UgYXJlIHRoZSBkYXRhIHRoYXQgSm9yZGFuIFdhdHNvbiBwcm9jdXJlZCBmb3IgdXMgZnJvbSBBS0ZJTi4gV2Ugd2FudCB0byB0YWtlIGEgbG9vayBhdCB0aGUgZGF0YSBmcm9tIHRoZSBmaXNoaW5nIGVmZm9ydCBhbmQgaW5jb3Jwb3JhdGUgdGhhdCBpbnRvIHRoZSBmdWxtYXIgYnljYXRjaCBkaXN0cmlidXRpb25zLgoKVGhlIGZpcnN0IGdvYWwgd291bGQgYmUgdG8gbWFrZSBhIG1hcCB0aGF0IGxvb2tzIGxpa2UgdGhlIGJ5Y2F0Y2ggbWFwLCBidXQgc2hvd3MgdGhlIHNwYXRpYWwgZGlzdHJpYnV0aW9uIG9mIGZpc2hpbmcgZWZmb3J0LgoKCmBgYHtyIGxvYWQtcGFja2FnZXN9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGFkZWhhYml0YXRIUikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KHNwKQpsaWJyYXJ5KHJhc3RlcikKbGlicmFyeShtYXJtYXApCmxpYnJhcnkobWFwZGF0YSkKCmxpYnJhcnkoc3BEYXRhKQpgYGAKCgoKYGBge3IgbG9hZC1kYXRhfQpmaXNoaW5nIDwtIHJlYWRSRFMoImV4dGRhdGEvbG9uZ2xpbmVfZWZmb3J0X2hhbGZkZWdyZWVfYmluc19kaWFuYV93X2hvb2tzLlJEUyIpICU+JQogIG11dGF0ZShzZWFzb24gPSBpZmVsc2UobW9udGggJWluJSBjKDU6OSksICJicmVlZGluZyIsICJub25icmVlZGluZyIpKQoKZmlzaF9ieV9ob29rcyA8LSBmaXNoaW5nICU+JQogIGdyb3VwX2J5KHNlYXNvbiwgbG9uciwgbGF0cikgJT4lCiAgc3VtbWFyaXNlKHN1bShob29rcykpICU+JQogIHJlbmFtZSh0b3RfaG9va3MgPSBgc3VtKGhvb2tzKWApCgpgYGAKYGBge3J9CmdncGxvdChmaXNoX2J5X2hvb2tzKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbnIsIHkgPSBsYXRyKSkKYGBgCgoKRmxpcCB0aGUgc2lnbiBvbiB0aGUgZGF0YSBwb2ludHMgd2l0aCB0aGUgd3JvbmcgbG9uZ2l0dWRlLgoKYGBge3J9CmZpc2hfZWZmb3J0IDwtIGZpc2hfYnlfaG9va3MgJT4lCiAgbXV0YXRlKGxvbiA9IGlmZWxzZShsb25yID4gMCwgKDM2MC1sb25yKSotMSwgbG9ucikpIAoKZmlzaF9lZmZvcnQgJT4lICMgZGVhbCB3aXRoIHRoZSBpbnRlcm5hdGlvbmFsIGRhdGUgbGluZQogIGdncGxvdChhZXMoeCA9IGxvbiwgeSA9IGxhdHIpKSArCiAgZ2VvbV9wb2ludCgpCgpgYGAKClF1aWNrIGNoZWNrOiBXaGF0IGlzIHRoZSBtYXggTiBsYXRpdHVkZT8KYGBge3J9CmZpc2hfZWZmb3J0ICU+JQogIGFycmFuZ2UoZGVzYyhsYXRyKSkgIyBpcyB0aGlzIGJlYyBvZiB0aGUgb3JpZ2luYWwgZGF0YSBkdW1wIGZyb20gSm9yZGFuPwpgYGAKCk9rYXksIEkgbmVlZCB0byB0aGluayBhYm91dCBob3cgdG8gd2VpZ2h0IHRoZSBudW1iZXIgb2YgaG9va3MuLi4KCkZpcnN0LCBtYXliZSBsb29rIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgaG9va3M/CmBgYHtyfQpmaXNoX2VmZm9ydCAlPiUKICBnZ3Bsb3QoYWVzKHggPSBsb24sIHkgPSBsYXRyLCBjb2xvciA9IHRvdF9ob29rcykpICsKICBnZW9tX3BvaW50KCkgKwogIGZhY2V0X3dyYXAofnNlYXNvbikgKwogIHRoZW1lX2J3KCkKCmBgYAoKCiMjIyBzcGF0aWFsIGRhdGEgcHJvamVjdGlvbnMKCmBgYHtyIHJlcHJvamVjdC1kYXRhcG9pbnRzfQojIyMgZGVmaW5lIHByb2plY3Rpb25zCiMgaW5wdXRfcHJvaiA8LSAiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiICMjI3RoZSBpbnB1dCBwcm9qZWN0aW9uIG9mIHRyYWNrIHBvaW50cwojIGRlc2lyZWRfcHJvaiA8LSAiK3Byb2o9YWVhICtsYXRfMT01NSArbGF0XzI9NjUgK2xhdF8wPTUwICtsb25fMD0tMTU0ICt4XzA9MCAreV8wPTAgK2VsbHBzPUdSUzgwICtkYXR1bT1OQUQ4MyArdW5pdHM9bSArbm9fZGVmcyIgIyMjdGhlIGRlc2lyZWQgcHJvamVjdGlvbiBmb3IgdHJhY2sgcG9pbnRzCiMgCiMgIyMjIGNvbnZlcnQgZGF0YSB0byBhIHNwYXRpYWwgb2JqZWN0IGFuZCByZXByb2plY3QgdG8gZGVzaXJlZCBjb29yZGluYXRlIHN5c3RlbQojIGNvb3JkaW5hdGVzKGZpc2hpbmdfc2Vhc29uMikgPSB+bG9ucitsYXRyICMjIyBkZWZpbmUgdGhlIHggYW5kIHkgc3BhdGlhbCBmaWVsZHMKIyBwcm9qNHN0cmluZyhmaXNoaW5nX3NlYXNvbjIpIDwtIENSUyhpbnB1dF9wcm9qKSAjIyMgZGVmaW5lIHRoZSBwcm9qZWN0aW9uCiMgZmlzaF9lZmZvcnRfdHIgPC0gc3BUcmFuc2Zvcm0oZmlzaGluZ19zZWFzb24yLCBDUlMoZGVzaXJlZF9wcm9qKSkgIyMjdHJhbnNmb3JtIHRvIGRlc2lyZWQgcHJvamVjdGlvbgojIAojICMgYW5vdGhlciBxdWljayBwbG90CiMgcGxvdChmaXNoX2VmZm9ydF90ciwgcGNoID0gMTksIGNleCA9IDAuNSkKYGBgCgpJIGhhdmUgdHdvIGZvcm1zIG9mIGVmZm9ydCAtIAoxLiB0aGUgbnVtYmVyIG9mIHZlc3NlbHMgaW4gYSBnaXZlbiBnZW9ncmFwaGljIGFyZWEgKHNpbWlsYXIgdG8gdGhlIHdheSB0aGUgYnljYXRjaCBmdWxtYXJzIHdlcmUgdHJlYXRlZCkKMi4gdGhlIG51bWJlciBvZiBob29rcyBlYWNoIHZlc3NlbCBzZXQKCkkgdGhpbmsgd2hhdCBtYWtlcyBtb3JlIHNlbnNlIGlzIHRvIHVzZSBob29rcyBpbnRlZ3JhdGVkIGFjcm9zcyBzcGFjZSBhcyBvdXIgbWVhc3VyZSBvZiBlZmZvcnQuIEknbSBnb2luZyB0byBuZWVkIHRvIHR3ZWFrIHRoZSBjb2RlIHRoYXQgSSBoYWQgdXNlZCBmb3IgdGhlIGZ1bG1hciBrZXJuZWxpbmcgYmVjYXVzZSBpbiB0aGF0IGNhc2UsIGVhY2ggZGF0YSBwb2ludCB3YXMgb25lIGJpcmQgd2l0aCBvbmUgc2V0IG9mIGxhdC9sb24sIHdoZXJlYXMgZm9yIHRoaXMsIGVhY2ggc3BhdGlhbCBkYXRhcG9pbnQgY29ycmVzcG9uZHMgdG8gbWFueSBtYW55IGhvb2tzLgoKQWRkIGJhdGh5bWV0cmljIG1hcApgYGB7cn0KIyBhbnRpbWVyaWRpYW4gcmVnaW9uIAphbGV1IDwtIG1hcm1hcDo6Z2V0Tk9BQS5iYXRoeSgxNzksIC0xMzUsIDUwLCA2NywgcmVzb2x1dGlvbiA9IDQsCmFudGltZXJpZGlhbiA9IFRSVUUpCgojIE1ha2UgaXQgYSByYXN0ZXIKI2JhdGh5IDwtIGFzLnJhc3RlcihhbGV1KQoKIyBDcmVhdGUgYSB4eXogdGFibGUgZm9yIGdncGxvdAojYmF0aDwtZm9ydGlmeShhbGV1KQoKYGBgCgojIyMgYmF0aHltZXRyeQoKdGhpcyBtYXBwaW5nIGZyb206IGh0dHBzOi8vaGFuc2Vuam9obnNvbi5vcmcvcG9zdC9iYXRoeW1ldHJpYy1tYXBzLWluLXIvCmBgYHtyfQpsaWJyYXJ5KG9jZSkKbGlicmFyeShvY2VkYXRhKQpkYXRhKCJjb2FzdGxpbmVXb3JsZEZpbmUiKQoKIyBjb252ZXJ0IGJhdGh5bWV0cnkKIyBiYXRoeUxvbiA9IGFzLm51bWVyaWMocm93bmFtZXMoYWxldSkpCiMgYmF0aHlMYXQgPSBhcy5udW1lcmljKGNvbG5hbWVzKGFsZXUpKQojIGJhdGh5WiA9IGFzLm51bWVyaWMoYWxldSkKIyBkaW0oYmF0aHlaKSA9IGRpbShhbGV1KQoKCiMgZGVmaW5lIHBsb3R0aW5nIHJlZ2lvbgptbG9uID0gbWVhbihmaXNoX2VmZm9ydCRsb24pCm1sYXQgPSBtZWFuKGZpc2hfZWZmb3J0JGxhdHIpCnNwYW4gPSAyMDAwCmBgYAoKCmBgYHtyIHBsb3R0aW5nLWRlbnNpdHktb2Ytb2JzZXJ2YXRpb25zLW5vdC1ob29rc30KIyBmaXNoaW5nX3NlYXNvbjIgJT4lCiMgICBnZ3Bsb3QoYWVzKHggPSBsb25yLCB5ID0gbGF0cikpICsKIyAgIGdlb21fcG9pbnQoc2l6ZSA9IDAuMSkgKwojICAgc3RhdF9kZW5zaXR5MmQoCiMgICAgIGFlcyhmaWxsID0gc3RhdChsZXZlbCkpLAojICAgICBnZW9tID0gInBvbHlnb24iLAojICAgICBjb250b3VyX3ZhciA9ICJkZW5zaXR5IiwKIyAgICAgY29udG91cl90eXBlID0gImJhbmRzIiwKIyAgICAgYWxwaGEgPSAwLjcsCiMgICApICsKIyAgICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAieWVsbG93IiwgaGlnaCA9ICJyZWQiKSArIHNjYWxlX2FscGhhKHJhbmdlID0gYygwLjAwLCAwLjI1KSwgZ3VpZGUgPSBGQUxTRSkKCmBgYAoKCmBgYHtyIGN1c3RvbS1iaW5zfQojcUJpbnMgPC0gcXVhbnRpbGUoZmlzaF9ieV9ob29rcyR0b3RfaG9va3MpCgpgYGAKCmBgYHtyIHN1bW1hcml6ZS1lZmZvdC1zdGF0c30KZmlzaF9lZmZvcnQgJT4lCiAgZ3JvdXBfYnkoc2Vhc29uKSAlPiUKICBzdW1tYXJpc2Uoc3VtKHRvdF9ob29rcykpICU+JQogIG11dGF0ZSh0b3RfaG9va3NfYWNyb3NzX3NlYXNvbnMgPSBzdW0oYHN1bSh0b3RfaG9va3MpYCkpICU+JQogIG11dGF0ZShob29rc19wZXJfbW9udGggPSBpZmVsc2Uoc2Vhc29uID09ICJicmVlZGluZyIsIGBzdW0odG90X2hvb2tzKWAvNSwgYHN1bSh0b3RfaG9va3MpYC83KSkgCgoKICAjIG11dGF0ZShwcm9wX2VmZm9ydCA9IGlmZWxzZShzZWFzb24gPT0gImJyZWVkaW5nIiwgYHN1bSh0b3RfaG9va3MpYC90b3RfaG9va3NfYWNyb3NzX3NlYXNvbnMsIGBzdW0odG90X2hvb2tzKWAvdG90X2hvb2tzX2Fjcm9zc19zZWFzb25zKSkKCmBgYAoKCmBgYHtyIHBsb3R0aW5nLWRlbnNpdHktb2YtaG9va3Mtdy1nZW9tX3RpbGV9CmZpc2hfZWZmb3J0ICU+JQogIGdncGxvdChhZXMoeCA9IGxvbiwgeSA9IGxhdHIpKSArCiAgI2dlb21fcG9pbnQoc2l6ZSA9IDAuMSkgKwogIGdlb21fdGlsZSgKICAgIGFlcyh4ID0gbG9uLCB5ID0gbGF0ciwgZmlsbCA9IHRvdF9ob29rcyksCiAgICBhbHBoYSA9IDAuNSwKICApICsKICAgIHNjYWxlX2ZpbGxfc3RlcHNuKGNvbG9ycyA9IGhlYXQuY29sb3JzKDUsIGFscGhhID0gMC41LCByZXYgPSBUUlVFKSkrCiAgdGhlbWVfYncoKSArCiAgeGxhYigiTG9uZ2l0dWRlIikgKwogIHlsYWIoIkxhdGl0dWRlIikKCmBgYAoKSSBkb24ndCB3YW50IGEgZGVuc2l0eSBtYXAuIEJhc2ljYWxseSwgSSBoYXZlIGEgbnVtZXJpYyB2YXJpYWJsZSB0aGF0IEkgd2FudCB0byBwbG90IGFzIHRoZSBncmFkaWVudCBmaWxsIG9uIHRoZSBtYXAgKHJhdGhlciB0aGFuIGNvbXB1dGluZyB0aGUgZGVuc2l0eSBvZiBvYnNlcnZhdGlvbnMpLgoKCmBgYHtyfQojcGxvdChzcGRmKQojIEkgbmVlZCB0byBmb3J0aWZ5IHRoZSBkYXRhCmxpYnJhcnkoYnJvb20pCnJlcXVpcmUobWFwZGF0YSkKCmFsZXUuZm9ydCA8LSBtYXJtYXA6OmZvcnRpZnkuYmF0aHkoYWxldSkKCiMgZ2V0IHJlZ2lvbmFsIHBvbHlnb25zCnJlZyA9IG1hcF9kYXRhKCJ3b3JsZDJIaXJlcyIpCnJlZ2lvbiA9IHN1YnNldChyZWcsIHJlZ2lvbiAlaW4lIGMoJ1VTQScsICdDYW5hZGEnKSkKCiMgZmlsdGVyCmFrIDwtIHJlZ2lvbiAlPiUKICBmaWx0ZXIobGF0ID4gNTAgJiBsYXQgPCA2NSwgbG9uZyA8IDI0MCkKCmBgYAoKCmBgYHtyfQojIHNldCBtYXAgbGltaXRzCiNsb25zID0gYygtMTgwLCAtMTM1KQojbGF0cyA9IGMoNDUsIDY1KQoKIyBwbG90CmdncGxvdCgpICsKICMgYWRkIDEwMG0gY29udG91cgogIGdlb21fY29udG91cihkYXRhID0gYWxldS5mb3J0LCAKICAgICAgICAgICAgICAgYWVzKHg9eCwgeT15LCB6PXopLAogICAgICAgICAgICAgICBicmVha3M9YygtMTAwKSwKICAgICAgICAgICAgICAgc2l6ZT1jKDAuMyksCiAgICAgICAgICAgICAgIGNvbG91cj0iZ3JleSIpICsKICAKICAjIGFkZCAyNTBtIGNvbnRvdXIKICBnZW9tX2NvbnRvdXIoZGF0YSA9IGFsZXUuZm9ydCwgCiAgICAgICAgICAgICAgIGFlcyh4PXgsIHk9eSwgej16KSwKICAgICAgICAgICAgICAgYnJlYWtzPWMoLTI1MCksCiAgICAgICAgICAgICAgIHNpemU9YygwLjYpLAogICAgICAgICAgICAgICBjb2xvdXI9ImdyZXkiKSArCiAgCiAgIyBhZGQgY29hc3RsaW5lCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBhaywgYWVzKHggPSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwKSwgCiAgICAgICAgICAgICAgIGZpbGwgPSAiZGFya2dyZXkiLCBjb2xvciA9IE5BKSArCiAgdGhlbWVfYncoKQpgYGAKCgpgYGB7ciBhay1jb2FzdGxpbmUtbWFwLXctZmlzaGluZy1lZmZvcnR9CiNmb3JtYXR0aW5nCmJyZWFrcyA8LSBjKDUwMDAsIDEwMDAwLCA1MDAwMCwgMTAwMDAwLCA1MDAwMDAsIDEwMDAwMDAsIDUwMDAwMDApCmN1c3RvbV9iaW5zIDwtIHF1YW50aWxlKGZpc2hfZWZmb3J0JHRvdF9ob29rcywgcHJvYnM9YygwLC4yLC40LC42LC44LDEpKQoKCmZpc2hfYnlfaG9va3NfZGYgPC0gbXV0YXRlKGZpc2hfZWZmb3J0LCBob29rcz1jdXQodG90X2hvb2tzLCBicmVha3M9Y3VzdG9tX2JpbnMpKQpmaXNoX2J5X2hvb2tzX2RmMSA8LSBmaXNoX2J5X2hvb2tzX2RmICU+JQogIGZpbHRlcighaXMubmEoaG9va3MpKQoKYGBgCgoKYGBge3IgbWFwLXBhcmFtc30KIyBnZXQgcmVnaW9uYWwgcG9seWdvbnMKcmVnID0gbWFwX2RhdGEoIndvcmxkMkhpcmVzIikKcmVnaW9ucyA9IHN1YnNldChyZWcsIHJlZ2lvbiAlaW4lIGMoJ1VTQScsICdDYW5hZGEnKSkgJT4lCiAgZmlsdGVyKGxhdCA+IDQ3ICYgbGF0IDwgNjUsIGxvbmcgPCAyNDApCgojIGNvbnZlcnQgbGF0IGxvbmdzCnJlZ2lvbnMkbG9uZyA9ICgzNjAgLSByZWdpb25zJGxvbmcpKi0xCgojIHNldCBtYXAgbGltaXRzCmxvbnMgPSBjKC0xODgsIC0xNDApICN0aGlzIG5lZWRzIHRvIGV4dGVuZCBiZXlvbmQgdGhlIGRhdGUgbGluZQpsYXRzID0gYyg1MCwgNjEuNzUpCgpgYGAKCgoKYGBge3IgYWstbWFwLXctZmlzaGluZy1lZmZvcnR9CmxpYnJhcnkoZ2dwbG90MikKIyBtYWtlIHBsb3QKZ2dwbG90KCkrCiAgCiAgIyBhZGQgMTAwbSBjb250b3VyCiAgZ2VvbV9jb250b3VyKGRhdGEgPSBhbGV1LmZvcnQsIAogICAgICAgICAgICAgICBhZXMoeD14LCB5PXksIHo9eiksCiAgICAgICAgICAgICAgIGJyZWFrcz1jKC0xMDApLAogICAgICAgICAgICAgICBzaXplPWMoMC4zKSwKICAgICAgICAgICAgICAgY29sb3VyPSJncmV5IikgKwogIAogICMgYWRkIDI1MG0gY29udG91cgogIGdlb21fY29udG91cihkYXRhID0gYWxldS5mb3J0LCAKICAgICAgICAgICAgICAgYWVzKHg9eCwgeT15LCB6PXopLAogICAgICAgICAgICAgICBicmVha3M9YygtMjUwKSwKICAgICAgICAgICAgICAgc2l6ZT1jKDAuNiksCiAgICAgICAgICAgICAgIGNvbG91cj0iZ3JleSIpICsKICAKICAjIGFkZCBjb2FzdGxpbmUKICBnZW9tX3BvbHlnb24oZGF0YSA9IHJlZ2lvbnMsIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCksIAogICAgICAgICAgICAgICBmaWxsID0gImRhcmtncmV5IiwgY29sb3IgPSBOQSkgKyAKICAKICAjIGFkZCBob29rcyAoZmlzaGluZyBlZmZvcnQpCiAgZ2VvbV90aWxlKGRhdGEgPSBmaXNoX2J5X2hvb2tzX2RmMSwKICAgIGFlcyh4ID0gbG9uLCB5ID0gbGF0ciwgZmlsbCA9IGhvb2tzKSwKICAgIGFscGhhID0gMC43NSwKICApICsKICAgICNzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJ5ZWxsb3ciLCBoaWdoID0gInJlZCIpKwogICNzY2FsZV9maWxsX3N0ZXBzbihjb2xvcnMgPSBSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoNSwgIllsT3JSZCIpLCBicmVha3MgPSBjdXN0b21fYmlucykgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiWWxPclJkIikgKwogICAjIGZhY2V0IHNlYXNvbnMKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKHNlYXNvbikpICsKICAKICAjIGNvbmZpZ3VyZSBwcm9qZWN0aW9uIGFuZCBwbG90IGRvbWFpbgogIGNvb3JkX21hcCh4bGltID0gbG9ucywgeWxpbSA9IGxhdHMpKwoKICAKICAjIGZvcm1hdHRpbmcKICB4bGFiKCJMb25naXR1ZGUiKSArCiAgeWxhYigiTGF0aXR1ZGUiKSArCiAgbGFicyhmaWxsID0gIiMgb2YgaG9va3MgKHF1YW50aWxlcykiKSArCiAgdGhlbWVfYncoKSsgCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHQ9MTApKSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4ocj0xMCkpCiAgKQogIyBtYW51YWxseSBzZXQgdGhlIHRleHQgZm9yIHRoZSBsZWdlbmQuIAogCiNnZ3NhdmUoInBkZl9vdXRwdXRzL2Zpc2hpbmdfZWZmb3J0X21hcF9zZWFzb24ucGRmIiwgd2lkdGggPSA3LCBoZWlnaHQgPSA5KQpgYGAKCgpNYWtlIHRoZSBzYW1lIG1hcHMsIGJ1dCB6b29tIGluIHNvIHRoZSBzcGF0aWFsIGV4dGVudCBtYXRjaGVzIHRoZSB1dGlsaXphdGlvbiBkaXN0cmlidXRpb24gbWFwcyBmb3IgdGhlIGNvbG9uaWVzOgpgYGB7ciB6b29tZWQtbWFwfQojIHNldCBtYXAgbGltaXRzCmxvbnMgPSBjKC0xODEsIC0xNTUpICN0aGlzIG5lZWRzIHRvIGV4dGVuZCBiZXlvbmQgdGhlIGRhdGUgbGluZQpsYXRzID0gYyg1MSwgNjEuMSkKCiMgbWFrZSBwbG90CmdncGxvdCgpKwogIAogICMgYWRkIGNvYXN0bGluZQogIGdlb21fcG9seWdvbihkYXRhID0gcmVnaW9ucywgYWVzKHggPSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwKSwgCiAgICAgICAgICAgICAgIGZpbGwgPSAiZGFya2dyZXkiLCBjb2xvciA9IE5BKSArIAogIAogICMgYWRkIGhvb2tzIChmaXNoaW5nIGVmZm9ydCkKICBnZW9tX3RpbGUoZGF0YSA9IGZpc2hfYnlfaG9va3NfZGYxLAogICAgYWVzKHggPSBsb24sIHkgPSBsYXRyLCBmaWxsID0gaG9va3MpLAogICAgYWxwaGEgPSAwLjc1LAogICkgKwogICAgI3NjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gInllbGxvdyIsIGhpZ2ggPSAicmVkIikrCiAgI3NjYWxlX2ZpbGxfc3RlcHNuKGNvbG9ycyA9IFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg1LCAiWWxPclJkIiksIGJyZWFrcyA9IGN1c3RvbV9iaW5zKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJZbE9yUmQiKSArCiAgICMgZmFjZXQgc2Vhc29ucwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoc2Vhc29uKSkgKwogIAogICMgY29uZmlndXJlIHByb2plY3Rpb24gYW5kIHBsb3QgZG9tYWluCiAgY29vcmRfbWFwKHhsaW0gPSBsb25zLCB5bGltID0gbGF0cykrCgogIAogICMgZm9ybWF0dGluZwogIHhsYWIoIkxvbmdpdHVkZSIpICsKICB5bGFiKCJMYXRpdHVkZSIpICsKICBsYWJzKGZpbGwgPSAiIyBvZiBob29rcyAocXVhbnRpbGVzKSIpICsKICB0aGVtZV9idygpKyAKICB0aGVtZSgKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4odD0xMCkpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihyPTEwKSkKICApCiAgCmdnc2F2ZSgicGRmX291dHB1dHMvZmlzaGluZ19lZmZvcnRfbWFwX3NlYXNvbl96b29tZWQucGRmIiwgd2lkdGggPSA3LCBoZWlnaHQgPSA5KQoKYGBgCgoKYGBge3J9CiMgbWFrZSBwbG90CnRlc3QubWFwIDwtIGdncGxvdCgpKwogIAogICMgYWRkIDEwMG0gY29udG91cgogIGdlb21fY29udG91cihkYXRhID0gYWxldS5mb3J0LAogICAgICAgICAgICAgICBhZXMoeD14LCB5PXksIHo9eiksCiAgICAgICAgICAgICAgIGJyZWFrcz1jKC0xMDApLAogICAgICAgICAgICAgICBzaXplPWMoMC4zKSwKICAgICAgICAgICAgICAgY29sb3VyPSJncmV5IikgKwoKICAjIGFkZCAyNTBtIGNvbnRvdXIKICBnZW9tX2NvbnRvdXIoZGF0YSA9IGFsZXUuZm9ydCwKICAgICAgICAgICAgICAgYWVzKHg9eCwgeT15LCB6PXopLAogICAgICAgICAgICAgICBicmVha3M9YygtMjUwKSwKICAgICAgICAgICAgICAgc2l6ZT1jKDAuNiksCiAgICAgICAgICAgICAgIGNvbG91cj0iZ3JleSIpICsKCiAgIyBhZGQgY29hc3RsaW5lCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSByZWdpb25zLCBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXApLCAKICAgICAgICAgICAgICAgZmlsbCA9ICJkYXJrZ3JleSIsIGNvbG9yID0gTkEpICsgCiAgCiAKICAjIGNvbmZpZ3VyZSBwcm9qZWN0aW9uIGFuZCBwbG90IGRvbWFpbgogIGNvb3JkX21hcCh4bGltID0gbG9ucywgeWxpbSA9IGxhdHMpKwogIAogICMgZm9ybWF0dGluZwogIHhsYWIoIkxvbmdpdHVkZSIpICsKICB5bGFiKCJMYXRpdHVkZSIpICsKICBsYWJzKGZpbGwgPSAiIyBvZiBob29rcyAocXVhbnRpbGVzKSIpICsKICB0aGVtZV9idygpKyAKICB0aGVtZSgKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4odD0xMCkpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihyPTEwKSkKICApCgpgYGAKCgpDYW4gSSB6b29tIGluIG1vcmUgb24gdGhhdD8KYGBge3J9CnJlZ2lvbi56b29tIDwtIHJlZ2lvbnMgJT4lCiAgZmlsdGVyKGxvbmcgPCAtMTQ1LCBsb25nID4gLTE4MSwgbGF0ID4gNTAsIGxhdCA8IDYyKQpgYGAKCmBgYHtyfQphbGJlcnMuYWsubWFwIDwtIGdncGxvdCgpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IHJlZ2lvbi56b29tLCBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXApLCAKICAgICAgICAgICAgICAgZmlsbCA9ICJkYXJrZ3JleSIsIGNvbG9yID0gTkEpICsKICBjb29yZF9tYXAocHJvamVjdGlvbiA9ICJhbGJlcnMiLCBwYXI9NTUsNjIpICsKICB0aGVtZV9taW5pbWFsKCkKCmFsYmVycy5hay5tYXAgCgpnZ3NhdmUoInBkZl9vdXRwdXRzL2FsYmVyc19tYXBfYWsucGRmIikKYGBgCgoKCmBgYHtyfQojIHpvb20gaW4gb24gdGhlIGVmZm9ydCBkYXRhIHRvbwpmaXNoX2J5X2hvb2tzX3RvX3Bsb3QgPC0gZmlzaF9ieV9ob29rc19kZjEgJT4lCiAgZmlsdGVyKGxvbiA8IC0xNDUsIGxvbiA+IC0xODEsIGxhdHIgPiA1MCwgbGF0ciA8IDYyKQoKYWxiZXJzLmFrLm1hcCArCiMgYWRkIGhvb2tzIChmaXNoaW5nIGVmZm9ydCkKICBnZW9tX3RpbGUoZGF0YSA9IGZpc2hfYnlfaG9va3NfZGYxLAogICAgYWVzKHggPSBsb24sIHkgPSBsYXRyLCBmaWxsID0gaG9va3MpLAogICAgYWxwaGEgPSAwLjc1LAogICkgKwogIHlsaW0oYyg1MSw2MS41KSkgKwogIHhsaW0oYygtMTgxLC0xNTApKSArCiAgICAjc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAieWVsbG93IiwgaGlnaCA9ICJyZWQiKSsKICAjc2NhbGVfZmlsbF9zdGVwc24oY29sb3JzID0gUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKDUsICJZbE9yUmQiKSwgYnJlYWtzID0gY3VzdG9tX2JpbnMpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIllsT3JSZCIpICsKICAgIyBmYWNldCBzZWFzb25zCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhzZWFzb24pKSArCgogICMgZm9ybWF0dGluZwogIHhsYWIoIkxvbmdpdHVkZSIpICsKICB5bGFiKCJMYXRpdHVkZSIpICsKICBsYWJzKGZpbGwgPSAiIyBvZiBob29rcyAocXVhbnRpbGVzKSIpICsKICB0aGVtZV9idygpKyAKICB0aGVtZSgKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4odD0xMCkpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihyPTEwKSkKICApCgpnZ3NhdmUoInBkZl9vdXRwdXRzL2hvb2tzX2VmZm90X2FlYV9wcm9qLnBkZiIsIHdpZHRoID0gNywgaGVpZ2h0ID0gOSkKYGBgCgoKCg==