Introduction

This report analyses data from 2 capture-recapture sessions in Miroslav during the 2020 spring in order to calculate the density of the population.

Session 1 run from 23,27 of April to May 1st (6 occasions).

Session 2 run from 18 - 22 of May (5 occasions).

(Note: No problem with different n of occasions according to Murray http://www.phidot.org/forum/viewtopic.php?f=36&t=3260)

Libraries

pacman::p_load(tidyverse,ggplot2, janitor, data.table, here, rio, kableExtra, ggstatsplot, lubridate,
            secr)

Tidying data

Saved and edited two txt files from the original data directly in excel (sacrilege!): captures and traps.

  • Eliminated several columns that we won’t use in this analysis

  • Selected only captures in the traps used for CR.

  • Deleted one capture of a female without collar, a single capture in between sessions, and two captures without collar code.

  • Recoded the sessions, which were coded as every single day, into sessions 1 and 2. (within each session we can consider the population as closed, but deaths and births can happen between sessions).

  • Renamed the variable “Unique ID” as “occasion” and recoded it - now, correctly - as each day as an occasion.

  • Renamed the Collar ID variable as captureid. We’ll use the collar code this time, but we need an individual unique code for each animal across seasons and hopefully across years if the collars stay on the susliks after hibernation.

  • Used the same trap layout from last year and added character 0 to single digit traps ids on the capture file to match the trap file

Analysis

We combine the information obtained from our captures and the trap locations to create the capthist file. The analysis was performed using the package ‘secr’ version 4.3.3 and R 4.1.2.

multi <- read.capthist(here("data", "captures.txt"), here("data", "traps.txt"), detector = "proximity") #The “proximity” detector type allows, at
## Session 1 
## More than one detection per detector per occasion at binary detector(s)
# most, one detection of each individual at a particular detector on any occasion (i.e.,
# it is equivalent to what we call the Bernoulli or binomial encounter process model,
# or model SCR0).

summary(multi)
## $`1`
## Object class       capthist 
## Detector type      proximity 
## Detector number    20 
## Average spacing    13.63913 m 
## x-range            -623778.5 -623653.2 m 
## y-range            -1187164 -1187091 m 
## 
## Counts by occasion 
##                    1  2  3  4  5  6 Total
## n                  7  8 12 10 11  8    56
## u                  7  7 11  6  9  4    44
## f                 33 10  1  0  0  0    44
## M(t+1)             7 14 25 31 40 44    44
## losses             0  0  0  0  0  0     0
## detections         7  8 12 10 11  9    57
## detectors visited  6  7  6  9  7  7    42
## detectors used    20 20 20 20 20 20   120
## 
## $`2`
## Object class       capthist 
## Detector type      proximity 
## Detector number    20 
## Average spacing    13.63913 m 
## x-range            -623778.5 -623653.2 m 
## y-range            -1187164 -1187091 m 
## 
## Counts by occasion 
##                    1  2  3  4  5 Total
## n                  4 10  5  8  8    35
## u                  4 10  5  5  6    30
## f                 25  5  0  0  0    30
## M(t+1)             4 14 19 24 30    30
## losses             0  0  0  0  0     0
## detections         4 10  5  8  8    35
## detectors visited  3  7  5  7  6    28
## detectors used    20 20 20 20 20   100

n number of distinct individuals detected on each occasion t
u number of individuals detected for the first time on each occasion t
f number of individuals detected on exactly t occasions
M(t+1) cumulative number of detected individuals on each occasion t

Trap array and consecutive captures of each individual

par(mfrow = c(1,1), mar = c(1,1,1,1)) # reduce margins
plot (multi, tracks = TRUE, gridsp = 5,border = 10)

##  1  2 
## 57 35

The most important insight from these figures is that individuals tend to be recaptured near their site of first capture. This is expected when the individuals of a species occupy home ranges. In SECR models the tendency for detections to be localised is reflected in the spatial scale parameter σ.

Successive trap-revealed movements and distances

m <- unlist(moves(multi))
par(mar = c(3.2,4,1,1), mgp = c(2.1,0.6,0)) # reduce margins
hist(m, breaks = seq(0/5, 50,5), xlab = "Movement m", main = "")

We will employ the estimate of the spatial scale σ from 2019 (6.21) to fit the simplest possible SECR model with function secr.fit.

fit <- secr.fit (multi, buffer = 4 * 6.21, trace = FALSE,biasLimit = NA, verify = FALSE)

detector(traps(multi)) <- "proximity"

fit
## 
## secr.fit(capthist = multi, buffer = 4 * 6.21, verify = FALSE, 
##     biasLimit = NA, trace = FALSE)
## secr 4.5.1, 10:00:58 24 Jan 2022
## 
## $`1`
## Detector type      count 
## Detector number    20 
## Average spacing    13.63913 m 
## x-range            -623778.5 -623653.2 m 
## y-range            -1187164 -1187091 m 
## 
##  Usage range by occasion
##     1
## min 6
## max 6
## 
## $`2`
## Detector type      count 
## Detector number    20 
## Average spacing    13.63913 m 
## x-range            -623778.5 -623653.2 m 
## y-range            -1187164 -1187091 m 
## 
##  Usage range by occasion
##     1
## min 5
## max 5
## 
## 
##             1  2
## Occasions   1  1
## Detections 57 35
## Animals    44 30
## Detectors  20 20
## Count model     :  Binomial, size from usage
## 
## Model           :  D~1 g0~1 sigma~1 
## Fixed (real)    :  none 
## Detection fn    :  halfnormal
## Distribution    :  poisson 
## N parameters    :  3 
## Log likelihood  :  -115.8147 
## AIC             :  237.6294 
## AICc            :  237.9723 
## 
## Beta parameters (coefficients) 
##            beta   SE.beta       lcl       ucl
## D      5.066286 0.2250801  4.625138  5.507435
## g0    -2.123043 0.3256476 -2.761301 -1.484785
## sigma  1.839040 0.1282299  1.587714  2.090366
## 
## Variance-covariance matrix of beta parameters 
##                  D          g0        sigma
## D      0.050661032 -0.03091532 -0.009273088
## g0    -0.030915320  0.10604639 -0.025971375
## sigma -0.009273088 -0.02597137  0.016442901
## 
## Fitted (real) parameters evaluated at base levels of covariates 
## 
##  session = 1 
##        link    estimate SE.estimate          lcl         ucl
## D       log 158.5843224 36.15105216 102.01681446 246.5180612
## g0    logit   0.1068773  0.03108454   0.05945159   0.1847057
## sigma   log   6.2904956  0.80995670   4.89255136   8.0878732
## 
##  session = 2 
##        link    estimate SE.estimate          lcl         ucl
## D       log 158.5843224 36.15105216 102.01681446 246.5180612
## g0    logit   0.1068773  0.03108454   0.05945159   0.1847057
## sigma   log   6.2904956  0.80995670   4.89255136   8.0878732

The report comprises:
• function call and time stamp
• summary of the data
• description of the model, including the maximized log likelihood, Akaike’s Information Criterion AIC
• estimates of model coefficients (beta parameters)
• estimates of variance-covariance matrix of the coefficients
• estimates of the ‘real’ parameters

. The estimated density is 158.58 susliks per hectare, 95% confidence interval 102-246 susliks per hectare
. The other two real parameters jointly determine the detection function, plotted below with 95% confidence limits

par(mar = c(4,4,1,1)) # reduce margins
plot(fit, limits = TRUE)

The theory of SECR tells us that buffer width is not critical as long as it is wide enough that animals at the edge have effectively zero chance of appearing in our sample.We check that for the present model with the function esa.plot.

The estimated density has easily reached a plateau at the chosen buffer width (dashed red line):

esa.plot(fit)
abline(v = 4 * 6.21, lty = 2, col = 'red')

Homeranges

Mean distance in meters, between consecutive capture locations, pooled over individuals, per capture session (e.g. Efford 2004).

dbar(multi, userdist = NULL, mask = NULL)
## [[1]]
## [1] 6.871799
## 
## [[2]]
## [1] 5.554234

MMDM (for ‘Mean Maximum Distance Moved’) is the average maximum distance (in m) between detections of each individual i.e. the observed range length averaged over individuals (Otis et al. 1978).

MMDM(multi, min.recapt = 1, full = FALSE, userdist = NULL, mask = NULL)
## [[1]]
## [1] 8.121217
## 
## [[2]]
## [1] 5.554234

RPSV (for ‘Root Pooled Spatial Variance’) is a measure of the 2-D dispersion of the locations at which individual animals are detected, pooled over individuals (cf Calhoun and Casby 1958, Slade and Swihart 1983).

RPSV(multi, CC = FALSE)
## [[1]]
## [1] 8.432224
## 
## [[2]]
## [1] 7.073392
LS0tDQphdXRob3I6ICJGZXJuYW5kbyBNYXRlb3MtR29uesOhbGV6Ig0KZGF0ZTogTGFzdCB1cGRhdGUgImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogbm8NCiAgICAgIHNtb290aF9zY3JvbGw6IG5vDQogIG1kX2RvY3VtZW50Og0KICAgIHZhcmlhbnQ6IG1hcmtkb3duX2dpdGh1Yg0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCnRpdGxlOiAiQ2FwdHVyZS1SZWNhcHR1cmUgQW5hbHlzaXMgZm9yIE1pcm9zbGF2IFN1c2xpa3MgMjAyMCINCmVkaXRvcl9vcHRpb25zOiANCiAgbWFya2Rvd246IA0KICAgIHdyYXA6IDcyDQotLS0NCg0KIyBJbnRyb2R1Y3Rpb24NCg0KVGhpcyByZXBvcnQgYW5hbHlzZXMgZGF0YSBmcm9tIDIgY2FwdHVyZS1yZWNhcHR1cmUgc2Vzc2lvbnMgaW4gTWlyb3NsYXYNCmR1cmluZyB0aGUgMjAyMCBzcHJpbmcgaW4gb3JkZXIgdG8gY2FsY3VsYXRlIHRoZSBkZW5zaXR5IG9mIHRoZQ0KcG9wdWxhdGlvbi4NCg0KU2Vzc2lvbiAxIHJ1biBmcm9tIDIzLDI3IG9mIEFwcmlsIHRvIE1heSAxc3QgKDYgb2NjYXNpb25zKS4NCg0KU2Vzc2lvbiAyIHJ1biBmcm9tIDE4IC0gMjIgb2YgTWF5ICg1IG9jY2FzaW9ucykuDQoNCihOb3RlOiBObyBwcm9ibGVtIHdpdGggZGlmZmVyZW50IG4gb2Ygb2NjYXNpb25zIGFjY29yZGluZyB0byBNdXJyYXkNCjxodHRwOi8vd3d3LnBoaWRvdC5vcmcvZm9ydW0vdmlld3RvcGljLnBocD9mPTM2JnQ9MzI2MD4pDQoNCmBgYHtyIGdsb2JhbC1vcHRpb25zLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCByZXN1bHRzPSJoaWRlIn0NCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aD02LCBmaWcuYXNwID0gMC42MTgsIGZpZy5wYXRoPSdGaWdzLycsDQogICAgICAgICAgICAgICAgICAgICAgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFKQ0KDQpvcHRpb25zKGFsbG93X2h0bWxfaW5fYWxsX291dHB1dHM9VFJVRSkNCmBgYA0KDQojIExpYnJhcmllcw0KDQpgYGB7ciByZXN1bHRzPSJoaWRlIn0NCg0KcGFjbWFuOjpwX2xvYWQodGlkeXZlcnNlLGdncGxvdDIsIGphbml0b3IsIGRhdGEudGFibGUsIGhlcmUsIHJpbywga2FibGVFeHRyYSwgZ2dzdGF0c3Bsb3QsIGx1YnJpZGF0ZSwNCiAgICAgICAgICAgIHNlY3IpDQoNCmBgYA0KDQojIFRpZHlpbmcgZGF0YQ0KDQpTYXZlZCBhbmQgZWRpdGVkIHR3byB0eHQgZmlsZXMgZnJvbSB0aGUgb3JpZ2luYWwgZGF0YSBkaXJlY3RseSBpbiBleGNlbA0KKHNhY3JpbGVnZSEpOiBjYXB0dXJlcyBhbmQgdHJhcHMuDQoNCi0gICBFbGltaW5hdGVkIHNldmVyYWwgY29sdW1ucyB0aGF0IHdlIHdvbid0IHVzZSBpbiB0aGlzIGFuYWx5c2lzDQoNCi0gICBTZWxlY3RlZCBvbmx5IGNhcHR1cmVzIGluIHRoZSB0cmFwcyB1c2VkIGZvciBDUi4NCg0KLSAgIERlbGV0ZWQgb25lIGNhcHR1cmUgb2YgYSBmZW1hbGUgd2l0aG91dCBjb2xsYXIsIGEgc2luZ2xlIGNhcHR1cmUgaW4NCiAgICBiZXR3ZWVuIHNlc3Npb25zLCBhbmQgdHdvIGNhcHR1cmVzIHdpdGhvdXQgY29sbGFyIGNvZGUuDQoNCi0gICBSZWNvZGVkIHRoZSBzZXNzaW9ucywgd2hpY2ggd2VyZSBjb2RlZCBhcyBldmVyeSBzaW5nbGUgZGF5LCBpbnRvDQogICAgc2Vzc2lvbnMgMSBhbmQgMi4gKHdpdGhpbiBlYWNoIHNlc3Npb24gd2UgY2FuIGNvbnNpZGVyIHRoZQ0KICAgIHBvcHVsYXRpb24gYXMgY2xvc2VkLCBidXQgZGVhdGhzIGFuZCBiaXJ0aHMgY2FuIGhhcHBlbiBiZXR3ZWVuDQogICAgc2Vzc2lvbnMpLg0KDQotICAgUmVuYW1lZCB0aGUgdmFyaWFibGUgIlVuaXF1ZSBJRCIgYXMgIm9jY2FzaW9uIiBhbmQgcmVjb2RlZCBpdCAtIG5vdywNCiAgICBjb3JyZWN0bHkgLSBhcyBlYWNoIGRheSBhcyBhbiBvY2Nhc2lvbi4NCg0KLSAgIFJlbmFtZWQgdGhlIENvbGxhciBJRCB2YXJpYWJsZSBhcyBjYXB0dXJlaWQuIFdlJ2xsIHVzZSB0aGUgY29sbGFyDQogICAgY29kZSB0aGlzIHRpbWUsIGJ1dCB3ZSBuZWVkIGFuIGluZGl2aWR1YWwgdW5pcXVlIGNvZGUgZm9yIGVhY2gNCiAgICBhbmltYWwgYWNyb3NzIHNlYXNvbnMgYW5kIGhvcGVmdWxseSBhY3Jvc3MgeWVhcnMgaWYgdGhlIGNvbGxhcnMgc3RheQ0KICAgIG9uIHRoZSBzdXNsaWtzIGFmdGVyIGhpYmVybmF0aW9uLg0KDQotICAgVXNlZCB0aGUgc2FtZSB0cmFwIGxheW91dCBmcm9tIGxhc3QgeWVhciBhbmQgYWRkZWQgY2hhcmFjdGVyIDAgdG8NCiAgICBzaW5nbGUgZGlnaXQgdHJhcHMgaWRzIG9uIHRoZSBjYXB0dXJlIGZpbGUgdG8gbWF0Y2ggdGhlIHRyYXAgZmlsZQ0KDQojIEFuYWx5c2lzDQoNCldlIGNvbWJpbmUgdGhlIGluZm9ybWF0aW9uIG9idGFpbmVkIGZyb20gb3VyIGNhcHR1cmVzIGFuZCB0aGUgdHJhcA0KbG9jYXRpb25zIHRvIGNyZWF0ZSB0aGUgY2FwdGhpc3QgZmlsZS4gVGhlIGFuYWx5c2lzIHdhcyBwZXJmb3JtZWQgdXNpbmcNCnRoZSBwYWNrYWdlICdzZWNyJyB2ZXJzaW9uIDQuMy4zIGFuZCBSIGByIGdldFJ2ZXJzaW9uKClgLg0KDQpgYGB7ciBjYXB0aGlzdH0NCg0KbXVsdGkgPC0gcmVhZC5jYXB0aGlzdChoZXJlKCJkYXRhIiwgImNhcHR1cmVzLnR4dCIpLCBoZXJlKCJkYXRhIiwgInRyYXBzLnR4dCIpLCBkZXRlY3RvciA9ICJwcm94aW1pdHkiKSAjVGhlIOKAnHByb3hpbWl0eeKAnSBkZXRlY3RvciB0eXBlIGFsbG93cywgYXQNCiMgbW9zdCwgb25lIGRldGVjdGlvbiBvZiBlYWNoIGluZGl2aWR1YWwgYXQgYSBwYXJ0aWN1bGFyIGRldGVjdG9yIG9uIGFueSBvY2Nhc2lvbiAoaS5lLiwNCiMgaXQgaXMgZXF1aXZhbGVudCB0byB3aGF0IHdlIGNhbGwgdGhlIEJlcm5vdWxsaSBvciBiaW5vbWlhbCBlbmNvdW50ZXIgcHJvY2VzcyBtb2RlbCwNCiMgb3IgbW9kZWwgU0NSMCkuDQoNCnN1bW1hcnkobXVsdGkpDQoNCg0KYGBgDQoNCipuIG51bWJlciBvZiBkaXN0aW5jdCBpbmRpdmlkdWFscyBkZXRlY3RlZCBvbiBlYWNoIG9jY2FzaW9uIHRcDQoqdSBudW1iZXIgb2YgaW5kaXZpZHVhbHMgZGV0ZWN0ZWQgZm9yIHRoZSBmaXJzdCB0aW1lIG9uIGVhY2ggb2NjYXNpb24gdFwNCipmIG51bWJlciBvZiBpbmRpdmlkdWFscyBkZXRlY3RlZCBvbiBleGFjdGx5IHQgb2NjYXNpb25zXA0KKk0odCsxKSBjdW11bGF0aXZlIG51bWJlciBvZiBkZXRlY3RlZCBpbmRpdmlkdWFscyBvbiBlYWNoIG9jY2FzaW9uIHQNCg0KIyMgVHJhcCBhcnJheSBhbmQgY29uc2VjdXRpdmUgY2FwdHVyZXMgb2YgZWFjaCBpbmRpdmlkdWFsDQoNCmBgYHtyfQ0KcGFyKG1mcm93ID0gYygxLDEpLCBtYXIgPSBjKDEsMSwxLDEpKSAjIHJlZHVjZSBtYXJnaW5zDQpwbG90IChtdWx0aSwgdHJhY2tzID0gVFJVRSwgZ3JpZHNwID0gNSxib3JkZXIgPSAxMCkNCiAgICAgIA0KDQpgYGANCg0KVGhlIG1vc3QgaW1wb3J0YW50IGluc2lnaHQgZnJvbSB0aGVzZSBmaWd1cmVzIGlzIHRoYXQgaW5kaXZpZHVhbHMgdGVuZA0KdG8gYmUgcmVjYXB0dXJlZCBuZWFyIHRoZWlyIHNpdGUgb2YgZmlyc3QgY2FwdHVyZS4gVGhpcyBpcyBleHBlY3RlZCB3aGVuDQp0aGUgaW5kaXZpZHVhbHMgb2YgYSBzcGVjaWVzIG9jY3VweSBob21lIHJhbmdlcy4gSW4gU0VDUiBtb2RlbHMgdGhlDQp0ZW5kZW5jeSBmb3IgZGV0ZWN0aW9ucyB0byBiZSBsb2NhbGlzZWQgaXMgcmVmbGVjdGVkIGluIHRoZSBzcGF0aWFsDQpzY2FsZSBwYXJhbWV0ZXIgz4MuDQoNCiMjIFN1Y2Nlc3NpdmUgdHJhcC1yZXZlYWxlZCBtb3ZlbWVudHMgYW5kIGRpc3RhbmNlcyANCg0KYGBge3J9DQptIDwtIHVubGlzdChtb3ZlcyhtdWx0aSkpDQpwYXIobWFyID0gYygzLjIsNCwxLDEpLCBtZ3AgPSBjKDIuMSwwLjYsMCkpICMgcmVkdWNlIG1hcmdpbnMNCmhpc3QobSwgYnJlYWtzID0gc2VxKDAvNSwgNTAsNSksIHhsYWIgPSAiTW92ZW1lbnQgbSIsIG1haW4gPSAiIikNCmBgYA0KDQpXZSB3aWxsIGVtcGxveSB0aGUgZXN0aW1hdGUgb2YgdGhlIHNwYXRpYWwgc2NhbGUgz4MgZnJvbSAyMDE5DQooNi4yMSkgdG8gZml0IHRoZSBzaW1wbGVzdCBwb3NzaWJsZSBTRUNSIG1vZGVsIHdpdGggZnVuY3Rpb24gc2Vjci5maXQuDQoNCmBgYHtyfQ0KZml0IDwtIHNlY3IuZml0IChtdWx0aSwgYnVmZmVyID0gNCAqIDYuMjEsIHRyYWNlID0gRkFMU0UsYmlhc0xpbWl0ID0gTkEsIHZlcmlmeSA9IEZBTFNFKQ0KDQpkZXRlY3Rvcih0cmFwcyhtdWx0aSkpIDwtICJwcm94aW1pdHkiDQoNCmZpdA0KYGBgDQoNClRoZSByZXBvcnQgY29tcHJpc2VzOlwNCuKAoiBmdW5jdGlvbiBjYWxsIGFuZCB0aW1lIHN0YW1wXA0K4oCiIHN1bW1hcnkgb2YgdGhlIGRhdGFcDQrigKIgZGVzY3JpcHRpb24gb2YgdGhlIG1vZGVsLCBpbmNsdWRpbmcgdGhlIG1heGltaXplZCBsb2cgbGlrZWxpaG9vZCwNCkFrYWlrZSdzIEluZm9ybWF0aW9uIENyaXRlcmlvbiBBSUNcDQrigKIgZXN0aW1hdGVzIG9mIG1vZGVsIGNvZWZmaWNpZW50cyAoYmV0YSBwYXJhbWV0ZXJzKVwNCuKAoiBlc3RpbWF0ZXMgb2YgdmFyaWFuY2UtY292YXJpYW5jZSBtYXRyaXggb2YgdGhlIGNvZWZmaWNpZW50c1wNCuKAoiBlc3RpbWF0ZXMgb2YgdGhlICdyZWFsJyBwYXJhbWV0ZXJzDQoNCi4gVGhlIGVzdGltYXRlZCBkZW5zaXR5IGlzIDE1OC41OCBzdXNsaWtzIHBlciBoZWN0YXJlLCA5NSUgY29uZmlkZW5jZQ0KaW50ZXJ2YWwgMTAyLTI0NiBzdXNsaWtzIHBlciBoZWN0YXJlXA0KLiBUaGUgb3RoZXIgdHdvIHJlYWwgcGFyYW1ldGVycyBqb2ludGx5IGRldGVybWluZSB0aGUgZGV0ZWN0aW9uDQpmdW5jdGlvbiwgcGxvdHRlZCBiZWxvdyB3aXRoIDk1JSBjb25maWRlbmNlIGxpbWl0cw0KDQpgYGB7cn0NCnBhcihtYXIgPSBjKDQsNCwxLDEpKSAjIHJlZHVjZSBtYXJnaW5zDQpwbG90KGZpdCwgbGltaXRzID0gVFJVRSkNCg0KDQpgYGANCg0KVGhlIHRoZW9yeSBvZiBTRUNSIHRlbGxzIHVzIHRoYXQgYnVmZmVyIHdpZHRoIGlzIG5vdCBjcml0aWNhbCBhcyBsb25nIGFzDQppdCBpcyB3aWRlIGVub3VnaCB0aGF0IGFuaW1hbHMgYXQgdGhlIGVkZ2UgaGF2ZSBlZmZlY3RpdmVseSB6ZXJvIGNoYW5jZQ0Kb2YgYXBwZWFyaW5nIGluIG91ciBzYW1wbGUuV2UgY2hlY2sgdGhhdCBmb3IgdGhlIHByZXNlbnQgbW9kZWwgd2l0aCB0aGUNCmZ1bmN0aW9uIGVzYS5wbG90Lg0KDQpUaGUgZXN0aW1hdGVkIGRlbnNpdHkgaGFzIGVhc2lseSByZWFjaGVkIGEgcGxhdGVhdSBhdCB0aGUgY2hvc2VuIGJ1ZmZlcg0Kd2lkdGggKGRhc2hlZCByZWQgbGluZSk6DQoNCmBgYHtyfQ0KZXNhLnBsb3QoZml0KQ0KYWJsaW5lKHYgPSA0ICogNi4yMSwgbHR5ID0gMiwgY29sID0gJ3JlZCcpDQoNCmBgYA0KDQojIyBIb21lcmFuZ2VzDQoNCk1lYW4gZGlzdGFuY2UgaW4gbWV0ZXJzLCBiZXR3ZWVuIGNvbnNlY3V0aXZlIGNhcHR1cmUgbG9jYXRpb25zLCBwb29sZWQNCm92ZXIgaW5kaXZpZHVhbHMsIHBlciBjYXB0dXJlIHNlc3Npb24gKGUuZy4gRWZmb3JkIDIwMDQpLg0KDQpgYGB7ciB9DQpkYmFyKG11bHRpLCB1c2VyZGlzdCA9IE5VTEwsIG1hc2sgPSBOVUxMKQ0KDQpgYGANCg0KTU1ETSAoZm9yICdNZWFuIE1heGltdW0gRGlzdGFuY2UgTW92ZWQnKSBpcyB0aGUgYXZlcmFnZSBtYXhpbXVtIGRpc3RhbmNlDQooaW4gbSkgYmV0d2VlbiBkZXRlY3Rpb25zIG9mIGVhY2ggaW5kaXZpZHVhbCBpLmUuIHRoZSBvYnNlcnZlZCByYW5nZQ0KbGVuZ3RoIGF2ZXJhZ2VkIG92ZXIgaW5kaXZpZHVhbHMgKE90aXMgZXQgYWwuIDE5NzgpLg0KDQpgYGB7cn0NCg0KTU1ETShtdWx0aSwgbWluLnJlY2FwdCA9IDEsIGZ1bGwgPSBGQUxTRSwgdXNlcmRpc3QgPSBOVUxMLCBtYXNrID0gTlVMTCkNCg0KYGBgDQoNClJQU1YgKGZvciAnUm9vdCBQb29sZWQgU3BhdGlhbCBWYXJpYW5jZScpIGlzIGEgbWVhc3VyZSBvZiB0aGUgMi1EDQpkaXNwZXJzaW9uIG9mIHRoZSBsb2NhdGlvbnMgYXQgd2hpY2ggaW5kaXZpZHVhbCBhbmltYWxzIGFyZSBkZXRlY3RlZCwNCnBvb2xlZCBvdmVyIGluZGl2aWR1YWxzIChjZiBDYWxob3VuIGFuZCBDYXNieSAxOTU4LCBTbGFkZSBhbmQgU3dpaGFydA0KMTk4MykuDQoNCmBgYHtyfQ0KUlBTVihtdWx0aSwgQ0MgPSBGQUxTRSkNCmBgYA0K