1 Objectives

In this tutorial, we present the post-processed eye-tracking and EEG data of Coco, Nuthmann & Dimigen (2019) and walk the readers through the descriptive statistics of our eye-tracking data, as well as, the second-level of analysis of our result section.

This tutorial is divided into three main sections. In the first one, we look at the descriptive statistics about the eye-movement behavior and the bounding box surrounding the target object. In the second one, we will be looking at the measures extracted from the eye-tracking data, and in the third one instead, at the EEG data both ERP-stimulus locked and fixation-related potentials of interest. Of the EEG data, we will not present the Threshold-Free cluster enhancement results as they were computed using Matlab.

Before starting though, we need to load the libraries and the data that we are going to use.

library(lme4)     ## for linear-mixed effect modeling
library(lmerTest) ## to do model selection and calculate the p-values 
library(gplots)   ## for plotting
library(reshape)  ## to reshape the data
library(ez)       ## to run classic ANOVA analyses

load("C:/Users/mcoco/Dropbox/Writing/CND/R2/OSF_files/data.RData")

2 Eye-tracking data

In Table 1 of the manuscript, we report some descriptive results (mean and standard deviation) for the eye-movement behavior in the task and properties of the target object.

We will use four different datasets for this section:

  • fixation_features: storing characteristics of fixation relative to their type and the target object.
    • fix_dur : fixation duration in ms
    • fixix : ordinal number of first fixation
    • in_sacamp : incoming saccade amplitude in degrees of visual angle
    • target : the type of fixation
      • pst : t + 1
      • pt : t - 1
      • pt2 : t - 2
      • t : t
    • consistency : the semantic consistency of the target object
    • d : the distance from the closest edge of the target object
  • nr_refix : re-fixation behavior on the target object
    • nrfix : number of refixations
    • duration : fixation duration in ms
    • consistency : the semantic consistency of the target object
  • after_contingency: eye-movement responses after first encountering the target object until the end of the study phase
    • nrfix: number of fixations
    • duration: fixation duration in ms
  • boundingbox: low-level properties of the bounding box surrounding the target object
    • scene: the ID of the photograph
    • distcent_vis: distance of the target object center from screen center in degrees of visual angle
    • saliency: mean visual saliency as computed using the AWS model
    • area_vis: area size in degrees of visual angle squared
    • width_vis: the width of the bounding box in degrees of visual angle
    • height_vis: the height of the bounding box in degrees of visual angle
    • consistency: the consistency of the target object

First, let’s look at the very first fixation on the critical target

# extract only the descriptive stats of the fixation on the target object
firstfix = subset(fixation_features, fixation_features$target == "t")

# ordinal number of first fixation on the target
with(firstfix, tapply(fixix, list(consistency), mean))
##        c        i 
## 6.725064 5.176606
with(firstfix, tapply(fixix, list(consistency), sd))
##        c        i 
## 6.024570 5.343164

Now, we look at the duration of each fixation type, the incoming saccade amplitude that brought that fixation, and the distance of such fixations from the bounding box. We also look at the re-fixation behavior on the target.

# duration of the target fixations
with(fixation_features, tapply(fix_dur, list(target, consistency), mean))
##            c        i
## pst 245.3317 243.7477
## pt  207.6553 197.0505
## pt2 220.7263 212.9127
## t   261.6413 263.3079
with(fixation_features, tapply(fix_dur, list(target, consistency), sd))
##             c         i
## pst 148.92642 146.67208
## pt   96.02076  91.83283
## pt2 105.07910  95.06892
## t   146.78624 136.29250
## incoming saccade amplitudes
with(fixation_features, tapply(in_sacamp, list(target, consistency), mean, na.rm = T))
##            c         i
## pst 9.506156 10.163270
## pt  6.149894  5.990658
## pt2 5.880484  6.103110
## t   8.462598  8.277136
with(fixation_features, tapply(in_sacamp, list(target, consistency), sd, na.rm = T))
##            c        i
## pst 5.866331 5.813715
## pt  5.196002 4.850780
## pt2 4.804712 4.717461
## t   5.165782 4.886340
## distances of fixations from bounding box closest edge
with(fixation_features, tapply(d, list(target, consistency), mean))
##             c         i
## pst  7.860970  8.142223
## pt   6.771015  6.302465
## pt2 10.299516  9.386965
## t   -1.180603 -1.441000
with(fixation_features, tapply(d, list(target, consistency), sd))
##            c         i
## pst 6.171721 6.0437775
## pt  5.757710 5.3272929
## pt2 6.324626 6.3745749
## t   2.143717 0.8807079
## refixation behavior
with(nr_refix, tapply(nrfix, list(consistency), mean, na.rm = T))
##        c        i 
## 1.762615 2.211222
with(nr_refix, tapply(nrfix, list(consistency), sd, na.rm = T))
##        c        i 
## 2.029261 2.059923
with(nr_refix, tapply(duration, list(consistency), mean, na.rm = T))
##        c        i 
## 238.9412 250.1554
with(nr_refix, tapply(duration, list(consistency), sd, na.rm = T))
##        c        i 
## 121.8081 135.6975

Let see what happens from when the participants made a saccade out of the target object, and triggered the gaze contingency mechanisms, until the study phase ends.

## Number of fixations after first encountering target object until the end of the study phase
with(after_contingency, tapply(nrfix, list(consistency), mean, na.rm = T))
##        c        i 
## 7.341731 7.255072
with(after_contingency, tapply(nrfix, list(consistency), sd, na.rm = T))
##        c        i 
## 2.144162 1.742696
## after contingency fixation duration
with(after_contingency, tapply(duration, list(consistency), mean, na.rm = T))
##        c        i 
## 254.6405 251.6742
with(after_contingency, tapply(duration, list(consistency), sd, na.rm = T))
##        c        i 
## 120.4519 118.8510

Finally, let’s examine the properties of the bounding box that surrounded the target object.

## distance of bounding box from the center of the screen 
with(boundingbox, tapply(distcent_vis, list(consistency), mean))
##        c        i 
## 12.13071 11.67111
with(boundingbox, tapply(distcent_vis, list(consistency), sd))
##        c        i 
## 2.769445 2.979903
## mean saliency of bounding box (AWS model)
with(boundingbox, tapply(saliency, list(consistency), mean))
##         c         i 
## 0.3595237 0.3718273
with(boundingbox, tapply(saliency, list(consistency), sd))
##         c         i 
## 0.1679568 0.1603509
## width of the bounding box
with(boundingbox, tapply(width_vis, list(consistency), mean))
##        c        i 
## 6.083125 6.136018
with(boundingbox, tapply(width_vis, list(consistency), sd))
##        c        i 
## 1.961227 2.139699
## height of the bounding box
with(boundingbox, tapply(height_vis, list(consistency), mean))
##        c        i 
## 5.137755 5.386191
with(boundingbox, tapply(height_vis, list(consistency), sd))
##        c        i 
## 1.790017 2.166007
## the area size
with(boundingbox, tapply(area_vis, list(consistency), mean))
##        c        i 
## 16.15426 17.33353
with(boundingbox, tapply(area_vis, list(consistency), sd))
##         c         i 
##  8.744652 11.366291

After having investigated the descriptive patters of eye-movement behavior in the task, and some of the target object properties, let’s have a look at the dependent measures of the eye-tracking data (Table 2 and Table 3) that we have further analysed:

## load the data
str(ET)
## 'data.frame':    3318 obs. of  8 variables:
##  $ subj           : int  3 3 3 3 3 3 3 3 3 3 ...
##  $ trial          : int  5 6 7 9 12 13 14 15 16 17 ...
##  $ scene          : Factor w/ 192 levels "bathroom_1","bathroom_10",..: 135 152 126 73 84 127 119 41 103 8 ...
##  $ consistency    : Factor w/ 2 levels "c","i": 1 1 2 1 1 2 2 2 2 1 ...
##  $ FIXNR_FIRSTFIX : int  8 2 1 17 4 2 7 6 30 2 ...
##  $ FIRSTFIX_ON_OBJ: int  0 0 1 0 0 0 0 0 0 0 ...
##  $ TIME_FIRSTFIX  : int  1851 646 388 5183 1138 560 1880 1624 7516 389 ...
##  $ GD             : int  528 313 337 143 640 307 616 653 261 647 ...

The eye-tracking data consists of 3,318 unique trials, 1,567 for the consistent condition and 1,751 for the inconsistent condition. Per participant, this corresponded to an average of 65.3 trials (SD = 6.9, range = 48-78) for consistent and 73.0 trials (SD = 6.9, range = 59-82) for inconsistent items.

inter = with(ET, table(subj, consistency)) ## take frequencies
apply(inter, 2, mean)
##        c        i 
## 65.29167 72.95833
apply(inter, 2, sd)
##        c        i 
## 6.893470 6.855522
apply(inter, 2, range)
##       consistency
##         c  i
##   [1,] 48 59
##   [2,] 78 82
head(ET)
##   subj trial      scene consistency FIXNR_FIRSTFIX FIRSTFIX_ON_OBJ
## 1    3     5   filler_9           c              8               0
## 2    3     6 kitchen_19           c              2               0
## 3    3     7  filler_81           i              1               1
## 4    3     9  filler_33           c             17               0
## 5    3    12  filler_43           c              4               0
## 6    3    13  filler_82           i              2               0
##   TIME_FIRSTFIX  GD
## 1          1851 528
## 2           646 313
## 3           388 337
## 4          5183 143
## 5          1138 640
## 6           560 307

Along the columns of the dataframe, we have organized the following variables:

  • subj: the subj ID
  • trial: the trial number
  • scene: the identifier for the scene that was looked at during the study phase
  • consistency: the consistency of the target object (c = consistent, i = inconsistent)
  • FIXNR_FIRSTIFX: the ordinal nr. of first fixation on target
  • FIRSTFIX_ON_OBJ: a binomial indicating whether the target object was fixated immediately after the scene onset
  • TIME_FIRSTFIX: the latency to first fixation on the target object
  • GD: the gaze duration on the target object

We will also create a centred version of the consistency variable and code it to range, approximately, between -.5 and .5 that will be used as predictor in the linear-mixed effect models.

ET$consistencyC = as.numeric(as.factor(ET$consistency))
ET$consistencyC = ET$consistencyC - mean(ET$consistencyC, na.rm = T) 
cbind(as.character(ET$consistency[1:10]), ET$consistencyC[1:10])
##       [,1] [,2]                
##  [1,] "c"  "-0.527727546714889"
##  [2,] "c"  "-0.527727546714889"
##  [3,] "i"  "0.472272453285111" 
##  [4,] "c"  "-0.527727546714889"
##  [5,] "c"  "-0.527727546714889"
##  [6,] "i"  "0.472272453285111" 
##  [7,] "i"  "0.472272453285111" 
##  [8,] "i"  "0.472272453285111" 
##  [9,] "i"  "0.472272453285111" 
## [10,] "c"  "-0.527727546714889"

2.1 Cumulative probability of first fixation

We begin by computing and plotting the cumulative distribution of the ordinal number of fixations for consistent and inconsistent objects respectively. We will exclude the values that are higher than the 99% of the distribution.

## get the quantile and look at the ordinal nr. of fixation that is over 99% of the distribution
qnt = quantile(ET$FIXNR_FIRSTFIX, seq(0,1,.01))

mxfix   = as.numeric(qnt[which(names(qnt) == "99%")]) ## maximum number of ordinal fixations considered

cset = subset(ET$FIXNR_FIRSTFIX, ET$consistency == "c")
iset = subset(ET$FIXNR_FIRSTFIX, ET$consistency == "i")

cf  = ecdf(cset)
cf  = cf(1:mxfix)
inf = ecdf(iset)
inf = inf(1:mxfix)

visualize it:

alpha = .05 ## set alpha values for plotting

plot(1:mxfix, cf, ylim = c(0,1), col = 'blue4', lty = 1, 
     lwd = 5, cex = 1.8, pch = 20, type = 'b',
     ylab = 'Cumulative Probability of Target Fixation', 
     xlab = 'Ordinal fixation number')

lines(1:mxfix, inf, ylim = c(0,1), col = 'red4', 
      lwd = 5, cex = 1.8, lty = 2, type = 'b', pch = 15)

legend('bottomright', c('Consistent Object', 'Inconsistent Object'),
       col = c('blue4', 'red4'), lty = c(1,2), pch = c(20,15), 
       cex = 1.5, bty = 'n')
grid()

Then, in order to apply a generalized linear model to the ordinal number of fixations we need to slightly reshape the data, and calculate a frequency count to then compute a probit model. We do this separately for the conditions of object consistency.

cond = unique(ET$consistency)
c = cond[1]; 

freqprob = vector()
for (c in cond){
  print(c)
  fixc = vector()
  sset = subset(ET, ET$consistency == c)
  cump = ecdf(sset$FIXNR_FIRSTFIX)
  for (s in 1:mxfix){
    ixfix = length(which(sset$FIXNR_FIRSTFIX == s))
    fixc = c(fixc, ixfix) 
  }
  
  freqprob = cbind(freqprob, fixc, deparse.level = 0)
}
## [1] "c"
## [1] "i"
freqprob = as.data.frame(freqprob)
colnames(freqprob) = c("Consistent", "Inconsistent")
freqprob$timepoint = 1:mxfix

totn = table(ET$consistency) ## get the total nr. of points 

M           = melt(id = c('timepoint'), data = freqprob)
M$r         = c(rep(totn[1], mxfix),  rep(totn[2], mxfix)) - M$value
M$timepoint = as.numeric(as.matrix(M$timepoint))
M$value     = as.numeric(as.matrix(M$value))
M$x         = M$timepoint/max(M$timepoint)
head(M)
##   timepoint   variable value    r          x
## 1         1 Consistent   148 1419 0.03571429
## 2         2 Consistent   246 1321 0.07142857
## 3         3 Consistent   192 1375 0.10714286
## 4         4 Consistent   172 1395 0.14285714
## 5         5 Consistent   114 1453 0.17857143
## 6         6 Consistent   114 1453 0.21428571

and now, let’s run the model:

model <- glm(cbind(value, r) ~  x*variable, data = M, family = binomial(probit))
summary(model)
## 
## Call:
## glm(formula = cbind(value, r) ~ x * variable, family = binomial(probit), 
##     data = M)
## 
## Deviance Residuals: 
##    Min      1Q  Median      3Q     Max  
## -4.683  -1.588  -0.031   1.863  10.258  
## 
## Coefficients:
##                        Estimate Std. Error z value Pr(>|z|)    
## (Intercept)            -1.04102    0.02073 -50.207  < 2e-16 ***
## x                      -2.02374    0.05708 -35.455  < 2e-16 ***
## variableInconsistent    0.17183    0.02909   5.907 3.49e-09 ***
## x:variableInconsistent -0.71673    0.08891  -8.062 7.53e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 5140.51  on 55  degrees of freedom
## Residual deviance:  389.73  on 52  degrees of freedom
## AIC: 676.24
## 
## Number of Fisher Scoring iterations: 5
confint(model)
##                             2.5 %     97.5 %
## (Intercept)            -1.0814693 -1.0006846
## x                      -2.1356545 -1.9139428
## variableInconsistent    0.1155082  0.2281842
## x:variableInconsistent -0.8877653 -0.5464493

Table 2 of the manuscripts also reports the corresponding GLM model coefficients. We found a significant main effect of Consistency; overall, inconsistent objects were looked at with a higher probability than consistent objects. As expected, the cumulative probability of looking at the critical object increased as a function of the Ordinal Number of Fixation (i.e., x here). There was also a significant interaction between the two variables.

2.2 Probability of immediate fixation

Now, we examine the very first eye-movement during scene exploration to assess whether observers had immediate extrafoveal access to object-scene semantics, i.e., the probability of immediate fixation. The mean probability of immediate object fixation was 12.92

with(ET, mean(FIRSTFIX_ON_OBJ))*100
## [1] 12.92948

Visualize it:

mean <- with(ET, tapply(FIRSTFIX_ON_OBJ, list(consistency, subj), mean))
ymax = max(mean)

M = as.data.frame(cbind(c(mean[1,], mean[2,]), 
                        c(rep("Consistent", ncol(mean)), 
                          rep("Inconsistent", ncol(mean))), 
                        deparse.level = 0),
                  check.names = FALSE,
                  row.names = FALSE)

colnames(M) = c("value", "consistency")

M[,1] = as.numeric(as.matrix(M[,1]))

