Bycatch spatial and seasonal overlap

Are there differences between the spatial distributions of bycatch from the different colonies during the breeding and nonbreeding seasons? I’ll use BA values to compare among the pairwise comparisons.

library(tidyverse)
── Attaching packages ─────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
✓ ggplot2 3.3.2     ✓ purrr   0.3.3
✓ tibble  3.0.1     ✓ dplyr   1.0.4
✓ tidyr   1.1.2     ✓ stringr 1.4.0
✓ readr   1.3.1     ✓ forcats 0.4.0
package ‘ggplot2’ was built under R version 3.6.2package ‘tibble’ was built under R version 3.6.2package ‘tidyr’ was built under R version 3.6.2── Conflicts ────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x tidyr::extract() masks raster::extract()
x dplyr::filter()  masks stats::filter()
x purrr::is_null() masks testthat::is_null()
x dplyr::lag()     masks stats::lag()
x dplyr::matches() masks tidyr::matches(), testthat::matches()
x dplyr::select()  masks raster::select()
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 objects are masked from ‘package:testthat’:

    equals, is_less_than, not

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

    extract
library(sp)
library(raster)
library(marmap)

Attaching package: ‘marmap’

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

    plotProfile

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

    as.raster

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

    as.raster

06 August 2020 NOTE: the input file linking bycatch samples to geographic locations is confidential until publication

# assignments
nofu_w_meta <- read_csv("bycatch_data/FINAL_nofu_bycatch_downsampled_revised_06122020_newseasons.csv") 
Parsed with column specification:
cols(
  SAMPLE_ID = col_character(),
  NMFS_DNA_ID = col_character(),
  collection = col_character(),
  PofZ = col_double(),
  z_score = col_double(),
  TemporalAvail = col_double(),
  SpatialAvail = col_double(),
  FisheriesCollMonth = col_double(),
  FisheriesCollSeason = col_character(),
  FisheriesLatDD = col_double(),
  FisheriesLongDD = col_double(),
  MissingSBND = col_double()
)
# summarise those data a bit...
nofu_w_meta %>%
  filter(!is.na(FisheriesLatDD)) %>% # remove entries that don't have Lat/Lon info
  filter(!is.na(FisheriesCollSeason)) %>% # remove entries that don't have temporal info
  #group_by(collection, FisheriesCollSeason) %>% # how many birds per colony/season
  #group_by(FisheriesCollSeason) %>%
  tally() 

# are all data >90% likelihood?
nofu_w_meta %>%
  filter(PofZ > 0.90) %>%
  dplyr::select(SAMPLE_ID) %>%
  unique()

# colony locations
colony_locs <- read_csv("bycatch_data/colony_lat_lon.csv")
Parsed with column specification:
cols(
  Colony = col_character(),
  lon = col_double(),
  lat = col_double()
)
# how many during which seasons?
nofu_w_meta %>%
  group_by(FisheriesCollSeason) %>%
  tally()
# arrange assignment and fishery data for spatial analysis
new_spatial_df <- nofu_w_meta %>%
  #select(-TAG_NUMBER, -NMFS_DNA_ID, -OriginColony, -ColonyLatDD, -ColonyLongDD, -PofZ, -z_score) %>%
  dplyr::select(NMFS_DNA_ID, collection, FisheriesCollSeason, FisheriesLatDD, FisheriesLongDD) %>%
  rename(OriginColony = collection) %>%
  filter(!is.na(FisheriesLatDD), FisheriesLatDD>50) %>% #get rid of blanks, keep only alaska data
  filter(!is.na(FisheriesCollSeason)) %>% #get rid of blanks
  mutate(ColonyPhenology = paste(OriginColony, FisheriesCollSeason, sep="_")) #make colony-phenology grouping fieldg

NOFU <- new_spatial_df %>%
  dplyr::select(OriginColony, FisheriesLongDD, FisheriesLatDD, ColonyPhenology) #keep only these fields for kerneling

972 birds at this stage (29 birds were caught below 50 degrees N latitude)

plot(NOFU$FisheriesLongDD, NOFU$FisheriesLatDD, asp = 1)

Because of the date line, these birds at +176 are just on the other side of 180 degrees…

NOFU %>%
  filter(FisheriesLongDD > 150) #%>%
  # group_by(ColonyPhenology) %>%
  # tally() %>%
  # mutate(prop = n/sum(n))

I don’t need to mess with the longitude values in the new projection.

nofu_dat_fixed <- NOFU %>%
  #mutate(long = ifelse(FisheriesLongDD > 150, -FisheriesLongDD, FisheriesLongDD)) %>% # 36 birds like this
  mutate(lat = FisheriesLatDD) %>%
  mutate(long = FisheriesLongDD)

# and save a version of that df that is still in df format
nofu_data_frame <- NOFU %>%
  #mutate(long = ifelse(FisheriesLongDD > 150, -FisheriesLongDD, FisheriesLongDD)) %>%
  mutate(lat = FisheriesLatDD) %>%
  mutate(long = FisheriesLongDD)

# plot again
plot(nofu_dat_fixed$long, nofu_dat_fixed$lat, asp = 1)

NA
NA

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(nofu_dat_fixed) = ~long+lat ### define the x and y spatial fields
proj4string(nofu_dat_fixed) <- CRS(input_proj) ### define the projection
nofu_dat2 <- spTransform(nofu_dat_fixed, CRS(desired_proj)) ###transform to desired projection

# another quick plot
plot(nofu_dat2, pch = 19, cex = 0.5)

# I need this in df form again - not spatial df
NOFU_df2 <- new_spatial_df %>%
  #mutate(long = ifelse(FisheriesLongDD > 150, -FisheriesLongDD, FisheriesLongDD)) %>%
  mutate(lat = FisheriesLatDD) %>%
  mutate(long = FisheriesLongDD)

Add bathymetric map

# antimeridian region 
aleu <- getNOAA.bathy(175, -145, 50, 65, 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)
str(bathy)
Formal class 'RasterLayer' [package "raster"] with 12 slots
  ..@ file    :Formal class '.RasterFile' [package "raster"] with 13 slots
  .. .. ..@ name        : chr ""
  .. .. ..@ datanotation: chr "FLT4S"
  .. .. ..@ byteorder   : chr "little"
  .. .. ..@ nodatavalue : num -Inf
  .. .. ..@ NAchanged   : logi FALSE
  .. .. ..@ nbands      : int 1
  .. .. ..@ bandorder   : chr "BIL"
  .. .. ..@ offset      : int 0
  .. .. ..@ toptobottom : logi TRUE
  .. .. ..@ blockrows   : int 0
  .. .. ..@ blockcols   : int 0
  .. .. ..@ driver      : chr ""
  .. .. ..@ open        : logi FALSE
  ..@ data    :Formal class '.SingleLayerData' [package "raster"] with 13 slots
  .. .. ..@ values    : int [1:134775] 44 58 41 28 22 16 29 31 31 30 ...
  .. .. ..@ offset    : num 0
  .. .. ..@ gain      : num 1
  .. .. ..@ inmemory  : logi TRUE
  .. .. ..@ fromdisk  : logi FALSE
  .. .. ..@ isfactor  : logi FALSE
  .. .. ..@ attributes: list()
  .. .. ..@ haveminmax: logi TRUE
  .. .. ..@ min       : int -7380
  .. .. ..@ max       : int 4537
  .. .. ..@ band      : int 1
  .. .. ..@ unit      : chr ""
  .. .. ..@ names     : chr ""
  ..@ legend  :Formal class '.RasterLegend' [package "raster"] with 5 slots
  .. .. ..@ type      : chr(0) 
  .. .. ..@ values    : logi(0) 
  .. .. ..@ color     : logi(0) 
  .. .. ..@ names     : logi(0) 
  .. .. ..@ colortable: logi(0) 
  ..@ title   : chr(0) 
  ..@ extent  :Formal class 'Extent' [package "raster"] with 4 slots
  .. .. ..@ xmin: num 175
  .. .. ..@ xmax: num 215
  .. .. ..@ ymin: num 50
  .. .. ..@ ymax: num 65
  ..@ rotated : logi FALSE
  ..@ rotation:Formal class '.Rotation' [package "raster"] with 2 slots
  .. .. ..@ geotrans: num(0) 
  .. .. ..@ transfun:function ()  
  ..@ ncols   : int 599
  ..@ nrows   : int 225
  ..@ crs     :Formal class 'CRS' [package "sp"] with 1 slot
  .. .. ..@ projargs: chr "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"
  ..@ history : list()
  ..@ z       : list()

The projection for the bathy raster appears to be: “+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0”

kerneling

I need the blank grid and the nofu df in the same projection

** Need new blank grid with the appropriate projection:

# new desired projection
new_proj <- "+proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154"

### convert data to a spatial object and reproject to desired coordinate system
#coordinates(nofu_dat_fixed) = ~long+lat ### define the x and y spatial fields
#proj4string(nofu_dat_fixed) <- CRS(input_proj) ### define the projection

nofu_dat3 <- spTransform(nofu_dat_fixed, CRS(new_proj)) ###transform to desired projection


### build a grid to use for the KUDs
ext<-1.3*extent(nofu_dat3) #define the spatial extent as 1.3X the extent of your data
grid_blank2 <- raster(ext=ext, crs=new_proj, resolution=3000) #make a grid using the extent, define the projection, and set the cell size (resolution)
vals <- 1:ncell(grid_blank2) #give the grid dummy values
grid_blank2 <- setValues(grid_blank2, vals) #give the grid dummy values
grid_blank2 <- as(grid_blank2, "SpatialPixelsDataFrame") #convert grid to Spatial Pixels Data Frame (what kernelUD needs)

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(NOFU_df2$long)
mlat = mean(NOFU_df2$lat)
span = 2000

Subset the dataframe for each comparison

