knitr::opts_chunk$set(cache = TRUE, dev = c("png", "pdf", "tiff"))
library(eucs)
library(ggplot2)
library(GGally)
library(here)
library(oz)
library(png)
library(raster)
library(rgeos)
library(sp)
library(tidyr)
library(xtable)

Plot Locations

ibra_subregions <- unique(
  c(
    subset(
      occupancy_southeast,
      occupancy_southeast$ibra_subregion_coverage > .5,
      ibra_subregion
    )[[1]],
    occupancy_grampians$ibra_subregion
  )
)

tmp <- tempfile()
png(tmp, 600, 500, bg = rgb(1, 1, 1, 1))
oz(FALSE)
plot(
  subset(map_ibra_southeast, IBRA_SUB_N %in% ibra_subregions),
  col = "grey",
  border = NA,
  add = TRUE
)
dev.off()
par(mar = c(3, 3, 1, 1))
plot(
  map_southeast, xlim = c(141, 151), ylim = -c(39, 34), border = "black",
  lwd = .5, panel.first = grid()
)
plot(
  subset(map_ibra_southeast, IBRA_SUB_N %in% ibra_subregions),
  col = grey.colors(length(ibra_subregions), .1, .8),
  border = NA,
  add = TRUE
)
points(
  occupancy_grampians[c("longitude_gda94", "latitude_gda94")], pch = 16,
  cex = .1, col = rgb(.1, .1, .1, .1)
)
points(
  occupancy_grampians[c("longitude_gda94", "latitude_gda94")], pch = 16,
  cex = .01, col = rgb(1, 1, 1)
)


text(142.4, -38, "Greater Grampians", pos = 3)
points(
  subset(
    occupancy_southeast,
    ibra_subregion_coverage > .5,
    c("longitude_gda94", "latitude_gda94")
  ),
  cex = .1,
  pch = 16,
  col = rgb(.1, .1, .1, .1)
)
points(
  subset(
    occupancy_southeast,
    ibra_subregion_coverage > .5,
    c("longitude_gda94", "latitude_gda94")
  ),
  cex = .01,
  pch = 16,
  col = rgb(1, 1, 1)
)

points(144.963056, -37.813611, pch = 16)
text(144.963056, -37.813611, label = "Melbourne", cex = .5, pos = 2)
points(151.209444, -33.865, pch = 16)
text(151.209444, -33.865, label = "Sydney", cex = .5, pos = 2)

axis(1, tick = FALSE)
axis(2, tick = FALSE, las = 1)
rasterImage(readPNG(tmp), 149, -39.2, 151, -37.9)

Correlations among sampled covariates

hist_data <- do.call(
  rbind,
  list(
    with(
      covariates_grampians,
      data.frame(
        Region = "Grampians",
        mlq = mean_moisture_index_of_low_qtr,
        twi = topographic_wetness_index_3sec,
        r1k = relief_1000m_radius,
        tn  = total_nitrogen
      )
    ),
    with(
      covariates_southeast,
      data.frame(
        Region = "South-east Australia",
        mlq = mean_moisture_index_of_low_qtr,
        twi = topographic_wetness_index_3sec,
        r1k = relief_1000m_radius,
        tn  = total_nitrogen
      )
    )
  )
)

hist_data$Region <- relevel(hist_data$Region, "South-east Australia")

par(mar = rep(.5, 4), oma = c(3, 4, 4, 3), mfrow = c(3, 3))
ramps <- list()
ramps[[1]] <- colorRampPalette(
  c(rgb(.7, .7, .7, 0), rgb(0, 0, 0, 1)), alpha = TRUE
)
ramps[[2]] <- colorRampPalette(
  c(rgb(.3, .3, .3, 0), rgb(1, 1, 1, 1)), alpha = TRUE
)
rgns <- c("South-east Australia" = FALSE, "Grampians" = TRUE)
vars <- list()
vars[[1]] <- c("mlq", "twi", "r1k")
vars[[2]] <- c("tn", "r1k", "twi")
labels <- c(
  mlq = "Mean Moisture Index\nLowest Quarter",
  twi = "Topographic\nWetness Index",
  r1k = "Relief\n(1000m Radius)",
  tn  = "Total Nitrogen"
)