boxplot(value ~ consistency, data = M, 
        col = c("blue4", "red4"),
        ylab = "Probability of Immediate Fixation",
        cex.lab = 1.3,
        cex.axis = 1.8,
        ylim     = c(0, ymax*1.1))

and now run the LME model:

mod = glmer(FIRSTFIX_ON_OBJ ~ consistencyC
            + (1 | subj) + 
              + (1 | scene), 
            data = ET,
            family = 'binomial')

## there are no model for backward reducing GLMER models.
summary(mod)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: FIRSTFIX_ON_OBJ ~ consistencyC + (1 | subj) + +(1 | scene)
##    Data: ET
## 
##      AIC      BIC   logLik deviance df.resid 
##   2191.2   2215.6  -1091.6   2183.2     3314 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -1.8467 -0.3463 -0.2059 -0.1395  5.3468 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  scene  (Intercept) 2.2296   1.4932  
##  subj   (Intercept) 0.2066   0.4545  
## Number of obs: 3318, groups:  scene, 192; subj, 24
## 
## Fixed effects:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   -2.8194     0.1836 -15.358   <2e-16 ***
## consistencyC   0.2186     0.1582   1.381    0.167    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC 0.033

2.3 Latency to first fixation

The latency to first fixation on the target object is another measure to capture the potency of an object in attracting early attention in extrafoveal vision. This measure is defined as the time elapsed between the onset of the scene image and the first fixation on the critical object.

Visualize:

mean <- with(ET, tapply(TIME_FIRSTFIX, list(consistency, subj), mean, na.rm = TRUE))
ymax = max(mean, na.rm = TRUE)
ymin = min(mean, na.rm = TRUE)

M = as.data.frame(cbind(c(mean[1,], mean[2,]), 
                        c(rep("Consistent", ncol(mean)), 
                          rep("Inconsistent", ncol(mean))), 
                        deparse.level = 0),
                  check.names = FALSE,
                  row.names = FALSE)

## take out the nas
# M = M[-as.numeric(which(is.na(M[,1]) == TRUE)),]

colnames(M) = c("value", "consistency")

M[,1] = as.numeric(as.matrix(M[,1]))

boxplot(value ~ consistency, data = M, 
        col = c("blue4", "red4"),
        ylab = "Latency to First Fixation",
        cex.lab = 1.3,
        cex.axis = 1.8,
        ylim     = c(ymin, ymax))

model it:

## model the time of first fixation
mod = lmer(TIME_FIRSTFIX ~ consistencyC 
           + (1 | subj) + (1 | scene), 
           data = ET)

summary(mod)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: TIME_FIRSTFIX ~ consistencyC + (1 | subj) + (1 | scene)
##    Data: ET
## 
## REML criterion at convergence: 57632.5
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.9543 -0.5315 -0.1950  0.2507  5.3569 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  scene    (Intercept)  929298   964.0  
##  subj     (Intercept)   11979   109.5  
##  Residual             1801006  1342.0  
## Number of obs: 3318, groups:  scene, 192; subj, 24
## 
## Fixed effects:
##              Estimate Std. Error      df t value Pr(>|t|)    
## (Intercept)   1774.44      77.17  160.37   23.00  < 2e-16 ***
## consistencyC  -246.37      63.99 3197.80   -3.85  0.00012 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC 0.014

The latency was significantly shorter for inconsistent as compared to consistent objects (refer to Figure 3C and Table 3 of the manuscript).

2.4 Gaze duration

First-pass gaze duration is a measure of foveal object processing time, defined as the sum of all fixation duration from first entry to first exit on the critical object. On average, participants looked longer at inconsistent (520 msec) than consistent (409 msec) objects.

with(ET, tapply(GD, list(consistency), mean))
##        c        i 
## 408.5175 519.1650

Visualize:

mean <- with(ET, tapply(GD, list(consistency, subj), mean, na.rm = TRUE))
ymax = max(mean, na.rm = TRUE)
ymin = min(mean, na.rm = TRUE)

M = as.data.frame(cbind(c(mean[1,], mean[2,]), 
                        c(rep("Consistent", ncol(mean)), 
                          rep("Inconsistent", ncol(mean))), 
                        deparse.level = 0),
                  check.names = FALSE,
                  row.names = FALSE)

## take out the nas
# M = M[-as.numeric(which(is.na(M[,1]) == TRUE)),]

colnames(M) = c("value", "consistency")

M[,1] = as.numeric(as.matrix(M[,1]))

boxplot(value ~ consistency, data = M, 
        col = c("blue4", "red4"),
        ylab = "Gaze Duration (First Pass)",
        cex.lab = 1.3,
        cex.axis = 1.8,
        ylim     = c(ymin, ymax))

model it:

mod = lmer(GD ~ consistencyC
           + (1 | subj) + (1 | scene), 
           data = ET)

summary(mod)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: GD ~ consistencyC + (1 | subj) + (1 | scene)
##    Data: ET
## 
## REML criterion at convergence: 48345.7
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.0950 -0.5231 -0.1559  0.3106 26.9541 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  scene    (Intercept)  15222   123.38  
##  subj     (Intercept)   6337    79.61  
##  Residual             115310   339.57  
## Number of obs: 3318, groups:  scene, 192; subj, 24
## 
## Fixed effects:
##              Estimate Std. Error      df t value Pr(>|t|)    
## (Intercept)    455.54      19.52   36.55  23.333  < 2e-16 ***
## consistencyC   105.02      14.83 2053.08   7.082 1.94e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC 0.009

On average, participants looked longer at inconsistent (520 ms) than consistent objects (409 ms) before leaving the target object for the first time, and this difference was significant (refer to Table 3 in the manuscript)

In the next section, we are going to be looking whether the prioritization of an inconsistent object over a consistent object manifests also in the fixation-related potentials time-locked to the fixation preceding the target fixation (i.e., t-1), and whether such an effect carries over throughout fixation t. We also look at the rERP locked at the onset of the scene (s), and at the fixation-related potentials of all non-target fixations (i.e., nt)

3 Electro-physiological results

Results in this tutorial will only focus on the second-level of analysis (group statistics). Specifically, we compare the consistent and inconsistent condition in the time windows from 250-350 ms (early effect) and 350-600 ms (late effect) at a mid-central region-of-interest (ROI) of nine electrodes (comprising FC1, FCz, FC2, C1, Cz, C2, CP1, CPz, and CP2), independently for four types of events: stimulus-locked (s), non-target fixations (nt), pre-target fixations (t-1) and target fixations (t).

Because the output provided by the linear deconvolution model (the first-level analysis) is already aggregated at the level of subject-averages, the only predictor included in these LMMs was the Consistency of the object, along with Participant as random effect, which is included both as intercept, and as random slope of Consistency to make the test more conservative. Then, we utilize the step function from the lmerTest() package to compute the level of significance was calculated from an F-test based on the Satterthwaite approximation to the effective degrees of freedom, as well as, evaluate the random structure of the models to maximize their convergence. Additionally, we report a simple ANOVA analysis, which perfectly corroborates the LME results.

We refer the reader to the manuscript for much greater details about the first-level of analysis, and the pipeline that we have followed to compute the fixation-related potentials.

3.1 Structure of the EEG data

Let’s look at the structure of the EEG data file first.

str(EEG)
## 'data.frame':    3456 obs. of  6 variables:
##  $ subj       : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ consistency: Factor w/ 2 levels "consistent","inconsistent": 1 1 1 1 1 1 1 1 1 1 ...
##  $ type_event : Factor w/ 4 levels "nt","pt","s",..: 4 4 4 4 4 4 4 4 4 4 ...
##  $ segment    : Factor w/ 2 levels "0.250-0.350",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ voltage    : num  0.37406 -0.60501 -1.50245 -0.00127 -1.35604 ...
##  $ electrode  : Factor w/ 9 levels "C1","C2","CP1",..: 7 7 7 7 7 7 7 7 7 7 ...

The EEG/FRP data has been structured along the columns in the following way:

  • subj = the subject ID
  • consistency = the consistency of the target object (consistent, inconsistent)
  • type_event = the type of EEG data analysed, with 4 levels (s = stimulus-onset, nt = non-target, pt = preceding the target, t = target)
  • segment = the temporal windows of interest (0.250-0.350 = early; 0.350-0.600 = late)
  • voltage = the voltage of the EEG recording
  • electrode = the nine electrodes of the mid-central region of interest (comprising FC1, FCz, FC2, C1, Cz, C2, CP1, CPz, and CP2).

To this we add the centred version of the consistency variable.

EEG$consistencyC = as.numeric(as.factor(EEG$consistency))
EEG$consistencyC = EEG$consistencyC - mean(EEG$consistencyC, na.rm = T) 
c(as.character(EEG$consistency[1]), EEG$consistencyC[1])
## [1] "consistent" "-0.5"

We will subset and analyse the relevant type of event and window of interests that are reported in the manuscript (Table 4)

3.2 Scene-onset ERP, s

First, we look at the evoked potentials time-locked to the scene onset for the two temporal windows of interest.

s_early = subset(EEG, EEG$type_event == "s" & EEG$segment == "0.250-0.350")
s_late  = subset(EEG, EEG$type_event == "s" & EEG$segment == "0.350-0.600")

print("Early-Window")
## [1] "Early-Window"
s_e = lmer(voltage ~ consistencyC
           + (1 | subj) + (0 + consistency | subj),
           data = s_early, 
           control=lmerControl(check.conv.singular = .makeCC(action = "ignore",  tol = 1e-4)))

print("LME output")
## [1] "LME output"
summary(s_e)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: voltage ~ consistencyC + (1 | subj) + (0 + consistency | subj)
##    Data: s_early
## Control: lmerControl(check.conv.singular = .makeCC(action = "ignore",  
##     tol = 1e-04))
## 
## REML criterion at convergence: 2489.4
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.1225 -0.6408 -0.1307  0.6284  2.6793 
## 
## Random effects:
##  Groups   Name                    Variance  Std.Dev. Corr
##  subj     (Intercept)             7.819e+00 2.796258     
##  subj.1   consistencyconsistent   1.005e-05 0.003171     
##           consistencyinconsistent 1.454e-05 0.003813 1.00
##  Residual                         1.654e+01 4.067460     
## Number of obs: 432, groups:  subj, 24
## 
## Fixed effects:
##              Estimate Std. Error       df t value Pr(>|t|)    
## (Intercept)   -3.9393     0.6034  22.9999  -6.528 1.16e-06 ***
## consistencyC   0.2802     0.3914 406.9981   0.716    0.475    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC 0.000
s_e_red = step(s_e, ddf = "Satterthwaite", 
                         alpha.random = 0.1, alpha.fixed = 0.08,       
                         reduce.fixed = FALSE, reduce.random = TRUE)

s_e_red    = get_model(s_e_red)


print("LME selected with p-values")
## [1] "LME selected with p-values"
summary(s_e_red)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: voltage ~ consistencyC + (1 | subj)
##    Data: s_early
## Control: lmerControl(check.conv.singular = .makeCC(action = "ignore",  
##     tol = 1e-04))
## 
## REML criterion at convergence: 2489.4
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.1225 -0.6408 -0.1307  0.6284  2.6793 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  subj     (Intercept)  7.819   2.796   
##  Residual             16.544   4.067   
## Number of obs: 432, groups:  subj, 24
## 
## Fixed effects:
##              Estimate Std. Error       df t value Pr(>|t|)    
## (Intercept)   -3.9393     0.6034  23.0000  -6.528 1.16e-06 ***
## consistencyC   0.2802     0.3914 407.0000   0.716    0.475    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC 0.000
aov_s_e = ezANOVA(
  data = s_early
  , dv = voltage
  , wid = subj
  , within = .(consistency))

print("ANOVA output")
## [1] "ANOVA output"
print(aov_s_e)
## $ANOVA
##        Effect DFn DFd        F          p p<.05         ges
## 2 consistency   1  23 3.450846 0.07606891       0.002301984
print("Now Late-Window")
## [1] "Now Late-Window"
s_l = lmer(voltage ~ consistencyC
           + (1 | subj) + (0 + consistency | subj),
           data = s_late,
           control=lmerControl(check.conv.singular = .makeCC(action = "ignore",  tol = 1e-4)))

print("LME output")
## [1] "LME output"
summary(s_l)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: voltage ~ consistencyC + (1 | subj) + (0 + consistency | subj)
##    Data: s_late
## Control: lmerControl(check.conv.singular = .makeCC(action = "ignore",  
##     tol = 1e-04))
## 
## REML criterion at convergence: 2482.5
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -2.13624 -0.66651 -0.09792  0.72287  2.84615 
## 
## Random effects:
##  Groups   Name                    Variance  Std.Dev. Corr
##  subj     (Intercept)             4.249e-05 0.006518     
##  subj.1   consistencyconsistent   4.317e+00 2.077808     
##           consistencyinconsistent 4.787e+00 2.187840 1.00
##  Residual                         1.670e+01 4.086668     
## Number of obs: 432, groups:  subj, 24
## 
## Fixed effects:
##              Estimate Std. Error       df t value Pr(>|t|)    
## (Intercept)   -3.5661     0.4777  22.9931  -7.465 1.38e-07 ***
## consistencyC   0.3483     0.3939 366.3213   0.884    0.377    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC 0.052
s_l_red = step(s_l, ddf = "Satterthwaite", 
                         alpha.random = 0.1, alpha.fixed = 0.08,       
                         reduce.fixed = FALSE, reduce.random = TRUE)

s_l_red    = get_model(s_l_red)


print("LME selected with p-values")
## [1] "LME selected with p-values"
summary(s_l_red)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: voltage ~ consistencyC + (1 | subj)
##    Data: s_late
## Control: lmerControl(check.conv.singular = .makeCC(action = "ignore",  
##     tol = 1e-04))
## 
## REML criterion at convergence: 2482.6
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -2.10818 -0.66949 -0.09964  0.72424  2.84181 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  subj     (Intercept)  4.547   2.132   
##  Residual             16.705   4.087   
## Number of obs: 432, groups:  subj, 24
## 
## Fixed effects:
##              Estimate Std. Error       df t value Pr(>|t|)    
## (Intercept)   -3.5661     0.4776  23.0000  -7.466 1.37e-07 ***
## consistencyC   0.3483     0.3933 407.0000   0.886    0.376    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC 0.000
aov_s_l = ezANOVA(
  data = s_late
  , dv = voltage
  , wid = subj
  , within = .(consistency))

print("ANOVA output")
## [1] "ANOVA output"
print(aov_s_l)
## $ANOVA
##        Effect DFn DFd        F          p p<.05         ges
## 2 consistency   1  23 3.902595 0.06033019       0.005558076

We do not observe any influence of semantic consistency of the target object on the neural response to the initial presentation of the scene in both windows of analysis.

3.3 Non-target fixation, nt

Now, we look at the non-target fixation.

nt_early = subset(EEG, EEG$type_event == "nt" & EEG$segment == "0.250-0.350")
nt_late  = subset(EEG, EEG$type_event == "nt" & EEG$segment == "0.350-0.600")

print("Early-Window")
## [1] "Early-Window"
nt_e = lmer(voltage ~ consistencyC
            + (1 | subj) + (0 + consistency | subj),
            data = nt_early,
            control=lmerControl(check.conv.singular = .makeCC(action = "ignore",  tol = 1e-4)))

print("LME output")
## [1] "LME output"
summary(nt_e)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: voltage ~ consistencyC + (1 | subj) + (0 + consistency | subj)
##    Data: nt_early
## Control: lmerControl(check.conv.singular = .makeCC(action = "ignore",  
##     tol = 1e-04))
## 
## REML criterion at convergence: 516.6
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.4588 -0.5841 -0.0784  0.5698  4.1889 
## 
## Random effects:
##  Groups   Name                    Variance Std.Dev. Corr
##  subj     (Intercept)             0.16081  0.4010       
##  subj.1   consistencyconsistent   0.14727  0.3838       
##           consistencyinconsistent 0.08814  0.2969   0.56
##  Residual                         0.14597  0.3821       
## Number of obs: 432, groups:  subj, 24
## 
## Fixed effects:
##              Estimate Std. Error       df t value Pr(>|t|)    
## (Intercept)  -0.52785    0.10397 22.99976  -5.077 3.85e-05 ***
## consistencyC -0.06077    0.07672 23.00228  -0.792    0.436    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC -0.154
## convergence code: 0
## unable to evaluate scaled gradient
## Model failed to converge: degenerate  Hessian with 1 negative eigenvalues
nt_e_red = step(nt_e, ddf = "Satterthwaite", 
                         alpha.random = 0.1, alpha.fixed = 0.08,       
                         reduce.fixed = FALSE, reduce.random = TRUE)