col_comparisons_kernel <- function(colony_phenology1, colony_phenology2){
  
      map_dat1 <- NOFU_df2 %>%
      filter(ColonyPhenology %in% c(colony_phenology1, colony_phenology2))
    
    # Make a SPDF
    spdf <- SpatialPointsDataFrame(coords=cbind(map_dat1$long,
                                                         map_dat1$lat),
                                            data=data.frame(id=map_dat1$ColonyPhenology),
                                            proj4string = CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"))
    
    # convert my UDs into the right projection to match up with the bathymap
    # Project data into laea
      spdf.t <- spTransform(spdf,
                                    CRS("+proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154"))
    
    # calculate kernelUD
    ud <- kernelUD(spdf.t, h = 30000, grid=grid_blank2)
    tmp_ud <- getverticeshr(ud, percent=50, standardize=T)
    
    # transform to the same projection as the bathymetry
    tmp_ud2 <- spTransform(tmp_ud, CRS = "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0")
    
    # fortify for ggplotting
    uds_df <- fortify(tmp_ud2) %>%
      mutate(lon = ifelse(long < 0, -long, long))
    
    # colors and formatting
    col1 <-uds_df %>%
      filter(id == colony_phenology1)
    
    col2 <- uds_df %>%
      filter(id == colony_phenology2)
    
    return(list
           (col1,
            col2))
 
}

Chagulak and St. Matthew comparison

Apply that function to Chagulak and StMatthew, breeding season:

comp1
[[1]]

[[2]]
NA
# and just the locations for st matt and chagulak
    matt_chag_locs <- colony_locs %>%
      filter(Colony %in% c("Chagulak", "StMatthew"))
    
    matt_chag_locs$Colony <- as.factor(matt_chag_locs$Colony)
    colors <- c("purple", "dodgerblue")[matt_chag_locs$Colony]
chag <- comp1[[1]]
stmatt <- comp1[[2]]

Plot it up

# set up the output
pdf("pdf_outputs/chagulak_breeding.pdf", width = 5.5, height = 4.5)
plot(coastlineWorldFine, clon = -168, clat = 56.8, span = 825, 
     projection="+proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154", col = 'lightgrey')

# plot bathymetry
mapContour(bathyLon, bathyLat, bathyZ,
           levels = c(-500, -1000, -2500),
           lwd = c(1.5, 1, 1),
           lty = c(3, 1, 3),
           col = 'darkgray')

# add depth legend
legend("bottomleft", seg.len = 3, cex = 0.7,
        lwd = c(1.5, 1, 1),
        lty = c(3, 1, 3),
        legend = c("-500", "-1000", "-2500"),
        box.col = "white", col = 'darkgray', title = "Depth (m)", bg = "white")

# add map data
#mapPolygon(longitude = stmatt$long, latitude = stmatt$lat, lty = 0, col = alpha("dodgerblue", 0.2))
mapPolygon(longitude = chag$long, latitude = chag$lat, lty = 0, col = alpha("purple", 0.2))

# add colony legend
# legend("bottom", seg.len = 3, cex = 0.7,
#        legend = c("lightblue", "lightgreen"),
#        box.col = "white", col = 'darkgray', title = "Breeding colony", bg = "white")

# add colony locations
mapPoints(longitude = matt_chag_locs$lon, latitude = matt_chag_locs$lat, pch = 23, col = colors, cex = 1.2, lwd = 2)
dev.off()
null device 
          1 

Apply that function to Chagulak and StMatthew, nonbreeding season:

colony_phenology1 <- "Chagulak_nonbreeding"
colony_phenology2 <- "StMatthew_nonbreeding"

comp2 <- col_comparisons_kernel(colony_phenology1, colony_phenology2)
Regions defined for each Polygons
nob.chag <- comp2[[1]]
nob.stmatt <- comp2[[2]]
# set up the output
#plot(coastlineWorldFine, clon = -168, clat = mlat, span = 1100, 
#pdf("pdf_outputs/stmatt_nonbreeding.pdf", width = 5.5, height = 4.5)
pdf("pdf_outputs/chagulak_nonbreeding.pdf", width = 5.5, height = 4.5)

plot(coastlineWorldFine, clon = -168, clat = 56.8, span = 825, 
     projection="+proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154", col = 'lightgrey')

# plot bathymetry
mapContour(bathyLon, bathyLat, bathyZ,
           levels = c(-500, -1000, -2500),
           lwd = c(1.5, 1, 1),
           lty = c(3, 1, 3),
           col = 'darkgray')

# add depth legend
legend("bottomleft", seg.len = 3, cex = 0.7,
        lwd = c(1.5, 1, 1),
        lty = c(3, 1, 3),
        legend = c("-500", "-1000", "-2500"),
        box.col = "white", col = 'darkgray', title = "Depth (m)", bg = "white")

# add map data
#mapPolygon(longitude = nob.stmatt$long, latitude = nob.stmatt$lat, col = alpha("dodgerblue", 0.2), lty = 0)
mapPolygon(longitude = nob.chag$long, latitude = nob.chag$lat, lty = 0, col = alpha("purple", 0.2))

# add colony locations
mapPoints(longitude = matt_chag_locs$lon, latitude = matt_chag_locs$lat, pch = 23, col = colors, cex = 1.2, lwd = 2)
dev.off()
null device 
          1 

Pribilofs and Semidi comparison

Apply that function to Pribilofs and Semidis, breeding season:

colony_phenology1 <- "Semidi_breeding"
colony_phenology2 <- "Pribilof_breeding"

comp1 <- col_comparisons_kernel(colony_phenology1, colony_phenology2)
Regions defined for each Polygons
# and just the locations for pribs and semidis
semidi_prib_locs <- colony_locs %>%
    filter(Colony %in% c("Pribilof", "Semidi"))
    
semidi_prib_locs$Colony <- as.factor(semidi_prib_locs$Colony)
    colors2 <- c("red", "darkorange")[semidi_prib_locs$Colony]

# select-the-output-for-mapping
semidi.b <- comp1[[1]]
prib.b <- comp1[[2]]

Plot it up

Nonbreeding season: Pribs and Semidis

colony_phenology1 <- "Semidi_nonbreeding"
colony_phenology2 <- "Pribilof_nonbreeding"

comp1 <- col_comparisons_kernel(colony_phenology1, colony_phenology2)
Regions defined for each Polygons
# select-the-output-for-mapping
semidi.nob <- comp1[[1]]
prib.nob <- comp1[[2]]

Plot it up

# set up the output
#pdf("pdf_outputs/prib_semidi_nonbreeding_map.pdf", width = 6.5, height = 5.5)
pdf("pdf_outputs/prib_nonbreeding.pdf", width = 5.5, height = 4.5)
plot(coastlineWorldFine, clon = -168, clat = 56.8, span = 825, 
#plot(coastlineWorldFine, clon = -168, clat = mlat, span = 1100, 
     projection="+proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154", col = 'lightgrey')

# plot bathymetry
mapContour(bathyLon, bathyLat, bathyZ,
           levels = c(-500, -1000, -2500),
           lwd = c(1.5, 1, 1),
           lty = c(3, 1, 3),
           col = 'darkgray')

# add depth legend
legend("bottomleft", seg.len = 3, cex = 0.7,
        lwd = c(1.5, 1, 1),
        lty = c(3, 1, 3),
        legend = c("-500", "-1000", "-2500"),
        box.col = "white", col = 'darkgray', title = "Depth (m)", bg = "white")

# add map data
#mapPolygon(longitude = semidi.nob$long, latitude = semidi.nob$lat, lty = 0, col = alpha("darkorange", 0.2))
mapPolygon(longitude = prib.nob$long, latitude = prib.nob$lat, lty = 0, col = alpha("red", 0.2))

# add colony legend
# legend("bottom", seg.len = 3, cex = 0.7,
#        legend = c("lightblue", "lightgreen"),
#        box.col = "white", col = 'darkgray', title = "Breeding colony", bg = "white")

# add colony locations
mapPoints(longitude = semidi_prib_locs$lon, latitude = semidi_prib_locs$lat, pch = 23, col = colors2, cex = 1.2, lwd = 2)
dev.off()
null device 
          1 

St. Matthew and Pribs comparison

Next set of comparisons: St. Matthew and the Pribilof Islands

colony_phenology1 <- "Pribilof_breeding"
colony_phenology2 <- "StMatthew_breeding"

comp3 <- col_comparisons_kernel(colony_phenology1, colony_phenology2)
Regions defined for each Polygons
# colors and formatting
prib.b <- comp3[[1]]
matt.b <- comp3[[2]]

# select those colonies
# keep the color consistent for St Matt's
# and just the locations for st matt and chagulak
p.m_locs <- colony_locs %>%
  filter(Colony %in% c("Pribilof", "StMatthew"))

p.m_locs$Colony <- as.factor(p.m_locs$Colony)
colors <- c("red", "dodgerblue")[p.m_locs$Colony]

Plot it up

# set up the output
#plot(coastlineWorldFine, clon = -168, clat = mlat, span = 1100, 
pdf("pdf_outputs/prib_breeding.pdf", width = 5.5, height = 4.5)
plot(coastlineWorldFine, clon = -168, clat = 56.8, span = 825, 
     projection="+proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154", col = 'lightgrey')

# plot bathymetry
mapContour(bathyLon, bathyLat, bathyZ,
            levels = c(-500, -1000, -2500),
            lwd = c(1.5, 1, 1),
            lty = c(3, 1, 3),
            col = 'darkgray')

# add depth legend
legend("bottomleft", seg.len = 3, cex = 0.7,
        lwd = c(1.5, 1, 1),
        lty = c(3, 1, 3),
        legend = c("-500", "-1000", "-2500"),
        box.col = "white", col = 'darkgray', title = "Depth (m)", bg = "white")

# add map data
mapPolygon(longitude = prib.b$long, latitude = prib.b$lat, col = alpha("red", 0.2), lty = 0)
#mapPolygon(longitude = matt.b$long, latitude = matt.b$lat, lty = 0, col = alpha("dodgerblue", 0.2))

# add colony locations
mapPoints(longitude = p.m_locs$lon, latitude = p.m_locs$lat, pch = 23, col = colors, cex = 1.2, lwd = 2)
dev.off()
null device 
          1 

nonbreeding:

colony_phenology1 <- "Pribilof_nonbreeding"
colony_phenology2 <- "StMatthew_nonbreeding"

comp4 <- col_comparisons_kernel(colony_phenology1, colony_phenology2)
Regions defined for each Polygons
# colors and formatting
prib.nob <- comp4[[1]]
matt.nob <- comp4[[2]]
plot(coastlineWorldFine, clon = -168, clat = mlat, span = 1100, 
     projection="+proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154", col = 'lightgrey')

# plot bathymetry
mapContour(bathyLon, bathyLat, bathyZ,
           levels = c(-500, -1000, -2500),
           lwd = c(1.5, 1, 1),
           lty = c(3, 1, 3),
           col = 'darkgray')

# add depth legend
legend("bottomleft", seg.len = 3, cex = 0.7,
       lwd = c(1.5, 1, 1),
       lty = c(3, 1, 3),
       legend = c("-500", "-1000", "-2500"),
       box.col = "white", col = 'darkgray', title = "Depth (m)", bg = "white")

# add map data
mapPolygon(longitude = prib.nob$long, latitude = prib.nob$lat, col = alpha("red", 0.2), lty = 0)
mapPolygon(longitude = matt.nob$long, latitude = matt.nob$lat, lty = 0, col = alpha("dodgerblue", 0.2))

# add colony locations
mapPoints(longitude = p.m_locs$lon, latitude = p.m_locs$lat, pch = 23, col = colors, cex = 1.2, lwd = 2)

Figure 1

Colony size map Quick and dirty way: list of colony sizes

colony_pops <- colony_locs %>%
  mutate(pop = ifelse(Colony == "Chagulak", 500000, 450000)) %>%
  mutate(pop = ifelse(Colony == "Pribilof", 79700, pop)) %>%
  mutate(pop = ifelse(Colony == "Semidi", 440000, pop))

# add the % bycatch per colony
bycatch_prop <- c(.14, .36, .23, .27) # the order is Chag/Semidi/Prib/StM
by_percent <- as_tibble(bycatch_prop) %>%
  rename(by_prop = value)

colony_perc <- colony_pops %>%
  mutate(pop_perc = pop/(sum(pop))) %>% # and then make that a percentage
  bind_cols(by_percent)

#colony_pops$pop <- factor(colony_pops$pop)
colony_locs$Colony <- as.factor(colony_locs$Colony)
#colors <- c("purple", "red", "goldenrod", "dodgerblue")[colony_locs$Colony]
# # easiest to grab this from Jessie's table
# colony <- c("Chagulak", "Pribilof", "StMatthew", "Semidi")
# 
# 
# by_prop <- as_data_frame(bycatch_prop) %>%
#   rename(by_prop = value)
# 
# as_data_frame(colony) %>%
#   rename(colony = value) %>%
#   bind_cols(by_prop)
library(ggpattern)

Attaching package: ‘ggpattern’

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

    flip_data, flipped_names, gg_dep, has_flipped_aes, remove_missing, should_stop,
    waiver

Straight colony map

colors
[1] "purple"     "darkorange" "red"        "dodgerblue"
Warning messages:
1: package ‘raster’ was built under R version 3.6.2 
2: package ‘sp’ was built under R version 3.6.2 
#pdf("pdf_outputs/August28_test_disproportionate_map.pdf")
plot(coastlineWorldFine, clon = -167, clat = mlat, span = 1100, 
     projection="+proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154", col = 'lightgrey')

# plot bathymetry
mapContour(bathyLon, bathyLat, bathyZ,
           levels = c(-500, -1000, -2500),
           lwd = c(1, 1, 0.5),
           lty = c(3, 1, 3, 1, 3),
           col = 'darkgray')

# add depth legend
legend("bottomleft", seg.len = 3, cex = 0.7,
       lwd = c(1, 1, 0.5),
       lty = c(3, 1, 3, 1, 3),
       legend = c("-500", "-1000", "-2500"),
       box.col = "white", col = 'darkgray', title = "Depth (m)", bg = "white")

# add map data

# add colony locations
# mapPoints(longitude = colony_locs$lon, latitude = colony_locs$lat, pch = 16, col = alpha(colors, 0.5), cex = 0.00001* (colony_pops$pop), lwd = 2) # relative population sizes

mapPoints(longitude = colony_locs$lon, latitude = colony_locs$lat, pch = 1, col = alpha("dodgerblue",0.7), cex = 11*(colony_perc$pop_perc), lwd = 2) # relative population sizes

mapPoints(longitude = colony_locs$lon, latitude = colony_locs$lat, pch = 1, col = "red", cex = 11*(colony_perc$by_prop), lwd = 2) # relative bycatch amounts


#dev.off()

BA calculations

I need to recalculate the BA values for all of my colony comparisons. Fortunately, I don’t think I need to do so using the p-value randomized framework because none of those p-values were remotely close to statistically significant.

source("R/nofu-functions.R")

build blank grid for use in the kernel overlap function

### 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(NOFU) = ~FisheriesLongDD+FisheriesLatDD ### define the x and y spatial fields
proj4string(NOFU) <- CRS(input_proj) ### define the projection
NOFU2 <- spTransform(NOFU, CRS(desired_proj)) ###transform to desired projection

### build a grid to use for the KUDs
ext<-1.3*extent(NOFU2) #define the spatial extent as 1.3X the extent of your data
grid_blank <- raster(ext=ext, crs=desired_proj, resolution=3000) #make a grid using the extent, define the projection, and set the cell size (resolution)
vals <- 1:ncell(grid_blank) #give the grid dummy values
grid_blank <- setValues(grid_blank, vals) #give the grid dummy values
grid_blank <- as(grid_blank, "SpatialPixelsDataFrame") #convert grid to Spatial Pixels Data Frame (what kernelUD needs)

Basically, the function I want is to enter the colony names and season of interest, and have the rest wrapped up in a function that leans on Abram’s fct.

colony_season_BA <- function(colony1, colony2, season, nofu_spatial_df){
  
  # subset the data by colony comparisons
  comparison_df <- nofu_spatial_df %>%
    filter(OriginColony == colony1 | OriginColony == colony2) %>%
    filter(FisheriesCollSeason == season)
  
  comparison_BA <- kernalOverlapBA_p(tracks = comparison_df, tripid="NMFS_DNA_ID", groupid = "ColonyPhenology",
                             lon="FisheriesLongDD",lat="FisheriesLatDD",
                             colonyLon=-169.6449, colonyLat=56.66225,
                             its=2, h=30000, ud.grid = grid_blank, Plot=F)
  
  return(comparison_BA)
  
}

test that out for the St Matthew/Prib breeding and nonbreeding

colony_season_BA("StMatthew", "Pribilof", "breeding", new_spatial_df)
[1] "iteration: 1 of 2"
[1] "iteration: 2 of 2"

colony_season_BA("StMatthew", "Pribilof", "nonbreeding", new_spatial_df)
colony_season_BA("StMatthew", "Chagulak", "nonbreeding", new_spatial_df)
colony_season_BA("StMatthew", "Chagulak", "breeding", new_spatial_df)
colony_season_BA("Pribilof", "Chagulak", "breeding", new_spatial_df)
colony_season_BA("Pribilof", "Chagulak", "nonbreeding", new_spatial_df)
colony_season_BA("Semidi", "Chagulak", "breeding", new_spatial_df)
colony_season_BA("Semidi", "Chagulak", "nonbreeding", new_spatial_df)
colony_season_BA("Semidi", "StMatthew", "breeding", new_spatial_df)
colony_season_BA("Semidi", "StMatthew", "nonbreeding", new_spatial_df)
colony_season_BA("Semidi", "Pribilof", "breeding", new_spatial_df)
colony_season_BA("Semidi", "Pribilof", "nonbreeding", new_spatial_df)
LS0tCnRpdGxlOiAiMDYtYnljYXRjaC1zcGF0aWFsLWFuYWx5c2lzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKIyMgQnljYXRjaCBzcGF0aWFsIGFuZCBzZWFzb25hbCBvdmVybGFwCgpBcmUgdGhlcmUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgc3BhdGlhbCBkaXN0cmlidXRpb25zIG9mIGJ5Y2F0Y2ggZnJvbSB0aGUgZGlmZmVyZW50IGNvbG9uaWVzIGR1cmluZyB0aGUgYnJlZWRpbmcgYW5kIG5vbmJyZWVkaW5nIHNlYXNvbnM/IEknbGwgdXNlIEJBIHZhbHVlcyB0byBjb21wYXJlIGFtb25nIHRoZSBwYWlyd2lzZSBjb21wYXJpc29ucy4KCgpgYGB7ciBsb2FkLXBhY2thZ2VzfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShkcGx5cikKbGlicmFyeShhZGVoYWJpdGF0SFIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeShzcCkKbGlicmFyeShyYXN0ZXIpCmxpYnJhcnkobWFybWFwKQoKYGBgCgojIyMjIDA2IEF1Z3VzdCAyMDIwIE5PVEU6IHRoZSBpbnB1dCBmaWxlIGxpbmtpbmcgYnljYXRjaCBzYW1wbGVzIHRvIGdlb2dyYXBoaWMgbG9jYXRpb25zIGlzIGNvbmZpZGVudGlhbCB1bnRpbCBwdWJsaWNhdGlvbgoKYGBge3IgbG9hZC1uZXctZGF0YX0KIyBhc3NpZ25tZW50cwpub2Z1X3dfbWV0YSA8LSByZWFkX2NzdigiYnljYXRjaF9kYXRhL0ZJTkFMX25vZnVfYnljYXRjaF9kb3duc2FtcGxlZF9yZXZpc2VkXzA2MTIyMDIwX25ld3NlYXNvbnMuY3N2IikgCgojIHN1bW1hcmlzZSB0aG9zZSBkYXRhIGEgYml0Li4uCm5vZnVfd19tZXRhICU+JQogIGZpbHRlcighaXMubmEoRmlzaGVyaWVzTGF0REQpKSAlPiUgIyByZW1vdmUgZW50cmllcyB0aGF0IGRvbid0IGhhdmUgTGF0L0xvbiBpbmZvCiAgZmlsdGVyKCFpcy5uYShGaXNoZXJpZXNDb2xsU2Vhc29uKSkgJT4lICMgcmVtb3ZlIGVudHJpZXMgdGhhdCBkb24ndCBoYXZlIHRlbXBvcmFsIGluZm8KICAjZ3JvdXBfYnkoY29sbGVjdGlvbiwgRmlzaGVyaWVzQ29sbFNlYXNvbikgJT4lICMgaG93IG1hbnkgYmlyZHMgcGVyIGNvbG9ueS9zZWFzb24KICAjZ3JvdXBfYnkoRmlzaGVyaWVzQ29sbFNlYXNvbikgJT4lCiAgdGFsbHkoKSAKCiMgYXJlIGFsbCBkYXRhID45MCUgbGlrZWxpaG9vZD8Kbm9mdV93X21ldGEgJT4lCiAgZmlsdGVyKFBvZlogPiAwLjkwKSAlPiUKICBkcGx5cjo6c2VsZWN0KFNBTVBMRV9JRCkgJT4lCiAgdW5pcXVlKCkKCiMgY29sb255IGxvY2F0aW9ucwpjb2xvbnlfbG9jcyA8LSByZWFkX2NzdigiYnljYXRjaF9kYXRhL2NvbG9ueV9sYXRfbG9uLmNzdiIpCgpgYGAKCmBgYHtyfQojIGhvdyBtYW55IGR1cmluZyB3aGljaCBzZWFzb25zPwpub2Z1X3dfbWV0YSAlPiUKICBncm91cF9ieShGaXNoZXJpZXNDb2xsU2Vhc29uKSAlPiUKICB0YWxseSgpCmBgYAoKCmBgYHtyIG9yZ2FuaXplLXNwYXRpYWwtZGF0YX0KIyBhcnJhbmdlIGFzc2lnbm1lbnQgYW5kIGZpc2hlcnkgZGF0YSBmb3Igc3BhdGlhbCBhbmFseXNpcwpuZXdfc3BhdGlhbF9kZiA8LSBub2Z1X3dfbWV0YSAlPiUKICAjc2VsZWN0KC1UQUdfTlVNQkVSLCAtTk1GU19ETkFfSUQsIC1PcmlnaW5Db2xvbnksIC1Db2xvbnlMYXRERCwgLUNvbG9ueUxvbmdERCwgLVBvZlosIC16X3Njb3JlKSAlPiUKICBkcGx5cjo6c2VsZWN0KE5NRlNfRE5BX0lELCBjb2xsZWN0aW9uLCBGaXNoZXJpZXNDb2xsU2Vhc29uLCBGaXNoZXJpZXNMYXRERCwgRmlzaGVyaWVzTG9uZ0REKSAlPiUKICByZW5hbWUoT3JpZ2luQ29sb255ID0gY29sbGVjdGlvbikgJT4lCiAgZmlsdGVyKCFpcy5uYShGaXNoZXJpZXNMYXRERCksIEZpc2hlcmllc0xhdEREPjUwKSAlPiUgI2dldCByaWQgb2YgYmxhbmtzLCBrZWVwIG9ubHkgYWxhc2thIGRhdGEKICBmaWx0ZXIoIWlzLm5hKEZpc2hlcmllc0NvbGxTZWFzb24pKSAlPiUgI2dldCByaWQgb2YgYmxhbmtzCiAgbXV0YXRlKENvbG9ueVBoZW5vbG9neSA9IHBhc3RlKE9yaWdpbkNvbG9ueSwgRmlzaGVyaWVzQ29sbFNlYXNvbiwgc2VwPSJfIikpICNtYWtlIGNvbG9ueS1waGVub2xvZ3kgZ3JvdXBpbmcgZmllbGRnCgpOT0ZVIDwtIG5ld19zcGF0aWFsX2RmICU+JQogIGRwbHlyOjpzZWxlY3QoT3JpZ2luQ29sb255LCBGaXNoZXJpZXNMb25nREQsIEZpc2hlcmllc0xhdERELCBDb2xvbnlQaGVub2xvZ3kpICNrZWVwIG9ubHkgdGhlc2UgZmllbGRzIGZvciBrZXJuZWxpbmcKCmBgYAoKOTcyIGJpcmRzIGF0IHRoaXMgc3RhZ2UgKDI5IGJpcmRzIHdlcmUgY2F1Z2h0IGJlbG93IDUwIGRlZ3JlZXMgTiBsYXRpdHVkZSkKCmBgYHtyIHRlc3QtcGxvdH0KcGxvdChOT0ZVJEZpc2hlcmllc0xvbmdERCwgTk9GVSRGaXNoZXJpZXNMYXRERCwgYXNwID0gMSkKYGBgCgpCZWNhdXNlIG9mIHRoZSBkYXRlIGxpbmUsIHRoZXNlIGJpcmRzIGF0ICsxNzYgYXJlIGp1c3Qgb24gdGhlIG90aGVyIHNpZGUgb2YgMTgwIGRlZ3JlZXMuLi4KCmBgYHtyfQpOT0ZVICU+JQogIGZpbHRlcihGaXNoZXJpZXNMb25nREQgPiAxNTApICMlPiUKICAjIGdyb3VwX2J5KENvbG9ueVBoZW5vbG9neSkgJT4lCiAgIyB0YWxseSgpICU+JQogICMgbXV0YXRlKHByb3AgPSBuL3N1bShuKSkKYGBgCgpJIGRvbid0IG5lZWQgdG8gbWVzcyB3aXRoIHRoZSBsb25naXR1ZGUgdmFsdWVzIGluIHRoZSBuZXcgcHJvamVjdGlvbi4KYGBge3Iga2VlcC1hbGwtbG9uZ2l0dWRlLWFzLWlzfQpub2Z1X2RhdF9maXhlZCA8LSBOT0ZVICU+JQogICNtdXRhdGUobG9uZyA9IGlmZWxzZShGaXNoZXJpZXNMb25nREQgPiAxNTAsIC1GaXNoZXJpZXNMb25nREQsIEZpc2hlcmllc0xvbmdERCkpICU+JSAjIDM2IGJpcmRzIGxpa2UgdGhpcwogIG11dGF0ZShsYXQgPSBGaXNoZXJpZXNMYXRERCkgJT4lCiAgbXV0YXRlKGxvbmcgPSBGaXNoZXJpZXNMb25nREQpCgojIGFuZCBzYXZlIGEgdmVyc2lvbiBvZiB0aGF0IGRmIHRoYXQgaXMgc3RpbGwgaW4gZGYgZm9ybWF0Cm5vZnVfZGF0YV9mcmFtZSA8LSBOT0ZVICU+JQogICNtdXRhdGUobG9uZyA9IGlmZWxzZShGaXNoZXJpZXNMb25nREQgPiAxNTAsIC1GaXNoZXJpZXNMb25nREQsIEZpc2hlcmllc0xvbmdERCkpICU+JQogIG11dGF0ZShsYXQgPSBGaXNoZXJpZXNMYXRERCkgJT4lCiAgbXV0YXRlKGxvbmcgPSBGaXNoZXJpZXNMb25nREQpCgojIHBsb3QgYWdhaW4KcGxvdChub2Z1X2RhdF9maXhlZCRsb25nLCBub2Z1X2RhdF9maXhlZCRsYXQsIGFzcCA9IDEpCgoKYGBgCgojIyMgc3BhdGlhbCBkYXRhIHByb2plY3Rpb25zCgpgYGB7ciByZXByb2plY3QtZGF0YXBvaW50c30KIyMjIGRlZmluZSBwcm9qZWN0aW9ucwppbnB1dF9wcm9qIDwtICIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIgIyMjdGhlIGlucHV0IHByb2plY3Rpb24gb2YgdHJhY2sgcG9pbnRzCmRlc2lyZWRfcHJvaiA8LSAiK3Byb2o9YWVhICtsYXRfMT01NSArbGF0XzI9NjUgK2xhdF8wPTUwICtsb25fMD0tMTU0ICt4XzA9MCAreV8wPTAgK2VsbHBzPUdSUzgwICtkYXR1bT1OQUQ4MyArdW5pdHM9bSArbm9fZGVmcyIgIyMjdGhlIGRlc2lyZWQgcHJvamVjdGlvbiBmb3IgdHJhY2sgcG9pbnRzCgojIyMgY29udmVydCBkYXRhIHRvIGEgc3BhdGlhbCBvYmplY3QgYW5kIHJlcHJvamVjdCB0byBkZXNpcmVkIGNvb3JkaW5hdGUgc3lzdGVtCmNvb3JkaW5hdGVzKG5vZnVfZGF0X2ZpeGVkKSA9IH5sb25nK2xhdCAjIyMgZGVmaW5lIHRoZSB4IGFuZCB5IHNwYXRpYWwgZmllbGRzCnByb2o0c3RyaW5nKG5vZnVfZGF0X2ZpeGVkKSA8LSBDUlMoaW5wdXRfcHJvaikgIyMjIGRlZmluZSB0aGUgcHJvamVjdGlvbgpub2Z1X2RhdDIgPC0gc3BUcmFuc2Zvcm0obm9mdV9kYXRfZml4ZWQsIENSUyhkZXNpcmVkX3Byb2opKSAjIyN0cmFuc2Zvcm0gdG8gZGVzaXJlZCBwcm9qZWN0aW9uCgojIGFub3RoZXIgcXVpY2sgcGxvdApwbG90KG5vZnVfZGF0MiwgcGNoID0gMTksIGNleCA9IDAuNSkKYGBgCgpgYGB7ciBub2Z1LWRmLWZvci1maWx0ZXJpbmd9CiMgSSBuZWVkIHRoaXMgaW4gZGYgZm9ybSBhZ2FpbiAtIG5vdCBzcGF0aWFsIGRmCk5PRlVfZGYyIDwtIG5ld19zcGF0aWFsX2RmICU+JQogICNtdXRhdGUobG9uZyA9IGlmZWxzZShGaXNoZXJpZXNMb25nREQgPiAxNTAsIC1GaXNoZXJpZXNMb25nREQsIEZpc2hlcmllc0xvbmdERCkpICU+JQogIG11dGF0ZShsYXQgPSBGaXNoZXJpZXNMYXRERCkgJT4lCiAgbXV0YXRlKGxvbmcgPSBGaXNoZXJpZXNMb25nREQpCgpgYGAKCkFkZCBiYXRoeW1ldHJpYyBtYXAKYGBge3J9CiMgYW50aW1lcmlkaWFuIHJlZ2lvbiAKYWxldSA8LSBnZXROT0FBLmJhdGh5KDE3NSwgLTE0NSwgNTAsIDY1LCByZXNvbHV0aW9uID0gNCwKYW50aW1lcmlkaWFuID0gVFJVRSkKCiMgTWFrZSBpdCBhIHJhc3RlcgpiYXRoeSA8LSBhcy5yYXN0ZXIoYWxldSkKCiMgQ3JlYXRlIGEgeHl6IHRhYmxlIGZvciBnZ3Bsb3QKYmF0aDwtZm9ydGlmeShhbGV1KQoKYGBgCgpgYGB7cn0Kc3RyKGJhdGh5KQpgYGAKClRoZSBwcm9qZWN0aW9uIGZvciB0aGUgYmF0aHkgcmFzdGVyIGFwcGVhcnMgdG8gYmU6CiIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCArZWxscHM9V0dTODQgK3Rvd2dzODQ9MCwwLDAiCgojIyMga2VybmVsaW5nCkkgbmVlZCB0aGUgYmxhbmsgZ3JpZCBhbmQgdGhlIG5vZnUgZGYgaW4gdGhlIHNhbWUgcHJvamVjdGlvbgoKCioqIE5lZWQgbmV3IGJsYW5rIGdyaWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgcHJvamVjdGlvbjoKYGBge3IgYnVpbGQtYmxhbmstZ3JpZC0yfQojIG5ldyBkZXNpcmVkIHByb2plY3Rpb24KbmV3X3Byb2ogPC0gIitwcm9qPWFlYSArbGF0XzE9NTUgK2xhdF8yPTY1ICtsYXRfMD01MCArbG9uXzA9LTE1NCIKCiMjIyBjb252ZXJ0IGRhdGEgdG8gYSBzcGF0aWFsIG9iamVjdCBhbmQgcmVwcm9qZWN0IHRvIGRlc2lyZWQgY29vcmRpbmF0ZSBzeXN0ZW0KI2Nvb3JkaW5hdGVzKG5vZnVfZGF0X2ZpeGVkKSA9IH5sb25nK2xhdCAjIyMgZGVmaW5lIHRoZSB4IGFuZCB5IHNwYXRpYWwgZmllbGRzCiNwcm9qNHN0cmluZyhub2Z1X2RhdF9maXhlZCkgPC0gQ1JTKGlucHV0X3Byb2opICMjIyBkZWZpbmUgdGhlIHByb2plY3Rpb24KCm5vZnVfZGF0MyA8LSBzcFRyYW5zZm9ybShub2Z1X2RhdF9maXhlZCwgQ1JTKG5ld19wcm9qKSkgIyMjdHJhbnNmb3JtIHRvIGRlc2lyZWQgcHJvamVjdGlvbgoKCiMjIyBidWlsZCBhIGdyaWQgdG8gdXNlIGZvciB0aGUgS1VEcwpleHQ8LTEuMypleHRlbnQobm9mdV9kYXQzKSAjZGVmaW5lIHRoZSBzcGF0aWFsIGV4dGVudCBhcyAxLjNYIHRoZSBleHRlbnQgb2YgeW91ciBkYXRhCmdyaWRfYmxhbmsyIDwtIHJhc3RlcihleHQ9ZXh0LCBjcnM9bmV3X3Byb2osIHJlc29sdXRpb249MzAwMCkgI21ha2UgYSBncmlkIHVzaW5nIHRoZSBleHRlbnQsIGRlZmluZSB0aGUgcHJvamVjdGlvbiwgYW5kIHNldCB0aGUgY2VsbCBzaXplIChyZXNvbHV0aW9uKQp2YWxzIDwtIDE6bmNlbGwoZ3JpZF9ibGFuazIpICNnaXZlIHRoZSBncmlkIGR1bW15IHZhbHVlcwpncmlkX2JsYW5rMiA8LSBzZXRWYWx1ZXMoZ3JpZF9ibGFuazIsIHZhbHMpICNnaXZlIHRoZSBncmlkIGR1bW15IHZhbHVlcwpncmlkX2JsYW5rMiA8LSBhcyhncmlkX2JsYW5rMiwgIlNwYXRpYWxQaXhlbHNEYXRhRnJhbWUiKSAjY29udmVydCBncmlkIHRvIFNwYXRpYWwgUGl4ZWxzIERhdGEgRnJhbWUgKHdoYXQga2VybmVsVUQgbmVlZHMpCmBgYAoKCiMjIyBiYXRoeW1ldHJ5Cgp0aGlzIG1hcHBpbmcgZnJvbTogaHR0cHM6Ly9oYW5zZW5qb2huc29uLm9yZy9wb3N0L2JhdGh5bWV0cmljLW1hcHMtaW4tci8KYGBge3J9CmxpYnJhcnkob2NlKQpsaWJyYXJ5KG9jZWRhdGEpCmRhdGEoImNvYXN0bGluZVdvcmxkRmluZSIpCgojIGNvbnZlcnQgYmF0aHltZXRyeQpiYXRoeUxvbiA9IGFzLm51bWVyaWMocm93bmFtZXMoYWxldSkpCmJhdGh5TGF0ID0gYXMubnVtZXJpYyhjb2xuYW1lcyhhbGV1KSkKYmF0aHlaID0gYXMubnVtZXJpYyhhbGV1KQpkaW0oYmF0aHlaKSA9IGRpbShhbGV1KQoKCiMgZGVmaW5lIHBsb3R0aW5nIHJlZ2lvbgptbG9uID0gbWVhbihOT0ZVX2RmMiRsb25nKQptbGF0ID0gbWVhbihOT0ZVX2RmMiRsYXQpCnNwYW4gPSAyMDAwCmBgYAoKCiMjIyMgU3Vic2V0IHRoZSBkYXRhZnJhbWUgZm9yIGVhY2ggY29tcGFyaXNvbgoKCmBgYHtyIHN1YnNldC10aGUtZGZ9CmNvbF9jb21wYXJpc29uc19rZXJuZWwgPC0gZnVuY3Rpb24oY29sb255X3BoZW5vbG9neTEsIGNvbG9ueV9waGVub2xvZ3kyKXsKICAKICAgICAgbWFwX2RhdDEgPC0gTk9GVV9kZjIgJT4lCiAgICAgIGZpbHRlcihDb2xvbnlQaGVub2xvZ3kgJWluJSBjKGNvbG9ueV9waGVub2xvZ3kxLCBjb2xvbnlfcGhlbm9sb2d5MikpCiAgICAKICAgICMgTWFrZSBhIFNQREYKICAgIHNwZGYgPC0gU3BhdGlhbFBvaW50c0RhdGFGcmFtZShjb29yZHM9Y2JpbmQobWFwX2RhdDEkbG9uZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2RhdDEkbGF0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRhdGEuZnJhbWUoaWQ9bWFwX2RhdDEkQ29sb255UGhlbm9sb2d5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qNHN0cmluZyA9IENSUygiK3Byb2o9bG9uZ2xhdCArZWxscHM9V0dTODQgK2RhdHVtPVdHUzg0ICtub19kZWZzIikpCiAgICAKICAgICMgY29udmVydCBteSBVRHMgaW50byB0aGUgcmlnaHQgcHJvamVjdGlvbiB0byBtYXRjaCB1cCB3aXRoIHRoZSBiYXRoeW1hcAogICAgIyBQcm9qZWN0IGRhdGEgaW50byBsYWVhCiAgICAgIHNwZGYudCA8LSBzcFRyYW5zZm9ybShzcGRmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUlMoIitwcm9qPWFlYSArbGF0XzE9NTUgK2xhdF8yPTY1ICtsYXRfMD01MCArbG9uXzA9LTE1NCIpKQogICAgCiAgICAjIGNhbGN1bGF0ZSBrZXJuZWxVRAogICAgdWQgPC0ga2VybmVsVUQoc3BkZi50LCBoID0gMzAwMDAsIGdyaWQ9Z3JpZF9ibGFuazIpCiAgICB0bXBfdWQgPC0gZ2V0dmVydGljZXNocih1ZCwgcGVyY2VudD01MCwgc3RhbmRhcmRpemU9VCkKICAgIAogICAgIyB0cmFuc2Zvcm0gdG8gdGhlIHNhbWUgcHJvamVjdGlvbiBhcyB0aGUgYmF0aHltZXRyeQogICAgdG1wX3VkMiA8LSBzcFRyYW5zZm9ybSh0bXBfdWQsIENSUyA9ICIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCArZWxscHM9V0dTODQgK3Rvd2dzODQ9MCwwLDAiKQogICAgCiAgICAjIGZvcnRpZnkgZm9yIGdncGxvdHRpbmcKICAgIHVkc19kZiA8LSBmb3J0aWZ5KHRtcF91ZDIpICU+JQogICAgICBtdXRhdGUobG9uID0gaWZlbHNlKGxvbmcgPCAwLCAtbG9uZywgbG9uZykpCiAgICAKICAgICMgY29sb3JzIGFuZCBmb3JtYXR0aW5nCiAgICBjb2wxIDwtdWRzX2RmICU+JQogICAgICBmaWx0ZXIoaWQgPT0gY29sb255X3BoZW5vbG9neTEpCiAgICAKICAgIGNvbDIgPC0gdWRzX2RmICU+JQogICAgICBmaWx0ZXIoaWQgPT0gY29sb255X3BoZW5vbG9neTIpCiAgICAKICAgIHJldHVybihsaXN0CiAgICAgICAgICAgKGNvbDEsCiAgICAgICAgICAgIGNvbDIpKQogCn0KYGBgCgoKIyMjIyBDaGFndWxhayBhbmQgU3QuIE1hdHRoZXcgY29tcGFyaXNvbgoKQXBwbHkgdGhhdCBmdW5jdGlvbiB0byBDaGFndWxhayBhbmQgU3RNYXR0aGV3LCBicmVlZGluZyBzZWFzb246CmBgYHtyIGNvbXBhcmlzb24xfQpjb2xvbnlfcGhlbm9sb2d5MSA8LSAiQ2hhZ3VsYWtfYnJlZWRpbmciCmNvbG9ueV9waGVub2xvZ3kyIDwtICJTdE1hdHRoZXdfYnJlZWRpbmciCgpjb21wMSA8LSBjb2xfY29tcGFyaXNvbnNfa2VybmVsKGNvbG9ueV9waGVub2xvZ3kxLCBjb2xvbnlfcGhlbm9sb2d5MikKYGBgCgoKYGBge3IgcGxvdC1kZXRhaWxzfQojIGFuZCBqdXN0IHRoZSBsb2NhdGlvbnMgZm9yIHN0IG1hdHQgYW5kIGNoYWd1bGFrCiAgICBtYXR0X2NoYWdfbG9jcyA8LSBjb2xvbnlfbG9jcyAlPiUKICAgICAgZmlsdGVyKENvbG9ueSAlaW4lIGMoIkNoYWd1bGFrIiwgIlN0TWF0dGhldyIpKQogICAgCiAgICBtYXR0X2NoYWdfbG9jcyRDb2xvbnkgPC0gYXMuZmFjdG9yKG1hdHRfY2hhZ19sb2NzJENvbG9ueSkKICAgIGNvbG9ycyA8LSBjKCJwdXJwbGUiLCAiZG9kZ2VyYmx1ZSIpW21hdHRfY2hhZ19sb2NzJENvbG9ueV0KCmBgYAoKYGBge3Igc2VsZWN0LXRoZS1vdXRwdXQtZm9yLW1hcHBpbmd9CmNoYWcgPC0gY29tcDFbWzFdXQpzdG1hdHQgPC0gY29tcDFbWzJdXQoKYGBgCgpQbG90IGl0IHVwCmBgYHtyIHBsb3QtY2hhZ3VsYWstc3RtYXR0LWJyZWVkaW5nfQojIHNldCB1cCB0aGUgb3V0cHV0CnBkZigicGRmX291dHB1dHMvY2hhZ3VsYWtfYnJlZWRpbmcucGRmIiwgd2lkdGggPSA1LjUsIGhlaWdodCA9IDQuNSkKcGxvdChjb2FzdGxpbmVXb3JsZEZpbmUsIGNsb24gPSAtMTY4LCBjbGF0ID0gNTYuOCwgc3BhbiA9IDgyNSwgCiAgICAgcHJvamVjdGlvbj0iK3Byb2o9YWVhICtsYXRfMT01NSArbGF0XzI9NjUgK2xhdF8wPTUwICtsb25fMD0tMTU0IiwgY29sID0gJ2xpZ2h0Z3JleScpCgojIHBsb3QgYmF0aHltZXRyeQptYXBDb250b3VyKGJhdGh5TG9uLCBiYXRoeUxhdCwgYmF0aHlaLAogICAgICAgICAgIGxldmVscyA9IGMoLTUwMCwgLTEwMDAsIC0yNTAwKSwKICAgICAgICAgICBsd2QgPSBjKDEuNSwgMSwgMSksCiAgICAgICAgICAgbHR5ID0gYygzLCAxLCAzKSwKICAgICAgICAgICBjb2wgPSAnZGFya2dyYXknKQoKIyBhZGQgZGVwdGggbGVnZW5kCmxlZ2VuZCgiYm90dG9tbGVmdCIsIHNlZy5sZW4gPSAzLCBjZXggPSAwLjcsCiAgICAgICAgbHdkID0gYygxLjUsIDEsIDEpLAogICAgICAgIGx0eSA9IGMoMywgMSwgMyksCiAgICAgICAgbGVnZW5kID0gYygiLTUwMCIsICItMTAwMCIsICItMjUwMCIpLAogICAgICAgIGJveC5jb2wgPSAid2hpdGUiLCBjb2wgPSAnZGFya2dyYXknLCB0aXRsZSA9ICJEZXB0aCAobSkiLCBiZyA9ICJ3aGl0ZSIpCgojIGFkZCBtYXAgZGF0YQojbWFwUG9seWdvbihsb25naXR1ZGUgPSBzdG1hdHQkbG9uZywgbGF0aXR1ZGUgPSBzdG1hdHQkbGF0LCBsdHkgPSAwLCBjb2wgPSBhbHBoYSgiZG9kZ2VyYmx1ZSIsIDAuMikpCm1hcFBvbHlnb24obG9uZ2l0dWRlID0gY2hhZyRsb25nLCBsYXRpdHVkZSA9IGNoYWckbGF0LCBsdHkgPSAwLCBjb2wgPSBhbHBoYSgicHVycGxlIiwgMC4yKSkKCiMgYWRkIGNvbG9ueSBsZWdlbmQKIyBsZWdlbmQoImJvdHRvbSIsIHNlZy5sZW4gPSAzLCBjZXggPSAwLjcsCiMgICAgICAgIGxlZ2VuZCA9IGMoImxpZ2h0Ymx1ZSIsICJsaWdodGdyZWVuIiksCiMgICAgICAgIGJveC5jb2wgPSAid2hpdGUiLCBjb2wgPSAnZGFya2dyYXknLCB0aXRsZSA9ICJCcmVlZGluZyBjb2xvbnkiLCBiZyA9ICJ3aGl0ZSIpCgojIGFkZCBjb2xvbnkgbG9jYXRpb25zCm1hcFBvaW50cyhsb25naXR1ZGUgPSBtYXR0X2NoYWdfbG9jcyRsb24sIGxhdGl0dWRlID0gbWF0dF9jaGFnX2xvY3MkbGF0LCBwY2ggPSAyMywgY29sID0gY29sb3JzLCBjZXggPSAxLjIsIGx3ZCA9IDIpCmRldi5vZmYoKQpgYGAKCgoKQXBwbHkgdGhhdCBmdW5jdGlvbiB0byBDaGFndWxhayBhbmQgU3RNYXR0aGV3LCBub25icmVlZGluZyBzZWFzb246CmBgYHtyfQpjb2xvbnlfcGhlbm9sb2d5MSA8LSAiQ2hhZ3VsYWtfbm9uYnJlZWRpbmciCmNvbG9ueV9waGVub2xvZ3kyIDwtICJTdE1hdHRoZXdfbm9uYnJlZWRpbmciCgpjb21wMiA8LSBjb2xfY29tcGFyaXNvbnNfa2VybmVsKGNvbG9ueV9waGVub2xvZ3kxLCBjb2xvbnlfcGhlbm9sb2d5MikKYGBgCgoKYGBge3Igb3V0cHV0LWZvci1tYXBwaW5nfQpub2IuY2hhZyA8LSBjb21wMltbMV1dCm5vYi5zdG1hdHQgPC0gY29tcDJbWzJdXQoKYGBgCgpgYGB7ciBwbG90LWNoYWd1bGFrLXN0bWF0dC1ub25icmVlZGluZ30KIyBzZXQgdXAgdGhlIG91dHB1dAojcGxvdChjb2FzdGxpbmVXb3JsZEZpbmUsIGNsb24gPSAtMTY4LCBjbGF0ID0gbWxhdCwgc3BhbiA9IDExMDAsIAojcGRmKCJwZGZfb3V0cHV0cy9zdG1hdHRfbm9uYnJlZWRpbmcucGRmIiwgd2lkdGggPSA1LjUsIGhlaWdodCA9IDQuNSkKcGRmKCJwZGZfb3V0cHV0cy9jaGFndWxha19ub25icmVlZGluZy5wZGYiLCB3aWR0aCA9IDUuNSwgaGVpZ2h0ID0gNC41KQoKcGxvdChjb2FzdGxpbmVXb3JsZEZpbmUsIGNsb24gPSAtMTY4LCBjbGF0ID0gNTYuOCwgc3BhbiA9IDgyNSwgCiAgICAgcHJvamVjdGlvbj0iK3Byb2o9YWVhICtsYXRfMT01NSArbGF0XzI9NjUgK2xhdF8wPTUwICtsb25fMD0tMTU0IiwgY29sID0gJ2xpZ2h0Z3JleScpCgojIHBsb3QgYmF0aHltZXRyeQptYXBDb250b3VyKGJhdGh5TG9uLCBiYXRoeUxhdCwgYmF0aHlaLAogICAgICAgICAgIGxldmVscyA9IGMoLTUwMCwgLTEwMDAsIC0yNTAwKSwKICAgICAgICAgICBsd2QgPSBjKDEuNSwgMSwgMSksCiAgICAgICAgICAgbHR5ID0gYygzLCAxLCAzKSwKICAgICAgICAgICBjb2wgPSAnZGFya2dyYXknKQoKIyBhZGQgZGVwdGggbGVnZW5kCmxlZ2VuZCgiYm90dG9tbGVmdCIsIHNlZy5sZW4gPSAzLCBjZXggPSAwLjcsCiAgICAgICAgbHdkID0gYygxLjUsIDEsIDEpLAogICAgICAgIGx0eSA9IGMoMywgMSwgMyksCiAgICAgICAgbGVnZW5kID0gYygiLTUwMCIsICItMTAwMCIsICItMjUwMCIpLAogICAgICAgIGJveC5jb2wgPSAid2hpdGUiLCBjb2wgPSAnZGFya2dyYXknLCB0aXRsZSA9ICJEZXB0aCAobSkiLCBiZyA9ICJ3aGl0ZSIpCgojIGFkZCBtYXAgZGF0YQojbWFwUG9seWdvbihsb25naXR1ZGUgPSBub2Iuc3RtYXR0JGxvbmcsIGxhdGl0dWRlID0gbm9iLnN0bWF0dCRsYXQsIGNvbCA9IGFscGhhKCJkb2RnZXJibHVlIiwgMC4yKSwgbHR5ID0gMCkKbWFwUG9seWdvbihsb25naXR1ZGUgPSBub2IuY2hhZyRsb25nLCBsYXRpdHVkZSA9IG5vYi5jaGFnJGxhdCwgbHR5ID0gMCwgY29sID0gYWxwaGEoInB1cnBsZSIsIDAuMikpCgojIGFkZCBjb2xvbnkgbG9jYXRpb25zCm1hcFBvaW50cyhsb25naXR1ZGUgPSBtYXR0X2NoYWdfbG9jcyRsb24sIGxhdGl0dWRlID0gbWF0dF9jaGFnX2xvY3MkbGF0LCBwY2ggPSAyMywgY29sID0gY29sb3JzLCBjZXggPSAxLjIsIGx3ZCA9IDIpCmRldi5vZmYoKQpgYGAKCgoKIyMjIyBQcmliaWxvZnMgYW5kIFNlbWlkaSBjb21wYXJpc29uCgpBcHBseSB0aGF0IGZ1bmN0aW9uIHRvIFByaWJpbG9mcyBhbmQgU2VtaWRpcywgYnJlZWRpbmcgc2Vhc29uOgpgYGB7ciBjb21wYXJpc29uLXByaWItc2VtaWRpfQpjb2xvbnlfcGhlbm9sb2d5MSA8LSAiU2VtaWRpX2JyZWVkaW5nIgpjb2xvbnlfcGhlbm9sb2d5MiA8LSAiUHJpYmlsb2ZfYnJlZWRpbmciCgpjb21wMSA8LSBjb2xfY29tcGFyaXNvbnNfa2VybmVsKGNvbG9ueV9waGVub2xvZ3kxLCBjb2xvbnlfcGhlbm9sb2d5MikKCiMgYW5kIGp1c3QgdGhlIGxvY2F0aW9ucyBmb3IgcHJpYnMgYW5kIHNlbWlkaXMKc2VtaWRpX3ByaWJfbG9jcyA8LSBjb2xvbnlfbG9jcyAlPiUKICAgIGZpbHRlcihDb2xvbnkgJWluJSBjKCJQcmliaWxvZiIsICJTZW1pZGkiKSkKICAgIApzZW1pZGlfcHJpYl9sb2NzJENvbG9ueSA8LSBhcy5mYWN0b3Ioc2VtaWRpX3ByaWJfbG9jcyRDb2xvbnkpCiAgICBjb2xvcnMyIDwtIGMoInJlZCIsICJkYXJrb3JhbmdlIilbc2VtaWRpX3ByaWJfbG9jcyRDb2xvbnldCgojIHNlbGVjdC10aGUtb3V0cHV0LWZvci1tYXBwaW5nCnNlbWlkaS5iIDwtIGNvbXAxW1sxXV0KcHJpYi5iIDwtIGNvbXAxW1syXV0KCmBgYAoKUGxvdCBpdCB1cApgYGB7ciBwbG90LXNlbWlkaS1wcmliLWJyZWVkaW5nfQojIHNldCB1cCB0aGUgb3V0cHV0CiNwZGYoInBkZl9vdXRwdXRzL3ByaWJfc2VtaWRpX2JyZWVkaW5nX21hcC5wZGYiLCB3aWR0aCA9IDYuNSwgaGVpZ2h0ID0gNS41KQojcGxvdChjb2FzdGxpbmVXb3JsZEZpbmUsIGNsb24gPSAtMTY4LCBjbGF0ID0gbWxhdCwgc3BhbiA9IDExMDAsIApwZGYoInBkZl9vdXRwdXRzL3NlbWlkaV9icmVlZGluZy5wZGYiLCB3aWR0aCA9IDUuNSwgaGVpZ2h0ID0gNC41KQojcGRmKCJwZGZfb3V0cHV0cy9wcmliX2JyZWVkaW5nLnBkZiIsIHdpZHRoID0gNS41LCBoZWlnaHQgPSA0LjUpCgpwbG90KGNvYXN0bGluZVdvcmxkRmluZSwgY2xvbiA9IC0xNjgsIGNsYXQgPSA1Ni44LCBzcGFuID0gODI1LCAKICAgICBwcm9qZWN0aW9uPSIrcHJvaj1hZWEgK2xhdF8xPTU1ICtsYXRfMj02NSArbGF0XzA9NTAgK2xvbl8wPS0xNTQiLCBjb2wgPSAnbGlnaHRncmV5JykKCiMgcGxvdCBiYXRoeW1ldHJ5Cm1hcENvbnRvdXIoYmF0aHlMb24sIGJhdGh5TGF0LCBiYXRoeVosCiAgICAgICAgICAgbGV2ZWxzID0gYygtNTAwLCAtMTAwMCwgLTI1MDApLAogICAgICAgICAgIGx3ZCA9IGMoMS41LCAxLCAxKSwKICAgICAgICAgICBsdHkgPSBjKDMsIDEsIDMpLAogICAgICAgICAgIGNvbCA9ICdkYXJrZ3JheScpCgojIGFkZCBkZXB0aCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0Iiwgc2VnLmxlbiA9IDMsIGNleCA9IDAuNywKICAgICAgICBsd2QgPSBjKDEuNSwgMSwgMSksCiAgICAgICAgbHR5ID0gYygzLCAxLCAzKSwKICAgICAgICBsZWdlbmQgPSBjKCItNTAwIiwgIi0xMDAwIiwgIi0yNTAwIiksCiAgICAgICAgYm94LmNvbCA9ICJ3aGl0ZSIsIGNvbCA9ICdkYXJrZ3JheScsIHRpdGxlID0gIkRlcHRoIChtKSIsIGJnID0gIndoaXRlIikKCiMgYWRkIG1hcCBkYXRhCm1hcFBvbHlnb24obG9uZ2l0dWRlID0gc2VtaWRpLmIkbG9uZywgbGF0aXR1ZGUgPSBzZW1pZGkuYiRsYXQsIGx0eSA9IDAsIGNvbCA9IGFscGhhKCJkYXJrb3JhbmdlIiwgMC4yKSkKI21hcFBvbHlnb24obG9uZ2l0dWRlID0gcHJpYi5iJGxvbmcsIGxhdGl0dWRlID0gcHJpYi5iJGxhdCwgbHR5ID0gMCwgY29sID0gYWxwaGEoInJlZCIsIDAuMikpCgojIGFkZCBjb2xvbnkgbGVnZW5kCiMgbGVnZW5kKCJib3R0b20iLCBzZWcubGVuID0gMywgY2V4ID0gMC43LAojICAgICAgICBsZWdlbmQgPSBjKCJsaWdodGJsdWUiLCAibGlnaHRncmVlbiIpLAojICAgICAgICBib3guY29sID0gIndoaXRlIiwgY29sID0gJ2RhcmtncmF5JywgdGl0bGUgPSAiQnJlZWRpbmcgY29sb255IiwgYmcgPSAid2hpdGUiKQoKIyBhZGQgY29sb255IGxvY2F0aW9ucwptYXBQb2ludHMobG9uZ2l0dWRlID0gc2VtaWRpX3ByaWJfbG9jcyRsb24sIGxhdGl0dWRlID0gc2VtaWRpX3ByaWJfbG9jcyRsYXQsIHBjaCA9IDIzLCBjb2wgPSBjb2xvcnMyLCBjZXggPSAxLjIsIGx3ZCA9IDIpCmRldi5vZmYoKQpgYGAKCgpOb25icmVlZGluZyBzZWFzb246IFByaWJzIGFuZCBTZW1pZGlzCgpgYGB7ciBjb21wYXJpc29uLXByaWItc2VtaWRpLW5vbmJyZWVkaW5nfQpjb2xvbnlfcGhlbm9sb2d5MSA8LSAiU2VtaWRpX25vbmJyZWVkaW5nIgpjb2xvbnlfcGhlbm9sb2d5MiA8LSAiUHJpYmlsb2Zfbm9uYnJlZWRpbmciCgpjb21wMSA8LSBjb2xfY29tcGFyaXNvbnNfa2VybmVsKGNvbG9ueV9waGVub2xvZ3kxLCBjb2xvbnlfcGhlbm9sb2d5MikKCiMgc2VsZWN0LXRoZS1vdXRwdXQtZm9yLW1hcHBpbmcKc2VtaWRpLm5vYiA8LSBjb21wMVtbMV1dCnByaWIubm9iIDwtIGNvbXAxW1syXV0KCmBgYAoKUGxvdCBpdCB1cApgYGB7ciBwbG90LXNlbWlkaS1wcmliLW5vbmJyZWVkaW5nfQojIHNldCB1cCB0aGUgb3V0cHV0CiNwZGYoInBkZl9vdXRwdXRzL3ByaWJfc2VtaWRpX25vbmJyZWVkaW5nX21hcC5wZGYiLCB3aWR0aCA9IDYuNSwgaGVpZ2h0ID0gNS41KQpwZGYoInBkZl9vdXRwdXRzL3ByaWJfbm9uYnJlZWRpbmcucGRmIiwgd2lkdGggPSA1LjUsIGhlaWdodCA9IDQuNSkKcGxvdChjb2FzdGxpbmVXb3JsZEZpbmUsIGNsb24gPSAtMTY4LCBjbGF0ID0gNTYuOCwgc3BhbiA9IDgyNSwgCiNwbG90KGNvYXN0bGluZVdvcmxkRmluZSwgY2xvbiA9IC0xNjgsIGNsYXQgPSBtbGF0LCBzcGFuID0gMTEwMCwgCiAgICAgcHJvamVjdGlvbj0iK3Byb2o9YWVhICtsYXRfMT01NSArbGF0XzI9NjUgK2xhdF8wPTUwICtsb25fMD0tMTU0IiwgY29sID0gJ2xpZ2h0Z3JleScpCgojIHBsb3QgYmF0aHltZXRyeQptYXBDb250b3VyKGJhdGh5TG9uLCBiYXRoeUxhdCwgYmF0aHlaLAogICAgICAgICAgIGxldmVscyA9IGMoLTUwMCwgLTEwMDAsIC0yNTAwKSwKICAgICAgICAgICBsd2QgPSBjKDEuNSwgMSwgMSksCiAgICAgICAgICAgbHR5ID0gYygzLCAxLCAzKSwKICAgICAgICAgICBjb2wgPSAnZGFya2dyYXknKQoKIyBhZGQgZGVwdGggbGVnZW5kCmxlZ2VuZCgiYm90dG9tbGVmdCIsIHNlZy5sZW4gPSAzLCBjZXggPSAwLjcsCiAgICAgICAgbHdkID0gYygxLjUsIDEsIDEpLAogICAgICAgIGx0eSA9IGMoMywgMSwgMyksCiAgICAgICAgbGVnZW5kID0gYygiLTUwMCIsICItMTAwMCIsICItMjUwMCIpLAogICAgICAgIGJveC5jb2wgPSAid2hpdGUiLCBjb2wgPSAnZGFya2dyYXknLCB0aXRsZSA9ICJEZXB0aCAobSkiLCBiZyA9ICJ3aGl0ZSIpCgojIGFkZCBtYXAgZGF0YQojbWFwUG9seWdvbihsb25naXR1ZGUgPSBzZW1pZGkubm9iJGxvbmcsIGxhdGl0dWRlID0gc2VtaWRpLm5vYiRsYXQsIGx0eSA9IDAsIGNvbCA9IGFscGhhKCJkYXJrb3JhbmdlIiwgMC4yKSkKbWFwUG9seWdvbihsb25naXR1ZGUgPSBwcmliLm5vYiRsb25nLCBsYXRpdHVkZSA9IHByaWIubm9iJGxhdCwgbHR5ID0gMCwgY29sID0gYWxwaGEoInJlZCIsIDAuMikpCgojIGFkZCBjb2xvbnkgbGVnZW5kCiMgbGVnZW5kKCJib3R0b20iLCBzZWcubGVuID0gMywgY2V4ID0gMC43LAojICAgICAgICBsZWdlbmQgPSBjKCJsaWdodGJsdWUiLCAibGlnaHRncmVlbiIpLAojICAgICAgICBib3guY29sID0gIndoaXRlIiwgY29sID0gJ2RhcmtncmF5JywgdGl0bGUgPSAiQnJlZWRpbmcgY29sb255IiwgYmcgPSAid2hpdGUiKQoKIyBhZGQgY29sb255IGxvY2F0aW9ucwptYXBQb2ludHMobG9uZ2l0dWRlID0gc2VtaWRpX3ByaWJfbG9jcyRsb24sIGxhdGl0dWRlID0gc2VtaWRpX3ByaWJfbG9jcyRsYXQsIHBjaCA9IDIzLCBjb2wgPSBjb2xvcnMyLCBjZXggPSAxLjIsIGx3ZCA9IDIpCmRldi5vZmYoKQpgYGAKCgoKCgoKCgojIyMjIFN0LiBNYXR0aGV3IGFuZCBQcmlicyBjb21wYXJpc29uCgpOZXh0IHNldCBvZiBjb21wYXJpc29uczogU3QuIE1hdHRoZXcgYW5kIHRoZSBQcmliaWxvZiBJc2xhbmRzCgpgYGB7ciBjb21wYXJpc29uM30KY29sb255X3BoZW5vbG9neTEgPC0gIlByaWJpbG9mX2JyZWVkaW5nIgpjb2xvbnlfcGhlbm9sb2d5MiA8LSAiU3RNYXR0aGV3X2JyZWVkaW5nIgoKY29tcDMgPC0gY29sX2NvbXBhcmlzb25zX2tlcm5lbChjb2xvbnlfcGhlbm9sb2d5MSwgY29sb255X3BoZW5vbG9neTIpCmBgYAoKCmBgYHtyIHBsb3QtZGV0YWlsczJ9CiMgY29sb3JzIGFuZCBmb3JtYXR0aW5nCnByaWIuYiA8LSBjb21wM1tbMV1dCm1hdHQuYiA8LSBjb21wM1tbMl1dCgojIHNlbGVjdCB0aG9zZSBjb2xvbmllcwojIGtlZXAgdGhlIGNvbG9yIGNvbnNpc3RlbnQgZm9yIFN0IE1hdHQncwojIGFuZCBqdXN0IHRoZSBsb2NhdGlvbnMgZm9yIHN0IG1hdHQgYW5kIGNoYWd1bGFrCnAubV9sb2NzIDwtIGNvbG9ueV9sb2NzICU+JQogIGZpbHRlcihDb2xvbnkgJWluJSBjKCJQcmliaWxvZiIsICJTdE1hdHRoZXciKSkKCnAubV9sb2NzJENvbG9ueSA8LSBhcy5mYWN0b3IocC5tX2xvY3MkQ29sb255KQpjb2xvcnMgPC0gYygicmVkIiwgImRvZGdlcmJsdWUiKVtwLm1fbG9jcyRDb2xvbnldCgpgYGAKClBsb3QgaXQgdXAKYGBge3IgcGxvdC1wcmliLXN0bWF0dC1icmVlZGluZ30KIyBzZXQgdXAgdGhlIG91dHB1dAojcGxvdChjb2FzdGxpbmVXb3JsZEZpbmUsIGNsb24gPSAtMTY4LCBjbGF0ID0gbWxhdCwgc3BhbiA9IDExMDAsIApwZGYoInBkZl9vdXRwdXRzL3ByaWJfYnJlZWRpbmcucGRmIiwgd2lkdGggPSA1LjUsIGhlaWdodCA9IDQuNSkKcGxvdChjb2FzdGxpbmVXb3JsZEZpbmUsIGNsb24gPSAtMTY4LCBjbGF0ID0gNTYuOCwgc3BhbiA9IDgyNSwgCiAgICAgcHJvamVjdGlvbj0iK3Byb2o9YWVhICtsYXRfMT01NSArbGF0XzI9NjUgK2xhdF8wPTUwICtsb25fMD0tMTU0IiwgY29sID0gJ2xpZ2h0Z3JleScpCgojIHBsb3QgYmF0aHltZXRyeQptYXBDb250b3VyKGJhdGh5TG9uLCBiYXRoeUxhdCwgYmF0aHlaLAogICAgICAgICAgICBsZXZlbHMgPSBjKC01MDAsIC0xMDAwLCAtMjUwMCksCiAgICAgICAgICAgIGx3ZCA9IGMoMS41LCAxLCAxKSwKICAgICAgICAgICAgbHR5ID0gYygzLCAxLCAzKSwKICAgICAgICAgICAgY29sID0gJ2RhcmtncmF5JykKCiMgYWRkIGRlcHRoIGxlZ2VuZApsZWdlbmQoImJvdHRvbWxlZnQiLCBzZWcubGVuID0gMywgY2V4ID0gMC43LAogICAgICAgIGx3ZCA9IGMoMS41LCAxLCAxKSwKICAgICAgICBsdHkgPSBjKDMsIDEsIDMpLAogICAgICAgIGxlZ2VuZCA9IGMoIi01MDAiLCAiLTEwMDAiLCAiLTI1MDAiKSwKICAgICAgICBib3guY29sID0gIndoaXRlIiwgY29sID0gJ2RhcmtncmF5JywgdGl0bGUgPSAiRGVwdGggKG0pIiwgYmcgPSAid2hpdGUiKQoKIyBhZGQgbWFwIGRhdGEKbWFwUG9seWdvbihsb25naXR1ZGUgPSBwcmliLmIkbG9uZywgbGF0aXR1ZGUgPSBwcmliLmIkbGF0LCBjb2wgPSBhbHBoYSgicmVkIiwgMC4yKSwgbHR5ID0gMCkKI21hcFBvbHlnb24obG9uZ2l0dWRlID0gbWF0dC5iJGxvbmcsIGxhdGl0dWRlID0gbWF0dC5iJGxhdCwgbHR5ID0gMCwgY29sID0gYWxwaGEoImRvZGdlcmJsdWUiLCAwLjIpKQoKIyBhZGQgY29sb255IGxvY2F0aW9ucwptYXBQb2ludHMobG9uZ2l0dWRlID0gcC5tX2xvY3MkbG9uLCBsYXRpdHVkZSA9IHAubV9sb2NzJGxhdCwgcGNoID0gMjMsIGNvbCA9IGNvbG9ycywgY2V4ID0gMS4yLCBsd2QgPSAyKQpkZXYub2ZmKCkKYGBgCgoKCm5vbmJyZWVkaW5nOgpgYGB7ciBjb21wYXJpc29uNH0KY29sb255X3BoZW5vbG9neTEgPC0gIlByaWJpbG9mX25vbmJyZWVkaW5nIgpjb2xvbnlfcGhlbm9sb2d5MiA8LSAiU3RNYXR0aGV3X25vbmJyZWVkaW5nIgoKY29tcDQgPC0gY29sX2NvbXBhcmlzb25zX2tlcm5lbChjb2xvbnlfcGhlbm9sb2d5MSwgY29sb255X3BoZW5vbG9neTIpCgojIGNvbG9ycyBhbmQgZm9ybWF0dGluZwpwcmliLm5vYiA8LSBjb21wNFtbMV1dCm1hdHQubm9iIDwtIGNvbXA0W1syXV0KYGBgCgoKYGBge3IgcGxvdC1wcmliLXN0bWF0dC1ub25icmVlZGluZ30KcGxvdChjb2FzdGxpbmVXb3JsZEZpbmUsIGNsb24gPSAtMTY4LCBjbGF0ID0gbWxhdCwgc3BhbiA9IDExMDAsIAogICAgIHByb2plY3Rpb249Iitwcm9qPWFlYSArbGF0XzE9NTUgK2xhdF8yPTY1ICtsYXRfMD01MCArbG9uXzA9LTE1NCIsIGNvbCA9ICdsaWdodGdyZXknKQoKIyBwbG90IGJhdGh5bWV0cnkKbWFwQ29udG91cihiYXRoeUxvbiwgYmF0aHlMYXQsIGJhdGh5WiwKICAgICAgICAgICBsZXZlbHMgPSBjKC01MDAsIC0xMDAwLCAtMjUwMCksCiAgICAgICAgICAgbHdkID0gYygxLjUsIDEsIDEpLAogICAgICAgICAgIGx0eSA9IGMoMywgMSwgMyksCiAgICAgICAgICAgY29sID0gJ2RhcmtncmF5JykKCiMgYWRkIGRlcHRoIGxlZ2VuZApsZWdlbmQoImJvdHRvbWxlZnQiLCBzZWcubGVuID0gMywgY2V4ID0gMC43LAogICAgICAgbHdkID0gYygxLjUsIDEsIDEpLAogICAgICAgbHR5ID0gYygzLCAxLCAzKSwKICAgICAgIGxlZ2VuZCA9IGMoIi01MDAiLCAiLTEwMDAiLCAiLTI1MDAiKSwKICAgICAgIGJveC5jb2wgPSAid2hpdGUiLCBjb2wgPSAnZGFya2dyYXknLCB0aXRsZSA9ICJEZXB0aCAobSkiLCBiZyA9ICJ3aGl0ZSIpCgojIGFkZCBtYXAgZGF0YQptYXBQb2x5Z29uKGxvbmdpdHVkZSA9IHByaWIubm9iJGxvbmcsIGxhdGl0dWRlID0gcHJpYi5ub2IkbGF0LCBjb2wgPSBhbHBoYSgicmVkIiwgMC4yKSwgbHR5ID0gMCkKbWFwUG9seWdvbihsb25naXR1ZGUgPSBtYXR0Lm5vYiRsb25nLCBsYXRpdHVkZSA9IG1hdHQubm9iJGxhdCwgbHR5ID0gMCwgY29sID0gYWxwaGEoImRvZGdlcmJsdWUiLCAwLjIpKQoKIyBhZGQgY29sb255IGxvY2F0aW9ucwptYXBQb2ludHMobG9uZ2l0dWRlID0gcC5tX2xvY3MkbG9uLCBsYXRpdHVkZSA9IHAubV9sb2NzJGxhdCwgcGNoID0gMjMsIGNvbCA9IGNvbG9ycywgY2V4ID0gMS4yLCBsd2QgPSAyKQoKYGBgCgoKIyMjIEZpZ3VyZSAxCkNvbG9ueSBzaXplIG1hcApRdWljayBhbmQgZGlydHkgd2F5OiBsaXN0IG9mIGNvbG9ueSBzaXplcwpgYGB7cn0KY29sb255X3BvcHMgPC0gY29sb255X2xvY3MgJT4lCiAgbXV0YXRlKHBvcCA9IGlmZWxzZShDb2xvbnkgPT0gIkNoYWd1bGFrIiwgNTAwMDAwLCA0NTAwMDApKSAlPiUKICBtdXRhdGUocG9wID0gaWZlbHNlKENvbG9ueSA9PSAiUHJpYmlsb2YiLCA3OTcwMCwgcG9wKSkgJT4lCiAgbXV0YXRlKHBvcCA9IGlmZWxzZShDb2xvbnkgPT0gIlNlbWlkaSIsIDQ0MDAwMCwgcG9wKSkKCiMgYWRkIHRoZSAlIGJ5Y2F0Y2ggcGVyIGNvbG9ueQpieWNhdGNoX3Byb3AgPC0gYyguMTQsIC4zNiwgLjIzLCAuMjcpICMgdGhlIG9yZGVyIGlzIENoYWcvU2VtaWRpL1ByaWIvU3RNCmJ5X3BlcmNlbnQgPC0gYXNfdGliYmxlKGJ5Y2F0Y2hfcHJvcCkgJT4lCiAgcmVuYW1lKGJ5X3Byb3AgPSB2YWx1ZSkKCmNvbG9ueV9wZXJjIDwtIGNvbG9ueV9wb3BzICU+JQogIG11dGF0ZShwb3BfcGVyYyA9IHBvcC8oc3VtKHBvcCkpKSAlPiUgIyBhbmQgdGhlbiBtYWtlIHRoYXQgYSBwZXJjZW50YWdlCiAgYmluZF9jb2xzKGJ5X3BlcmNlbnQpCgojY29sb255X3BvcHMkcG9wIDwtIGZhY3Rvcihjb2xvbnlfcG9wcyRwb3ApCmNvbG9ueV9sb2NzJENvbG9ueSA8LSBhcy5mYWN0b3IoY29sb255X2xvY3MkQ29sb255KQojY29sb3JzIDwtIGMoInB1cnBsZSIsICJyZWQiLCAiZ29sZGVucm9kIiwgImRvZGdlcmJsdWUiKVtjb2xvbnlfbG9jcyRDb2xvbnldCgpgYGAKCgpgYGB7ciBwcm9wLWJ5Y2F0Y2gtcGVyLWNvbG9ueX0KIyAjIGVhc2llc3QgdG8gZ3JhYiB0aGlzIGZyb20gSmVzc2llJ3MgdGFibGUKIyBjb2xvbnkgPC0gYygiQ2hhZ3VsYWsiLCAiUHJpYmlsb2YiLCAiU3RNYXR0aGV3IiwgIlNlbWlkaSIpCiMgCiMgCiMgYnlfcHJvcCA8LSBhc19kYXRhX2ZyYW1lKGJ5Y2F0Y2hfcHJvcCkgJT4lCiMgICByZW5hbWUoYnlfcHJvcCA9IHZhbHVlKQojIAojIGFzX2RhdGFfZnJhbWUoY29sb255KSAlPiUKIyAgIHJlbmFtZShjb2xvbnkgPSB2YWx1ZSkgJT4lCiMgICBiaW5kX2NvbHMoYnlfcHJvcCkKCmBgYAoKCmBgYHtyfQpyZW1vdGVzOjppbnN0YWxsX2dpdGh1YigiY29vbGJ1dHVzZWxlc3MvZ2dwYXR0ZXJuIikKbGlicmFyeShnZ3BhdHRlcm4pCmBgYAoKYGBge3IgaGlzdG9ncmFtfQpjb2xvcnMgPC0gYygicHVycGxlIiwgInJlZCIsICJkYXJrb3JhbmdlIiwgImRvZGdlcmJsdWUiKQoKYmFycGxvdC5kZiA8LSBjb2xvbnlfcGVyYyAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IDU6NiwgbmFtZXNfdG8gPSAidHlwZSIsIHZhbHVlc190byA9ICJQZXJjZW50YWdlIikgJT4lICMgcmVmb3JtYXQganVzdCBhIGJpdAogIG11dGF0ZSh0eXBlID0gaWZlbHNlKHR5cGUgPT0gInBvcF9wZXJjIiwgIm1ldGFwb3B1bGF0aW9uIiwgImJ5Y2F0Y2giKSkgJT4lCiAgbXV0YXRlKFBlcmNlbnRhZ2UgPSBQZXJjZW50YWdlKjEwMCkgCgpiYXJwbG90LmRmJENvbG9ueSA8LSBhcy5mYWN0b3IoYmFycGxvdC5kZiRDb2xvbnkpCgoKICAgIApwYXR0ZXJuLnBsb3QgPC0gZ2dwbG90KGJhcnBsb3QuZGYsIGFlcyh4ID0gQ29sb255LCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IENvbG9ueSkpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBhbHBoYShjb2xvcnMsIDAuNzUpKSArCiAgZ2VvbV9jb2xfcGF0dGVybihhZXMocGF0dGVybl9maWxsID0gQ29sb255LCBwYXR0ZXJuX2RlbnNpdHkgPSB0eXBlKSwgCiAgICAgICAgICAgICAgICAgICBjb2xvdXI9J2JsYWNrJywgCiAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJ3N0cmlwZScsCiAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICdkb2RnZScsCiAgICAgICAgICAgICAgICAgICBzaXplID0gMC4xLAogICAgICAgICAgICAgICAgICAgcGF0dGVybl9zcGFjaW5nID0gMC4wMDgsCiAgICAgICAgICAgICAgICAgICAjcGF0dGVybl9saW5ldHlwZSA9ICJkYXNoZWQiLAogICAgICAgICAgICAgICAgICAgcGF0dGVybl9zaXplID0gMC4yLAogICAgICAgICAgICAgICAgICAgcGF0dGVybl9jb2xvciA9ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICBwYXR0ZXJuX2ZpbGwgPSAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgcGF0dGVybl9hbmdsZSA9IDUwCiAgICAgICAgICAgICAgICAgICkgKwogIHRoZW1lX21pbmltYWwoKSAgKwogICN0aGVtZShsZWdlbmQua2V5LnNpemUgPSB1bml0KDEsICdjbScpKSArCiAgeWxhYigiUGVyY2VudCBvZiB0b3RhbCIpICsKICB4bGFiKCJCcmVlZGluZyBjb2xvbnkiKQoKcGF0dGVybi5wbG90ICsgZ3VpZGVzKAogIGZpbGwgPSBGQUxTRQopICsKICB0aGVtZSgKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4ociA9IDEwKSksCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHQgPSAxMCkpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgI2xlZ2VuZC5wb3NpdGlvbiA9IGMoMC45LCAwLjkzKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gTkEpCiAgKQoKCiMgICBnZ3Bsb3QoYWVzKHggPSBDb2xvbnksIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gdHlwZSkpICsKIyAgIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdCA9ICJpZGVudGl0eSIpICsKIyAgIHRoZW1lX21pbmltYWwoKSArCiMgICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygibGlnaHRza3libHVlMSIsICJkYXJrZ3JlZW4iKSkgKwojICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JzKSArCiMgICB4bGFiKCJCcmVlZGluZyBjb2xvbnkiKSArCiMgICB5bGFiKCJQZXJjZW50IG9mIHRvdGFsIikKIyAKIyBiYXJwbG90ICsKIyAgIHRoZW1lKAojICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHIgPSAxMCkpLAojICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHQgPSAxMCkpLAojICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICNsZWdlbmQucG9zaXRpb24gPSBjKDAuOSwgMC45MyksCiMgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAojICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSBOQSkKIyAgICkKCmdnc2F2ZSgicGRmX291dHB1dHMvYmFycGxvdF9zdHJpcGVzLnBkZiIsIHdpZHRoID0gNiwgaGVpZ2h0ID0gMykKYGBgCgoKU3RyYWlnaHQgY29sb255IG1hcApgYGB7ciBjb2xvbnktbG9jYXRpb25zLW1hcH0KY29sb3JzIDwtIGMoInB1cnBsZSIsICJyZWQiLCAiZGFya29yYW5nZSIsICJkb2RnZXJibHVlIilbY29sb255X2xvY3MkQ29sb255XQoKI3BkZigicGRmX291dHB1dHMvY29sb255X2xvY19tYXBfY29sb3JzLnBkZiIsIHdpZHRoID0gNi41LCBoZWlnaHQgPSA1LjUpCnBsb3QoY29hc3RsaW5lV29ybGRGaW5lLCBjbG9uID0gLTE2NywgY2xhdCA9IG1sYXQsIHNwYW4gPSAxMTAwLCAKICAgICBwcm9qZWN0aW9uPSIrcHJvaj1hZWEgK2xhdF8xPTU1ICtsYXRfMj02NSArbGF0XzA9NTAgK2xvbl8wPS0xNTQiLCBjb2wgPSAnbGlnaHRncmV5JykKCiMgcGxvdCBiYXRoeW1ldHJ5Cm1hcENvbnRvdXIoYmF0aHlMb24sIGJhdGh5TGF0LCBiYXRoeVosCiAgICAgICAgICAgbGV2ZWxzID0gYygtNTAwLCAtMTAwMCwgLTI1MDApLAogICAgICAgICAgIGx3ZCA9IGMoMSwgMSwgMC41KSwKICAgICAgICAgICBsdHkgPSBjKDMsIDEsIDMsIDEsIDMpLAogICAgICAgICAgIGNvbCA9ICdkYXJrZ3JheScpCgojIGFkZCBkZXB0aCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0Iiwgc2VnLmxlbiA9IDMsIGNleCA9IDAuNywKICAgICAgIGx3ZCA9IGMoMSwgMSwgMC41KSwKICAgICAgIGx0eSA9IGMoMywgMSwgMywgMSwgMyksCiAgICAgICBsZWdlbmQgPSBjKCItNTAwIiwgIi0xMDAwIiwgIi0yNTAwIiksCiAgICAgICBib3guY29sID0gIndoaXRlIiwgY29sID0gJ2RhcmtncmF5JywgdGl0bGUgPSAiRGVwdGggKG0pIiwgYmcgPSAid2hpdGUiKQoKIyBhZGQgbWFwIGRhdGEKCiMgYWRkIGNvbG9ueSBsb2NhdGlvbnMKIyBtYXBQb2ludHMobG9uZ2l0dWRlID0gY29sb255X2xvY3MkbG9uLCBsYXRpdHVkZSA9IGNvbG9ueV9sb2NzJGxhdCwgcGNoID0gMTYsIGNleCA9IDIsIGNvbCA9IGFscGhhKCJkYXJrZ3JlZW4iLCAwLjc1KSkKCm1hcFBvaW50cyhsb25naXR1ZGUgPSBjb2xvbnlfbG9jcyRsb24sIGxhdGl0dWRlID0gY29sb255X2xvY3MkbGF0LCBwY2ggPSAyMywgY29sID0gY29sb3JzLCBjZXggPSAxLjIsIGx3ZCA9IDIpCgojZGV2Lm9mZigpCmBgYAoKCgoKYGBge3IgY29sb255LXNpemUtbWFwfQojcGRmKCJwZGZfb3V0cHV0cy9BdWd1c3QyOF90ZXN0X2Rpc3Byb3BvcnRpb25hdGVfbWFwLnBkZiIpCiMgcGxvdChjb2FzdGxpbmVXb3JsZEZpbmUsIGNsb24gPSAtMTY3LCBjbGF0ID0gbWxhdCwgc3BhbiA9IDExMDAsIAojICAgICAgcHJvamVjdGlvbj0iK3Byb2o9YWVhICtsYXRfMT01NSArbGF0XzI9NjUgK2xhdF8wPTUwICtsb25fMD0tMTU0IiwgY29sID0gJ2xpZ2h0Z3JleScpCiMgCiMgIyBwbG90IGJhdGh5bWV0cnkKIyBtYXBDb250b3VyKGJhdGh5TG9uLCBiYXRoeUxhdCwgYmF0aHlaLAojICAgICAgICAgICAgbGV2ZWxzID0gYygtNTAwLCAtMTAwMCwgLTI1MDApLAojICAgICAgICAgICAgbHdkID0gYygxLCAxLCAwLjUpLAojICAgICAgICAgICAgbHR5ID0gYygzLCAxLCAzLCAxLCAzKSwKIyAgICAgICAgICAgIGNvbCA9ICdkYXJrZ3JheScpCiMgCiMgIyBhZGQgZGVwdGggbGVnZW5kCiMgbGVnZW5kKCJib3R0b21sZWZ0Iiwgc2VnLmxlbiA9IDMsIGNleCA9IDAuNywKIyAgICAgICAgbHdkID0gYygxLCAxLCAwLjUpLAojICAgICAgICBsdHkgPSBjKDMsIDEsIDMsIDEsIDMpLAojICAgICAgICBsZWdlbmQgPSBjKCItNTAwIiwgIi0xMDAwIiwgIi0yNTAwIiksCiMgICAgICAgIGJveC5jb2wgPSAid2hpdGUiLCBjb2wgPSAnZGFya2dyYXknLCB0aXRsZSA9ICJEZXB0aCAobSkiLCBiZyA9ICJ3aGl0ZSIpCiMgCiMgIyBhZGQgbWFwIGRhdGEKIyAKIyAjIGFkZCBjb2xvbnkgbG9jYXRpb25zCiMgIyBtYXBQb2ludHMobG9uZ2l0dWRlID0gY29sb255X2xvY3MkbG9uLCBsYXRpdHVkZSA9IGNvbG9ueV9sb2NzJGxhdCwgcGNoID0gMTYsIGNvbCA9IGFscGhhKGNvbG9ycywgMC41KSwgY2V4ID0gMC4wMDAwMSogKGNvbG9ueV9wb3BzJHBvcCksIGx3ZCA9IDIpICMgcmVsYXRpdmUgcG9wdWxhdGlvbiBzaXplcwojIAojIG1hcFBvaW50cyhsb25naXR1ZGUgPSBjb2xvbnlfbG9jcyRsb24sIGxhdGl0dWRlID0gY29sb255X2xvY3MkbGF0LCBwY2ggPSAxLCBjb2wgPSBhbHBoYSgiZG9kZ2VyYmx1ZSIsMC43KSwgY2V4ID0gMTEqKGNvbG9ueV9wZXJjJHBvcF9wZXJjKSwgbHdkID0gMikgIyByZWxhdGl2ZSBwb3B1bGF0aW9uIHNpemVzCiMgCiMgbWFwUG9pbnRzKGxvbmdpdHVkZSA9IGNvbG9ueV9sb2NzJGxvbiwgbGF0aXR1ZGUgPSBjb2xvbnlfbG9jcyRsYXQsIHBjaCA9IDEsIGNvbCA9ICJyZWQiLCBjZXggPSAxMSooY29sb255X3BlcmMkYnlfcHJvcCksIGx3ZCA9IDIpICMgcmVsYXRpdmUgYnljYXRjaCBhbW91bnRzCgojZGV2Lm9mZigpCgpgYGAKCgoKCgoKCgoKIyMgQkEgY2FsY3VsYXRpb25zCgpJIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIEJBIHZhbHVlcyBmb3IgYWxsIG9mIG15IGNvbG9ueSBjb21wYXJpc29ucy4KRm9ydHVuYXRlbHksIEkgZG9uJ3QgdGhpbmsgSSBuZWVkIHRvIGRvIHNvIHVzaW5nIHRoZSBwLXZhbHVlIHJhbmRvbWl6ZWQgZnJhbWV3b3JrIGJlY2F1c2Ugbm9uZSBvZiB0aG9zZSBwLXZhbHVlcyB3ZXJlIHJlbW90ZWx5IGNsb3NlIHRvIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuCgoKYGBge3IgQkEtb3ZlcmxhcC1mY3QtZnJvbS1BYnJhbX0Kc291cmNlKCJSL25vZnUtZnVuY3Rpb25zLlIiKQpgYGAKCmJ1aWxkIGJsYW5rIGdyaWQgZm9yIHVzZSBpbiB0aGUga2VybmVsIG92ZXJsYXAgZnVuY3Rpb24KYGBge3IgYnVpbGQtYmxhbmstZ3JpZH0KIyMjIGRlZmluZSBwcm9qZWN0aW9ucwppbnB1dF9wcm9qIDwtICIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIgIyMjdGhlIGlucHV0IHByb2plY3Rpb24gb2YgdHJhY2sgcG9pbnRzCmRlc2lyZWRfcHJvaiA8LSAiK3Byb2o9YWVhICtsYXRfMT01NSArbGF0XzI9NjUgK2xhdF8wPTUwICtsb25fMD0tMTU0ICt4XzA9MCAreV8wPTAgK2VsbHBzPUdSUzgwICtkYXR1bT1OQUQ4MyArdW5pdHM9bSArbm9fZGVmcyIgIyMjdGhlIGRlc2lyZWQgcHJvamVjdGlvbiBmb3IgdHJhY2sgcG9pbnRzCgojIyMgY29udmVydCBkYXRhIHRvIGEgc3BhdGlhbCBvYmplY3QgYW5kIHJlcHJvamVjdCB0byBkZXNpcmVkIGNvb3JkaW5hdGUgc3lzdGVtCmNvb3JkaW5hdGVzKE5PRlUpID0gfkZpc2hlcmllc0xvbmdERCtGaXNoZXJpZXNMYXRERCAjIyMgZGVmaW5lIHRoZSB4IGFuZCB5IHNwYXRpYWwgZmllbGRzCnByb2o0c3RyaW5nKE5PRlUpIDwtIENSUyhpbnB1dF9wcm9qKSAjIyMgZGVmaW5lIHRoZSBwcm9qZWN0aW9uCk5PRlUyIDwtIHNwVHJhbnNmb3JtKE5PRlUsIENSUyhkZXNpcmVkX3Byb2opKSAjIyN0cmFuc2Zvcm0gdG8gZGVzaXJlZCBwcm9qZWN0aW9uCgojIyMgYnVpbGQgYSBncmlkIHRvIHVzZSBmb3IgdGhlIEtVRHMKZXh0PC0xLjMqZXh0ZW50KE5PRlUyKSAjZGVmaW5lIHRoZSBzcGF0aWFsIGV4dGVudCBhcyAxLjNYIHRoZSBleHRlbnQgb2YgeW91ciBkYXRhCmdyaWRfYmxhbmsgPC0gcmFzdGVyKGV4dD1leHQsIGNycz1kZXNpcmVkX3Byb2osIHJlc29sdXRpb249MzAwMCkgI21ha2UgYSBncmlkIHVzaW5nIHRoZSBleHRlbnQsIGRlZmluZSB0aGUgcHJvamVjdGlvbiwgYW5kIHNldCB0aGUgY2VsbCBzaXplIChyZXNvbHV0aW9uKQp2YWxzIDwtIDE6bmNlbGwoZ3JpZF9ibGFuaykgI2dpdmUgdGhlIGdyaWQgZHVtbXkgdmFsdWVzCmdyaWRfYmxhbmsgPC0gc2V0VmFsdWVzKGdyaWRfYmxhbmssIHZhbHMpICNnaXZlIHRoZSBncmlkIGR1bW15IHZhbHVlcwpncmlkX2JsYW5rIDwtIGFzKGdyaWRfYmxhbmssICJTcGF0aWFsUGl4ZWxzRGF0YUZyYW1lIikgI2NvbnZlcnQgZ3JpZCB0byBTcGF0aWFsIFBpeGVscyBEYXRhIEZyYW1lICh3aGF0IGtlcm5lbFVEIG5lZWRzKQpgYGAKCgoKQmFzaWNhbGx5LCB0aGUgZnVuY3Rpb24gSSB3YW50IGlzIHRvIGVudGVyIHRoZSBjb2xvbnkgbmFtZXMgYW5kIHNlYXNvbiBvZiBpbnRlcmVzdCwgYW5kIGhhdmUgdGhlIHJlc3Qgd3JhcHBlZCB1cCBpbiBhIGZ1bmN0aW9uIHRoYXQgbGVhbnMgb24gQWJyYW0ncyBmY3QuCmBgYHtyIGNvbG9ueS1zZWFzb24tQkEtY2FsY30KY29sb255X3NlYXNvbl9CQSA8LSBmdW5jdGlvbihjb2xvbnkxLCBjb2xvbnkyLCBzZWFzb24sIG5vZnVfc3BhdGlhbF9kZil7CiAgCiAgIyBzdWJzZXQgdGhlIGRhdGEgYnkgY29sb255IGNvbXBhcmlzb25zCiAgY29tcGFyaXNvbl9kZiA8LSBub2Z1X3NwYXRpYWxfZGYgJT4lCiAgICBmaWx0ZXIoT3JpZ2luQ29sb255ID09IGNvbG9ueTEgfCBPcmlnaW5Db2xvbnkgPT0gY29sb255MikgJT4lCiAgICBmaWx0ZXIoRmlzaGVyaWVzQ29sbFNlYXNvbiA9PSBzZWFzb24pCiAgCiAgY29tcGFyaXNvbl9CQSA8LSBrZXJuYWxPdmVybGFwQkFfcCh0cmFja3MgPSBjb21wYXJpc29uX2RmLCB0cmlwaWQ9Ik5NRlNfRE5BX0lEIiwgZ3JvdXBpZCA9ICJDb2xvbnlQaGVub2xvZ3kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbj0iRmlzaGVyaWVzTG9uZ0REIixsYXQ9IkZpc2hlcmllc0xhdEREIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvbnlMb249LTE2OS42NDQ5LCBjb2xvbnlMYXQ9NTYuNjYyMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzPTIsIGg9MzAwMDAsIHVkLmdyaWQgPSBncmlkX2JsYW5rLCBQbG90PUYpCiAgCiAgcmV0dXJuKGNvbXBhcmlzb25fQkEpCiAgCn0KCmBgYAoKdGVzdCB0aGF0IG91dCBmb3IgdGhlIFN0IE1hdHRoZXcvUHJpYiBicmVlZGluZyBhbmQgbm9uYnJlZWRpbmcKYGBge3Igc3RtYXR0LXByaWItYnJlZWRpbmd9CmNvbG9ueV9zZWFzb25fQkEoIlN0TWF0dGhldyIsICJQcmliaWxvZiIsICJicmVlZGluZyIsIG5ld19zcGF0aWFsX2RmKQoKYGBgCgpgYGB7ciBzdG1hdHQtcHJpYi1ub25icmVlZGluZ30KY29sb255X3NlYXNvbl9CQSgiU3RNYXR0aGV3IiwgIlByaWJpbG9mIiwgIm5vbmJyZWVkaW5nIiwgbmV3X3NwYXRpYWxfZGYpCgpgYGAKCmBgYHtyIHN0bWF0dC1jaGFndWxhay1ub25icmVlZGluZ30KY29sb255X3NlYXNvbl9CQSgiU3RNYXR0aGV3IiwgIkNoYWd1bGFrIiwgIm5vbmJyZWVkaW5nIiwgbmV3X3NwYXRpYWxfZGYpCgpgYGAKCgpgYGB7ciBzdG1hdHQtY2hhZ3VsYWstYnJlZWRpbmd9CmNvbG9ueV9zZWFzb25fQkEoIlN0TWF0dGhldyIsICJDaGFndWxhayIsICJicmVlZGluZyIsIG5ld19zcGF0aWFsX2RmKQoKYGBgCgoKYGBge3IgcHJpYi1jaGFndWxhay1icmVlZGluZ30KY29sb255X3NlYXNvbl9CQSgiUHJpYmlsb2YiLCAiQ2hhZ3VsYWsiLCAiYnJlZWRpbmciLCBuZXdfc3BhdGlhbF9kZikKCmBgYAoKYGBge3IgcHJpYi1jaGFndWxhay1ub25icmVlZGluZ30KY29sb255X3NlYXNvbl9CQSgiUHJpYmlsb2YiLCAiQ2hhZ3VsYWsiLCAibm9uYnJlZWRpbmciLCBuZXdfc3BhdGlhbF9kZikKCmBgYAoKYGBge3Igc2VtaWRpLWNoYWd1bGFrLWJyZWVkaW5nfQpjb2xvbnlfc2Vhc29uX0JBKCJTZW1pZGkiLCAiQ2hhZ3VsYWsiLCAiYnJlZWRpbmciLCBuZXdfc3BhdGlhbF9kZikKCmBgYAoKCmBgYHtyIHNlbWlkaS1jaGFndWxhay1ub25icmVlZGluZ30KY29sb255X3NlYXNvbl9CQSgiU2VtaWRpIiwgIkNoYWd1bGFrIiwgIm5vbmJyZWVkaW5nIiwgbmV3X3NwYXRpYWxfZGYpCgpgYGAKCgpgYGB7ciBzZW1pZGktc3RtYXR0LWJyZWVkaW5nfQpjb2xvbnlfc2Vhc29uX0JBKCJTZW1pZGkiLCAiU3RNYXR0aGV3IiwgImJyZWVkaW5nIiwgbmV3X3NwYXRpYWxfZGYpCgpgYGAKCmBgYHtyIHNlbWlkaS1zdG1hdHQtbm9uYnJlZWRpbmd9CmNvbG9ueV9zZWFzb25fQkEoIlNlbWlkaSIsICJTdE1hdHRoZXciLCAibm9uYnJlZWRpbmciLCBuZXdfc3BhdGlhbF9kZikKCmBgYAoKCmBgYHtyIHNlbWlkaS1wcmliLWJyZWVkaW5nfQpjb2xvbnlfc2Vhc29uX0JBKCJTZW1pZGkiLCAiUHJpYmlsb2YiLCAiYnJlZWRpbmciLCBuZXdfc3BhdGlhbF9kZikKCmBgYAoKCmBgYHtyIHNlbWlkaS1wcmliLW5vbmJyZWVkaW5nfQpjb2xvbnlfc2Vhc29uX0JBKCJTZW1pZGkiLCAiUHJpYmlsb2YiLCAibm9uYnJlZWRpbmciLCBuZXdfc3BhdGlhbF9kZikKCmBgYAoKCg==