for (i in seq(vars[[1]])) {
  for (j in seq(vars[[2]])) {
    if (sum(i, j) > 4) {
      plot.new()
      if (i == j) {
        legend(
          "center", c("Southeast","Grampians"),
          fill = c("black", "white"),
          bty = "n", cex = 2, xpd = NA
        )
      }
    } else {
      for (k in seq(rgns)) {
        smoothScatter(
          subset(
            hist_data, Region == names(rgns)[k], c(vars[[1]][j], vars[[2]][i])
          ),
          colramp = ramps[[k]], nrpoints = 0, add = rgns[k], xaxt = "n",
          yaxt = "n",
          panel.first = {
            rect(
              par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4],
              col = "lightgrey"
            )
            grid(col = "grey")
          },
          xlim = range(hist_data[[vars[[1]][j]]], na.rm = TRUE),
          ylim = range(hist_data[[vars[[2]][i]]], na.rm = TRUE)
        )
      }
      if (sum(i, j) == 4) {
        axis(1)
        axis(4, las = 1)
      }
      if (i == 1) mtext(labels[vars[[1]][j]], 3, 1)
      if (j == 1) mtext(labels[vars[[2]][i]], 2, 1)
    }
  }
}

Histograms of sampled covariates

hist_data$Region <- relevel(hist_data$Region, "Grampians")
hist_data <- gather(hist_data, type, value, -Region)
hist_data$type <- factor(hist_data$type, rev(levels(factor(hist_data$type))))
hist_data$Region <- factor(hist_data$Region, rev(levels(hist_data$Region)))

ggplot(na.omit(hist_data)) +
aes(value, fill = Region) +
geom_histogram(bins = 25) +
scale_fill_grey() +
facet_grid(
  ~type,
  labeller = as_labeller(labels),
  scales = "free_x"
) +
xlab("") +
ylab("Plots") +
theme_bw(base_size = 14) +
theme(
  legend.position = c(.975, .95), legend.justification = c("right", "top"),
  legend.title = element_blank()
)

rgns <- subset(map_ibra_southeast, IBRA_SUB_N %in% ibra_subregions)
km2 <- 1000000
aa <- CRS("+init=epsg:3577")

summary_table <- data.frame(
  Region = ibra_subregions,
  "Area (km$^2$)" = as.integer(round(as.vector(tapply(
    gArea(spTransform(rgns, aa), TRUE) / km2, rgns@data$IBRA_SUB_N, sum
  )[ibra_subregions]), -2)),
  "No. of plots" = as.vector(table(
    c(occupancy_grampians[, 2], occupancy_southeast[, 2])
  )[ibra_subregions]),
  "No. of taxa" = c(
    apply(
      with(
        subset(modeldata_southeast, occupancy),
        table(taxon, ibra_subregion) > 0
      ),
      2,
      sum
    ),
    `Greater Grampians` = length(unique(modeldata_grampians$taxon))
  )[ibra_subregions],
  check.names = FALSE,
  stringsAsFactors = FALSE
)

summary_table <- xtable(
  summary_table, caption = "IBRA subregions", label = "tab:summary"
)

dir.create(
  here("notebooks/eucalypt_project_maps_files/figure-html"),
  showWarnings = FALSE, recursive = TRUE
)