nt_e_red    = get_model(nt_e_red)


print("LME selected with p-values")
## [1] "LME selected with p-values"
summary(nt_e_red)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: voltage ~ consistencyC + (0 + consistency | subj)
##    Data: nt_early
## Control: lmerControl(check.conv.singular = .makeCC(action = "ignore",  
##     tol = 1e-04))
## 
## REML criterion at convergence: 516.6
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.4588 -0.5841 -0.0784  0.5698  4.1889 
## 
## Random effects:
##  Groups   Name                    Variance Std.Dev. Corr
##  subj     consistencyconsistent   0.3081   0.5550       
##           consistencyinconsistent 0.2489   0.4989   0.81
##  Residual                         0.1460   0.3821       
## Number of obs: 432, groups:  subj, 24
## 
## Fixed effects:
##              Estimate Std. Error       df t value Pr(>|t|)    
## (Intercept)  -0.52785    0.10396 23.00101  -5.077 3.85e-05 ***
## consistencyC -0.06077    0.07672 23.00092  -0.792    0.436    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC -0.154
aov_nt_e = ezANOVA(
  data = nt_early
  , dv = voltage
  , wid = subj
  , within = .(consistency))

print("ANOVA output")
## [1] "ANOVA output"
print(aov_nt_e)
## $ANOVA
##        Effect DFn DFd         F         p p<.05         ges
## 2 consistency   1  23 0.6273906 0.4364079       0.003258092
print("Now Late-Window")
## [1] "Now Late-Window"
nt_l      = lmer(voltage ~ consistencyC
                 + (1 | subj) + (0 + consistency | subj),
                 data = nt_late,
                 control=lmerControl(check.conv.singular = .makeCC(action = "ignore",  tol = 1e-4)))

print("LME output")
## [1] "LME output"
summary(nt_l)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: voltage ~ consistencyC + (1 | subj) + (0 + consistency | subj)
##    Data: nt_late
## Control: lmerControl(check.conv.singular = .makeCC(action = "ignore",  
##     tol = 1e-04))
## 
## REML criterion at convergence: 672.2
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.8719 -0.5579 -0.0300  0.4822  3.3442 
## 
## Random effects:
##  Groups   Name                    Variance Std.Dev. Corr
##  subj     (Intercept)             0.2722   0.5218       
##  subj.1   consistencyconsistent   0.1185   0.3442       
##           consistencyinconsistent 0.0320   0.1789   0.05
##  Residual                         0.2122   0.4606       
## Number of obs: 432, groups:  subj, 24
## 
## Fixed effects:
##              Estimate Std. Error       df t value Pr(>|t|)    
## (Intercept)  -0.45579    0.11602 22.99626  -3.929 0.000672 ***
## consistencyC -0.09661    0.08943 22.99876  -1.080 0.291228    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC -0.174
## convergence code: 0
## Model failed to converge with max|grad| = 0.00370665 (tol = 0.002, component 1)
nt_l_red = step(nt_l, ddf = "Satterthwaite", 
                         alpha.random = 0.1, alpha.fixed = 0.08,       
                         reduce.fixed = FALSE, reduce.random = TRUE)

nt_l_red    = get_model(nt_l_red)


print("LME selected with p-values")
## [1] "LME selected with p-values"
summary(nt_l_red)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: voltage ~ consistencyC + (0 + consistency | subj)
##    Data: nt_late
## Control: lmerControl(check.conv.singular = .makeCC(action = "ignore",  
##     tol = 1e-04))
## 
## REML criterion at convergence: 672.2
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.8719 -0.5579 -0.0300  0.4822  3.3442 
## 
## Random effects:
##  Groups   Name                    Variance Std.Dev. Corr
##  subj     consistencyconsistent   0.3907   0.6250       
##           consistencyinconsistent 0.3042   0.5516   0.80
##  Residual                         0.2122   0.4606       
## Number of obs: 432, groups:  subj, 24
## 
## Fixed effects:
##              Estimate Std. Error       df t value Pr(>|t|)    
## (Intercept)  -0.45579    0.11602 22.99620  -3.929 0.000672 ***
## consistencyC -0.09661    0.08943 23.00054  -1.080 0.291220    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC -0.174
aov_nt_l = ezANOVA(
  data = nt_late
  , dv = voltage
  , wid = subj
  , within = .(consistency))

print("ANOVA output")
## [1] "ANOVA output"
print(aov_nt_l)
## $ANOVA
##        Effect DFn DFd        F         p p<.05         ges
## 2 consistency   1  23 1.166996 0.2912174       0.006520055

Consistency had no effect on the FRP for non-target (nt) fixations in both windows of analysis.

3.4 Pre-target fixation, t-1

Moving onto the fixation-related potential time-locked to the pre-target fixation.

pt_early = subset(EEG, EEG$type_event == "pt" & EEG$segment == "0.250-0.350")
pt_late  = subset(EEG, EEG$type_event == "pt" & EEG$segment == "0.350-0.600")

print("Early-Window")
## [1] "Early-Window"
pt_e = lmer(voltage ~ consistencyC
            + (1 | subj) + (0 + consistency | subj),
            data = pt_early,
            control=lmerControl(check.conv.singular = .makeCC(action = "ignore",  tol = 1e-4)))

print("LME output")
## [1] "LME output"
summary(pt_e)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: voltage ~ consistencyC + (1 | subj) + (0 + consistency | subj)
##    Data: pt_early
## Control: lmerControl(check.conv.singular = .makeCC(action = "ignore",  
##     tol = 1e-04))
## 
## REML criterion at convergence: 1082.8
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -8.4625 -0.5095 -0.0438  0.5212  3.3456 
## 
## Random effects:
##  Groups   Name                    Variance  Std.Dev.  Corr
##  subj     (Intercept)             5.434e-08 0.0002331     
##  subj.1   consistencyconsistent   3.480e-01 0.5898730     
##           consistencyinconsistent 3.455e-01 0.5877536 0.33
##  Residual                         5.838e-01 0.7640382     
## Number of obs: 432, groups:  subj, 24
## 
## Fixed effects:
##              Estimate Std. Error      df t value Pr(>|t|)    
## (Intercept)   -0.8342     0.1046 22.9994  -7.975 4.53e-08 ***
## consistencyC  -0.2799     0.1576 23.0000  -1.776   0.0889 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC -0.003
pt_e_red = step(pt_e, ddf = "Satterthwaite", 
                         alpha.random = 0.1, alpha.fixed = 0.08,       
                         reduce.fixed = FALSE, reduce.random = TRUE)

pt_e_red    = get_model(pt_e_red)


print("LME selected with p-values")
## [1] "LME selected with p-values"
summary(pt_e_red)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: voltage ~ consistencyC + (0 + consistency | subj)
##    Data: pt_early
## Control: lmerControl(check.conv.singular = .makeCC(action = "ignore",  
##     tol = 1e-04))
## 
## REML criterion at convergence: 1082.8
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -8.4625 -0.5095 -0.0438  0.5211  3.3456 
## 
## Random effects:
##  Groups   Name                    Variance Std.Dev. Corr
##  subj     consistencyconsistent   0.3479   0.5898       
##           consistencyinconsistent 0.3454   0.5877   0.33
##  Residual                         0.5838   0.7640       
## Number of obs: 432, groups:  subj, 24
## 
## Fixed effects:
##              Estimate Std. Error      df t value Pr(>|t|)    
## (Intercept)   -0.8342     0.1046 23.0031  -7.975 4.52e-08 ***
## consistencyC  -0.2799     0.1576 23.0024  -1.777   0.0889 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC -0.003
aov_pt_e = ezANOVA(
  data = pt_early
  , dv = voltage
  , wid = subj
  , within = .(consistency))


print("ANOVA output")
## [1] "ANOVA output"
print(aov_pt_e)
## $ANOVA
##        Effect DFn DFd        F          p p<.05        ges
## 2 consistency   1  23 3.155887 0.08888493       0.04731496
print("Now Late-Window")
## [1] "Now Late-Window"
pt_l = lmer(voltage ~ consistencyC
            + (1 | subj) + (0 + consistency | subj),
            data = pt_late,
            control=lmerControl(check.conv.singular = .makeCC(action = "ignore",  tol = 1e-4)))

print("LME output")
## [1] "LME output"
summary(pt_l)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: voltage ~ consistencyC + (1 | subj) + (0 + consistency | subj)
##    Data: pt_late
## Control: lmerControl(check.conv.singular = .makeCC(action = "ignore",  
##     tol = 1e-04))
## 
## REML criterion at convergence: 1150.5
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -10.9245  -0.4486  -0.0203   0.4576   3.4264 
## 
## Random effects:
##  Groups   Name                    Variance Std.Dev. Corr 
##  subj     (Intercept)             0.2663   0.5160        
##  subj.1   consistencyconsistent   0.0287   0.1694        
##           consistencyinconsistent 0.1233   0.3512   -0.49
##  Residual                         0.7080   0.8414        
## Number of obs: 432, groups:  subj, 24
## 
## Fixed effects:
##              Estimate Std. Error      df t value Pr(>|t|)    
## (Intercept)   -0.7292     0.1171 23.0017  -6.226 2.37e-06 ***
## consistencyC  -0.4662     0.1237 23.0028  -3.769 0.000996 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC 0.136 
## convergence code: 0
## unable to evaluate scaled gradient
## Model failed to converge: degenerate  Hessian with 1 negative eigenvalues
pt_l_red = step(pt_l, ddf = "Satterthwaite", 
                         alpha.random = 0.1, alpha.fixed = 0.08,       
                         reduce.fixed = FALSE, reduce.random = TRUE)

pt_l_red    = get_model(pt_l_red)


print("LME selected with p-values")
## [1] "LME selected with p-values"
summary(pt_l_red)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: voltage ~ consistencyC + (0 + consistency | subj)
##    Data: pt_late
## Control: lmerControl(check.conv.singular = .makeCC(action = "ignore",  
##     tol = 1e-04))
## 
## REML criterion at convergence: 1150.5
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -10.9245  -0.4486  -0.0203   0.4576   3.4265 
## 
## Random effects:
##  Groups   Name                    Variance Std.Dev. Corr
##  subj     consistencyconsistent   0.2950   0.5432       
##           consistencyinconsistent 0.3897   0.6242   0.70
##  Residual                         0.7080   0.8414       
## Number of obs: 432, groups:  subj, 24
## 
## Fixed effects:
##              Estimate Std. Error      df t value Pr(>|t|)    
## (Intercept)   -0.7292     0.1171 22.9986  -6.226 2.37e-06 ***
## consistencyC  -0.4662     0.1237 22.9990  -3.769 0.000997 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC 0.136
aov_pt_l = ezANOVA(
  data = pt_late
  , dv = voltage
  , wid = subj
  , within = .(consistency))

print("ANOVA output")
## [1] "ANOVA output"
print(aov_pt_l)
## $ANOVA
##        Effect DFn DFd        F            p p<.05       ges
## 2 consistency   1  23 14.20578 0.0009964811     * 0.1186879

In the LMM analyses conducted on the mid-central ROI, this effect was marginally significant (p < 0.1) for the early time window (250 to 350 ms), but became highly significant between 350 and 600 ms (p < 0.001, Table 4)

3.5 Target fixation, t

Finally, we look at the fixation-related potential during foveation of the target.

t_early = subset(EEG, EEG$type_event == "t" & EEG$segment == "0.250-0.350")
t_late  = subset(EEG, EEG$type_event == "t" & EEG$segment == "0.350-0.600")

print("Early-Window")
## [1] "Early-Window"
t_e = lmer(voltage ~ consistencyC
           + (1 | subj) + (0 + consistency | subj),
           data = t_early,
           control=lmerControl(check.conv.singular = .makeCC(action = "ignore",  tol = 1e-4)))

print("LME output")
## [1] "LME output"
summary(t_e)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: voltage ~ consistencyC + (1 | subj) + (0 + consistency | subj)
##    Data: t_early
## Control: lmerControl(check.conv.singular = .makeCC(action = "ignore",  
##     tol = 1e-04))
## 
## REML criterion at convergence: 1278.9
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -9.6219 -0.4435  0.0110  0.4489  3.8891 
## 
## Random effects:
##  Groups   Name                    Variance Std.Dev. Corr
##  subj     (Intercept)             0.0349   0.1868       
##  subj.1   consistencyconsistent   0.2861   0.5349       
##           consistencyinconsistent 0.5691   0.7544   0.41
##  Residual                         0.9434   0.9713       
## Number of obs: 432, groups:  subj, 24
## 
## Fixed effects:
##              Estimate Std. Error      df t value Pr(>|t|)    
## (Intercept)   -0.7941     0.1265 22.9951  -6.279 2.09e-06 ***
## consistencyC  -0.5298     0.1749 23.0024  -3.030  0.00596 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC 0.267 
## convergence code: 0
## Model failed to converge with max|grad| = 0.00360266 (tol = 0.002, component 1)
t_e_red = step(t_e, ddf = "Satterthwaite", 
                         alpha.random = 0.1, alpha.fixed = 0.08,       
                         reduce.fixed = FALSE, reduce.random = TRUE)

t_e_red    = get_model(t_e_red)

print("LME selected with p-values")
## [1] "LME selected with p-values"
summary(t_e_red)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: voltage ~ consistencyC + (0 + consistency | subj)
##    Data: t_early
## Control: lmerControl(check.conv.singular = .makeCC(action = "ignore",  
##     tol = 1e-04))
## 
## REML criterion at convergence: 1278.9
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -9.6218 -0.4435  0.0110  0.4489  3.8891 
## 
## Random effects:
##  Groups   Name                    Variance Std.Dev. Corr
##  subj     consistencyconsistent   0.3210   0.5666       
##           consistencyinconsistent 0.6038   0.7771   0.46
##  Residual                         0.9434   0.9713       
## Number of obs: 432, groups:  subj, 24
## 
## Fixed effects:
##              Estimate Std. Error      df t value Pr(>|t|)    
## (Intercept)   -0.7941     0.1265 22.9942  -6.279 2.09e-06 ***
## consistencyC  -0.5298     0.1748 23.0096  -3.030  0.00595 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC 0.266
aov_t_e = ezANOVA(
  data = t_early
  , dv = voltage
  , wid = subj
  , within = .(consistency))

print("ANOVA output")
## [1] "ANOVA output"
print(aov_t_e)
## $ANOVA
##        Effect DFn DFd        F           p p<.05      ges
## 2 consistency   1  23 9.179458 0.005958477     * 0.114331
print("Now Late-Window")
## [1] "Now Late-Window"
t_l = lmer(voltage ~ consistencyC
           + (1 | subj) + (0 + consistency | subj),
           data = t_late,
           control=lmerControl(check.conv.singular = .makeCC(action = "ignore",  tol = 1e-4)))

print("LME output")
## [1] "LME output"
summary(t_l)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: voltage ~ consistencyC + (1 | subj) + (0 + consistency | subj)
##    Data: t_late
## Control: lmerControl(check.conv.singular = .makeCC(action = "ignore",  
##     tol = 1e-04))
## 
## REML criterion at convergence: 1317.1
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -7.7440 -0.4918  0.0128  0.5542  5.3502 
## 
## Random effects:
##  Groups   Name                    Variance Std.Dev. Corr
##  subj     (Intercept)             0.3079   0.5549       
##  subj.1   consistencyconsistent   0.0000   0.0000       
##           consistencyinconsistent 0.3057   0.5529    NaN
##  Residual                         1.0542   1.0267       
## Number of obs: 432, groups:  subj, 24
## 
## Fixed effects:
##              Estimate Std. Error      df t value Pr(>|t|)    
## (Intercept)   -0.6754     0.1359 21.5286  -4.971 5.99e-05 ***
## consistencyC  -0.3829     0.1500 23.3490  -2.553   0.0177 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC 0.313
t_l_red = step(t_l, ddf = "Satterthwaite", 
                         alpha.random = 0.1, alpha.fixed = 0.08,       
                         reduce.fixed = FALSE, reduce.random = TRUE)

t_l_red    = get_model(t_l_red)

print("LME selected with p-values")
## [1] "LME selected with p-values"
summary(t_l_red)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: voltage ~ consistencyC + (0 + consistency | subj)
##    Data: t_late
## Control: lmerControl(check.conv.singular = .makeCC(action = "ignore",  
##     tol = 1e-04))
## 
## REML criterion at convergence: 1316.1
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -7.7036 -0.4948  0.0145  0.5400  5.3023 
## 
## Random effects:
##  Groups   Name                    Variance Std.Dev. Corr
##  subj     consistencyconsistent   0.3517   0.5931       
##           consistencyinconsistent 0.5019   0.7085   0.59
##  Residual                         1.0478   1.0236       
## Number of obs: 432, groups:  subj, 24
## 
## Fixed effects:
##              Estimate Std. Error      df t value Pr(>|t|)    
## (Intercept)   -0.6754     0.1282 23.0037  -5.267 2.41e-05 ***
## consistencyC  -0.3829     0.1574 22.9961  -2.433   0.0232 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr)
## consistncyC 0.155
aov_t_l = ezANOVA(
  data = t_late
  , dv = voltage
  , wid = subj
  , within = .(consistency))

print("ANOVA output")
## [1] "ANOVA output"
print(aov_t_l)
## $ANOVA
##        Effect DFn DFd        F          p p<.05        ges
## 2 consistency   1  23 5.917444 0.02318162     * 0.06576877

The effect of object consistency is significant in both the early and late window of analysis.

4 Conclusion

Our findings converge to suggest that the visual system accesses semantic features of objects in extrafoveal vision to guide attention towards objects that do not fit to the scene’s overall meaning. They also highlight the utility of investigating attentional and neural mechanisms in parallel to uncover the mechanisms underlying object recognition during the unconstrained exploration of naturalistic scenes.

5 References

Coco, Nuthmann & Dimigen (in press). Fixation-related brain potentials during semantic integration of object-scene information. Journal of Cognitive Neuroscience.