print(
  summary_table,
  file = here(
    "notebooks/eucalypt_project_maps_files/figure-html/summarytab.tex"
  ),
  include.rownames = FALSE,
  table.placement = "htbp!",
  caption.placement = "top",
  sanitize.text.function = identity
)
IycgLS0tCiMnIHRpdGxlOiAiTWFwcyBhbmQgcGxvdHMgZm9yIHRoZSBldWNhbHlwdCBwcm9qZWN0IgojJyBhdXRob3I6ICJXaWxsaWFtIEsuIE1vcnJpcyIKIycgZGF0ZTogImByIFN5cy5EYXRlKClgIgojJyBvdXRwdXQ6CiMnICAgcm1hcmtkb3duOjpodG1sX25vdGVib29rOgojJyAgICAgY29kZV9mb2xkaW5nOiBoaWRlCiMnIC0tLQoKIysgc2V0dXAsIG1lc3NhZ2U9RkFMU0UKa25pdHI6Om9wdHNfY2h1bmskc2V0KGNhY2hlID0gVFJVRSwgZGV2ID0gYygicG5nIiwgInBkZiIsICJ0aWZmIikpCmxpYnJhcnkoZXVjcykKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KEdHYWxseSkKbGlicmFyeShoZXJlKQpsaWJyYXJ5KG96KQpsaWJyYXJ5KHBuZykKbGlicmFyeShyYXN0ZXIpCmxpYnJhcnkocmdlb3MpCmxpYnJhcnkoc3ApCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoeHRhYmxlKQoKIycgIyMgUGxvdCBMb2NhdGlvbnMKIysgcGxvdC1sb2NhdGlvbi1tYXAsIG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD03LjUsIHJlc3VsdHM9ImhpZGUiCmlicmFfc3VicmVnaW9ucyA8LSB1bmlxdWUoCiAgYygKICAgIHN1YnNldCgKICAgICAgb2NjdXBhbmN5X3NvdXRoZWFzdCwKICAgICAgb2NjdXBhbmN5X3NvdXRoZWFzdCRpYnJhX3N1YnJlZ2lvbl9jb3ZlcmFnZSA+IC41LAogICAgICBpYnJhX3N1YnJlZ2lvbgogICAgKVtbMV1dLAogICAgb2NjdXBhbmN5X2dyYW1waWFucyRpYnJhX3N1YnJlZ2lvbgogICkKKQoKdG1wIDwtIHRlbXBmaWxlKCkKcG5nKHRtcCwgNjAwLCA1MDAsIGJnID0gcmdiKDEsIDEsIDEsIDEpKQpveihGQUxTRSkKcGxvdCgKICBzdWJzZXQobWFwX2licmFfc291dGhlYXN0LCBJQlJBX1NVQl9OICVpbiUgaWJyYV9zdWJyZWdpb25zKSwKICBjb2wgPSAiZ3JleSIsCiAgYm9yZGVyID0gTkEsCiAgYWRkID0gVFJVRQopCmRldi5vZmYoKQoKcGFyKG1hciA9IGMoMywgMywgMSwgMSkpCnBsb3QoCiAgbWFwX3NvdXRoZWFzdCwgeGxpbSA9IGMoMTQxLCAxNTEpLCB5bGltID0gLWMoMzksIDM0KSwgYm9yZGVyID0gImJsYWNrIiwKICBsd2QgPSAuNSwgcGFuZWwuZmlyc3QgPSBncmlkKCkKKQpwbG90KAogIHN1YnNldChtYXBfaWJyYV9zb3V0aGVhc3QsIElCUkFfU1VCX04gJWluJSBpYnJhX3N1YnJlZ2lvbnMpLAogIGNvbCA9IGdyZXkuY29sb3JzKGxlbmd0aChpYnJhX3N1YnJlZ2lvbnMpLCAuMSwgLjgpLAogIGJvcmRlciA9IE5BLAogIGFkZCA9IFRSVUUKKQpwb2ludHMoCiAgb2NjdXBhbmN5X2dyYW1waWFuc1tjKCJsb25naXR1ZGVfZ2RhOTQiLCAibGF0aXR1ZGVfZ2RhOTQiKV0sIHBjaCA9IDE2LAogIGNleCA9IC4xLCBjb2wgPSByZ2IoLjEsIC4xLCAuMSwgLjEpCikKcG9pbnRzKAogIG9jY3VwYW5jeV9ncmFtcGlhbnNbYygibG9uZ2l0dWRlX2dkYTk0IiwgImxhdGl0dWRlX2dkYTk0IildLCBwY2ggPSAxNiwKICBjZXggPSAuMDEsIGNvbCA9IHJnYigxLCAxLCAxKQopCgoKdGV4dCgxNDIuNCwgLTM4LCAiR3JlYXRlciBHcmFtcGlhbnMiLCBwb3MgPSAzKQpwb2ludHMoCiAgc3Vic2V0KAogICAgb2NjdXBhbmN5X3NvdXRoZWFzdCwKICAgIGlicmFfc3VicmVnaW9uX2NvdmVyYWdlID4gLjUsCiAgICBjKCJsb25naXR1ZGVfZ2RhOTQiLCAibGF0aXR1ZGVfZ2RhOTQiKQogICksCiAgY2V4ID0gLjEsCiAgcGNoID0gMTYsCiAgY29sID0gcmdiKC4xLCAuMSwgLjEsIC4xKQopCnBvaW50cygKICBzdWJzZXQoCiAgICBvY2N1cGFuY3lfc291dGhlYXN0LAogICAgaWJyYV9zdWJyZWdpb25fY292ZXJhZ2UgPiAuNSwKICAgIGMoImxvbmdpdHVkZV9nZGE5NCIsICJsYXRpdHVkZV9nZGE5NCIpCiAgKSwKICBjZXggPSAuMDEsCiAgcGNoID0gMTYsCiAgY29sID0gcmdiKDEsIDEsIDEpCikKCnBvaW50cygxNDQuOTYzMDU2LCAtMzcuODEzNjExLCBwY2ggPSAxNikKdGV4dCgxNDQuOTYzMDU2LCAtMzcuODEzNjExLCBsYWJlbCA9ICJNZWxib3VybmUiLCBjZXggPSAuNSwgcG9zID0gMikKcG9pbnRzKDE1MS4yMDk0NDQsIC0zMy44NjUsIHBjaCA9IDE2KQp0ZXh0KDE1MS4yMDk0NDQsIC0zMy44NjUsIGxhYmVsID0gIlN5ZG5leSIsIGNleCA9IC41LCBwb3MgPSAyKQoKYXhpcygxLCB0aWNrID0gRkFMU0UpCmF4aXMoMiwgdGljayA9IEZBTFNFLCBsYXMgPSAxKQpyYXN0ZXJJbWFnZShyZWFkUE5HKHRtcCksIDE0OSwgLTM5LjIsIDE1MSwgLTM3LjkpCgojJyAjIyBDb3JyZWxhdGlvbnMgYW1vbmcgc2FtcGxlZCBjb3ZhcmlhdGVzCiMrIHBhaXJzLWNvdmFycywgZmlnLndpZHRoPTMuNSwgZmlnLmhlaWdodD0zLjUsIHdhcm5pbmc9RkFMU0UsIGRldi5hcmdzPWxpc3QocG9pbnRzaXplPTgpCmhpc3RfZGF0YSA8LSBkby5jYWxsKAogIHJiaW5kLAogIGxpc3QoCiAgICB3aXRoKAogICAgICBjb3ZhcmlhdGVzX2dyYW1waWFucywKICAgICAgZGF0YS5mcmFtZSgKICAgICAgICBSZWdpb24gPSAiR3JhbXBpYW5zIiwKICAgICAgICBtbHEgPSBtZWFuX21vaXN0dXJlX2luZGV4X29mX2xvd19xdHIsCiAgICAgICAgdHdpID0gdG9wb2dyYXBoaWNfd2V0bmVzc19pbmRleF8zc2VjLAogICAgICAgIHIxayA9IHJlbGllZl8xMDAwbV9yYWRpdXMsCiAgICAgICAgdG4gID0gdG90YWxfbml0cm9nZW4KICAgICAgKQogICAgKSwKICAgIHdpdGgoCiAgICAgIGNvdmFyaWF0ZXNfc291dGhlYXN0LAogICAgICBkYXRhLmZyYW1lKAogICAgICAgIFJlZ2lvbiA9ICJTb3V0aC1lYXN0IEF1c3RyYWxpYSIsCiAgICAgICAgbWxxID0gbWVhbl9tb2lzdHVyZV9pbmRleF9vZl9sb3dfcXRyLAogICAgICAgIHR3aSA9IHRvcG9ncmFwaGljX3dldG5lc3NfaW5kZXhfM3NlYywKICAgICAgICByMWsgPSByZWxpZWZfMTAwMG1fcmFkaXVzLAogICAgICAgIHRuICA9IHRvdGFsX25pdHJvZ2VuCiAgICAgICkKICAgICkKICApCikKCmhpc3RfZGF0YSRSZWdpb24gPC0gcmVsZXZlbChoaXN0X2RhdGEkUmVnaW9uLCAiU291dGgtZWFzdCBBdXN0cmFsaWEiKQoKcGFyKG1hciA9IHJlcCguNSwgNCksIG9tYSA9IGMoMywgNCwgNCwgMyksIG1mcm93ID0gYygzLCAzKSkKcmFtcHMgPC0gbGlzdCgpCnJhbXBzW1sxXV0gPC0gY29sb3JSYW1wUGFsZXR0ZSgKICBjKHJnYiguNywgLjcsIC43LCAwKSwgcmdiKDAsIDAsIDAsIDEpKSwgYWxwaGEgPSBUUlVFCikKcmFtcHNbWzJdXSA8LSBjb2xvclJhbXBQYWxldHRlKAogIGMocmdiKC4zLCAuMywgLjMsIDApLCByZ2IoMSwgMSwgMSwgMSkpLCBhbHBoYSA9IFRSVUUKKQpyZ25zIDwtIGMoIlNvdXRoLWVhc3QgQXVzdHJhbGlhIiA9IEZBTFNFLCAiR3JhbXBpYW5zIiA9IFRSVUUpCnZhcnMgPC0gbGlzdCgpCnZhcnNbWzFdXSA8LSBjKCJtbHEiLCAidHdpIiwgInIxayIpCnZhcnNbWzJdXSA8LSBjKCJ0biIsICJyMWsiLCAidHdpIikKbGFiZWxzIDwtIGMoCiAgbWxxID0gIk1lYW4gTW9pc3R1cmUgSW5kZXhcbkxvd2VzdCBRdWFydGVyIiwKICB0d2kgPSAiVG9wb2dyYXBoaWNcbldldG5lc3MgSW5kZXgiLAogIHIxayA9ICJSZWxpZWZcbigxMDAwbSBSYWRpdXMpIiwKICB0biAgPSAiVG90YWwgTml0cm9nZW4iCikKCmZvciAoaSBpbiBzZXEodmFyc1tbMV1dKSkgewogIGZvciAoaiBpbiBzZXEodmFyc1tbMl1dKSkgewogICAgaWYgKHN1bShpLCBqKSA+IDQpIHsKICAgICAgcGxvdC5uZXcoKQogICAgICBpZiAoaSA9PSBqKSB7CiAgICAgICAgbGVnZW5kKAogICAgICAgICAgImNlbnRlciIsIGMoIlNvdXRoZWFzdCIsIkdyYW1waWFucyIpLAogICAgICAgICAgZmlsbCA9IGMoImJsYWNrIiwgIndoaXRlIiksCiAgICAgICAgICBidHkgPSAibiIsIGNleCA9IDIsIHhwZCA9IE5BCiAgICAgICAgKQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGsgaW4gc2VxKHJnbnMpKSB7CiAgICAgICAgc21vb3RoU2NhdHRlcigKICAgICAgICAgIHN1YnNldCgKICAgICAgICAgICAgaGlzdF9kYXRhLCBSZWdpb24gPT0gbmFtZXMocmducylba10sIGModmFyc1tbMV1dW2pdLCB2YXJzW1syXV1baV0pCiAgICAgICAgICApLAogICAgICAgICAgY29scmFtcCA9IHJhbXBzW1trXV0sIG5ycG9pbnRzID0gMCwgYWRkID0gcmduc1trXSwgeGF4dCA9ICJuIiwKICAgICAgICAgIHlheHQgPSAibiIsCiAgICAgICAgICBwYW5lbC5maXJzdCA9IHsKICAgICAgICAgICAgcmVjdCgKICAgICAgICAgICAgICBwYXIoInVzciIpWzFdLCBwYXIoInVzciIpWzNdLCBwYXIoInVzciIpWzJdLCBwYXIoInVzciIpWzRdLAogICAgICAgICAgICAgIGNvbCA9ICJsaWdodGdyZXkiCiAgICAgICAgICAgICkKICAgICAgICAgICAgZ3JpZChjb2wgPSAiZ3JleSIpCiAgICAgICAgICB9LAogICAgICAgICAgeGxpbSA9IHJhbmdlKGhpc3RfZGF0YVtbdmFyc1tbMV1dW2pdXV0sIG5hLnJtID0gVFJVRSksCiAgICAgICAgICB5bGltID0gcmFuZ2UoaGlzdF9kYXRhW1t2YXJzW1syXV1baV1dXSwgbmEucm0gPSBUUlVFKQogICAgICAgICkKICAgICAgfQogICAgICBpZiAoc3VtKGksIGopID09IDQpIHsKICAgICAgICBheGlzKDEpCiAgICAgICAgYXhpcyg0LCBsYXMgPSAxKQogICAgICB9CiAgICAgIGlmIChpID09IDEpIG10ZXh0KGxhYmVsc1t2YXJzW1sxXV1bal1dLCAzLCAxKQogICAgICBpZiAoaiA9PSAxKSBtdGV4dChsYWJlbHNbdmFyc1tbMl1dW2ldXSwgMiwgMSkKICAgIH0KICB9Cn0KCiMnICMjIEhpc3RvZ3JhbXMgb2Ygc2FtcGxlZCBjb3ZhcmlhdGVzCiMrIGhpc3QtY292YXJzLCBmaWcud2lkdGg9MTAsIHdhcm5pbmc9RkFMU0UKaGlzdF9kYXRhJFJlZ2lvbiA8LSByZWxldmVsKGhpc3RfZGF0YSRSZWdpb24sICJHcmFtcGlhbnMiKQpoaXN0X2RhdGEgPC0gZ2F0aGVyKGhpc3RfZGF0YSwgdHlwZSwgdmFsdWUsIC1SZWdpb24pCmhpc3RfZGF0YSR0eXBlIDwtIGZhY3RvcihoaXN0X2RhdGEkdHlwZSwgcmV2KGxldmVscyhmYWN0b3IoaGlzdF9kYXRhJHR5cGUpKSkpCmhpc3RfZGF0YSRSZWdpb24gPC0gZmFjdG9yKGhpc3RfZGF0YSRSZWdpb24sIHJldihsZXZlbHMoaGlzdF9kYXRhJFJlZ2lvbikpKQoKZ2dwbG90KG5hLm9taXQoaGlzdF9kYXRhKSkgKwphZXModmFsdWUsIGZpbGwgPSBSZWdpb24pICsKZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDI1KSArCnNjYWxlX2ZpbGxfZ3JleSgpICsKZmFjZXRfZ3JpZCgKICB+dHlwZSwKICBsYWJlbGxlciA9IGFzX2xhYmVsbGVyKGxhYmVscyksCiAgc2NhbGVzID0gImZyZWVfeCIKKSArCnhsYWIoIiIpICsKeWxhYigiUGxvdHMiKSArCnRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE0KSArCnRoZW1lKAogIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjk3NSwgLjk1KSwgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKCJyaWdodCIsICJ0b3AiKSwKICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkKKQoKcmducyA8LSBzdWJzZXQobWFwX2licmFfc291dGhlYXN0LCBJQlJBX1NVQl9OICVpbiUgaWJyYV9zdWJyZWdpb25zKQprbTIgPC0gMTAwMDAwMAphYSA8LSBDUlMoIitpbml0PWVwc2c6MzU3NyIpCgpzdW1tYXJ5X3RhYmxlIDwtIGRhdGEuZnJhbWUoCiAgUmVnaW9uID0gaWJyYV9zdWJyZWdpb25zLAogICJBcmVhIChrbSReMiQpIiA9IGFzLmludGVnZXIocm91bmQoYXMudmVjdG9yKHRhcHBseSgKICAgIGdBcmVhKHNwVHJhbnNmb3JtKHJnbnMsIGFhKSwgVFJVRSkgLyBrbTIsIHJnbnNAZGF0YSRJQlJBX1NVQl9OLCBzdW0KICApW2licmFfc3VicmVnaW9uc10pLCAtMikpLAogICJOby4gb2YgcGxvdHMiID0gYXMudmVjdG9yKHRhYmxlKAogICAgYyhvY2N1cGFuY3lfZ3JhbXBpYW5zWywgMl0sIG9jY3VwYW5jeV9zb3V0aGVhc3RbLCAyXSkKICApW2licmFfc3VicmVnaW9uc10pLAogICJOby4gb2YgdGF4YSIgPSBjKAogICAgYXBwbHkoCiAgICAgIHdpdGgoCiAgICAgICAgc3Vic2V0KG1vZGVsZGF0YV9zb3V0aGVhc3QsIG9jY3VwYW5jeSksCiAgICAgICAgdGFibGUodGF4b24sIGlicmFfc3VicmVnaW9uKSA+IDAKICAgICAgKSwKICAgICAgMiwKICAgICAgc3VtCiAgICApLAogICAgYEdyZWF0ZXIgR3JhbXBpYW5zYCA9IGxlbmd0aCh1bmlxdWUobW9kZWxkYXRhX2dyYW1waWFucyR0YXhvbikpCiAgKVtpYnJhX3N1YnJlZ2lvbnNdLAogIGNoZWNrLm5hbWVzID0gRkFMU0UsCiAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFCikKCnN1bW1hcnlfdGFibGUgPC0geHRhYmxlKAogIHN1bW1hcnlfdGFibGUsIGNhcHRpb24gPSAiSUJSQSBzdWJyZWdpb25zIiwgbGFiZWwgPSAidGFiOnN1bW1hcnkiCikKCmRpci5jcmVhdGUoCiAgaGVyZSgibm90ZWJvb2tzL2V1Y2FseXB0X3Byb2plY3RfbWFwc19maWxlcy9maWd1cmUtaHRtbCIpLAogIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFCikKCnByaW50KAogIHN1bW1hcnlfdGFibGUsCiAgZmlsZSA9IGhlcmUoCiAgICAibm90ZWJvb2tzL2V1Y2FseXB0X3Byb2plY3RfbWFwc19maWxlcy9maWd1cmUtaHRtbC9zdW1tYXJ5dGFiLnRleCIKICApLAogIGluY2x1ZGUucm93bmFtZXMgPSBGQUxTRSwKICB0YWJsZS5wbGFjZW1lbnQgPSAiaHRicCEiLAogIGNhcHRpb24ucGxhY2VtZW50ID0gInRvcCIsCiAgc2FuaXRpemUudGV4dC5mdW5jdGlvbiA9IGlkZW50aXR5CikK