LS0tDQp0aXRsZTogRml4YXRpb24tcmVsYXRlZCBicmFpbiBwb3RlbnRpYWxzIGR1cmluZyBzZW1hbnRpYyBpbnRlZ3JhdGlvbiBvZiBvYmplY3Qtc2NlbmUNCiAgaW5mb3JtYXRpb24gKHdhbGstdGhyb3VnaCB0aGUgbWFpbiByZXN1bHRzKQ0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGZvbnRzaXplOiA4cHQNCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0aGVtZTogY2VydWxlYW4NCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogbm8NCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLnBhdGggPSAncGxvdHMvJywgZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKSAjIHN0b3JlIHRoZSBwbG90cyBnZW5lcmF0ZWQgYnkgTWFya2Rvd24gaW50byBhIGZvbGRlcg0KYGBgDQoNCiMgIE9iamVjdGl2ZXMgDQoNCkluIHRoaXMgdHV0b3JpYWwsIHdlIHByZXNlbnQgdGhlIHBvc3QtcHJvY2Vzc2VkIGV5ZS10cmFja2luZyBhbmQgRUVHIGRhdGEgb2YgQ29jbywgTnV0aG1hbm4gJiBEaW1pZ2VuICgyMDE5KSBhbmQgd2FsayB0aGUgcmVhZGVycyB0aHJvdWdoIHRoZSBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIG9mIG91ciBleWUtdHJhY2tpbmcgZGF0YSwgYXMgd2VsbCBhcywgdGhlIHNlY29uZC1sZXZlbCBvZiBhbmFseXNpcyBvZiBvdXIgcmVzdWx0IHNlY3Rpb24uDQoNClRoaXMgdHV0b3JpYWwgaXMgZGl2aWRlZCBpbnRvIHRocmVlIG1haW4gc2VjdGlvbnMuIEluIHRoZSBmaXJzdCBvbmUsIHdlIGxvb2sgYXQgdGhlIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGV5ZS1tb3ZlbWVudCBiZWhhdmlvciBhbmQgdGhlIGJvdW5kaW5nIGJveCBzdXJyb3VuZGluZyB0aGUgdGFyZ2V0IG9iamVjdC4gSW4gdGhlIHNlY29uZCBvbmUsIHdlIHdpbGwgYmUgbG9va2luZyBhdCB0aGUgbWVhc3VyZXMgZXh0cmFjdGVkIGZyb20gdGhlIGV5ZS10cmFja2luZyBkYXRhLCBhbmQgaW4gdGhlIHRoaXJkIG9uZSBpbnN0ZWFkLCBhdCB0aGUgRUVHIGRhdGEgYm90aCBFUlAtc3RpbXVsdXMgbG9ja2VkIGFuZCBmaXhhdGlvbi1yZWxhdGVkIHBvdGVudGlhbHMgb2YgaW50ZXJlc3QuIE9mIHRoZSBFRUcgZGF0YSwgd2Ugd2lsbCBub3QgcHJlc2VudCB0aGUgVGhyZXNob2xkLUZyZWUgY2x1c3RlciBlbmhhbmNlbWVudCByZXN1bHRzIGFzIHRoZXkgd2VyZSBjb21wdXRlZCB1c2luZyBNYXRsYWIuDQoNCkJlZm9yZSBzdGFydGluZyB0aG91Z2gsIHdlIG5lZWQgdG8gbG9hZCB0aGUgbGlicmFyaWVzIGFuZCB0aGUgZGF0YSB0aGF0IHdlIGFyZSBnb2luZyB0byB1c2UuDQoNCmBgYHtyfQ0KbGlicmFyeShsbWU0KSAgICAgIyMgZm9yIGxpbmVhci1taXhlZCBlZmZlY3QgbW9kZWxpbmcNCmxpYnJhcnkobG1lclRlc3QpICMjIHRvIGRvIG1vZGVsIHNlbGVjdGlvbiBhbmQgY2FsY3VsYXRlIHRoZSBwLXZhbHVlcyANCmxpYnJhcnkoZ3Bsb3RzKSAgICMjIGZvciBwbG90dGluZw0KbGlicmFyeShyZXNoYXBlKSAgIyMgdG8gcmVzaGFwZSB0aGUgZGF0YQ0KbGlicmFyeShleikgICAgICAgIyMgdG8gcnVuIGNsYXNzaWMgQU5PVkEgYW5hbHlzZXMNCg0KbG9hZCgiQzovVXNlcnMvbWNvY28vRHJvcGJveC9Xcml0aW5nL0NORC9SMi9PU0ZfZmlsZXMvZGF0YS5SRGF0YSIpDQpgYGANCg0KIyBFeWUtdHJhY2tpbmcgZGF0YQ0KDQpJbiBUYWJsZSAxIG9mIHRoZSBtYW51c2NyaXB0LCB3ZSByZXBvcnQgc29tZSBkZXNjcmlwdGl2ZSByZXN1bHRzIChtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24pIGZvciB0aGUgZXllLW1vdmVtZW50IGJlaGF2aW9yIGluIHRoZSB0YXNrIGFuZCBwcm9wZXJ0aWVzIG9mIHRoZSB0YXJnZXQgb2JqZWN0Lg0KDQpXZSB3aWxsIHVzZSBmb3VyIGRpZmZlcmVudCBkYXRhc2V0cyBmb3IgdGhpcyBzZWN0aW9uOg0KDQoqIGBmaXhhdGlvbl9mZWF0dXJlc2A6IHN0b3JpbmcgY2hhcmFjdGVyaXN0aWNzIG9mIGZpeGF0aW9uIHJlbGF0aXZlIHRvIHRoZWlyIHR5cGUgYW5kIHRoZSB0YXJnZXQgb2JqZWN0Lg0KICAtIGBmaXhfZHVyYCAgICAgOiBmaXhhdGlvbiBkdXJhdGlvbiBpbiBtcw0KICAtIGBmaXhpeGAgICAgICAgOiBvcmRpbmFsIG51bWJlciBvZiBmaXJzdCBmaXhhdGlvbg0KICAtIGBpbl9zYWNhbXBgICAgOiBpbmNvbWluZyBzYWNjYWRlIGFtcGxpdHVkZSBpbiBkZWdyZWVzIG9mIHZpc3VhbCBhbmdsZQ0KICAtIGB0YXJnZXRgICAgICAgOiB0aGUgdHlwZSBvZiBmaXhhdGlvbg0KICAgIC0gYHBzdGAgICAgICAgIDogdCArIDENCiAgICAtIGBwdGAgICAgICAgICA6IHQgLSAxDQogICAgLSBgcHQyYCAgICAgICAgOiB0IC0gMg0KICAgIC0gYHRgICAgICAgICAgIDogdA0KICAtIGBjb25zaXN0ZW5jeWAgOiB0aGUgc2VtYW50aWMgY29uc2lzdGVuY3kgb2YgdGhlIHRhcmdldCBvYmplY3QNCiAgLSBgZGAgICAgICAgICAgIDogdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNsb3Nlc3QgZWRnZSBvZiB0aGUgdGFyZ2V0IG9iamVjdA0KDQoqIGBucl9yZWZpeGAgICAgICA6IHJlLWZpeGF0aW9uIGJlaGF2aW9yIG9uIHRoZSB0YXJnZXQgb2JqZWN0DQogIC0gYG5yZml4YCAgICAgICA6IG51bWJlciBvZiByZWZpeGF0aW9ucw0KICAtIGBkdXJhdGlvbmAgICAgOiBmaXhhdGlvbiBkdXJhdGlvbiBpbiBtcw0KICAtIGBjb25zaXN0ZW5jeWAgOiB0aGUgc2VtYW50aWMgY29uc2lzdGVuY3kgb2YgdGhlIHRhcmdldCBvYmplY3QNCg0KKiBgYWZ0ZXJfY29udGluZ2VuY3lgOiBleWUtbW92ZW1lbnQgcmVzcG9uc2VzIGFmdGVyIGZpcnN0IGVuY291bnRlcmluZyB0aGUgdGFyZ2V0IG9iamVjdCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBzdHVkeSBwaGFzZQ0KICAtIGBucmZpeGA6IG51bWJlciBvZiBmaXhhdGlvbnMNCiAgLSBgZHVyYXRpb25gOiBmaXhhdGlvbiBkdXJhdGlvbiBpbiBtcw0KDQoqIGBib3VuZGluZ2JveGA6IGxvdy1sZXZlbCBwcm9wZXJ0aWVzIG9mIHRoZSBib3VuZGluZyBib3ggc3Vycm91bmRpbmcgdGhlIHRhcmdldCBvYmplY3QNCiAgLSBgc2NlbmVgOiB0aGUgSUQgb2YgdGhlIHBob3RvZ3JhcGgNCiAgLSBgZGlzdGNlbnRfdmlzYDogZGlzdGFuY2Ugb2YgdGhlIHRhcmdldCBvYmplY3QgY2VudGVyIGZyb20gc2NyZWVuIGNlbnRlciBpbiBkZWdyZWVzIG9mIHZpc3VhbCBhbmdsZQ0KICAtIGBzYWxpZW5jeWA6IG1lYW4gdmlzdWFsIHNhbGllbmN5IGFzIGNvbXB1dGVkIHVzaW5nIHRoZSBBV1MgbW9kZWwNCiAgLSBgYXJlYV92aXNgOiBhcmVhIHNpemUgaW4gZGVncmVlcyBvZiB2aXN1YWwgYW5nbGUgc3F1YXJlZA0KICAtIGB3aWR0aF92aXNgOiB0aGUgd2lkdGggb2YgdGhlIGJvdW5kaW5nIGJveCBpbiBkZWdyZWVzIG9mIHZpc3VhbCBhbmdsZQ0KICAtIGBoZWlnaHRfdmlzYDogdGhlIGhlaWdodCBvZiB0aGUgYm91bmRpbmcgYm94IGluIGRlZ3JlZXMgb2YgdmlzdWFsIGFuZ2xlDQogIC0gYGNvbnNpc3RlbmN5YDogdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSB0YXJnZXQgb2JqZWN0DQoNCkZpcnN0LCBsZXQncyBsb29rIGF0IHRoZSB2ZXJ5IGZpcnN0IGZpeGF0aW9uIG9uIHRoZSBjcml0aWNhbCB0YXJnZXQNCg0KYGBge3J9DQojIGV4dHJhY3Qgb25seSB0aGUgZGVzY3JpcHRpdmUgc3RhdHMgb2YgdGhlIGZpeGF0aW9uIG9uIHRoZSB0YXJnZXQgb2JqZWN0DQpmaXJzdGZpeCA9IHN1YnNldChmaXhhdGlvbl9mZWF0dXJlcywgZml4YXRpb25fZmVhdHVyZXMkdGFyZ2V0ID09ICJ0IikNCg0KIyBvcmRpbmFsIG51bWJlciBvZiBmaXJzdCBmaXhhdGlvbiBvbiB0aGUgdGFyZ2V0DQp3aXRoKGZpcnN0Zml4LCB0YXBwbHkoZml4aXgsIGxpc3QoY29uc2lzdGVuY3kpLCBtZWFuKSkNCndpdGgoZmlyc3RmaXgsIHRhcHBseShmaXhpeCwgbGlzdChjb25zaXN0ZW5jeSksIHNkKSkNCmBgYA0KDQpOb3csIHdlIGxvb2sgYXQgdGhlIGR1cmF0aW9uIG9mIGVhY2ggZml4YXRpb24gdHlwZSwgdGhlIGluY29taW5nIHNhY2NhZGUgYW1wbGl0dWRlIHRoYXQgYnJvdWdodCB0aGF0IGZpeGF0aW9uLCBhbmQgdGhlIGRpc3RhbmNlIG9mIHN1Y2ggZml4YXRpb25zIGZyb20gdGhlIGJvdW5kaW5nIGJveC4gV2UgYWxzbyBsb29rIGF0IHRoZSByZS1maXhhdGlvbiBiZWhhdmlvciBvbiB0aGUgdGFyZ2V0Lg0KDQpgYGB7cn0NCiMgZHVyYXRpb24gb2YgdGhlIHRhcmdldCBmaXhhdGlvbnMNCndpdGgoZml4YXRpb25fZmVhdHVyZXMsIHRhcHBseShmaXhfZHVyLCBsaXN0KHRhcmdldCwgY29uc2lzdGVuY3kpLCBtZWFuKSkNCndpdGgoZml4YXRpb25fZmVhdHVyZXMsIHRhcHBseShmaXhfZHVyLCBsaXN0KHRhcmdldCwgY29uc2lzdGVuY3kpLCBzZCkpDQoNCiMjIGluY29taW5nIHNhY2NhZGUgYW1wbGl0dWRlcw0Kd2l0aChmaXhhdGlvbl9mZWF0dXJlcywgdGFwcGx5KGluX3NhY2FtcCwgbGlzdCh0YXJnZXQsIGNvbnNpc3RlbmN5KSwgbWVhbiwgbmEucm0gPSBUKSkNCndpdGgoZml4YXRpb25fZmVhdHVyZXMsIHRhcHBseShpbl9zYWNhbXAsIGxpc3QodGFyZ2V0LCBjb25zaXN0ZW5jeSksIHNkLCBuYS5ybSA9IFQpKQ0KDQojIyBkaXN0YW5jZXMgb2YgZml4YXRpb25zIGZyb20gYm91bmRpbmcgYm94IGNsb3Nlc3QgZWRnZQ0Kd2l0aChmaXhhdGlvbl9mZWF0dXJlcywgdGFwcGx5KGQsIGxpc3QodGFyZ2V0LCBjb25zaXN0ZW5jeSksIG1lYW4pKQ0Kd2l0aChmaXhhdGlvbl9mZWF0dXJlcywgdGFwcGx5KGQsIGxpc3QodGFyZ2V0LCBjb25zaXN0ZW5jeSksIHNkKSkNCg0KIyMgcmVmaXhhdGlvbiBiZWhhdmlvcg0Kd2l0aChucl9yZWZpeCwgdGFwcGx5KG5yZml4LCBsaXN0KGNvbnNpc3RlbmN5KSwgbWVhbiwgbmEucm0gPSBUKSkNCndpdGgobnJfcmVmaXgsIHRhcHBseShucmZpeCwgbGlzdChjb25zaXN0ZW5jeSksIHNkLCBuYS5ybSA9IFQpKQ0KDQp3aXRoKG5yX3JlZml4LCB0YXBwbHkoZHVyYXRpb24sIGxpc3QoY29uc2lzdGVuY3kpLCBtZWFuLCBuYS5ybSA9IFQpKQ0Kd2l0aChucl9yZWZpeCwgdGFwcGx5KGR1cmF0aW9uLCBsaXN0KGNvbnNpc3RlbmN5KSwgc2QsIG5hLnJtID0gVCkpDQpgYGANCg0KTGV0IHNlZSB3aGF0IGhhcHBlbnMgZnJvbSB3aGVuIHRoZSBwYXJ0aWNpcGFudHMgbWFkZSBhIHNhY2NhZGUgb3V0IG9mIHRoZSB0YXJnZXQgb2JqZWN0LCBhbmQgdHJpZ2dlcmVkIHRoZSBnYXplIGNvbnRpbmdlbmN5IG1lY2hhbmlzbXMsIHVudGlsIHRoZSBzdHVkeSBwaGFzZSBlbmRzLiANCg0KYGBge3J9DQojIyBOdW1iZXIgb2YgZml4YXRpb25zIGFmdGVyIGZpcnN0IGVuY291bnRlcmluZyB0YXJnZXQgb2JqZWN0IHVudGlsIHRoZSBlbmQgb2YgdGhlIHN0dWR5IHBoYXNlDQp3aXRoKGFmdGVyX2NvbnRpbmdlbmN5LCB0YXBwbHkobnJmaXgsIGxpc3QoY29uc2lzdGVuY3kpLCBtZWFuLCBuYS5ybSA9IFQpKQ0Kd2l0aChhZnRlcl9jb250aW5nZW5jeSwgdGFwcGx5KG5yZml4LCBsaXN0KGNvbnNpc3RlbmN5KSwgc2QsIG5hLnJtID0gVCkpDQoNCiMjIGFmdGVyIGNvbnRpbmdlbmN5IGZpeGF0aW9uIGR1cmF0aW9uDQp3aXRoKGFmdGVyX2NvbnRpbmdlbmN5LCB0YXBwbHkoZHVyYXRpb24sIGxpc3QoY29uc2lzdGVuY3kpLCBtZWFuLCBuYS5ybSA9IFQpKQ0Kd2l0aChhZnRlcl9jb250aW5nZW5jeSwgdGFwcGx5KGR1cmF0aW9uLCBsaXN0KGNvbnNpc3RlbmN5KSwgc2QsIG5hLnJtID0gVCkpDQpgYGANCg0KRmluYWxseSwgbGV0J3MgZXhhbWluZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgYm91bmRpbmcgYm94IHRoYXQgc3Vycm91bmRlZCB0aGUgdGFyZ2V0IG9iamVjdC4NCg0KYGBge3J9DQojIyBkaXN0YW5jZSBvZiBib3VuZGluZyBib3ggZnJvbSB0aGUgY2VudGVyIG9mIHRoZSBzY3JlZW4gDQp3aXRoKGJvdW5kaW5nYm94LCB0YXBwbHkoZGlzdGNlbnRfdmlzLCBsaXN0KGNvbnNpc3RlbmN5KSwgbWVhbikpDQp3aXRoKGJvdW5kaW5nYm94LCB0YXBwbHkoZGlzdGNlbnRfdmlzLCBsaXN0KGNvbnNpc3RlbmN5KSwgc2QpKQ0KDQojIyBtZWFuIHNhbGllbmN5IG9mIGJvdW5kaW5nIGJveCAoQVdTIG1vZGVsKQ0Kd2l0aChib3VuZGluZ2JveCwgdGFwcGx5KHNhbGllbmN5LCBsaXN0KGNvbnNpc3RlbmN5KSwgbWVhbikpDQp3aXRoKGJvdW5kaW5nYm94LCB0YXBwbHkoc2FsaWVuY3ksIGxpc3QoY29uc2lzdGVuY3kpLCBzZCkpDQoNCiMjIHdpZHRoIG9mIHRoZSBib3VuZGluZyBib3gNCndpdGgoYm91bmRpbmdib3gsIHRhcHBseSh3aWR0aF92aXMsIGxpc3QoY29uc2lzdGVuY3kpLCBtZWFuKSkNCndpdGgoYm91bmRpbmdib3gsIHRhcHBseSh3aWR0aF92aXMsIGxpc3QoY29uc2lzdGVuY3kpLCBzZCkpDQoNCiMjIGhlaWdodCBvZiB0aGUgYm91bmRpbmcgYm94DQp3aXRoKGJvdW5kaW5nYm94LCB0YXBwbHkoaGVpZ2h0X3ZpcywgbGlzdChjb25zaXN0ZW5jeSksIG1lYW4pKQ0Kd2l0aChib3VuZGluZ2JveCwgdGFwcGx5KGhlaWdodF92aXMsIGxpc3QoY29uc2lzdGVuY3kpLCBzZCkpDQoNCiMjIHRoZSBhcmVhIHNpemUNCndpdGgoYm91bmRpbmdib3gsIHRhcHBseShhcmVhX3ZpcywgbGlzdChjb25zaXN0ZW5jeSksIG1lYW4pKQ0Kd2l0aChib3VuZGluZ2JveCwgdGFwcGx5KGFyZWFfdmlzLCBsaXN0KGNvbnNpc3RlbmN5KSwgc2QpKQ0KYGBgDQoNCkFmdGVyIGhhdmluZyBpbnZlc3RpZ2F0ZWQgdGhlIGRlc2NyaXB0aXZlIHBhdHRlcnMgb2YgZXllLW1vdmVtZW50IGJlaGF2aW9yIGluIHRoZSB0YXNrLCBhbmQgc29tZSBvZiB0aGUgdGFyZ2V0IG9iamVjdCBwcm9wZXJ0aWVzLCBsZXQncyBoYXZlIGEgbG9vayBhdCB0aGUgZGVwZW5kZW50IG1lYXN1cmVzIG9mIHRoZSBleWUtdHJhY2tpbmcgZGF0YSAoVGFibGUgMiBhbmQgVGFibGUgMykgdGhhdCB3ZSBoYXZlIGZ1cnRoZXIgYW5hbHlzZWQ6DQoNCmBgYHtyfQ0KIyMgbG9hZCB0aGUgZGF0YQ0Kc3RyKEVUKQ0KYGBgDQoNClRoZSBleWUtdHJhY2tpbmcgZGF0YSBjb25zaXN0cyBvZiAzLDMxOCB1bmlxdWUgdHJpYWxzLCAxLDU2NyBmb3IgdGhlIGNvbnNpc3RlbnQgY29uZGl0aW9uIGFuZCAxLDc1MSBmb3IgdGhlIGluY29uc2lzdGVudCBjb25kaXRpb24uIFBlciBwYXJ0aWNpcGFudCwgdGhpcyBjb3JyZXNwb25kZWQgdG8gYW4gYXZlcmFnZSBvZiA2NS4zIHRyaWFscyAoU0QgPSA2LjksIHJhbmdlID0gNDgtNzgpIGZvciBjb25zaXN0ZW50IGFuZCA3My4wIHRyaWFscyAoU0QgPSA2LjksIHJhbmdlID0gNTktODIpIGZvciBpbmNvbnNpc3RlbnQgaXRlbXMuDQoNCmBgYHtyfQ0KaW50ZXIgPSB3aXRoKEVULCB0YWJsZShzdWJqLCBjb25zaXN0ZW5jeSkpICMjIHRha2UgZnJlcXVlbmNpZXMNCmFwcGx5KGludGVyLCAyLCBtZWFuKQ0KYXBwbHkoaW50ZXIsIDIsIHNkKQ0KYXBwbHkoaW50ZXIsIDIsIHJhbmdlKQ0KaGVhZChFVCkNCmBgYA0KDQpBbG9uZyB0aGUgY29sdW1ucyBvZiB0aGUgZGF0YWZyYW1lLCB3ZSBoYXZlIG9yZ2FuaXplZCB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoNCg0KLSBgc3ViamA6ICB0aGUgc3ViaiBJRA0KLSBgdHJpYWxgOiB0aGUgdHJpYWwgbnVtYmVyDQotIGBzY2VuZWA6IHRoZSBpZGVudGlmaWVyIGZvciB0aGUgc2NlbmUgdGhhdCB3YXMgbG9va2VkIGF0IGR1cmluZyB0aGUgc3R1ZHkgcGhhc2UNCi0gYGNvbnNpc3RlbmN5YDogdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSB0YXJnZXQgb2JqZWN0IChjID0gY29uc2lzdGVudCwgaSA9IGluY29uc2lzdGVudCkNCi0gYEZJWE5SX0ZJUlNUSUZYYDogIHRoZSBvcmRpbmFsIG5yLiBvZiBmaXJzdCBmaXhhdGlvbiBvbiB0YXJnZXQNCi0gYEZJUlNURklYX09OX09CSmA6IGEgYmlub21pYWwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgb2JqZWN0IHdhcyBmaXhhdGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBzY2VuZSBvbnNldA0KLSBgVElNRV9GSVJTVEZJWGA6IHRoZSBsYXRlbmN5IHRvIGZpcnN0IGZpeGF0aW9uIG9uIHRoZSB0YXJnZXQgb2JqZWN0DQotIGBHRGA6IHRoZSBnYXplIGR1cmF0aW9uIG9uIHRoZSB0YXJnZXQgb2JqZWN0DQoNCldlIHdpbGwgYWxzbyBjcmVhdGUgYSBjZW50cmVkIHZlcnNpb24gb2YgdGhlICpjb25zaXN0ZW5jeSogdmFyaWFibGUgYW5kIGNvZGUgaXQgdG8gcmFuZ2UsIGFwcHJveGltYXRlbHksIGJldHdlZW4gLS41IGFuZCAuNSB0aGF0IHdpbGwgYmUgdXNlZCBhcyBwcmVkaWN0b3IgaW4gdGhlIGxpbmVhci1taXhlZCBlZmZlY3QgbW9kZWxzLiANCg0KYGBge3J9DQpFVCRjb25zaXN0ZW5jeUMgPSBhcy5udW1lcmljKGFzLmZhY3RvcihFVCRjb25zaXN0ZW5jeSkpDQpFVCRjb25zaXN0ZW5jeUMgPSBFVCRjb25zaXN0ZW5jeUMgLSBtZWFuKEVUJGNvbnNpc3RlbmN5QywgbmEucm0gPSBUKSANCmNiaW5kKGFzLmNoYXJhY3RlcihFVCRjb25zaXN0ZW5jeVsxOjEwXSksIEVUJGNvbnNpc3RlbmN5Q1sxOjEwXSkNCmBgYA0KDQojIyBDdW11bGF0aXZlIHByb2JhYmlsaXR5IG9mIGZpcnN0IGZpeGF0aW9uDQoNCldlIGJlZ2luIGJ5IGNvbXB1dGluZyBhbmQgcGxvdHRpbmcgdGhlIGN1bXVsYXRpdmUgZGlzdHJpYnV0aW9uIG9mIHRoZSBvcmRpbmFsIG51bWJlciBvZiBmaXhhdGlvbnMgZm9yIGNvbnNpc3RlbnQgYW5kIGluY29uc2lzdGVudCBvYmplY3RzIHJlc3BlY3RpdmVseS4gV2Ugd2lsbCBleGNsdWRlIHRoZSB2YWx1ZXMgdGhhdCBhcmUgaGlnaGVyIHRoYW4gdGhlIDk5JSBvZiB0aGUgZGlzdHJpYnV0aW9uLg0KDQpgYGB7cn0NCiMjIGdldCB0aGUgcXVhbnRpbGUgYW5kIGxvb2sgYXQgdGhlIG9yZGluYWwgbnIuIG9mIGZpeGF0aW9uIHRoYXQgaXMgb3ZlciA5OSUgb2YgdGhlIGRpc3RyaWJ1dGlvbg0KcW50ID0gcXVhbnRpbGUoRVQkRklYTlJfRklSU1RGSVgsIHNlcSgwLDEsLjAxKSkNCg0KbXhmaXggICA9IGFzLm51bWVyaWMocW50W3doaWNoKG5hbWVzKHFudCkgPT0gIjk5JSIpXSkgIyMgbWF4aW11bSBudW1iZXIgb2Ygb3JkaW5hbCBmaXhhdGlvbnMgY29uc2lkZXJlZA0KDQpjc2V0ID0gc3Vic2V0KEVUJEZJWE5SX0ZJUlNURklYLCBFVCRjb25zaXN0ZW5jeSA9PSAiYyIpDQppc2V0ID0gc3Vic2V0KEVUJEZJWE5SX0ZJUlNURklYLCBFVCRjb25zaXN0ZW5jeSA9PSAiaSIpDQoNCmNmICA9IGVjZGYoY3NldCkNCmNmICA9IGNmKDE6bXhmaXgpDQppbmYgPSBlY2RmKGlzZXQpDQppbmYgPSBpbmYoMTpteGZpeCkNCmBgYA0KDQp2aXN1YWxpemUgaXQ6DQoNCmBgYHtyLCBmaWcud2lkdGg9IDUsIGZpZy5oZWlnaHQgPSA1fQ0KYWxwaGEgPSAuMDUgIyMgc2V0IGFscGhhIHZhbHVlcyBmb3IgcGxvdHRpbmcNCg0KcGxvdCgxOm14Zml4LCBjZiwgeWxpbSA9IGMoMCwxKSwgY29sID0gJ2JsdWU0JywgbHR5ID0gMSwgDQogICAgIGx3ZCA9IDUsIGNleCA9IDEuOCwgcGNoID0gMjAsIHR5cGUgPSAnYicsDQogICAgIHlsYWIgPSAnQ3VtdWxhdGl2ZSBQcm9iYWJpbGl0eSBvZiBUYXJnZXQgRml4YXRpb24nLCANCiAgICAgeGxhYiA9ICdPcmRpbmFsIGZpeGF0aW9uIG51bWJlcicpDQoNCmxpbmVzKDE6bXhmaXgsIGluZiwgeWxpbSA9IGMoMCwxKSwgY29sID0gJ3JlZDQnLCANCiAgICAgIGx3ZCA9IDUsIGNleCA9IDEuOCwgbHR5ID0gMiwgdHlwZSA9ICdiJywgcGNoID0gMTUpDQoNCmxlZ2VuZCgnYm90dG9tcmlnaHQnLCBjKCdDb25zaXN0ZW50IE9iamVjdCcsICdJbmNvbnNpc3RlbnQgT2JqZWN0JyksDQogICAgICAgY29sID0gYygnYmx1ZTQnLCAncmVkNCcpLCBsdHkgPSBjKDEsMiksIHBjaCA9IGMoMjAsMTUpLCANCiAgICAgICBjZXggPSAxLjUsIGJ0eSA9ICduJykNCmdyaWQoKQ0KYGBgDQoNClRoZW4sIGluIG9yZGVyIHRvIGFwcGx5IGEgZ2VuZXJhbGl6ZWQgbGluZWFyIG1vZGVsIHRvIHRoZSBvcmRpbmFsIG51bWJlciBvZiBmaXhhdGlvbnMgd2UgbmVlZCB0byBzbGlnaHRseSByZXNoYXBlIHRoZSBkYXRhLCBhbmQgY2FsY3VsYXRlIGEgZnJlcXVlbmN5IGNvdW50IHRvIHRoZW4gY29tcHV0ZSBhIHByb2JpdCBtb2RlbC4gV2UgZG8gdGhpcyBzZXBhcmF0ZWx5IGZvciB0aGUgY29uZGl0aW9ucyBvZiBvYmplY3QgY29uc2lzdGVuY3kuICAgDQoNCmBgYHtyfQ0KY29uZCA9IHVuaXF1ZShFVCRjb25zaXN0ZW5jeSkNCmMgPSBjb25kWzFdOyANCg0KZnJlcXByb2IgPSB2ZWN0b3IoKQ0KZm9yIChjIGluIGNvbmQpew0KICBwcmludChjKQ0KICBmaXhjID0gdmVjdG9yKCkNCiAgc3NldCA9IHN1YnNldChFVCwgRVQkY29uc2lzdGVuY3kgPT0gYykNCiAgY3VtcCA9IGVjZGYoc3NldCRGSVhOUl9GSVJTVEZJWCkNCiAgZm9yIChzIGluIDE6bXhmaXgpew0KICAgIGl4Zml4ID0gbGVuZ3RoKHdoaWNoKHNzZXQkRklYTlJfRklSU1RGSVggPT0gcykpDQogICAgZml4YyA9IGMoZml4YywgaXhmaXgpIA0KICB9DQogIA0KICBmcmVxcHJvYiA9IGNiaW5kKGZyZXFwcm9iLCBmaXhjLCBkZXBhcnNlLmxldmVsID0gMCkNCn0NCg0KZnJlcXByb2IgPSBhcy5kYXRhLmZyYW1lKGZyZXFwcm9iKQ0KY29sbmFtZXMoZnJlcXByb2IpID0gYygiQ29uc2lzdGVudCIsICJJbmNvbnNpc3RlbnQiKQ0KZnJlcXByb2IkdGltZXBvaW50ID0gMTpteGZpeA0KDQp0b3RuID0gdGFibGUoRVQkY29uc2lzdGVuY3kpICMjIGdldCB0aGUgdG90YWwgbnIuIG9mIHBvaW50cyANCg0KTSAgICAgICAgICAgPSBtZWx0KGlkID0gYygndGltZXBvaW50JyksIGRhdGEgPSBmcmVxcHJvYikNCk0kciAgICAgICAgID0gYyhyZXAodG90blsxXSwgbXhmaXgpLCAgcmVwKHRvdG5bMl0sIG14Zml4KSkgLSBNJHZhbHVlDQpNJHRpbWVwb2ludCA9IGFzLm51bWVyaWMoYXMubWF0cml4KE0kdGltZXBvaW50KSkNCk0kdmFsdWUgICAgID0gYXMubnVtZXJpYyhhcy5tYXRyaXgoTSR2YWx1ZSkpDQpNJHggICAgICAgICA9IE0kdGltZXBvaW50L21heChNJHRpbWVwb2ludCkNCmhlYWQoTSkNCmBgYA0KDQphbmQgbm93LCBsZXQncyBydW4gdGhlIG1vZGVsOg0KDQpgYGB7cn0NCm1vZGVsIDwtIGdsbShjYmluZCh2YWx1ZSwgcikgfiAgeCp2YXJpYWJsZSwgZGF0YSA9IE0sIGZhbWlseSA9IGJpbm9taWFsKHByb2JpdCkpDQpzdW1tYXJ5KG1vZGVsKQ0KY29uZmludChtb2RlbCkNCmBgYA0KDQpUYWJsZSAyIG9mIHRoZSBtYW51c2NyaXB0cyBhbHNvIHJlcG9ydHMgdGhlIGNvcnJlc3BvbmRpbmcgR0xNIG1vZGVsIGNvZWZmaWNpZW50cy4gIFdlIGZvdW5kIGEgc2lnbmlmaWNhbnQgbWFpbiBlZmZlY3Qgb2YgQ29uc2lzdGVuY3k7IG92ZXJhbGwsIGluY29uc2lzdGVudCBvYmplY3RzIHdlcmUgbG9va2VkIGF0IHdpdGggYSBoaWdoZXIgcHJvYmFiaWxpdHkgdGhhbiBjb25zaXN0ZW50IG9iamVjdHMuIEFzIGV4cGVjdGVkLCB0aGUgY3VtdWxhdGl2ZSBwcm9iYWJpbGl0eSBvZiBsb29raW5nIGF0IHRoZSBjcml0aWNhbCBvYmplY3QgaW5jcmVhc2VkIGFzIGEgZnVuY3Rpb24gb2YgdGhlIE9yZGluYWwgTnVtYmVyIG9mIEZpeGF0aW9uIChpLmUuLCB4IGhlcmUpLiBUaGVyZSB3YXMgYWxzbyBhIHNpZ25pZmljYW50IGludGVyYWN0aW9uIGJldHdlZW4gdGhlIHR3byB2YXJpYWJsZXMuIA0KDQojIyBQcm9iYWJpbGl0eSBvZiBpbW1lZGlhdGUgZml4YXRpb24NCg0KTm93LCB3ZSBleGFtaW5lIHRoZSB2ZXJ5IGZpcnN0IGV5ZS1tb3ZlbWVudCBkdXJpbmcgc2NlbmUgZXhwbG9yYXRpb24gdG8gYXNzZXNzIHdoZXRoZXIgb2JzZXJ2ZXJzIGhhZCBpbW1lZGlhdGUgZXh0cmFmb3ZlYWwgYWNjZXNzIHRvIG9iamVjdC1zY2VuZSBzZW1hbnRpY3MsIGkuZS4sIHRoZSBwcm9iYWJpbGl0eSBvZiBpbW1lZGlhdGUgZml4YXRpb24uIFRoZSBtZWFuIHByb2JhYmlsaXR5IG9mIGltbWVkaWF0ZSBvYmplY3QgZml4YXRpb24gd2FzIDEyLjkyDQoNCmBgYHtyfQ0Kd2l0aChFVCwgbWVhbihGSVJTVEZJWF9PTl9PQkopKSoxMDANCmBgYA0KDQpWaXN1YWxpemUgaXQ6DQoNCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDh9DQoNCg0KbWVhbiA8LSB3aXRoKEVULCB0YXBwbHkoRklSU1RGSVhfT05fT0JKLCBsaXN0KGNvbnNpc3RlbmN5LCBzdWJqKSwgbWVhbikpDQp5bWF4ID0gbWF4KG1lYW4pDQoNCk0gPSBhcy5kYXRhLmZyYW1lKGNiaW5kKGMobWVhblsxLF0sIG1lYW5bMixdKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBjKHJlcCgiQ29uc2lzdGVudCIsIG5jb2wobWVhbikpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJJbmNvbnNpc3RlbnQiLCBuY29sKG1lYW4pKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgZGVwYXJzZS5sZXZlbCA9IDApLA0KICAgICAgICAgICAgICAgICAgY2hlY2submFtZXMgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgIHJvdy5uYW1lcyA9IEZBTFNFKQ0KDQpjb2xuYW1lcyhNKSA9IGMoInZhbHVlIiwgImNvbnNpc3RlbmN5IikNCg0KTVssMV0gPSBhcy5udW1lcmljKGFzLm1hdHJpeChNWywxXSkpDQoNCmJveHBsb3QodmFsdWUgfiBjb25zaXN0ZW5jeSwgZGF0YSA9IE0sIA0KICAgICAgICBjb2wgPSBjKCJibHVlNCIsICJyZWQ0IiksDQogICAgICAgIHlsYWIgPSAiUHJvYmFiaWxpdHkgb2YgSW1tZWRpYXRlIEZpeGF0aW9uIiwNCiAgICAgICAgY2V4LmxhYiA9IDEuMywNCiAgICAgICAgY2V4LmF4aXMgPSAxLjgsDQogICAgICAgIHlsaW0gICAgID0gYygwLCB5bWF4KjEuMSkpDQoNCmBgYA0KDQphbmQgbm93IHJ1biB0aGUgTE1FIG1vZGVsOg0KDQpgYGB7cn0NCg0KbW9kID0gZ2xtZXIoRklSU1RGSVhfT05fT0JKIH4gY29uc2lzdGVuY3lDDQogICAgICAgICAgICArICgxIHwgc3ViaikgKyANCiAgICAgICAgICAgICAgKyAoMSB8IHNjZW5lKSwgDQogICAgICAgICAgICBkYXRhID0gRVQsDQogICAgICAgICAgICBmYW1pbHkgPSAnYmlub21pYWwnKQ0KDQojIyB0aGVyZSBhcmUgbm8gbW9kZWwgZm9yIGJhY2t3YXJkIHJlZHVjaW5nIEdMTUVSIG1vZGVscy4NCnN1bW1hcnkobW9kKQ0KYGBgDQoNCiMjIExhdGVuY3kgdG8gZmlyc3QgZml4YXRpb24NCg0KVGhlIGxhdGVuY3kgdG8gZmlyc3QgZml4YXRpb24gb24gdGhlIHRhcmdldCBvYmplY3QgaXMgYW5vdGhlciBtZWFzdXJlIHRvIGNhcHR1cmUgdGhlIHBvdGVuY3kgb2YgYW4gb2JqZWN0IGluIGF0dHJhY3RpbmcgZWFybHkgYXR0ZW50aW9uIGluIGV4dHJhZm92ZWFsIHZpc2lvbi4gVGhpcyBtZWFzdXJlIGlzIGRlZmluZWQgYXMgdGhlIHRpbWUgZWxhcHNlZCBiZXR3ZWVuIHRoZSBvbnNldCBvZiB0aGUgc2NlbmUgaW1hZ2UgYW5kIHRoZSBmaXJzdCBmaXhhdGlvbiBvbiB0aGUgY3JpdGljYWwgb2JqZWN0LiANCg0KVmlzdWFsaXplOg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4fQ0KDQptZWFuIDwtIHdpdGgoRVQsIHRhcHBseShUSU1FX0ZJUlNURklYLCBsaXN0KGNvbnNpc3RlbmN5LCBzdWJqKSwgbWVhbiwgbmEucm0gPSBUUlVFKSkNCnltYXggPSBtYXgobWVhbiwgbmEucm0gPSBUUlVFKQ0KeW1pbiA9IG1pbihtZWFuLCBuYS5ybSA9IFRSVUUpDQoNCk0gPSBhcy5kYXRhLmZyYW1lKGNiaW5kKGMobWVhblsxLF0sIG1lYW5bMixdKSwgDQogICAgICAgICAgICAgICAgICAgICAgICBjKHJlcCgiQ29uc2lzdGVudCIsIG5jb2wobWVhbikpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJJbmNvbnNpc3RlbnQiLCBuY29sKG1lYW4pKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgZGVwYXJzZS5sZXZlbCA9IDApLA0KICAgICAgICAgICAgICAgICAgY2hlY2submFtZXMgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgIHJvdy5uYW1lcyA9IEZBTFNFKQ0KDQojIyB0YWtlIG91dCB0aGUgbmFzDQojIE0gPSBNWy1hcy5udW1lcmljKHdoaWNoKGlzLm5hKE1bLDFdKSA9PSBUUlVFKSksXQ0KDQpjb2xuYW1lcyhNKSA9IGMoInZhbHVlIiwgImNvbnNpc3RlbmN5IikNCg0KTVssMV0gPSBhcy5udW1lcmljKGFzLm1hdHJpeChNWywxXSkpDQoNCmJveHBsb3QodmFsdWUgfiBjb25zaXN0ZW5jeSwgZGF0YSA9IE0sIA0KICAgICAgICBjb2wgPSBjKCJibHVlNCIsICJyZWQ0IiksDQogICAgICAgIHlsYWIgPSAiTGF0ZW5jeSB0byBGaXJzdCBGaXhhdGlvbiIsDQogICAgICAgIGNleC5sYWIgPSAxLjMsDQogICAgICAgIGNleC5heGlzID0gMS44LA0KICAgICAgICB5bGltICAgICA9IGMoeW1pbiwgeW1heCkpDQoNCmBgYA0KDQptb2RlbCBpdDoNCg0KYGBge3J9DQojIyBtb2RlbCB0aGUgdGltZSBvZiBmaXJzdCBmaXhhdGlvbg0KbW9kID0gbG1lcihUSU1FX0ZJUlNURklYIH4gY29uc2lzdGVuY3lDIA0KICAgICAgICAgICArICgxIHwgc3ViaikgKyAoMSB8IHNjZW5lKSwgDQogICAgICAgICAgIGRhdGEgPSBFVCkNCg0Kc3VtbWFyeShtb2QpDQpgYGANCg0KVGhlIGxhdGVuY3kgd2FzIHNpZ25pZmljYW50bHkgc2hvcnRlciBmb3IgaW5jb25zaXN0ZW50IGFzIGNvbXBhcmVkIHRvIGNvbnNpc3RlbnQgb2JqZWN0cyAocmVmZXIgdG8gRmlndXJlIDNDIGFuZCBUYWJsZSAzIG9mIHRoZSBtYW51c2NyaXB0KS4NCg0KIyMgR2F6ZSBkdXJhdGlvbg0KDQpGaXJzdC1wYXNzIGdhemUgZHVyYXRpb24gaXMgYSBtZWFzdXJlIG9mIGZvdmVhbCBvYmplY3QgcHJvY2Vzc2luZyB0aW1lLCBkZWZpbmVkIGFzIHRoZSBzdW0gb2YgYWxsIGZpeGF0aW9uIGR1cmF0aW9uIGZyb20gZmlyc3QgZW50cnkgdG8gZmlyc3QgZXhpdCBvbiB0aGUgY3JpdGljYWwgb2JqZWN0LiBPbiBhdmVyYWdlLCBwYXJ0aWNpcGFudHMgbG9va2VkIGxvbmdlciBhdCBpbmNvbnNpc3RlbnQgKDUyMCBtc2VjKSB0aGFuIGNvbnNpc3RlbnQgKDQwOSBtc2VjKSBvYmplY3RzLg0KDQpgYGB7cn0NCndpdGgoRVQsIHRhcHBseShHRCwgbGlzdChjb25zaXN0ZW5jeSksIG1lYW4pKQ0KYGBgDQoNClZpc3VhbGl6ZToNCg0KYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ICA9IDh9DQptZWFuIDwtIHdpdGgoRVQsIHRhcHBseShHRCwgbGlzdChjb25zaXN0ZW5jeSwgc3ViaiksIG1lYW4sIG5hLnJtID0gVFJVRSkpDQp5bWF4ID0gbWF4KG1lYW4sIG5hLnJtID0gVFJVRSkNCnltaW4gPSBtaW4obWVhbiwgbmEucm0gPSBUUlVFKQ0KDQpNID0gYXMuZGF0YS5mcmFtZShjYmluZChjKG1lYW5bMSxdLCBtZWFuWzIsXSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgYyhyZXAoIkNvbnNpc3RlbnQiLCBuY29sKG1lYW4pKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgiSW5jb25zaXN0ZW50IiwgbmNvbChtZWFuKSkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGFyc2UubGV2ZWwgPSAwKSwNCiAgICAgICAgICAgICAgICAgIGNoZWNrLm5hbWVzID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICByb3cubmFtZXMgPSBGQUxTRSkNCg0KIyMgdGFrZSBvdXQgdGhlIG5hcw0KIyBNID0gTVstYXMubnVtZXJpYyh3aGljaChpcy5uYShNWywxXSkgPT0gVFJVRSkpLF0NCg0KY29sbmFtZXMoTSkgPSBjKCJ2YWx1ZSIsICJjb25zaXN0ZW5jeSIpDQoNCk1bLDFdID0gYXMubnVtZXJpYyhhcy5tYXRyaXgoTVssMV0pKQ0KDQpib3hwbG90KHZhbHVlIH4gY29uc2lzdGVuY3ksIGRhdGEgPSBNLCANCiAgICAgICAgY29sID0gYygiYmx1ZTQiLCAicmVkNCIpLA0KICAgICAgICB5bGFiID0gIkdhemUgRHVyYXRpb24gKEZpcnN0IFBhc3MpIiwNCiAgICAgICAgY2V4LmxhYiA9IDEuMywNCiAgICAgICAgY2V4LmF4aXMgPSAxLjgsDQogICAgICAgIHlsaW0gICAgID0gYyh5bWluLCB5bWF4KSkNCmBgYA0KDQptb2RlbCBpdDoNCg0KYGBge3J9DQoNCm1vZCA9IGxtZXIoR0QgfiBjb25zaXN0ZW5jeUMNCiAgICAgICAgICAgKyAoMSB8IHN1YmopICsgKDEgfCBzY2VuZSksIA0KICAgICAgICAgICBkYXRhID0gRVQpDQoNCnN1bW1hcnkobW9kKQ0KDQpgYGANCg0KT24gYXZlcmFnZSwgcGFydGljaXBhbnRzIGxvb2tlZCBsb25nZXIgYXQgaW5jb25zaXN0ZW50ICg1MjAgbXMpIHRoYW4gY29uc2lzdGVudCBvYmplY3RzICg0MDkgbXMpIGJlZm9yZSBsZWF2aW5nIHRoZSB0YXJnZXQgb2JqZWN0IGZvciB0aGUgZmlyc3QgdGltZSwgYW5kIHRoaXMgZGlmZmVyZW5jZSB3YXMgc2lnbmlmaWNhbnQgKHJlZmVyIHRvIFRhYmxlIDMgaW4gdGhlIG1hbnVzY3JpcHQpDQoNCkluIHRoZSBuZXh0IHNlY3Rpb24sIHdlIGFyZSBnb2luZyB0byBiZSBsb29raW5nIHdoZXRoZXIgdGhlIHByaW9yaXRpemF0aW9uIG9mIGFuIGluY29uc2lzdGVudCBvYmplY3Qgb3ZlciBhIGNvbnNpc3RlbnQgb2JqZWN0IG1hbmlmZXN0cyBhbHNvIGluIHRoZSBmaXhhdGlvbi1yZWxhdGVkIHBvdGVudGlhbHMgdGltZS1sb2NrZWQgdG8gdGhlIGZpeGF0aW9uIHByZWNlZGluZyB0aGUgdGFyZ2V0IGZpeGF0aW9uIChpLmUuLCB0LTEpLCBhbmQgd2hldGhlciBzdWNoIGFuIGVmZmVjdCBjYXJyaWVzIG92ZXIgdGhyb3VnaG91dCBmaXhhdGlvbiB0LiBXZSBhbHNvIGxvb2sgYXQgdGhlIHJFUlAgbG9ja2VkIGF0IHRoZSBvbnNldCBvZiB0aGUgc2NlbmUgKHMpLCBhbmQgYXQgdGhlIGZpeGF0aW9uLXJlbGF0ZWQgcG90ZW50aWFscyBvZiBhbGwgbm9uLXRhcmdldCBmaXhhdGlvbnMgKGkuZS4sIG50KSANCg0KIyBFbGVjdHJvLXBoeXNpb2xvZ2ljYWwgcmVzdWx0cw0KDQpSZXN1bHRzIGluIHRoaXMgdHV0b3JpYWwgd2lsbCBvbmx5IGZvY3VzIG9uIHRoZSBzZWNvbmQtbGV2ZWwgb2YgYW5hbHlzaXMgKGdyb3VwIHN0YXRpc3RpY3MpLiBTcGVjaWZpY2FsbHksIHdlIGNvbXBhcmUgdGhlIGNvbnNpc3RlbnQgYW5kIGluY29uc2lzdGVudCBjb25kaXRpb24gaW4gdGhlIHRpbWUgd2luZG93cyBmcm9tIDI1MC0zNTAgbXMgKGVhcmx5IGVmZmVjdCkgYW5kIDM1MC02MDAgbXMgKGxhdGUgZWZmZWN0KSBhdCBhIG1pZC1jZW50cmFsIHJlZ2lvbi1vZi1pbnRlcmVzdCAoUk9JKSBvZiBuaW5lIGVsZWN0cm9kZXMgKGNvbXByaXNpbmcgRkMxLCBGQ3osIEZDMiwgQzEsIEN6LCBDMiwgQ1AxLCBDUHosIGFuZCBDUDIpLCBpbmRlcGVuZGVudGx5IGZvciBmb3VyIHR5cGVzIG9mIGV2ZW50czogc3RpbXVsdXMtbG9ja2VkICgqKnMqKiksIG5vbi10YXJnZXQgZml4YXRpb25zICgqKm50KiopLCBwcmUtdGFyZ2V0IGZpeGF0aW9ucyAoKip0LTEqKikgYW5kIHRhcmdldCBmaXhhdGlvbnMgKCoqdCoqKS4gDQoNCkJlY2F1c2UgdGhlIG91dHB1dCBwcm92aWRlZCBieSB0aGUgbGluZWFyIGRlY29udm9sdXRpb24gbW9kZWwgKHRoZSBmaXJzdC1sZXZlbCBhbmFseXNpcykgaXMgYWxyZWFkeSBhZ2dyZWdhdGVkIGF0IHRoZSBsZXZlbCBvZiBzdWJqZWN0LWF2ZXJhZ2VzLCB0aGUgb25seSBwcmVkaWN0b3IgaW5jbHVkZWQgaW4gdGhlc2UgTE1NcyB3YXMgdGhlIENvbnNpc3RlbmN5IG9mIHRoZSBvYmplY3QsIGFsb25nIHdpdGggUGFydGljaXBhbnQgYXMgcmFuZG9tIGVmZmVjdCwgd2hpY2ggaXMgaW5jbHVkZWQgYm90aCBhcyBpbnRlcmNlcHQsIGFuZCBhcyByYW5kb20gc2xvcGUgb2YgQ29uc2lzdGVuY3kgdG8gbWFrZSB0aGUgdGVzdCBtb3JlIGNvbnNlcnZhdGl2ZS4gVGhlbiwgd2UgdXRpbGl6ZSB0aGUgc3RlcCBmdW5jdGlvbiBmcm9tIHRoZSBgbG1lclRlc3QoKWAgcGFja2FnZSB0byBjb21wdXRlIHRoZSBsZXZlbCBvZiBzaWduaWZpY2FuY2Ugd2FzIGNhbGN1bGF0ZWQgZnJvbSBhbiBGLXRlc3QgYmFzZWQgb24gdGhlIFNhdHRlcnRod2FpdGUgYXBwcm94aW1hdGlvbiB0byB0aGUgZWZmZWN0aXZlIGRlZ3JlZXMgb2YgZnJlZWRvbSwgYXMgd2VsbCBhcywgZXZhbHVhdGUgdGhlIHJhbmRvbSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVscyB0byBtYXhpbWl6ZSB0aGVpciBjb252ZXJnZW5jZS4gQWRkaXRpb25hbGx5LCB3ZSByZXBvcnQgYSBzaW1wbGUgQU5PVkEgYW5hbHlzaXMsIHdoaWNoIHBlcmZlY3RseSBjb3Jyb2JvcmF0ZXMgdGhlIExNRSByZXN1bHRzLiAgDQoNCldlIHJlZmVyIHRoZSByZWFkZXIgdG8gdGhlIG1hbnVzY3JpcHQgZm9yIG11Y2ggZ3JlYXRlciBkZXRhaWxzIGFib3V0IHRoZSBmaXJzdC1sZXZlbCBvZiBhbmFseXNpcywgYW5kIHRoZSBwaXBlbGluZSB0aGF0IHdlIGhhdmUgZm9sbG93ZWQgdG8gY29tcHV0ZSB0aGUgZml4YXRpb24tcmVsYXRlZCBwb3RlbnRpYWxzLg0KDQojIyBTdHJ1Y3R1cmUgb2YgdGhlIEVFRyBkYXRhDQoNCkxldCdzIGxvb2sgYXQgdGhlIHN0cnVjdHVyZSBvZiB0aGUgRUVHIGRhdGEgZmlsZSBmaXJzdC4gDQoNCmBgYHtyfQ0Kc3RyKEVFRykNCmBgYA0KDQpUaGUgRUVHL0ZSUCBkYXRhIGhhcyBiZWVuIHN0cnVjdHVyZWQgYWxvbmcgdGhlIGNvbHVtbnMgaW4gdGhlIGZvbGxvd2luZyB3YXk6DQoNCi0gYHN1YmpgICAgICAgICA9IHRoZSBzdWJqZWN0IElEDQotIGBjb25zaXN0ZW5jeWAgPSB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIHRhcmdldCBvYmplY3QgKGNvbnNpc3RlbnQsIGluY29uc2lzdGVudCkNCi0gYHR5cGVfZXZlbnRgICA9IHRoZSB0eXBlIG9mIEVFRyBkYXRhIGFuYWx5c2VkLCB3aXRoIDQgbGV2ZWxzIChzID0gc3RpbXVsdXMtb25zZXQsIG50ID0gbm9uLXRhcmdldCwgcHQgPSBwcmVjZWRpbmcgdGhlIHRhcmdldCwgdCA9IHRhcmdldCkNCi0gYHNlZ21lbnRgICAgICA9IHRoZSB0ZW1wb3JhbCB3aW5kb3dzIG9mIGludGVyZXN0ICgwLjI1MC0wLjM1MCA9IGVhcmx5OyAwLjM1MC0wLjYwMCA9IGxhdGUpDQotIGB2b2x0YWdlYCAgICAgPSB0aGUgdm9sdGFnZSBvZiB0aGUgRUVHIHJlY29yZGluZw0KLSBgZWxlY3Ryb2RlYCAgID0gdGhlIG5pbmUgZWxlY3Ryb2RlcyBvZiB0aGUgbWlkLWNlbnRyYWwgcmVnaW9uIG9mIGludGVyZXN0IChjb21wcmlzaW5nIEZDMSwgRkN6LCBGQzIsIEMxLCBDeiwgQzIsIENQMSwgQ1B6LCBhbmQgQ1AyKS4gDQoNClRvIHRoaXMgd2UgYWRkIHRoZSBjZW50cmVkIHZlcnNpb24gb2YgdGhlICpjb25zaXN0ZW5jeSogdmFyaWFibGUuIA0KDQpgYGB7cn0NCkVFRyRjb25zaXN0ZW5jeUMgPSBhcy5udW1lcmljKGFzLmZhY3RvcihFRUckY29uc2lzdGVuY3kpKQ0KRUVHJGNvbnNpc3RlbmN5QyA9IEVFRyRjb25zaXN0ZW5jeUMgLSBtZWFuKEVFRyRjb25zaXN0ZW5jeUMsIG5hLnJtID0gVCkgDQpjKGFzLmNoYXJhY3RlcihFRUckY29uc2lzdGVuY3lbMV0pLCBFRUckY29uc2lzdGVuY3lDWzFdKQ0KYGBgDQpXZSB3aWxsIHN1YnNldCBhbmQgYW5hbHlzZSB0aGUgcmVsZXZhbnQgdHlwZSBvZiBldmVudCBhbmQgd2luZG93IG9mIGludGVyZXN0cyB0aGF0IGFyZSByZXBvcnRlZCBpbiB0aGUgbWFudXNjcmlwdCAoVGFibGUgNCkgDQoNCiMjIFNjZW5lLW9uc2V0IEVSUCwgcw0KDQpGaXJzdCwgd2UgbG9vayBhdCB0aGUgZXZva2VkIHBvdGVudGlhbHMgdGltZS1sb2NrZWQgdG8gdGhlIHNjZW5lIG9uc2V0IGZvciB0aGUgdHdvIHRlbXBvcmFsIHdpbmRvd3Mgb2YgaW50ZXJlc3QuIA0KDQpgYGB7cn0NCnNfZWFybHkgPSBzdWJzZXQoRUVHLCBFRUckdHlwZV9ldmVudCA9PSAicyIgJiBFRUckc2VnbWVudCA9PSAiMC4yNTAtMC4zNTAiKQ0Kc19sYXRlICA9IHN1YnNldChFRUcsIEVFRyR0eXBlX2V2ZW50ID09ICJzIiAmIEVFRyRzZWdtZW50ID09ICIwLjM1MC0wLjYwMCIpDQoNCnByaW50KCJFYXJseS1XaW5kb3ciKQ0KDQoNCnNfZSA9IGxtZXIodm9sdGFnZSB+IGNvbnNpc3RlbmN5Qw0KICAgICAgICAgICArICgxIHwgc3ViaikgKyAoMCArIGNvbnNpc3RlbmN5IHwgc3ViaiksDQogICAgICAgICAgIGRhdGEgPSBzX2Vhcmx5LCANCiAgICAgICAgICAgY29udHJvbD1sbWVyQ29udHJvbChjaGVjay5jb252LnNpbmd1bGFyID0gLm1ha2VDQyhhY3Rpb24gPSAiaWdub3JlIiwgIHRvbCA9IDFlLTQpKSkNCg0KcHJpbnQoIkxNRSBvdXRwdXQiKQ0KDQpzdW1tYXJ5KHNfZSkNCg0Kc19lX3JlZCA9IHN0ZXAoc19lLCBkZGYgPSAiU2F0dGVydGh3YWl0ZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLnJhbmRvbSA9IDAuMSwgYWxwaGEuZml4ZWQgPSAwLjA4LCAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2UuZml4ZWQgPSBGQUxTRSwgcmVkdWNlLnJhbmRvbSA9IFRSVUUpDQoNCnNfZV9yZWQgICAgPSBnZXRfbW9kZWwoc19lX3JlZCkNCg0KDQpwcmludCgiTE1FIHNlbGVjdGVkIHdpdGggcC12YWx1ZXMiKQ0KDQpzdW1tYXJ5KHNfZV9yZWQpDQoNCmFvdl9zX2UgPSBlekFOT1ZBKA0KICBkYXRhID0gc19lYXJseQ0KICAsIGR2ID0gdm9sdGFnZQ0KICAsIHdpZCA9IHN1YmoNCiAgLCB3aXRoaW4gPSAuKGNvbnNpc3RlbmN5KSkNCg0KcHJpbnQoIkFOT1ZBIG91dHB1dCIpDQoNCnByaW50KGFvdl9zX2UpDQoNCnByaW50KCJOb3cgTGF0ZS1XaW5kb3ciKQ0KDQpzX2wgPSBsbWVyKHZvbHRhZ2UgfiBjb25zaXN0ZW5jeUMNCiAgICAgICAgICAgKyAoMSB8IHN1YmopICsgKDAgKyBjb25zaXN0ZW5jeSB8IHN1YmopLA0KICAgICAgICAgICBkYXRhID0gc19sYXRlLA0KICAgICAgICAgICBjb250cm9sPWxtZXJDb250cm9sKGNoZWNrLmNvbnYuc2luZ3VsYXIgPSAubWFrZUNDKGFjdGlvbiA9ICJpZ25vcmUiLCAgdG9sID0gMWUtNCkpKQ0KDQpwcmludCgiTE1FIG91dHB1dCIpDQpzdW1tYXJ5KHNfbCkNCg0Kc19sX3JlZCA9IHN0ZXAoc19sLCBkZGYgPSAiU2F0dGVydGh3YWl0ZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLnJhbmRvbSA9IDAuMSwgYWxwaGEuZml4ZWQgPSAwLjA4LCAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2UuZml4ZWQgPSBGQUxTRSwgcmVkdWNlLnJhbmRvbSA9IFRSVUUpDQoNCnNfbF9yZWQgICAgPSBnZXRfbW9kZWwoc19sX3JlZCkNCg0KDQpwcmludCgiTE1FIHNlbGVjdGVkIHdpdGggcC12YWx1ZXMiKQ0Kc3VtbWFyeShzX2xfcmVkKQ0KDQphb3Zfc19sID0gZXpBTk9WQSgNCiAgZGF0YSA9IHNfbGF0ZQ0KICAsIGR2ID0gdm9sdGFnZQ0KICAsIHdpZCA9IHN1YmoNCiAgLCB3aXRoaW4gPSAuKGNvbnNpc3RlbmN5KSkNCg0KcHJpbnQoIkFOT1ZBIG91dHB1dCIpDQoNCnByaW50KGFvdl9zX2wpDQoNCmBgYA0KDQpXZSBkbyBub3Qgb2JzZXJ2ZSBhbnkgaW5mbHVlbmNlIG9mIHNlbWFudGljIGNvbnNpc3RlbmN5IG9mIHRoZSB0YXJnZXQgb2JqZWN0IG9uIHRoZSBuZXVyYWwgcmVzcG9uc2UgdG8gdGhlIGluaXRpYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzY2VuZSBpbiBib3RoIHdpbmRvd3Mgb2YgYW5hbHlzaXMuDQoNCiMjIE5vbi10YXJnZXQgZml4YXRpb24sIG50DQoNCk5vdywgd2UgbG9vayBhdCB0aGUgbm9uLXRhcmdldCBmaXhhdGlvbi4NCg0KYGBge3J9DQpudF9lYXJseSA9IHN1YnNldChFRUcsIEVFRyR0eXBlX2V2ZW50ID09ICJudCIgJiBFRUckc2VnbWVudCA9PSAiMC4yNTAtMC4zNTAiKQ0KbnRfbGF0ZSAgPSBzdWJzZXQoRUVHLCBFRUckdHlwZV9ldmVudCA9PSAibnQiICYgRUVHJHNlZ21lbnQgPT0gIjAuMzUwLTAuNjAwIikNCg0KcHJpbnQoIkVhcmx5LVdpbmRvdyIpDQoNCm50X2UgPSBsbWVyKHZvbHRhZ2UgfiBjb25zaXN0ZW5jeUMNCiAgICAgICAgICAgICsgKDEgfCBzdWJqKSArICgwICsgY29uc2lzdGVuY3kgfCBzdWJqKSwNCiAgICAgICAgICAgIGRhdGEgPSBudF9lYXJseSwNCiAgICAgICAgICAgIGNvbnRyb2w9bG1lckNvbnRyb2woY2hlY2suY29udi5zaW5ndWxhciA9IC5tYWtlQ0MoYWN0aW9uID0gImlnbm9yZSIsICB0b2wgPSAxZS00KSkpDQoNCnByaW50KCJMTUUgb3V0cHV0IikNCg0Kc3VtbWFyeShudF9lKQ0KDQpudF9lX3JlZCA9IHN0ZXAobnRfZSwgZGRmID0gIlNhdHRlcnRod2FpdGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5yYW5kb20gPSAwLjEsIGFscGhhLmZpeGVkID0gMC4wOCwgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlLmZpeGVkID0gRkFMU0UsIHJlZHVjZS5yYW5kb20gPSBUUlVFKQ0KDQpudF9lX3JlZCAgICA9IGdldF9tb2RlbChudF9lX3JlZCkNCg0KDQpwcmludCgiTE1FIHNlbGVjdGVkIHdpdGggcC12YWx1ZXMiKQ0Kc3VtbWFyeShudF9lX3JlZCkNCg0KYW92X250X2UgPSBlekFOT1ZBKA0KICBkYXRhID0gbnRfZWFybHkNCiAgLCBkdiA9IHZvbHRhZ2UNCiAgLCB3aWQgPSBzdWJqDQogICwgd2l0aGluID0gLihjb25zaXN0ZW5jeSkpDQoNCnByaW50KCJBTk9WQSBvdXRwdXQiKQ0KDQpwcmludChhb3ZfbnRfZSkNCg0KcHJpbnQoIk5vdyBMYXRlLVdpbmRvdyIpDQoNCm50X2wgICAgICA9IGxtZXIodm9sdGFnZSB+IGNvbnNpc3RlbmN5Qw0KICAgICAgICAgICAgICAgICArICgxIHwgc3ViaikgKyAoMCArIGNvbnNpc3RlbmN5IHwgc3ViaiksDQogICAgICAgICAgICAgICAgIGRhdGEgPSBudF9sYXRlLA0KICAgICAgICAgICAgICAgICBjb250cm9sPWxtZXJDb250cm9sKGNoZWNrLmNvbnYuc2luZ3VsYXIgPSAubWFrZUNDKGFjdGlvbiA9ICJpZ25vcmUiLCAgdG9sID0gMWUtNCkpKQ0KDQpwcmludCgiTE1FIG91dHB1dCIpDQoNCnN1bW1hcnkobnRfbCkNCg0KbnRfbF9yZWQgPSBzdGVwKG50X2wsIGRkZiA9ICJTYXR0ZXJ0aHdhaXRlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEucmFuZG9tID0gMC4xLCBhbHBoYS5maXhlZCA9IDAuMDgsICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZS5maXhlZCA9IEZBTFNFLCByZWR1Y2UucmFuZG9tID0gVFJVRSkNCg0KbnRfbF9yZWQgICAgPSBnZXRfbW9kZWwobnRfbF9yZWQpDQoNCg0KcHJpbnQoIkxNRSBzZWxlY3RlZCB3aXRoIHAtdmFsdWVzIikNCnN1bW1hcnkobnRfbF9yZWQpDQoNCmFvdl9udF9sID0gZXpBTk9WQSgNCiAgZGF0YSA9IG50X2xhdGUNCiAgLCBkdiA9IHZvbHRhZ2UNCiAgLCB3aWQgPSBzdWJqDQogICwgd2l0aGluID0gLihjb25zaXN0ZW5jeSkpDQoNCnByaW50KCJBTk9WQSBvdXRwdXQiKQ0KDQpwcmludChhb3ZfbnRfbCkNCg0KYGBgDQoNCkNvbnNpc3RlbmN5IGhhZCBubyBlZmZlY3Qgb24gdGhlIEZSUCBmb3Igbm9uLXRhcmdldCAobnQpIGZpeGF0aW9ucyBpbiBib3RoIHdpbmRvd3Mgb2YgYW5hbHlzaXMuIA0KDQojIyBQcmUtdGFyZ2V0IGZpeGF0aW9uLCB0LTENCg0KTW92aW5nIG9udG8gdGhlIGZpeGF0aW9uLXJlbGF0ZWQgcG90ZW50aWFsIHRpbWUtbG9ja2VkIHRvIHRoZSBwcmUtdGFyZ2V0IGZpeGF0aW9uLiANCg0KYGBge3J9DQpwdF9lYXJseSA9IHN1YnNldChFRUcsIEVFRyR0eXBlX2V2ZW50ID09ICJwdCIgJiBFRUckc2VnbWVudCA9PSAiMC4yNTAtMC4zNTAiKQ0KcHRfbGF0ZSAgPSBzdWJzZXQoRUVHLCBFRUckdHlwZV9ldmVudCA9PSAicHQiICYgRUVHJHNlZ21lbnQgPT0gIjAuMzUwLTAuNjAwIikNCg0KcHJpbnQoIkVhcmx5LVdpbmRvdyIpDQoNCnB0X2UgPSBsbWVyKHZvbHRhZ2UgfiBjb25zaXN0ZW5jeUMNCiAgICAgICAgICAgICsgKDEgfCBzdWJqKSArICgwICsgY29uc2lzdGVuY3kgfCBzdWJqKSwNCiAgICAgICAgICAgIGRhdGEgPSBwdF9lYXJseSwNCiAgICAgICAgICAgIGNvbnRyb2w9bG1lckNvbnRyb2woY2hlY2suY29udi5zaW5ndWxhciA9IC5tYWtlQ0MoYWN0aW9uID0gImlnbm9yZSIsICB0b2wgPSAxZS00KSkpDQoNCnByaW50KCJMTUUgb3V0cHV0IikNCg0Kc3VtbWFyeShwdF9lKQ0KDQpwdF9lX3JlZCA9IHN0ZXAocHRfZSwgZGRmID0gIlNhdHRlcnRod2FpdGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYS5yYW5kb20gPSAwLjEsIGFscGhhLmZpeGVkID0gMC4wOCwgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlLmZpeGVkID0gRkFMU0UsIHJlZHVjZS5yYW5kb20gPSBUUlVFKQ0KDQpwdF9lX3JlZCAgICA9IGdldF9tb2RlbChwdF9lX3JlZCkNCg0KDQpwcmludCgiTE1FIHNlbGVjdGVkIHdpdGggcC12YWx1ZXMiKQ0Kc3VtbWFyeShwdF9lX3JlZCkNCg0KYW92X3B0X2UgPSBlekFOT1ZBKA0KICBkYXRhID0gcHRfZWFybHkNCiAgLCBkdiA9IHZvbHRhZ2UNCiAgLCB3aWQgPSBzdWJqDQogICwgd2l0aGluID0gLihjb25zaXN0ZW5jeSkpDQoNCg0KcHJpbnQoIkFOT1ZBIG91dHB1dCIpDQoNCnByaW50KGFvdl9wdF9lKQ0KDQpwcmludCgiTm93IExhdGUtV2luZG93IikNCg0KcHRfbCA9IGxtZXIodm9sdGFnZSB+IGNvbnNpc3RlbmN5Qw0KICAgICAgICAgICAgKyAoMSB8IHN1YmopICsgKDAgKyBjb25zaXN0ZW5jeSB8IHN1YmopLA0KICAgICAgICAgICAgZGF0YSA9IHB0X2xhdGUsDQogICAgICAgICAgICBjb250cm9sPWxtZXJDb250cm9sKGNoZWNrLmNvbnYuc2luZ3VsYXIgPSAubWFrZUNDKGFjdGlvbiA9ICJpZ25vcmUiLCAgdG9sID0gMWUtNCkpKQ0KDQpwcmludCgiTE1FIG91dHB1dCIpDQoNCnN1bW1hcnkocHRfbCkNCg0KcHRfbF9yZWQgPSBzdGVwKHB0X2wsIGRkZiA9ICJTYXR0ZXJ0aHdhaXRlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEucmFuZG9tID0gMC4xLCBhbHBoYS5maXhlZCA9IDAuMDgsICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZS5maXhlZCA9IEZBTFNFLCByZWR1Y2UucmFuZG9tID0gVFJVRSkNCg0KcHRfbF9yZWQgICAgPSBnZXRfbW9kZWwocHRfbF9yZWQpDQoNCg0KcHJpbnQoIkxNRSBzZWxlY3RlZCB3aXRoIHAtdmFsdWVzIikNCnN1bW1hcnkocHRfbF9yZWQpDQoNCmFvdl9wdF9sID0gZXpBTk9WQSgNCiAgZGF0YSA9IHB0X2xhdGUNCiAgLCBkdiA9IHZvbHRhZ2UNCiAgLCB3aWQgPSBzdWJqDQogICwgd2l0aGluID0gLihjb25zaXN0ZW5jeSkpDQoNCnByaW50KCJBTk9WQSBvdXRwdXQiKQ0KcHJpbnQoYW92X3B0X2wpDQpgYGANCg0KSW4gdGhlIExNTSBhbmFseXNlcyBjb25kdWN0ZWQgb24gdGhlIG1pZC1jZW50cmFsIFJPSSwgdGhpcyBlZmZlY3Qgd2FzIG1hcmdpbmFsbHkgc2lnbmlmaWNhbnQgKHAgPCAwLjEpIGZvciB0aGUgZWFybHkgdGltZSB3aW5kb3cgKDI1MCB0byAzNTAgbXMpLCBidXQgYmVjYW1lIGhpZ2hseSBzaWduaWZpY2FudCBiZXR3ZWVuIDM1MCBhbmQgNjAwIG1zIChwIDwgMC4wMDEsIFRhYmxlIDQpDQoNCiMjIFRhcmdldCBmaXhhdGlvbiwgdA0KDQpGaW5hbGx5LCB3ZSBsb29rIGF0IHRoZSBmaXhhdGlvbi1yZWxhdGVkIHBvdGVudGlhbCBkdXJpbmcgZm92ZWF0aW9uIG9mIHRoZSB0YXJnZXQuIA0KDQpgYGB7cn0NCnRfZWFybHkgPSBzdWJzZXQoRUVHLCBFRUckdHlwZV9ldmVudCA9PSAidCIgJiBFRUckc2VnbWVudCA9PSAiMC4yNTAtMC4zNTAiKQ0KdF9sYXRlICA9IHN1YnNldChFRUcsIEVFRyR0eXBlX2V2ZW50ID09ICJ0IiAmIEVFRyRzZWdtZW50ID09ICIwLjM1MC0wLjYwMCIpDQoNCnByaW50KCJFYXJseS1XaW5kb3ciKQ0KDQp0X2UgPSBsbWVyKHZvbHRhZ2UgfiBjb25zaXN0ZW5jeUMNCiAgICAgICAgICAgKyAoMSB8IHN1YmopICsgKDAgKyBjb25zaXN0ZW5jeSB8IHN1YmopLA0KICAgICAgICAgICBkYXRhID0gdF9lYXJseSwNCiAgICAgICAgICAgY29udHJvbD1sbWVyQ29udHJvbChjaGVjay5jb252LnNpbmd1bGFyID0gLm1ha2VDQyhhY3Rpb24gPSAiaWdub3JlIiwgIHRvbCA9IDFlLTQpKSkNCg0KcHJpbnQoIkxNRSBvdXRwdXQiKQ0Kc3VtbWFyeSh0X2UpDQoNCg0KdF9lX3JlZCA9IHN0ZXAodF9lLCBkZGYgPSAiU2F0dGVydGh3YWl0ZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLnJhbmRvbSA9IDAuMSwgYWxwaGEuZml4ZWQgPSAwLjA4LCAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2UuZml4ZWQgPSBGQUxTRSwgcmVkdWNlLnJhbmRvbSA9IFRSVUUpDQoNCnRfZV9yZWQgICAgPSBnZXRfbW9kZWwodF9lX3JlZCkNCg0KcHJpbnQoIkxNRSBzZWxlY3RlZCB3aXRoIHAtdmFsdWVzIikNCnN1bW1hcnkodF9lX3JlZCkNCg0KYW92X3RfZSA9IGV6QU5PVkEoDQogIGRhdGEgPSB0X2Vhcmx5DQogICwgZHYgPSB2b2x0YWdlDQogICwgd2lkID0gc3Viag0KICAsIHdpdGhpbiA9IC4oY29uc2lzdGVuY3kpKQ0KDQpwcmludCgiQU5PVkEgb3V0cHV0IikNCg0KcHJpbnQoYW92X3RfZSkNCg0KcHJpbnQoIk5vdyBMYXRlLVdpbmRvdyIpDQoNCnRfbCA9IGxtZXIodm9sdGFnZSB+IGNvbnNpc3RlbmN5Qw0KICAgICAgICAgICArICgxIHwgc3ViaikgKyAoMCArIGNvbnNpc3RlbmN5IHwgc3ViaiksDQogICAgICAgICAgIGRhdGEgPSB0X2xhdGUsDQogICAgICAgICAgIGNvbnRyb2w9bG1lckNvbnRyb2woY2hlY2suY29udi5zaW5ndWxhciA9IC5tYWtlQ0MoYWN0aW9uID0gImlnbm9yZSIsICB0b2wgPSAxZS00KSkpDQoNCnByaW50KCJMTUUgb3V0cHV0IikNCnN1bW1hcnkodF9sKQ0KDQp0X2xfcmVkID0gc3RlcCh0X2wsIGRkZiA9ICJTYXR0ZXJ0aHdhaXRlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEucmFuZG9tID0gMC4xLCBhbHBoYS5maXhlZCA9IDAuMDgsICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZS5maXhlZCA9IEZBTFNFLCByZWR1Y2UucmFuZG9tID0gVFJVRSkNCg0KdF9sX3JlZCAgICA9IGdldF9tb2RlbCh0X2xfcmVkKQ0KDQpwcmludCgiTE1FIHNlbGVjdGVkIHdpdGggcC12YWx1ZXMiKQ0Kc3VtbWFyeSh0X2xfcmVkKQ0KDQphb3ZfdF9sID0gZXpBTk9WQSgNCiAgZGF0YSA9IHRfbGF0ZQ0KICAsIGR2ID0gdm9sdGFnZQ0KICAsIHdpZCA9IHN1YmoNCiAgLCB3aXRoaW4gPSAuKGNvbnNpc3RlbmN5KSkNCg0KcHJpbnQoIkFOT1ZBIG91dHB1dCIpDQoNCnByaW50KGFvdl90X2wpDQoNCmBgYA0KDQpUaGUgZWZmZWN0IG9mIG9iamVjdCBjb25zaXN0ZW5jeSBpcyBzaWduaWZpY2FudCBpbiBib3RoIHRoZSBlYXJseSBhbmQgbGF0ZSB3aW5kb3cgb2YgYW5hbHlzaXMuIA0KDQojIENvbmNsdXNpb24NCg0KT3VyIGZpbmRpbmdzIGNvbnZlcmdlIHRvIHN1Z2dlc3QgdGhhdCB0aGUgdmlzdWFsIHN5c3RlbSBhY2Nlc3NlcyBzZW1hbnRpYyBmZWF0dXJlcyBvZiBvYmplY3RzIGluIGV4dHJhZm92ZWFsIHZpc2lvbiB0byBndWlkZSBhdHRlbnRpb24gdG93YXJkcyBvYmplY3RzIHRoYXQgZG8gbm90IGZpdCB0byB0aGUgc2NlbmUncyBvdmVyYWxsIG1lYW5pbmcuIFRoZXkgYWxzbyBoaWdobGlnaHQgdGhlIHV0aWxpdHkgb2YgaW52ZXN0aWdhdGluZyBhdHRlbnRpb25hbCBhbmQgbmV1cmFsIG1lY2hhbmlzbXMgaW4gcGFyYWxsZWwgdG8gdW5jb3ZlciB0aGUgbWVjaGFuaXNtcyB1bmRlcmx5aW5nIG9iamVjdCByZWNvZ25pdGlvbiBkdXJpbmcgdGhlIHVuY29uc3RyYWluZWQgZXhwbG9yYXRpb24gb2YgbmF0dXJhbGlzdGljIHNjZW5lcy4NCg0KIyBSZWZlcmVuY2VzDQoNCkNvY28sIE51dGhtYW5uICYgRGltaWdlbiAoaW4gcHJlc3MpLiBGaXhhdGlvbi1yZWxhdGVkIGJyYWluIHBvdGVudGlhbHMgZHVyaW5nIHNlbWFudGljIGludGVncmF0aW9uIG9mIG9iamVjdC1zY2VuZSBpbmZvcm1hdGlvbi4gSm91cm5hbCBvZiBDb2duaXRpdmUgTmV1cm9zY2llbmNlLiANCg0K