Goal

Estimation of moderation analyses.

Set up and data import

#library
library(tidyverse)
library(lavaan)
library(data.table)
library(doParallel)
library(parallel)

#get data and estimates
load("results/predicted_means/240816_pred-means-cleaned-df.Rdata")
load(file = "results/riclpm/240816_lavaan-main-results.Rdata")


#create between level variables
MyData <- pred_results$df_combined %>% 
  rowwise() %>% 
  mutate(between_educ = mean(c_across(cols = matches("^educ_[[:digit:]]{1,2}")),na.rm = T),
         between_age = mean(c_across(cols = matches("^age_[[:digit:]]{1,2}")),na.rm = T),
         between_female = mean(c_across(cols = matches("^female_[[:digit:]]{1,2}")),na.rm = T),
         between_origin = mean(c_across(cols = matches("^origin_[[:digit:]]{1,2}")),na.rm = T)) %>%
  ungroup()

#create dir for storing model objects
dir <- file.path("results", "riclpm", "moderation_models") 

Between level interaction (median split)

Political Discussion

library(Hmisc) #used to create cuts in a variable

#create between mean
MyData <- MyData %>%
  rowwise() %>%
  mutate(pol_dis = mean(c_across(starts_with("Fpol")), na.rm = T)) %>%
  ungroup()

#create different groups
MyData <- MyData %>%
  mutate(pol_disc_rec = cut2(pol_dis, g = 4),
         pol_disc_2 = cut2(pol_dis, g = 2))

EU integration

EU_model6_constrained_groups <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*eu_1 + 1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  weu_1 =~ 1*eu_1
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_2   ~ c(a1, a1)*weu_1 + c(b1, b1)*wFeduc_a_1
  weu_3   ~ c(a2, a2)*weu_2 + c(b2, b2)*wFeduc_a_2
  weu_4   ~ c(a3, a3)*weu_3 + c(b3, b3)*wFeduc_a_3
  weu_5   ~ c(a4, a4)*weu_4 + c(b4, b4)*wFeduc_a_4
  weu_6   ~ c(a5, a5)*weu_5 + c(b5, b5)*wFeduc_a_5
  weu_7   ~ c(a6, a6)*weu_6 + c(b6, b6)*wFeduc_a_6
  weu_8   ~ c(a7, a7)*weu_7 + c(b7, b7)*wFeduc_a_7
  weu_9   ~ c(a8, a8)*weu_8 + c(b8, b8)*wFeduc_a_8
  weu_10  ~ c(a9, a9)*weu_9 + c(b9, b9)*wFeduc_a_9
  weu_11  ~ c(a10, a10)*weu_10 + c(b10, b10)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c1)*weu_1 + c(d1, d1)*wFeduc_a_1
  wFeduc_a_3  ~ c(c2, c2)*weu_2 + c(d2, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c3, c3)*weu_3 + c(d3, d3)*wFeduc_a_3
  wFeduc_a_5  ~ c(c4, c4)*weu_4 + c(d4, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c5, c5)*weu_5 + c(d5, d5)*wFeduc_a_5
  wFeduc_a_7  ~ c(c6, c6)*weu_6 + c(d6, d6)*wFeduc_a_6
  wFeduc_a_8  ~ c(c7, c7)*weu_7 + c(d7, d7)*wFeduc_a_7
  wFeduc_a_9  ~ c(c8, c8)*weu_8 + c(d8, d8)*wFeduc_a_8
  wFeduc_a_10  ~ c(c9, c9)*weu_9 + c(d9, d9)*wFeduc_a_9
  wFeduc_a_11  ~ c(c10, c10)*weu_10 + c(d10, d10)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_1 ~~ wFeduc_a_1 # Covariance

  # Estimate the covariances between the residuals
  weu_2 ~~ c(cov1, cov2)*wFeduc_a_2
  weu_3 ~~ c(cov1, cov2)*wFeduc_a_3
  weu_4 ~~ c(cov1, cov2)*wFeduc_a_4
  weu_5 ~~ c(cov1, cov2)*wFeduc_a_5
  weu_6 ~~ c(cov1, cov2)*wFeduc_a_6
  weu_7 ~~ c(cov1, cov2)*wFeduc_a_7
  weu_8 ~~ c(cov1, cov2)*wFeduc_a_8
  weu_9 ~~ c(cov1, cov2)*wFeduc_a_9
  weu_10 ~~ c(cov1, cov2)*wFeduc_a_10
  weu_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  weu_1 ~~ weu_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  weu_2 ~~ c(vy1, vy2)*weu_2 
  wFeduc_a_2 ~~ c(vx1, vx2)*wFeduc_a_2
  weu_3 ~~ c(vy1, vy2)*weu_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  weu_4 ~~ c(vy1, vy2)*weu_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  weu_5 ~~ c(vy1, vy2)*weu_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  weu_6 ~~ c(vy1, vy2)*weu_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  weu_7 ~~ c(vy1, vy2)*weu_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  weu_8 ~~ c(vy1, vy2)*weu_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  weu_9 ~~ c(vy1, vy2)*weu_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  weu_10 ~~ c(vy1, vy2)*weu_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  weu_11 ~~ c(vy1, vy2)*weu_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*weu_1

'


#create and store model
#create filename
filename <- file.path(dir, "EU_model6_constrained_groups_fit.Rdata")

#estimate model
if(!file.exists(filename)){
EU_model6_constrained_groups_fit <- #estimate model
  lavaan(
    EU_model6_constrained_groups,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "pol_disc_2"
  )

#save model
save(EU_model6_constrained_groups_fit,
     file = filename)
} else {
  load(file = filename)
}
EU_model6_unconstrained_groups_constrained_lag <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*eu_1 + 1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  weu_1 =~ 1*eu_1
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_2   ~ c(a1, a2)*weu_1 + c(b1, b2)*wFeduc_a_1
  weu_3   ~ c(a1, a2)*weu_2 + c(b1, b2)*wFeduc_a_2
  weu_4   ~ c(a1, a2)*weu_3 + c(b1, b2)*wFeduc_a_3
  weu_5   ~ c(a1, a2)*weu_4 + c(b1, b2)*wFeduc_a_4
  weu_6   ~ c(a1, a2)*weu_5 + c(b1, b2)*wFeduc_a_5
  weu_7   ~ c(a1, a2)*weu_6 + c(b1, b2)*wFeduc_a_6
  weu_8   ~ c(a1, a2)*weu_7 + c(b1, b2)*wFeduc_a_7
  weu_9   ~ c(a1, a2)*weu_8 + c(b1, b2)*wFeduc_a_8
  weu_10  ~ c(a1, a2)*weu_9 + c(b1, b2)*wFeduc_a_9
  weu_11  ~ c(a1, a2)*weu_10 + c(b1, b2)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c2)*weu_1 + c(d1, d2)*wFeduc_a_1
  wFeduc_a_3  ~ c(c1, c2)*weu_2 + c(d1, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2)*weu_3 + c(d1, d2)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2)*weu_4 + c(d1, d2)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2)*weu_5 + c(d1, d2)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2)*weu_6 + c(d1, d2)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2)*weu_7 + c(d1, d2)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2)*weu_8 + c(d1, d2)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2)*weu_9 + c(d1, d2)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2)*weu_10 + c(d1, d2)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_1 ~~ wFeduc_a_1 # Covariance

   # Estimate the covariances between the residuals
  weu_2 ~~ c(cov1, cov2)*wFeduc_a_2
  weu_3 ~~ c(cov1, cov2)*wFeduc_a_3
  weu_4 ~~ c(cov1, cov2)*wFeduc_a_4
  weu_5 ~~ c(cov1, cov2)*wFeduc_a_5
  weu_6 ~~ c(cov1, cov2)*wFeduc_a_6
  weu_7 ~~ c(cov1, cov2)*wFeduc_a_7
  weu_8 ~~ c(cov1, cov2)*wFeduc_a_8
  weu_9 ~~ c(cov1, cov2)*wFeduc_a_9
  weu_10 ~~ c(cov1, cov2)*wFeduc_a_10
  weu_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  weu_1 ~~ weu_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  weu_2 ~~ c(vy1, vy2)*weu_2 
  wFeduc_a_2 ~~ c(vx1, vx2)*wFeduc_a_2
  weu_3 ~~ c(vy1, vy2)*weu_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  weu_4 ~~ c(vy1, vy2)*weu_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  weu_5 ~~ c(vy1, vy2)*weu_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  weu_6 ~~ c(vy1, vy2)*weu_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  weu_7 ~~ c(vy1, vy2)*weu_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  weu_8 ~~ c(vy1, vy2)*weu_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  weu_9 ~~ c(vy1, vy2)*weu_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  weu_10 ~~ c(vy1, vy2)*weu_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  weu_11 ~~ c(vy1, vy2)*weu_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*weu_1

'

#create and store model
#create filename
filename <-
  file.path(dir,
            "EU_model6_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  EU_model6_unconstrained_groups_constrained_lag_fit <-
    lavaan(
      EU_model6_unconstrained_groups_constrained_lag,
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "pol_disc_2"
    )
  
  #save model
  save(EU_model6_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {
    load(file = filename)
}
#create and store model
#create filename
filename <-
  file.path(dir,
            "EU_model6_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  EU_model6_constrained_lag_groups_fit <-
    lavaan(
      main_lavaan_results$`Lavaan model objects`[[1]][[2]],
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "pol_disc_2"
    )
  #save model
  save(EU_model6_constrained_lag_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
fit_matrix_EU_m6_constrained_groups <- lavInspect(EU_model6_constrained_lag_groups_fit, what = "fit")
fit_matrix_EU_m6_unconstrained_groups <- lavInspect(EU_model6_unconstrained_groups_constrained_lag_fit, what = "fit")

fit_matrix_eu_M6 <- rbind(fit_matrix_EU_m6_constrained_groups, fit_matrix_EU_m6_unconstrained_groups)

lavTestLRT(EU_model6_constrained_lag_groups_fit, EU_model6_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq EU_model6_unconstrained_groups_constrained_lag_fit 640 154924 155484 2870.0 EU_model6_constrained_lag_groups_fit 647 154935 155450 2895.2 Chisq diff Df diff EU_model6_unconstrained_groups_constrained_lag_fit
EU_model6_constrained_lag_groups_fit 10.923 7 Pr(>Chisq) EU_model6_unconstrained_groups_constrained_lag_fit
EU_model6_constrained_lag_groups_fit 0.142

cultural inclusion

cult_model6_constrained_groups <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*cult_1 + 1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  wcult_1 =~ 1*cult_1
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects (constrained)
  wcult_2   ~ c(a1, a1)*wcult_1 + c(b1, b1)*wFeduc_a_1
  wcult_3   ~ c(a2, a2)*wcult_2 + c(b2, b2)*wFeduc_a_2
  wcult_4   ~ c(a3, a3)*wcult_3 + c(b3, b3)*wFeduc_a_3
  wcult_5   ~ c(a4, a4)*wcult_4 + c(b4, b4)*wFeduc_a_4
  wcult_6   ~ c(a5, a5)*wcult_5 + c(b5, b5)*wFeduc_a_5
  wcult_7   ~ c(a6, a6)*wcult_6 + c(b6, b6)*wFeduc_a_6
  wcult_8   ~ c(a7, a7)*wcult_7 + c(b7, b7)*wFeduc_a_7
  wcult_9   ~ c(a8, a8)*wcult_8 + c(b8, b8)*wFeduc_a_8
  wcult_10  ~ c(a9, a9)*wcult_9 + c(b9, b9)*wFeduc_a_9
  wcult_11  ~ c(a10, a10)*wcult_10 + c(b10, b10)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c1)*wcult_1 + c(d1, d1)*wFeduc_a_1
  wFeduc_a_3  ~ c(c2, c2)*wcult_2 + c(d2, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c3, c3)*wcult_3 + c(d3, d3)*wFeduc_a_3
  wFeduc_a_5  ~ c(c4, c4)*wcult_4 + c(d4, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c5, c5)*wcult_5 + c(d5, d5)*wFeduc_a_5
  wFeduc_a_7  ~ c(c6, c6)*wcult_6 + c(d6, d6)*wFeduc_a_6
  wFeduc_a_8  ~ c(c7, c7)*wcult_7 + c(d7, d7)*wFeduc_a_7
  wFeduc_a_9  ~ c(c8, c8)*wcult_8 + c(d8, d8)*wFeduc_a_8
  wFeduc_a_10  ~ c(c9, c9)*wcult_9 + c(d9, d9)*wFeduc_a_9
  wFeduc_a_11  ~ c(c10, c10)*wcult_10 + c(d10, d10)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_1 ~~ wFeduc_a_1 # Covariance

  # Estimate the covariances between the residuals
  wcult_2 ~~ cov*wFeduc_a_2
  wcult_3 ~~ cov*wFeduc_a_3
  wcult_4 ~~ cov*wFeduc_a_4
  wcult_5 ~~ cov*wFeduc_a_5
  wcult_6 ~~ cov*wFeduc_a_6
  wcult_7 ~~ cov*wFeduc_a_7
  wcult_8 ~~ cov*wFeduc_a_8
  wcult_9 ~~ cov*wFeduc_a_9
  wcult_10 ~~ cov*wFeduc_a_10
  wcult_11 ~~ cov*wFeduc_a_11
  
  # Estimate the variance 
  wcult_1 ~~ wcult_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  wcult_2 ~~ vy*wcult_2 
  wFeduc_a_2 ~~ vx*wFeduc_a_2
  wcult_3 ~~ vy*wcult_3
  wFeduc_a_3 ~~ vx*wFeduc_a_3
  wcult_4 ~~ vy*wcult_4 
  wFeduc_a_4 ~~ vx*wFeduc_a_4
  wcult_5 ~~ vy*wcult_5
  wFeduc_a_5 ~~ vx*wFeduc_a_5
  wcult_6 ~~ vy*wcult_6 
  wFeduc_a_6 ~~ vx*wFeduc_a_6
  wcult_7 ~~ vy*wcult_7 
  wFeduc_a_7 ~~ vx*wFeduc_a_7
  wcult_8 ~~ vy*wcult_8 
  wFeduc_a_8 ~~ vx*wFeduc_a_8
  wcult_9 ~~ vy*wcult_9 
  wFeduc_a_9 ~~ vx*wFeduc_a_9
  wcult_10 ~~ vy*wcult_10 
  wFeduc_a_10 ~~ vx*wFeduc_a_10
  wcult_11 ~~ vy*wcult_11 
  wFeduc_a_11 ~~ vx*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*wcult_1

'

#create and store model
#create filename
filename <-
  file.path(dir,
            "cult_model6_constrained_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  cult_model6_constrained_groups_fit <-
    lavaan(
      cult_model6_constrained_groups,
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "pol_disc_2"
    )
  #save model
  save(cult_model6_constrained_groups_fit,
       file = filename)
} else{
  load(file = filename)
}
cult_model6_unconstrained_groups_constrained_lag <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*cult_1 + 1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  wcult_1 =~ 1*cult_1
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects (constrained)
  wcult_2   ~ c(a1, a2)*wcult_1 + c(b1, b2)*wFeduc_a_1
  wcult_3   ~ c(a1, a2)*wcult_2 + c(b1, b2)*wFeduc_a_2
  wcult_4   ~ c(a1, a2)*wcult_3 + c(b1, b2)*wFeduc_a_3
  wcult_5   ~ c(a1, a2)*wcult_4 + c(b1, b2)*wFeduc_a_4
  wcult_6   ~ c(a1, a2)*wcult_5 + c(b1, b2)*wFeduc_a_5
  wcult_7   ~ c(a1, a2)*wcult_6 + c(b1, b2)*wFeduc_a_6
  wcult_8   ~ c(a1, a2)*wcult_7 + c(b1, b2)*wFeduc_a_7
  wcult_9   ~ c(a1, a2)*wcult_8 + c(b1, b2)*wFeduc_a_8
  wcult_10  ~ c(a1, a2)*wcult_9 + c(b1, b2)*wFeduc_a_9
  wcult_11  ~ c(a1, a2)*wcult_10 + c(b1, b2)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c2)*wcult_1 + c(d1, d2)*wFeduc_a_1
  wFeduc_a_3  ~ c(c1, c2)*wcult_2 + c(d1, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2)*wcult_3 + c(d1, d2)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2)*wcult_4 + c(d1, d2)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2)*wcult_5 + c(d1, d2)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2)*wcult_6 + c(d1, d2)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2)*wcult_7 + c(d1, d2)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2)*wcult_8 + c(d1, d2)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2)*wcult_9 + c(d1, d2)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2)*wcult_10 + c(d1, d2)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_1 ~~ wFeduc_a_1 # Covariance

   # Estimate the covariances between the residuals
  wcult_2 ~~ c(cov1, cov2)*wFeduc_a_2
  wcult_3 ~~ c(cov1, cov2)*wFeduc_a_3
  wcult_4 ~~ c(cov1, cov2)*wFeduc_a_4
  wcult_5 ~~ c(cov1, cov2)*wFeduc_a_5
  wcult_6 ~~ c(cov1, cov2)*wFeduc_a_6
  wcult_7 ~~ c(cov1, cov2)*wFeduc_a_7
  wcult_8 ~~ c(cov1, cov2)*wFeduc_a_8
  wcult_9 ~~ c(cov1, cov2)*wFeduc_a_9
  wcult_10 ~~ c(cov1, cov2)*wFeduc_a_10
  wcult_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  wcult_1 ~~ wcult_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  wcult_2 ~~ c(vy1, vy2)*wcult_2 
  wFeduc_a_2 ~~ c(vx1, vx2)*wFeduc_a_2
  wcult_3 ~~ c(vy1, vy2)*wcult_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  wcult_4 ~~ c(vy1, vy2)*wcult_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  wcult_5 ~~ c(vy1, vy2)*wcult_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  wcult_6 ~~ c(vy1, vy2)*wcult_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  wcult_7 ~~ c(vy1, vy2)*wcult_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  wcult_8 ~~ c(vy1, vy2)*wcult_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  wcult_9 ~~ c(vy1, vy2)*wcult_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  wcult_10 ~~ c(vy1, vy2)*wcult_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  wcult_11 ~~ c(vy1, vy2)*wcult_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*wcult_1


'

#create and store model
#create filename
filename <-
  file.path(dir,
            "cult_model6_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  cult_model6_unconstrained_groups_constrained_lag_fit <-
    lavaan(
      cult_model6_unconstrained_groups_constrained_lag,
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "pol_disc_2"
    )
  #save model
  save(cult_model6_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {
  load(file = filename)
  }
#create and store model
#create filename
filename <-
  file.path(dir,
            "cult_model6_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  cult_model6_constrained_lag_groups_fit <-
    lavaan(
      main_lavaan_results$`Lavaan model objects`[[2]][[2]],
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "pol_disc_2"
    )
  #save model
  save(cult_model6_constrained_lag_groups_fit,
       file = filename)
} else{
  load(file = filename)
}
fit_matrix_cult_m6_constrained_groups <- lavInspect(cult_model6_constrained_lag_groups_fit, what = "fit")
fit_matrix_cult_m6_unconstrained_groups <- lavInspect(cult_model6_unconstrained_groups_constrained_lag_fit, what = "fit")

fit_matrix_cult_M1 <- rbind(fit_matrix_cult_m6_constrained_groups, fit_matrix_cult_m6_unconstrained_groups)

lavTestLRT(cult_model6_constrained_lag_groups_fit, cult_model6_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq cult_model6_unconstrained_groups_constrained_lag_fit 640 148457 149017 2541.9 cult_model6_constrained_lag_groups_fit 647 148471 148985 2569.4 Chisq diff Df diff cult_model6_unconstrained_groups_constrained_lag_fit
cult_model6_constrained_lag_groups_fit 12.306 7 Pr(>Chisq)
cult_model6_unconstrained_groups_constrained_lag_fit
cult_model6_constrained_lag_groups_fit 0.09094 . — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

income differences

inc_diff_model6_constrained_groups <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*inc_diff_1 + 1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  winc_diff_1 =~ 1*inc_diff_1
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_2   ~ c(a1, a1)*winc_diff_1 + c(b1, b1)*wFeduc_a_1
  winc_diff_3   ~ c(a2, a2)*winc_diff_2 + c(b2, b2)*wFeduc_a_2
  winc_diff_4   ~ c(a3, a3)*winc_diff_3 + c(b3, b3)*wFeduc_a_3
  winc_diff_5   ~ c(a4, a4)*winc_diff_4 + c(b4, b4)*wFeduc_a_4
  winc_diff_6   ~ c(a5, a5)*winc_diff_5 + c(b5, b5)*wFeduc_a_5
  winc_diff_7   ~ c(a6, a6)*winc_diff_6 + c(b6, b6)*wFeduc_a_6
  winc_diff_8   ~ c(a7, a7)*winc_diff_7 + c(b7, b7)*wFeduc_a_7
  winc_diff_9   ~ c(a8, a8)*winc_diff_8 + c(b8, b8)*wFeduc_a_8
  winc_diff_10  ~ c(a9, a9)*winc_diff_9 + c(b9, b9)*wFeduc_a_9
  winc_diff_11  ~ c(a10, a10)*winc_diff_10 + c(b10, b10)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c1)*winc_diff_1 + c(d1, d1)*wFeduc_a_1
  wFeduc_a_3  ~ c(c2, c2)*winc_diff_2 + c(d2, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c3, c3)*winc_diff_3 + c(d3, d3)*wFeduc_a_3
  wFeduc_a_5  ~ c(c4, c4)*winc_diff_4 + c(d4, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c5, c5)*winc_diff_5 + c(d5, d5)*wFeduc_a_5
  wFeduc_a_7  ~ c(c6, c6)*winc_diff_6 + c(d6, d6)*wFeduc_a_6
  wFeduc_a_8  ~ c(c7, c7)*winc_diff_7 + c(d7, d7)*wFeduc_a_7
  wFeduc_a_9  ~ c(c8, c8)*winc_diff_8 + c(d8, d8)*wFeduc_a_8
  wFeduc_a_10  ~ c(c9, c9)*winc_diff_9 + c(d9, d9)*wFeduc_a_9
  wFeduc_a_11  ~ c(c10, c10)*winc_diff_10 + c(d10, d10)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_1 ~~ wFeduc_a_1 # Covariance

  # Estimate the covariances between the residuals
  winc_diff_2 ~~ cov*wFeduc_a_2
  winc_diff_3 ~~ cov*wFeduc_a_3
  winc_diff_4 ~~ cov*wFeduc_a_4
  winc_diff_5 ~~ cov*wFeduc_a_5
  winc_diff_6 ~~ cov*wFeduc_a_6
  winc_diff_7 ~~ cov*wFeduc_a_7
  winc_diff_8 ~~ cov*wFeduc_a_8
  winc_diff_9 ~~ cov*wFeduc_a_9
  winc_diff_10 ~~ cov*wFeduc_a_10
  winc_diff_11 ~~ cov*wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_1 ~~ winc_diff_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  winc_diff_2 ~~ vy*winc_diff_2 
  wFeduc_a_2 ~~ vx*wFeduc_a_2
  winc_diff_3 ~~ vy*winc_diff_3
  wFeduc_a_3 ~~ vx*wFeduc_a_3
  winc_diff_4 ~~ vy*winc_diff_4 
  wFeduc_a_4 ~~ vx*wFeduc_a_4
  winc_diff_5 ~~ vy*winc_diff_5
  wFeduc_a_5 ~~ vx*wFeduc_a_5
  winc_diff_6 ~~ vy*winc_diff_6 
  wFeduc_a_6 ~~ vx*wFeduc_a_6
  winc_diff_7 ~~ vy*winc_diff_7 
  wFeduc_a_7 ~~ vx*wFeduc_a_7
  winc_diff_8 ~~ vy*winc_diff_8 
  wFeduc_a_8 ~~ vx*wFeduc_a_8
  winc_diff_9 ~~ vy*winc_diff_9 
  wFeduc_a_9 ~~ vx*wFeduc_a_9
  winc_diff_10 ~~ vy*winc_diff_10 
  wFeduc_a_10 ~~ vx*wFeduc_a_10
  winc_diff_11 ~~ vy*winc_diff_11 
  wFeduc_a_11 ~~ vx*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*winc_diff_1

'
#create and store model
#create filename
filename <-
  file.path(dir,
            "inc_diff_model6_constrained_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  inc_diff_model6_constrained_groups_fit <-
    lavaan(
      inc_diff_model6_constrained_groups,
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "pol_disc_2"
    )
  #save model
  save(inc_diff_model6_constrained_groups_fit,
       file = filename)
} else {
    load(file = filename)
}
inc_diff_model6_unconstrained_groups_constrained_lag <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*inc_diff_1 + 1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  winc_diff_1 =~ 1*inc_diff_1
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_2   ~ c(a1, a2)*winc_diff_1 + c(b1, b2)*wFeduc_a_1
  winc_diff_3   ~ c(a1, a2)*winc_diff_2 + c(b1, b2)*wFeduc_a_2
  winc_diff_4   ~ c(a1, a2)*winc_diff_3 + c(b1, b2)*wFeduc_a_3
  winc_diff_5   ~ c(a1, a2)*winc_diff_4 + c(b1, b2)*wFeduc_a_4
  winc_diff_6   ~ c(a1, a2)*winc_diff_5 + c(b1, b2)*wFeduc_a_5
  winc_diff_7   ~ c(a1, a2)*winc_diff_6 + c(b1, b2)*wFeduc_a_6
  winc_diff_8   ~ c(a1, a2)*winc_diff_7 + c(b1, b2)*wFeduc_a_7
  winc_diff_9   ~ c(a1, a2)*winc_diff_8 + c(b1, b2)*wFeduc_a_8
  winc_diff_10  ~ c(a1, a2)*winc_diff_9 + c(b1, b2)*wFeduc_a_9
  winc_diff_11  ~ c(a1, a2)*winc_diff_10 + c(b1, b2)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c2)*winc_diff_1 + c(d1, d2)*wFeduc_a_1
  wFeduc_a_3  ~ c(c1, c2)*winc_diff_2 + c(d1, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2)*winc_diff_3 + c(d1, d2)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2)*winc_diff_4 + c(d1, d2)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2)*winc_diff_5 + c(d1, d2)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2)*winc_diff_6 + c(d1, d2)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2)*winc_diff_7 + c(d1, d2)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2)*winc_diff_8 + c(d1, d2)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2)*winc_diff_9 + c(d1, d2)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2)*winc_diff_10 + c(d1, d2)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_1 ~~ wFeduc_a_1 # Covariance

  # Estimate the covariances between the residuals
  winc_diff_2 ~~ c(cov1, cov2)*wFeduc_a_2
  winc_diff_3 ~~ c(cov1, cov2)*wFeduc_a_3
  winc_diff_4 ~~ c(cov1, cov2)*wFeduc_a_4
  winc_diff_5 ~~ c(cov1, cov2)*wFeduc_a_5
  winc_diff_6 ~~ c(cov1, cov2)*wFeduc_a_6
  winc_diff_7 ~~ c(cov1, cov2)*wFeduc_a_7
  winc_diff_8 ~~ c(cov1, cov2)*wFeduc_a_8
  winc_diff_9 ~~ c(cov1, cov2)*wFeduc_a_9
  winc_diff_10 ~~ c(cov1, cov2)*wFeduc_a_10
  winc_diff_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_1 ~~ winc_diff_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  winc_diff_2 ~~ c(vy1, vy2)*winc_diff_2 
  wFeduc_a_2 ~~ c(vx1, vx2)*wFeduc_a_2
  winc_diff_3 ~~ c(vy1, vy2)*winc_diff_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  winc_diff_4 ~~ c(vy1, vy2)*winc_diff_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  winc_diff_5 ~~ c(vy1, vy2)*winc_diff_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  winc_diff_6 ~~ c(vy1, vy2)*winc_diff_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  winc_diff_7 ~~ c(vy1, vy2)*winc_diff_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  winc_diff_8 ~~ c(vy1, vy2)*winc_diff_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  winc_diff_9 ~~ c(vy1, vy2)*winc_diff_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  winc_diff_10 ~~ c(vy1, vy2)*winc_diff_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  winc_diff_11 ~~ c(vy1, vy2)*winc_diff_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*winc_diff_1

'
#create and store model
#create filename
filename <-
  file.path(dir,
            "inc_diff_model6_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  inc_diff_model6_unconstrained_groups_constrained_lag_fit <-
    lavaan(
      inc_diff_model6_unconstrained_groups_constrained_lag,
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "pol_disc_2"
    )
  #save model
  save(inc_diff_model6_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else
  (load(file = filename)
   
  )

[1] “inc_diff_model6_unconstrained_groups_constrained_lag_fit”

#create and store model
#create filename
filename <-
  file.path(dir,
            "inc_diff_model6_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  inc_diff_model6_constrained_lag_groups_fit <-
    lavaan(
      main_lavaan_results$`Lavaan model objects`[[3]][[2]],
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "pol_disc_2"
    )
  #save model
  save(inc_diff_model6_constrained_lag_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
fit_matrix_inc_diff_m6_constrained_groups <- lavInspect(inc_diff_model6_constrained_lag_groups_fit, what = "fit")
fit_matrix_inc_diff_m6_unconstrained_groups <- lavInspect(inc_diff_model6_unconstrained_groups_constrained_lag_fit, what = "fit")

fit_matrix_inc_diff_M1 <- rbind(fit_matrix_inc_diff_m6_constrained_groups, fit_matrix_inc_diff_m6_unconstrained_groups)

lavTestLRT(inc_diff_model6_constrained_lag_groups_fit, inc_diff_model6_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC inc_diff_model6_unconstrained_groups_constrained_lag_fit 640 149302 149862 inc_diff_model6_constrained_lag_groups_fit 647 149316 149830 Chisq Chisq diff inc_diff_model6_unconstrained_groups_constrained_lag_fit 2696.3
inc_diff_model6_constrained_lag_groups_fit 2723.8 11.98 Df diff Pr(>Chisq) inc_diff_model6_unconstrained_groups_constrained_lag_fit
inc_diff_model6_constrained_lag_groups_fit 7 0.1012

Newness

#create between level variable
MyData <- MyData %>%
  rowwise() %>%
  mutate(rl_mean = mean(c_across(starts_with("Frl")), na.rm = T)) %>%
  ungroup()

#create groups
MyData <- MyData %>%
  mutate(rl_rec = cut2(rl_mean, g = 5),
         rl_2 = cut2(rl_mean, g = 2))

EU integration

EU_model7_constrained_groups <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~ 1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_3   ~ c(a2, a2)*weu_2 + c(b2, b2)*wFeduc_a_2
  weu_4   ~ c(a3, a3)*weu_3 + c(b3, b3)*wFeduc_a_3
  weu_5   ~ c(a4, a4)*weu_4 + c(b4, b4)*wFeduc_a_4
  weu_6   ~ c(a5, a5)*weu_5 + c(b5, b5)*wFeduc_a_5
  weu_7   ~ c(a6, a6)*weu_6 + c(b6, b6)*wFeduc_a_6
  weu_8   ~ c(a7, a7)*weu_7 + c(b7, b7)*wFeduc_a_7
  weu_9   ~ c(a8, a8)*weu_8 + c(b8, b8)*wFeduc_a_8
  weu_10  ~ c(a9, a9)*weu_9 + c(b9, b9)*wFeduc_a_9
  weu_11  ~ c(a10, a10)*weu_10 + c(b10, b10)*wFeduc_a_10
  
  
  wFeduc_a_3  ~ c(c2, c2)*weu_2 + c(d2, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c3, c3)*weu_3 + c(d3, d3)*wFeduc_a_3
  wFeduc_a_5  ~ c(c4, c4)*weu_4 + c(d4, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c5, c5)*weu_5 + c(d5, d5)*wFeduc_a_5
  wFeduc_a_7  ~ c(c6, c6)*weu_6 + c(d6, d6)*wFeduc_a_6
  wFeduc_a_8  ~ c(c7, c7)*weu_7 + c(d7, d7)*wFeduc_a_7
  wFeduc_a_9  ~ c(c8, c8)*weu_8 + c(d8, d8)*wFeduc_a_8
  wFeduc_a_10  ~ c(c9, c9)*weu_9 + c(d9, d9)*wFeduc_a_9
  wFeduc_a_11  ~ c(c10, c10)*weu_10 + c(d10, d10)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_2 ~~ wFeduc_a_2 # Covariance

  # Estimate the covariances between the residuals
  weu_3 ~~ c(cov1, cov2)*wFeduc_a_3
  weu_4 ~~ c(cov1, cov2)*wFeduc_a_4
  weu_5 ~~ c(cov1, cov2)*wFeduc_a_5
  weu_6 ~~ c(cov1, cov2)*wFeduc_a_6
  weu_7 ~~ c(cov1, cov2)*wFeduc_a_7
  weu_8 ~~ c(cov1, cov2)*wFeduc_a_8
  weu_9 ~~ c(cov1, cov2)*wFeduc_a_9
  weu_10 ~~ c(cov1, cov2)*wFeduc_a_10
  weu_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  weu_2 ~~ weu_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  weu_3 ~~ c(vy1, vy2)*weu_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  weu_4 ~~ c(vy1, vy2)*weu_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  weu_5 ~~ c(vy1, vy2)*weu_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  weu_6 ~~ c(vy1, vy2)*weu_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  weu_7 ~~ c(vy1, vy2)*weu_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  weu_8 ~~ c(vy1, vy2)*weu_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  weu_9 ~~ c(vy1, vy2)*weu_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  weu_10 ~~ c(vy1, vy2)*weu_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  weu_11 ~~ c(vy1, vy2)*weu_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*weu_2

'

#create and store model
#create filename
filename <-
  file.path(dir,
            "EU_model7_constrained_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  EU_model7_constrained_groups_fit <-
    lavaan(
      EU_model7_constrained_groups,
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "rl_2"
    )
  #save model
  save(EU_model7_constrained_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
EU_model7_unconstrained_groups_constrained_lag <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0. 
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_3   ~ c(a1, a2)*weu_2 + c(b1, b2)*wFeduc_a_2
  weu_4   ~ c(a1, a2)*weu_3 + c(b1, b2)*wFeduc_a_3
  weu_5   ~ c(a1, a2)*weu_4 + c(b1, b2)*wFeduc_a_4
  weu_6   ~ c(a1, a2)*weu_5 + c(b1, b2)*wFeduc_a_5
  weu_7   ~ c(a1, a2)*weu_6 + c(b1, b2)*wFeduc_a_6
  weu_8   ~ c(a1, a2)*weu_7 + c(b1, b2)*wFeduc_a_7
  weu_9   ~ c(a1, a2)*weu_8 + c(b1, b2)*wFeduc_a_8
  weu_10  ~ c(a1, a2)*weu_9 + c(b1, b2)*wFeduc_a_9
  weu_11  ~ c(a1, a2)*weu_10 + c(b1, b2)*wFeduc_a_10
  
  wFeduc_a_3  ~ c(c1, c2)*weu_2 + c(d1, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2)*weu_3 + c(d1, d2)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2)*weu_4 + c(d1, d2)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2)*weu_5 + c(d1, d2)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2)*weu_6 + c(d1, d2)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2)*weu_7 + c(d1, d2)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2)*weu_8 + c(d1, d2)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2)*weu_9 + c(d1, d2)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2)*weu_10 + c(d1, d2)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_2 ~~ wFeduc_a_2 # Covariance

   # Estimate the covariances between the residuals
  weu_3 ~~ c(cov1, cov2)*wFeduc_a_3
  weu_4 ~~ c(cov1, cov2)*wFeduc_a_4
  weu_5 ~~ c(cov1, cov2)*wFeduc_a_5
  weu_6 ~~ c(cov1, cov2)*wFeduc_a_6
  weu_7 ~~ c(cov1, cov2)*wFeduc_a_7
  weu_8 ~~ c(cov1, cov2)*wFeduc_a_8
  weu_9 ~~ c(cov1, cov2)*wFeduc_a_9
  weu_10 ~~ c(cov1, cov2)*wFeduc_a_10
  weu_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  weu_2 ~~ weu_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  weu_3 ~~ c(vy1, vy2)*weu_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  weu_4 ~~ c(vy1, vy2)*weu_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  weu_5 ~~ c(vy1, vy2)*weu_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  weu_6 ~~ c(vy1, vy2)*weu_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  weu_7 ~~ c(vy1, vy2)*weu_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  weu_8 ~~ c(vy1, vy2)*weu_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  weu_9 ~~ c(vy1, vy2)*weu_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  weu_10 ~~ c(vy1, vy2)*weu_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  weu_11 ~~ c(vy1, vy2)*weu_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*weu_2

'

#create and store model
#create filename
filename <-
  file.path(dir,
            "EU_model7_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  EU_model7_unconstrained_groups_constrained_lag_fit <-
    lavaan(
      EU_model7_unconstrained_groups_constrained_lag,
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "rl_2"
    )
  #save model
  save(EU_model7_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {
  load(file = filename)
}
EU_model7_constrained_lag_groups <- '
  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~ 1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_3   ~ a*weu_2 + b*wFeduc_a_2
  weu_4   ~ a*weu_3 + b*wFeduc_a_3
  weu_5   ~ a*weu_4 + b*wFeduc_a_4
  weu_6   ~ a*weu_5 + b*wFeduc_a_5
  weu_7   ~ a*weu_6 + b*wFeduc_a_6
  weu_8   ~ a*weu_7 + b*wFeduc_a_7
  weu_9   ~ a*weu_8 + b*wFeduc_a_8
  weu_10  ~ a*weu_9 + b*wFeduc_a_9
  weu_11  ~ a*weu_10 + b*wFeduc_a_10
  
  wFeduc_a_3  ~ c*weu_2 + d*wFeduc_a_2
  wFeduc_a_4  ~ c*weu_3 + d*wFeduc_a_3
  wFeduc_a_5  ~ c*weu_4 + d*wFeduc_a_4
  wFeduc_a_6  ~ c*weu_5 + d*wFeduc_a_5
  wFeduc_a_7  ~ c*weu_6 + d*wFeduc_a_6
  wFeduc_a_8  ~ c*weu_7 + d*wFeduc_a_7
  wFeduc_a_9  ~ c*weu_8 + d*wFeduc_a_8
  wFeduc_a_10  ~ c*weu_9 + d*wFeduc_a_9
  wFeduc_a_11  ~ c*weu_10 + d*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_2 ~~ wFeduc_a_2 # Covariance

  # Estimate the covariances between the residuals
  weu_3 ~~ cov*wFeduc_a_3
  weu_4 ~~ cov*wFeduc_a_4
  weu_5 ~~ cov*wFeduc_a_5
  weu_6 ~~ cov*wFeduc_a_6
  weu_7 ~~ cov*wFeduc_a_7
  weu_8 ~~ cov*wFeduc_a_8
  weu_9 ~~ cov*wFeduc_a_9
  weu_10 ~~ cov*wFeduc_a_10
  weu_11 ~~ cov*wFeduc_a_11
  
  # Estimate the variance 
  weu_2 ~~ weu_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  weu_3 ~~ vy*weu_3
  wFeduc_a_3 ~~ vx*wFeduc_a_3
  weu_4 ~~ vy*weu_4 
  wFeduc_a_4 ~~ vx*wFeduc_a_4
  weu_5 ~~ vy*weu_5
  wFeduc_a_5 ~~ vx*wFeduc_a_5
  weu_6 ~~ vy*weu_6 
  wFeduc_a_6 ~~ vx*wFeduc_a_6
  weu_7 ~~ vy*weu_7 
  wFeduc_a_7 ~~ vx*wFeduc_a_7
  weu_8 ~~ vy*weu_8 
  wFeduc_a_8 ~~ vx*wFeduc_a_8
  weu_9 ~~ vy*weu_9 
  wFeduc_a_9 ~~ vx*wFeduc_a_9
  weu_10 ~~ vy*weu_10 
  wFeduc_a_10 ~~ vx*wFeduc_a_10
  weu_11 ~~ vy*weu_11 
  wFeduc_a_11 ~~ vx*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*weu_2

'

#create and store model
#create filename
filename <-
  file.path(dir,
            "EU_model7_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  EU_model7_constrained_lag_groups_fit <-
    lavaan(
      EU_model7_constrained_lag_groups,
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "rl_2"
    )
  #save model
  save(EU_model7_constrained_lag_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
fit_matrix_EU_m7_constrained_groups <- lavInspect(EU_model7_constrained_lag_groups_fit, what = "fit")
fit_matrix_EU_m7_unconstrained_groups <- lavInspect(EU_model7_unconstrained_groups_constrained_lag_fit, what = "fit")

fit_matrix_eu_M1 <- rbind(fit_matrix_EU_m7_constrained_groups, fit_matrix_EU_m7_unconstrained_groups)

lavTestLRT(EU_model7_constrained_lag_groups_fit, EU_model7_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq EU_model7_unconstrained_groups_constrained_lag_fit 538 138737 139269 3389.4 EU_model7_constrained_lag_groups_fit 545 138829 139315 3494.7 Chisq diff Df diff EU_model7_unconstrained_groups_constrained_lag_fit
EU_model7_constrained_lag_groups_fit 46.715 7 Pr(>Chisq)
EU_model7_unconstrained_groups_constrained_lag_fit
EU_model7_constrained_lag_groups_fit 6.343e-08 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

cultural inclusion

cult_model7_constrained_groups <- '
  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~ 1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects (constrained)
  wcult_3   ~ c(a2, a2)*wcult_2 + c(b2, b2)*wFeduc_a_2
  wcult_4   ~ c(a3, a3)*wcult_3 + c(b3, b3)*wFeduc_a_3
  wcult_5   ~ c(a4, a4)*wcult_4 + c(b4, b4)*wFeduc_a_4
  wcult_6   ~ c(a5, a5)*wcult_5 + c(b5, b5)*wFeduc_a_5
  wcult_7   ~ c(a6, a6)*wcult_6 + c(b6, b6)*wFeduc_a_6
  wcult_8   ~ c(a7, a7)*wcult_7 + c(b7, b7)*wFeduc_a_7
  wcult_9   ~ c(a8, a8)*wcult_8 + c(b8, b8)*wFeduc_a_8
  wcult_10  ~ c(a9, a9)*wcult_9 + c(b9, b9)*wFeduc_a_9
  wcult_11  ~ c(a10, a10)*wcult_10 + c(b10, b10)*wFeduc_a_10
  
  
  wFeduc_a_3  ~ c(c2, c2)*wcult_2 + c(d2, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c3, c3)*wcult_3 + c(d3, d3)*wFeduc_a_3
  wFeduc_a_5  ~ c(c4, c4)*wcult_4 + c(d4, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c5, c5)*wcult_5 + c(d5, d5)*wFeduc_a_5
  wFeduc_a_7  ~ c(c6, c6)*wcult_6 + c(d6, d6)*wFeduc_a_6
  wFeduc_a_8  ~ c(c7, c7)*wcult_7 + c(d7, d7)*wFeduc_a_7
  wFeduc_a_9  ~ c(c8, c8)*wcult_8 + c(d8, d8)*wFeduc_a_8
  wFeduc_a_10  ~ c(c9, c9)*wcult_9 + c(d9, d9)*wFeduc_a_9
  wFeduc_a_11  ~ c(c10, c10)*wcult_10 + c(d10, d10)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_2 ~~ wFeduc_a_2 # Covariance

  # Estimate the covariances between the residuals
  wcult_3 ~~ c(cov1, cov2)*wFeduc_a_3
  wcult_4 ~~ c(cov1, cov2)*wFeduc_a_4
  wcult_5 ~~ c(cov1, cov2)*wFeduc_a_5
  wcult_6 ~~ c(cov1, cov2)*wFeduc_a_6
  wcult_7 ~~ c(cov1, cov2)*wFeduc_a_7
  wcult_8 ~~ c(cov1, cov2)*wFeduc_a_8
  wcult_9 ~~ c(cov1, cov2)*wFeduc_a_9
  wcult_10 ~~ c(cov1, cov2)*wFeduc_a_10
  wcult_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  wcult_2 ~~ wcult_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  wcult_3 ~~ c(vy1, vy2)*wcult_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  wcult_4 ~~ c(vy1, vy2)*wcult_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  wcult_5 ~~ c(vy1, vy2)*wcult_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  wcult_6 ~~ c(vy1, vy2)*wcult_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  wcult_7 ~~ c(vy1, vy2)*wcult_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  wcult_8 ~~ c(vy1, vy2)*wcult_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  wcult_9 ~~ c(vy1, vy2)*wcult_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  wcult_10 ~~ c(vy1, vy2)*wcult_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  wcult_11 ~~ c(vy1, vy2)*wcult_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*wcult_2

'
#create and store model
#create filename
filename <-
  file.path(dir,
            "cult_model7_constrained_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
cult_model7_constrained_groups_fit <-
  lavaan(
    cult_model7_constrained_groups,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "rl_2"
  )
  #save model
  save(cult_model7_constrained_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
cult_model7_unconstrained_groups_constrained_lag <- '
  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0. 
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects (constrained)
  wcult_3   ~ c(a1, a2)*wcult_2 + c(b1, b2)*wFeduc_a_2
  wcult_4   ~ c(a1, a2)*wcult_3 + c(b1, b2)*wFeduc_a_3
  wcult_5   ~ c(a1, a2)*wcult_4 + c(b1, b2)*wFeduc_a_4
  wcult_6   ~ c(a1, a2)*wcult_5 + c(b1, b2)*wFeduc_a_5
  wcult_7   ~ c(a1, a2)*wcult_6 + c(b1, b2)*wFeduc_a_6
  wcult_8   ~ c(a1, a2)*wcult_7 + c(b1, b2)*wFeduc_a_7
  wcult_9   ~ c(a1, a2)*wcult_8 + c(b1, b2)*wFeduc_a_8
  wcult_10  ~ c(a1, a2)*wcult_9 + c(b1, b2)*wFeduc_a_9
  wcult_11  ~ c(a1, a2)*wcult_10 + c(b1, b2)*wFeduc_a_10
  
  wFeduc_a_3  ~ c(c1, c2)*wcult_2 + c(d1, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2)*wcult_3 + c(d1, d2)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2)*wcult_4 + c(d1, d2)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2)*wcult_5 + c(d1, d2)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2)*wcult_6 + c(d1, d2)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2)*wcult_7 + c(d1, d2)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2)*wcult_8 + c(d1, d2)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2)*wcult_9 + c(d1, d2)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2)*wcult_10 + c(d1, d2)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_2 ~~ wFeduc_a_2 # Covariance

   # Estimate the covariances between the residuals
  wcult_3 ~~ c(cov1, cov2)*wFeduc_a_3
  wcult_4 ~~ c(cov1, cov2)*wFeduc_a_4
  wcult_5 ~~ c(cov1, cov2)*wFeduc_a_5
  wcult_6 ~~ c(cov1, cov2)*wFeduc_a_6
  wcult_7 ~~ c(cov1, cov2)*wFeduc_a_7
  wcult_8 ~~ c(cov1, cov2)*wFeduc_a_8
  wcult_9 ~~ c(cov1, cov2)*wFeduc_a_9
  wcult_10 ~~ c(cov1, cov2)*wFeduc_a_10
  wcult_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  wcult_2 ~~ wcult_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  wcult_3 ~~ c(vy1, vy2)*wcult_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  wcult_4 ~~ c(vy1, vy2)*wcult_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  wcult_5 ~~ c(vy1, vy2)*wcult_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  wcult_6 ~~ c(vy1, vy2)*wcult_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  wcult_7 ~~ c(vy1, vy2)*wcult_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  wcult_8 ~~ c(vy1, vy2)*wcult_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  wcult_9 ~~ c(vy1, vy2)*wcult_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  wcult_10 ~~ c(vy1, vy2)*wcult_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  wcult_11 ~~ c(vy1, vy2)*wcult_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*wcult_2

'
#create and store model
#create filename
filename <-
  file.path(dir,
            "cult_model7_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
cult_model7_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    cult_model7_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "rl_2"
  )
  #save model
  save(cult_model7_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {
  load(file = filename)
}
cult_model7_constrained_lag_groups <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~ 1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects (constrained)
  wcult_3   ~ a*wcult_2 + b*wFeduc_a_2
  wcult_4   ~ a*wcult_3 + b*wFeduc_a_3
  wcult_5   ~ a*wcult_4 + b*wFeduc_a_4
  wcult_6   ~ a*wcult_5 + b*wFeduc_a_5
  wcult_7   ~ a*wcult_6 + b*wFeduc_a_6
  wcult_8   ~ a*wcult_7 + b*wFeduc_a_7
  wcult_9   ~ a*wcult_8 + b*wFeduc_a_8
  wcult_10  ~ a*wcult_9 + b*wFeduc_a_9
  wcult_11  ~ a*wcult_10 + b*wFeduc_a_10
  
  wFeduc_a_3  ~ c*wcult_2 + d*wFeduc_a_2
  wFeduc_a_4  ~ c*wcult_3 + d*wFeduc_a_3
  wFeduc_a_5  ~ c*wcult_4 + d*wFeduc_a_4
  wFeduc_a_6  ~ c*wcult_5 + d*wFeduc_a_5
  wFeduc_a_7  ~ c*wcult_6 + d*wFeduc_a_6
  wFeduc_a_8  ~ c*wcult_7 + d*wFeduc_a_7
  wFeduc_a_9  ~ c*wcult_8 + d*wFeduc_a_8
  wFeduc_a_10  ~ c*wcult_9 + d*wFeduc_a_9
  wFeduc_a_11  ~ c*wcult_10 + d*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_2 ~~ wFeduc_a_2 # Covariance

  # Estimate the covariances between the residuals
  wcult_3 ~~ cov*wFeduc_a_3
  wcult_4 ~~ cov*wFeduc_a_4
  wcult_5 ~~ cov*wFeduc_a_5
  wcult_6 ~~ cov*wFeduc_a_6
  wcult_7 ~~ cov*wFeduc_a_7
  wcult_8 ~~ cov*wFeduc_a_8
  wcult_9 ~~ cov*wFeduc_a_9
  wcult_10 ~~ cov*wFeduc_a_10
  wcult_11 ~~ cov*wFeduc_a_11
  
  # Estimate the variance 
  wcult_2 ~~ wcult_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  wcult_3 ~~ vy*wcult_3
  wFeduc_a_3 ~~ vx*wFeduc_a_3
  wcult_4 ~~ vy*wcult_4 
  wFeduc_a_4 ~~ vx*wFeduc_a_4
  wcult_5 ~~ vy*wcult_5
  wFeduc_a_5 ~~ vx*wFeduc_a_5
  wcult_6 ~~ vy*wcult_6 
  wFeduc_a_6 ~~ vx*wFeduc_a_6
  wcult_7 ~~ vy*wcult_7 
  wFeduc_a_7 ~~ vx*wFeduc_a_7
  wcult_8 ~~ vy*wcult_8 
  wFeduc_a_8 ~~ vx*wFeduc_a_8
  wcult_9 ~~ vy*wcult_9 
  wFeduc_a_9 ~~ vx*wFeduc_a_9
  wcult_10 ~~ vy*wcult_10 
  wFeduc_a_10 ~~ vx*wFeduc_a_10
  wcult_11 ~~ vy*wcult_11 
  wFeduc_a_11 ~~ vx*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*wcult_2

'


#create and store model
#create filename
filename <-
  file.path(dir,
            "cult_model7_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  cult_model7_constrained_lag_groups_fit <-
    lavaan(
      cult_model7_constrained_lag_groups,
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "rl_2"
    )
  #save model
  save(cult_model7_constrained_lag_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
fit_matrix_cult_m7_constrained_groups <- lavInspect(cult_model7_constrained_lag_groups_fit, what = "fit")
fit_matrix_cult_m7_unconstrained_groups <- lavInspect(cult_model7_unconstrained_groups_constrained_lag_fit, what = "fit")

fit_matrix_cult_M1 <- rbind(fit_matrix_cult_m7_constrained_groups, fit_matrix_cult_m7_unconstrained_groups)

lavTestLRT(cult_model7_constrained_lag_groups_fit, cult_model7_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq cult_model7_unconstrained_groups_constrained_lag_fit 538 132725 133257 3052.1 cult_model7_constrained_lag_groups_fit 545 132852 133338 3192.4 Chisq diff Df diff cult_model7_unconstrained_groups_constrained_lag_fit
cult_model7_constrained_lag_groups_fit 65.711 7 Pr(>Chisq)
cult_model7_unconstrained_groups_constrained_lag_fit
cult_model7_constrained_lag_groups_fit 1.082e-11 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

income differences

inc_diff_model7_constrained_groups <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~ 1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_3   ~ c(a2, a2)*winc_diff_2 + c(b2, b2)*wFeduc_a_2
  winc_diff_4   ~ c(a3, a3)*winc_diff_3 + c(b3, b3)*wFeduc_a_3
  winc_diff_5   ~ c(a4, a4)*winc_diff_4 + c(b4, b4)*wFeduc_a_4
  winc_diff_6   ~ c(a5, a5)*winc_diff_5 + c(b5, b5)*wFeduc_a_5
  winc_diff_7   ~ c(a6, a6)*winc_diff_6 + c(b6, b6)*wFeduc_a_6
  winc_diff_8   ~ c(a7, a7)*winc_diff_7 + c(b7, b7)*wFeduc_a_7
  winc_diff_9   ~ c(a8, a8)*winc_diff_8 + c(b8, b8)*wFeduc_a_8
  winc_diff_10  ~ c(a9, a9)*winc_diff_9 + c(b9, b9)*wFeduc_a_9
  winc_diff_11  ~ c(a10, a10)*winc_diff_10 + c(b10, b10)*wFeduc_a_10
  
  
  wFeduc_a_3  ~ c(c2, c2)*winc_diff_2 + c(d2, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c3, c3)*winc_diff_3 + c(d3, d3)*wFeduc_a_3
  wFeduc_a_5  ~ c(c4, c4)*winc_diff_4 + c(d4, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c5, c5)*winc_diff_5 + c(d5, d5)*wFeduc_a_5
  wFeduc_a_7  ~ c(c6, c6)*winc_diff_6 + c(d6, d6)*wFeduc_a_6
  wFeduc_a_8  ~ c(c7, c7)*winc_diff_7 + c(d7, d7)*wFeduc_a_7
  wFeduc_a_9  ~ c(c8, c8)*winc_diff_8 + c(d8, d8)*wFeduc_a_8
  wFeduc_a_10  ~ c(c9, c9)*winc_diff_9 + c(d9, d9)*wFeduc_a_9
  wFeduc_a_11  ~ c(c10, c10)*winc_diff_10 + c(d10, d10)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_2 ~~ wFeduc_a_2 # Covariance

  # Estimate the covariances between the residuals
  winc_diff_3 ~~ c(cov1, cov2)*wFeduc_a_3
  winc_diff_4 ~~ c(cov1, cov2)*wFeduc_a_4
  winc_diff_5 ~~ c(cov1, cov2)*wFeduc_a_5
  winc_diff_6 ~~ c(cov1, cov2)*wFeduc_a_6
  winc_diff_7 ~~ c(cov1, cov2)*wFeduc_a_7
  winc_diff_8 ~~ c(cov1, cov2)*wFeduc_a_8
  winc_diff_9 ~~ c(cov1, cov2)*wFeduc_a_9
  winc_diff_10 ~~ c(cov1, cov2)*wFeduc_a_10
  winc_diff_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_2 ~~ winc_diff_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  winc_diff_3 ~~ c(vy1, vy2)*winc_diff_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  winc_diff_4 ~~ c(vy1, vy2)*winc_diff_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  winc_diff_5 ~~ c(vy1, vy2)*winc_diff_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  winc_diff_6 ~~ c(vy1, vy2)*winc_diff_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  winc_diff_7 ~~ c(vy1, vy2)*winc_diff_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  winc_diff_8 ~~ c(vy1, vy2)*winc_diff_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  winc_diff_9 ~~ c(vy1, vy2)*winc_diff_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  winc_diff_10 ~~ c(vy1, vy2)*winc_diff_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  winc_diff_11 ~~ c(vy1, vy2)*winc_diff_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*winc_diff_2

'
#create and store model
#create filename
filename <-
  file.path(dir,
            "inc_diff_model7_constrained_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  inc_diff_model7_constrained_groups_fit <-
    lavaan(
      inc_diff_model7_constrained_groups,
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "rl_2"
    )
  #save model
  save(inc_diff_model7_constrained_groups_fit,
       file = filename)
} else{
  load(file = filename)
}
inc_diff_model7_unconstrained_groups_constrained_lag <-  '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0. 
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_3   ~ c(a1, a2)*winc_diff_2 + c(b1, b2)*wFeduc_a_2
  winc_diff_4   ~ c(a1, a2)*winc_diff_3 + c(b1, b2)*wFeduc_a_3
  winc_diff_5   ~ c(a1, a2)*winc_diff_4 + c(b1, b2)*wFeduc_a_4
  winc_diff_6   ~ c(a1, a2)*winc_diff_5 + c(b1, b2)*wFeduc_a_5
  winc_diff_7   ~ c(a1, a2)*winc_diff_6 + c(b1, b2)*wFeduc_a_6
  winc_diff_8   ~ c(a1, a2)*winc_diff_7 + c(b1, b2)*wFeduc_a_7
  winc_diff_9   ~ c(a1, a2)*winc_diff_8 + c(b1, b2)*wFeduc_a_8
  winc_diff_10  ~ c(a1, a2)*winc_diff_9 + c(b1, b2)*wFeduc_a_9
  winc_diff_11  ~ c(a1, a2)*winc_diff_10 + c(b1, b2)*wFeduc_a_10
  
  wFeduc_a_3  ~ c(c1, c2)*winc_diff_2 + c(d1, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2)*winc_diff_3 + c(d1, d2)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2)*winc_diff_4 + c(d1, d2)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2)*winc_diff_5 + c(d1, d2)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2)*winc_diff_6 + c(d1, d2)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2)*winc_diff_7 + c(d1, d2)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2)*winc_diff_8 + c(d1, d2)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2)*winc_diff_9 + c(d1, d2)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2)*winc_diff_10 + c(d1, d2)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_2 ~~ wFeduc_a_2 # Covariance

   # Estimate the covariances between the residuals
  winc_diff_3 ~~ c(cov1, cov2)*wFeduc_a_3
  winc_diff_4 ~~ c(cov1, cov2)*wFeduc_a_4
  winc_diff_5 ~~ c(cov1, cov2)*wFeduc_a_5
  winc_diff_6 ~~ c(cov1, cov2)*wFeduc_a_6
  winc_diff_7 ~~ c(cov1, cov2)*wFeduc_a_7
  winc_diff_8 ~~ c(cov1, cov2)*wFeduc_a_8
  winc_diff_9 ~~ c(cov1, cov2)*wFeduc_a_9
  winc_diff_10 ~~ c(cov1, cov2)*wFeduc_a_10
  winc_diff_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_2 ~~ winc_diff_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  winc_diff_3 ~~ c(vy1, vy2)*winc_diff_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  winc_diff_4 ~~ c(vy1, vy2)*winc_diff_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  winc_diff_5 ~~ c(vy1, vy2)*winc_diff_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  winc_diff_6 ~~ c(vy1, vy2)*winc_diff_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  winc_diff_7 ~~ c(vy1, vy2)*winc_diff_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  winc_diff_8 ~~ c(vy1, vy2)*winc_diff_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  winc_diff_9 ~~ c(vy1, vy2)*winc_diff_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  winc_diff_10 ~~ c(vy1, vy2)*winc_diff_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  winc_diff_11 ~~ c(vy1, vy2)*winc_diff_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*winc_diff_2

'
#create and store model
#create filename
filename <-
  file.path(dir,
            "inc_diff_model7_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  inc_diff_model7_unconstrained_groups_constrained_lag_fit <-
    lavaan(
      inc_diff_model7_unconstrained_groups_constrained_lag,
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "rl_2"
    )
  #save model
  save(inc_diff_model7_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {
  load(file = filename)
}
inc_diff_model7_constrained_lag_groups <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~ 1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_3   ~ a*winc_diff_2 + b*wFeduc_a_2
  winc_diff_4   ~ a*winc_diff_3 + b*wFeduc_a_3
  winc_diff_5   ~ a*winc_diff_4 + b*wFeduc_a_4
  winc_diff_6   ~ a*winc_diff_5 + b*wFeduc_a_5
  winc_diff_7   ~ a*winc_diff_6 + b*wFeduc_a_6
  winc_diff_8   ~ a*winc_diff_7 + b*wFeduc_a_7
  winc_diff_9   ~ a*winc_diff_8 + b*wFeduc_a_8
  winc_diff_10  ~ a*winc_diff_9 + b*wFeduc_a_9
  winc_diff_11  ~ a*winc_diff_10 + b*wFeduc_a_10
  
  wFeduc_a_3  ~ c*winc_diff_2 + d*wFeduc_a_2
  wFeduc_a_4  ~ c*winc_diff_3 + d*wFeduc_a_3
  wFeduc_a_5  ~ c*winc_diff_4 + d*wFeduc_a_4
  wFeduc_a_6  ~ c*winc_diff_5 + d*wFeduc_a_5
  wFeduc_a_7  ~ c*winc_diff_6 + d*wFeduc_a_6
  wFeduc_a_8  ~ c*winc_diff_7 + d*wFeduc_a_7
  wFeduc_a_9  ~ c*winc_diff_8 + d*wFeduc_a_8
  wFeduc_a_10  ~ c*winc_diff_9 + d*wFeduc_a_9
  wFeduc_a_11  ~ c*winc_diff_10 + d*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_2 ~~ wFeduc_a_2 # Covariance

  # Estimate the covariances between the residuals
  winc_diff_3 ~~ cov*wFeduc_a_3
  winc_diff_4 ~~ cov*wFeduc_a_4
  winc_diff_5 ~~ cov*wFeduc_a_5
  winc_diff_6 ~~ cov*wFeduc_a_6
  winc_diff_7 ~~ cov*wFeduc_a_7
  winc_diff_8 ~~ cov*wFeduc_a_8
  winc_diff_9 ~~ cov*wFeduc_a_9
  winc_diff_10 ~~ cov*wFeduc_a_10
  winc_diff_11 ~~ cov*wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_2 ~~ winc_diff_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  winc_diff_3 ~~ vy*winc_diff_3
  wFeduc_a_3 ~~ vx*wFeduc_a_3
  winc_diff_4 ~~ vy*winc_diff_4 
  wFeduc_a_4 ~~ vx*wFeduc_a_4
  winc_diff_5 ~~ vy*winc_diff_5
  wFeduc_a_5 ~~ vx*wFeduc_a_5
  winc_diff_6 ~~ vy*winc_diff_6 
  wFeduc_a_6 ~~ vx*wFeduc_a_6
  winc_diff_7 ~~ vy*winc_diff_7 
  wFeduc_a_7 ~~ vx*wFeduc_a_7
  winc_diff_8 ~~ vy*winc_diff_8 
  wFeduc_a_8 ~~ vx*wFeduc_a_8
  winc_diff_9 ~~ vy*winc_diff_9 
  wFeduc_a_9 ~~ vx*wFeduc_a_9
  winc_diff_10 ~~ vy*winc_diff_10 
  wFeduc_a_10 ~~ vx*wFeduc_a_10
  winc_diff_11 ~~ vy*winc_diff_11 
  wFeduc_a_11 ~~ vx*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*winc_diff_2

'
#create and store model
#create filename
filename <-
  file.path(dir,
            "inc_diff_model7_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  inc_diff_model7_constrained_lag_groups_fit <-
    lavaan(
      inc_diff_model7_constrained_lag_groups,
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "rl_2"
    )
  #save model
  save(inc_diff_model7_constrained_lag_groups_fit,
       file = filename)
} else{
  load(file = filename)
}
fit_matrix_inc_diff_m7_constrained_groups <- lavInspect(inc_diff_model7_constrained_lag_groups_fit, what = "fit")
fit_matrix_inc_diff_m7_unconstrained_groups <- lavInspect(inc_diff_model7_unconstrained_groups_constrained_lag_fit, what = "fit")

fit_matrix_inc_diff_M7 <- rbind(fit_matrix_inc_diff_m7_constrained_groups, fit_matrix_inc_diff_m7_unconstrained_groups)

lavTestLRT(inc_diff_model7_constrained_lag_groups_fit, inc_diff_model7_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC inc_diff_model7_unconstrained_groups_constrained_lag_fit 538 133334 133866 inc_diff_model7_constrained_lag_groups_fit 545 133444 133930 Chisq Chisq diff inc_diff_model7_unconstrained_groups_constrained_lag_fit 3224.7
inc_diff_model7_constrained_lag_groups_fit 3348.7 57.397 Df diff Pr(>Chisq)
inc_diff_model7_unconstrained_groups_constrained_lag_fit
inc_diff_model7_constrained_lag_groups_fit 7 4.983e-10 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

Average similarity

#create Ave Sim beween measure
MyData <- MyData %>%
  rowwise() %>%
  mutate(ave_mean = mean(c_across(starts_with("Fav")), na.rm = T)) %>%
  ungroup()

#create between scores
MyData <- MyData %>%
  mutate(ave_rec = cut2(ave_mean, g = 5),
         ave_2 = cut2(ave_mean, g = 2))

EU integration

EU_model8_constrained_groups <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1*Feduc_a_1 + 1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*eu_1 + 1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  weu_1 =~ 1*eu_1
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_2   ~ c(a1, a1)*weu_1 + c(b1, b1)*wFeduc_a_1
  weu_3   ~ c(a2, a2)*weu_2 + c(b2, b2)*wFeduc_a_2
  weu_4   ~ c(a3, a3)*weu_3 + c(b3, b3)*wFeduc_a_3
  weu_5   ~ c(a4, a4)*weu_4 + c(b4, b4)*wFeduc_a_4
  weu_6   ~ c(a5, a5)*weu_5 + c(b5, b5)*wFeduc_a_5
  weu_7   ~ c(a6, a6)*weu_6 + c(b6, b6)*wFeduc_a_6
  weu_8   ~ c(a7, a7)*weu_7 + c(b7, b7)*wFeduc_a_7
  weu_9   ~ c(a8, a8)*weu_8 + c(b8, b8)*wFeduc_a_8
  weu_10  ~ c(a9, a9)*weu_9 + c(b9, b9)*wFeduc_a_9
  weu_11  ~ c(a10, a10)*weu_10 + c(b10, b10)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c1)*weu_1 + c(d1, d1)*wFeduc_a_1
  wFeduc_a_3  ~ c(c2, c2)*weu_2 + c(d2, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c3, c3)*weu_3 + c(d3, d3)*wFeduc_a_3
  wFeduc_a_5  ~ c(c4, c4)*weu_4 + c(d4, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c5, c5)*weu_5 + c(d5, d5)*wFeduc_a_5
  wFeduc_a_7  ~ c(c6, c6)*weu_6 + c(d6, d6)*wFeduc_a_6
  wFeduc_a_8  ~ c(c7, c7)*weu_7 + c(d7, d7)*wFeduc_a_7
  wFeduc_a_9  ~ c(c8, c8)*weu_8 + c(d8, d8)*wFeduc_a_8
  wFeduc_a_10  ~ c(c9, c9)*weu_9 + c(d9, d9)*wFeduc_a_9
  wFeduc_a_11  ~ c(c10, c10)*weu_10 + c(d10, d10)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_1 ~~ wFeduc_a_1 # Covariance

  # Estimate the covariances between the residuals
  weu_2 ~~ c(cov1, cov2)*wFeduc_a_2
  weu_3 ~~ c(cov1, cov2)*wFeduc_a_3
  weu_4 ~~ c(cov1, cov2)*wFeduc_a_4
  weu_5 ~~ c(cov1, cov2)*wFeduc_a_5
  weu_6 ~~ c(cov1, cov2)*wFeduc_a_6
  weu_7 ~~ c(cov1, cov2)*wFeduc_a_7
  weu_8 ~~ c(cov1, cov2)*wFeduc_a_8
  weu_9 ~~ c(cov1, cov2)*wFeduc_a_9
  weu_10 ~~ c(cov1, cov2)*wFeduc_a_10
  weu_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  weu_1 ~~ weu_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  weu_2 ~~ c(vy1, vy2)*weu_2 
  wFeduc_a_2 ~~ c(vx1, vx2)*wFeduc_a_2
  weu_3 ~~ c(vy1, vy2)*weu_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  weu_4 ~~ c(vy1, vy2)*weu_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  weu_5 ~~ c(vy1, vy2)*weu_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  weu_6 ~~ c(vy1, vy2)*weu_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  weu_7 ~~ c(vy1, vy2)*weu_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  weu_8 ~~ c(vy1, vy2)*weu_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  weu_9 ~~ c(vy1, vy2)*weu_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  weu_10 ~~ c(vy1, vy2)*weu_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  weu_11 ~~ c(vy1, vy2)*weu_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*weu_1

'

#create and store model
#create filename
filename <-
  file.path(dir,
            "EU_model8_constrained_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  EU_model8_constrained_groups_fit <-
    lavaan(
      EU_model8_constrained_groups,
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "ave_2"
    )
  #save model
  save(EU_model8_constrained_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
EU_model8_unconstrained_groups_constrained_lag <- 
'
################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1*Feduc_a_1 + 1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*eu_1 + 1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  weu_1 =~ 1*eu_1
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_2   ~ c(a1, a2)*weu_1 + c(b1, b2)*wFeduc_a_1
  weu_3   ~ c(a1, a2)*weu_2 + c(b1, b2)*wFeduc_a_2
  weu_4   ~ c(a1, a2)*weu_3 + c(b1, b2)*wFeduc_a_3
  weu_5   ~ c(a1, a2)*weu_4 + c(b1, b2)*wFeduc_a_4
  weu_6   ~ c(a1, a2)*weu_5 + c(b1, b2)*wFeduc_a_5
  weu_7   ~ c(a1, a2)*weu_6 + c(b1, b2)*wFeduc_a_6
  weu_8   ~ c(a1, a2)*weu_7 + c(b1, b2)*wFeduc_a_7
  weu_9   ~ c(a1, a2)*weu_8 + c(b1, b2)*wFeduc_a_8
  weu_10  ~ c(a1, a2)*weu_9 + c(b1, b2)*wFeduc_a_9
  weu_11  ~ c(a1, a2)*weu_10 + c(b1, b2)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c2)*weu_1 + c(d1, d2)*wFeduc_a_1
  wFeduc_a_3  ~ c(c1, c2)*weu_2 + c(d1, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2)*weu_3 + c(d1, d2)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2)*weu_4 + c(d1, d2)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2)*weu_5 + c(d1, d2)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2)*weu_6 + c(d1, d2)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2)*weu_7 + c(d1, d2)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2)*weu_8 + c(d1, d2)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2)*weu_9 + c(d1, d2)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2)*weu_10 + c(d1, d2)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_1 ~~ wFeduc_a_1 # Covariance

   # Estimate the covariances between the residuals
  weu_2 ~~ c(cov1, cov2)*wFeduc_a_2
  weu_3 ~~ c(cov1, cov2)*wFeduc_a_3
  weu_4 ~~ c(cov1, cov2)*wFeduc_a_4
  weu_5 ~~ c(cov1, cov2)*wFeduc_a_5
  weu_6 ~~ c(cov1, cov2)*wFeduc_a_6
  weu_7 ~~ c(cov1, cov2)*wFeduc_a_7
  weu_8 ~~ c(cov1, cov2)*wFeduc_a_8
  weu_9 ~~ c(cov1, cov2)*wFeduc_a_9
  weu_10 ~~ c(cov1, cov2)*wFeduc_a_10
  weu_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  weu_1 ~~ weu_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  weu_2 ~~ c(vy1, vy2)*weu_2 
  wFeduc_a_2 ~~ c(vx1, vx2)*wFeduc_a_2
  weu_3 ~~ c(vy1, vy2)*weu_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  weu_4 ~~ c(vy1, vy2)*weu_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  weu_5 ~~ c(vy1, vy2)*weu_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  weu_6 ~~ c(vy1, vy2)*weu_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  weu_7 ~~ c(vy1, vy2)*weu_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  weu_8 ~~ c(vy1, vy2)*weu_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  weu_9 ~~ c(vy1, vy2)*weu_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  weu_10 ~~ c(vy1, vy2)*weu_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  weu_11 ~~ c(vy1, vy2)*weu_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*weu_1

'
#create and store model
#create filename
filename <-
  file.path(dir,
            "EU_model8_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  EU_model8_unconstrained_groups_constrained_lag_fit <-
    lavaan(
      EU_model8_unconstrained_groups_constrained_lag,
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "ave_2"
    )
  #save model
  save(EU_model8_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {
  load(file = filename)
}
#create and store model
#create filename
filename <-
  file.path(dir,
            "EU_model8_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  EU_model8_constrained_lag_groups_fit <-
    lavaan(
      main_lavaan_results$`Lavaan model objects`[[1]][[2]],
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "ave_2"
    )
  
  #save model
  save(EU_model8_constrained_lag_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
fit_matrix_EU_m8_constrained_groups <- lavInspect(EU_model8_constrained_lag_groups_fit, what = "fit")
fit_matrix_EU_m8_unconstrained_groups <- lavInspect(EU_model8_unconstrained_groups_constrained_lag_fit, what = "fit")

fit_matrix_eu_M8 <- rbind(fit_matrix_EU_m8_constrained_groups, fit_matrix_EU_m8_unconstrained_groups)

lavTestLRT(EU_model8_constrained_lag_groups_fit, EU_model8_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq EU_model8_unconstrained_groups_constrained_lag_fit 640 155224 155785 2862.5 EU_model8_constrained_lag_groups_fit 647 155236 155751 2888.1 Chisq diff Df diff EU_model8_unconstrained_groups_constrained_lag_fit
EU_model8_constrained_lag_groups_fit 11.066 7 Pr(>Chisq) EU_model8_unconstrained_groups_constrained_lag_fit
EU_model8_constrained_lag_groups_fit 0.1358

cultural inclusion

cult_model8_constrained_groups <- 
' ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1*Feduc_a_1 + 1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*cult_1 + 1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  wcult_1 =~ 1*cult_1
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects (constrained)
  wcult_2   ~ c(a1, a1)*wcult_1 + c(b1, b1)*wFeduc_a_1
  wcult_3   ~ c(a2, a2)*wcult_2 + c(b2, b2)*wFeduc_a_2
  wcult_4   ~ c(a3, a3)*wcult_3 + c(b3, b3)*wFeduc_a_3
  wcult_5   ~ c(a4, a4)*wcult_4 + c(b4, b4)*wFeduc_a_4
  wcult_6   ~ c(a5, a5)*wcult_5 + c(b5, b5)*wFeduc_a_5
  wcult_7   ~ c(a6, a6)*wcult_6 + c(b6, b6)*wFeduc_a_6
  wcult_8   ~ c(a7, a7)*wcult_7 + c(b7, b7)*wFeduc_a_7
  wcult_9   ~ c(a8, a8)*wcult_8 + c(b8, b8)*wFeduc_a_8
  wcult_10  ~ c(a9, a9)*wcult_9 + c(b9, b9)*wFeduc_a_9
  wcult_11  ~ c(a10, a10)*wcult_10 + c(b10, b10)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c1)*wcult_1 + c(d1, d1)*wFeduc_a_1
  wFeduc_a_3  ~ c(c2, c2)*wcult_2 + c(d2, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c3, c3)*wcult_3 + c(d3, d3)*wFeduc_a_3
  wFeduc_a_5  ~ c(c4, c4)*wcult_4 + c(d4, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c5, c5)*wcult_5 + c(d5, d5)*wFeduc_a_5
  wFeduc_a_7  ~ c(c6, c6)*wcult_6 + c(d6, d6)*wFeduc_a_6
  wFeduc_a_8  ~ c(c7, c7)*wcult_7 + c(d7, d7)*wFeduc_a_7
  wFeduc_a_9  ~ c(c8, c8)*wcult_8 + c(d8, d8)*wFeduc_a_8
  wFeduc_a_10  ~ c(c9, c9)*wcult_9 + c(d9, d9)*wFeduc_a_9
  wFeduc_a_11  ~ c(c10, c10)*wcult_10 + c(d10, d10)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_1 ~~ wFeduc_a_1 # Covariance

  # Estimate the covariances between the residuals
  wcult_2 ~~ cov*wFeduc_a_2
  wcult_3 ~~ cov*wFeduc_a_3
  wcult_4 ~~ cov*wFeduc_a_4
  wcult_5 ~~ cov*wFeduc_a_5
  wcult_6 ~~ cov*wFeduc_a_6
  wcult_7 ~~ cov*wFeduc_a_7
  wcult_8 ~~ cov*wFeduc_a_8
  wcult_9 ~~ cov*wFeduc_a_9
  wcult_10 ~~ cov*wFeduc_a_10
  wcult_11 ~~ cov*wFeduc_a_11
  
  # Estimate the variance 
  wcult_1 ~~ wcult_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  wcult_2 ~~ vy*wcult_2 
  wFeduc_a_2 ~~ vx*wFeduc_a_2
  wcult_3 ~~ vy*wcult_3
  wFeduc_a_3 ~~ vx*wFeduc_a_3
  wcult_4 ~~ vy*wcult_4 
  wFeduc_a_4 ~~ vx*wFeduc_a_4
  wcult_5 ~~ vy*wcult_5
  wFeduc_a_5 ~~ vx*wFeduc_a_5
  wcult_6 ~~ vy*wcult_6 
  wFeduc_a_6 ~~ vx*wFeduc_a_6
  wcult_7 ~~ vy*wcult_7 
  wFeduc_a_7 ~~ vx*wFeduc_a_7
  wcult_8 ~~ vy*wcult_8 
  wFeduc_a_8 ~~ vx*wFeduc_a_8
  wcult_9 ~~ vy*wcult_9 
  wFeduc_a_9 ~~ vx*wFeduc_a_9
  wcult_10 ~~ vy*wcult_10 
  wFeduc_a_10 ~~ vx*wFeduc_a_10
  wcult_11 ~~ vy*wcult_11 
  wFeduc_a_11 ~~ vx*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*wcult_1'

#create and store model
#create filename
filename <-
  file.path(dir,
            "cult_model8_constrained_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  cult_model8_constrained_groups_fit <-
    lavaan(
      cult_model8_constrained_groups,
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "ave_2"
    )
  
  #save model
  save(cult_model8_constrained_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
cult_model8_unconstrained_groups_constrained_lag <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1*Feduc_a_1 + 1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*cult_1 + 1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  wcult_1 =~ 1*cult_1
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects (constrained)
  wcult_2   ~ c(a1, a2)*wcult_1 + c(b1, b2)*wFeduc_a_1
  wcult_3   ~ c(a1, a2)*wcult_2 + c(b1, b2)*wFeduc_a_2
  wcult_4   ~ c(a1, a2)*wcult_3 + c(b1, b2)*wFeduc_a_3
  wcult_5   ~ c(a1, a2)*wcult_4 + c(b1, b2)*wFeduc_a_4
  wcult_6   ~ c(a1, a2)*wcult_5 + c(b1, b2)*wFeduc_a_5
  wcult_7   ~ c(a1, a2)*wcult_6 + c(b1, b2)*wFeduc_a_6
  wcult_8   ~ c(a1, a2)*wcult_7 + c(b1, b2)*wFeduc_a_7
  wcult_9   ~ c(a1, a2)*wcult_8 + c(b1, b2)*wFeduc_a_8
  wcult_10  ~ c(a1, a2)*wcult_9 + c(b1, b2)*wFeduc_a_9
  wcult_11  ~ c(a1, a2)*wcult_10 + c(b1, b2)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c2)*wcult_1 + c(d1, d2)*wFeduc_a_1
  wFeduc_a_3  ~ c(c1, c2)*wcult_2 + c(d1, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2)*wcult_3 + c(d1, d2)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2)*wcult_4 + c(d1, d2)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2)*wcult_5 + c(d1, d2)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2)*wcult_6 + c(d1, d2)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2)*wcult_7 + c(d1, d2)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2)*wcult_8 + c(d1, d2)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2)*wcult_9 + c(d1, d2)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2)*wcult_10 + c(d1, d2)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_1 ~~ wFeduc_a_1 # Covariance

  # Estimate the covariances between the residuals
  wcult_2 ~~ c(cov1, cov2)*wFeduc_a_2
  wcult_3 ~~ c(cov1, cov2)*wFeduc_a_3
  wcult_4 ~~ c(cov1, cov2)*wFeduc_a_4
  wcult_5 ~~ c(cov1, cov2)*wFeduc_a_5
  wcult_6 ~~ c(cov1, cov2)*wFeduc_a_6
  wcult_7 ~~ c(cov1, cov2)*wFeduc_a_7
  wcult_8 ~~ c(cov1, cov2)*wFeduc_a_8
  wcult_9 ~~ c(cov1, cov2)*wFeduc_a_9
  wcult_10 ~~ c(cov1, cov2)*wFeduc_a_10
  wcult_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  wcult_1 ~~ wcult_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  wcult_2 ~~ c(vy1, vy2)*wcult_2 
  wFeduc_a_2 ~~ c(vx1, vx2)*wFeduc_a_2
  wcult_3 ~~ c(vy1, vy2)*wcult_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  wcult_4 ~~ c(vy1, vy2)*wcult_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  wcult_5 ~~ c(vy1, vy2)*wcult_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  wcult_6 ~~ c(vy1, vy2)*wcult_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  wcult_7 ~~ c(vy1, vy2)*wcult_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  wcult_8 ~~ c(vy1, vy2)*wcult_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  wcult_9 ~~ c(vy1, vy2)*wcult_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  wcult_10 ~~ c(vy1, vy2)*wcult_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  wcult_11 ~~ c(vy1, vy2)*wcult_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*wcult_1

'
#create and store model
#create filename
filename <-
  file.path(dir,
            "cult_model8_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
cult_model8_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    cult_model8_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "ave_2"
  )

  #save model
  save(cult_model8_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {
  load(file = filename)
}
#create and store model
#create filename
filename <-
  file.path(dir,
            "cult_model8_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
cult_model8_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[2]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "ave_2"
  )

  #save model
  save(cult_model8_constrained_lag_groups_fit,
       file = filename)
} else{
  load(file = filename)
  }
fit_matrix_cult_m8_constrained_groups <- lavInspect(cult_model8_constrained_lag_groups_fit, what = "fit")
fit_matrix_cult_m8_unconstrained_groups <- lavInspect(cult_model8_unconstrained_groups_constrained_lag_fit, what = "fit")

fit_matrix_cult_M8 <- rbind(fit_matrix_cult_m8_constrained_groups, fit_matrix_cult_m8_unconstrained_groups)

lavTestLRT(cult_model8_constrained_lag_groups_fit, cult_model8_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq cult_model8_unconstrained_groups_constrained_lag_fit 640 148728 149289 2585.3 cult_model8_constrained_lag_groups_fit 647 148737 149252 2608.1 Chisq diff Df diff cult_model8_unconstrained_groups_constrained_lag_fit
cult_model8_constrained_lag_groups_fit 10.166 7 Pr(>Chisq) cult_model8_unconstrained_groups_constrained_lag_fit
cult_model8_constrained_lag_groups_fit 0.1794

income differences

inc_diff_model8_constrained_groups <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1*Feduc_a_1 + 1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*inc_diff_1 + 1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  winc_diff_1 =~ 1*inc_diff_1
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_2   ~ c(a1, a1)*winc_diff_1 + c(b1, b1)*wFeduc_a_1
  winc_diff_3   ~ c(a2, a2)*winc_diff_2 + c(b2, b2)*wFeduc_a_2
  winc_diff_4   ~ c(a3, a3)*winc_diff_3 + c(b3, b3)*wFeduc_a_3
  winc_diff_5   ~ c(a4, a4)*winc_diff_4 + c(b4, b4)*wFeduc_a_4
  winc_diff_6   ~ c(a5, a5)*winc_diff_5 + c(b5, b5)*wFeduc_a_5
  winc_diff_7   ~ c(a6, a6)*winc_diff_6 + c(b6, b6)*wFeduc_a_6
  winc_diff_8   ~ c(a7, a7)*winc_diff_7 + c(b7, b7)*wFeduc_a_7
  winc_diff_9   ~ c(a8, a8)*winc_diff_8 + c(b8, b8)*wFeduc_a_8
  winc_diff_10  ~ c(a9, a9)*winc_diff_9 + c(b9, b9)*wFeduc_a_9
  winc_diff_11  ~ c(a10, a10)*winc_diff_10 + c(b10, b10)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c1)*winc_diff_1 + c(d1, d1)*wFeduc_a_1
  wFeduc_a_3  ~ c(c2, c2)*winc_diff_2 + c(d2, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c3, c3)*winc_diff_3 + c(d3, d3)*wFeduc_a_3
  wFeduc_a_5  ~ c(c4, c4)*winc_diff_4 + c(d4, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c5, c5)*winc_diff_5 + c(d5, d5)*wFeduc_a_5
  wFeduc_a_7  ~ c(c6, c6)*winc_diff_6 + c(d6, d6)*wFeduc_a_6
  wFeduc_a_8  ~ c(c7, c7)*winc_diff_7 + c(d7, d7)*wFeduc_a_7
  wFeduc_a_9  ~ c(c8, c8)*winc_diff_8 + c(d8, d8)*wFeduc_a_8
  wFeduc_a_10  ~ c(c9, c9)*winc_diff_9 + c(d9, d9)*wFeduc_a_9
  wFeduc_a_11  ~ c(c10, c10)*winc_diff_10 + c(d10, d10)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_1 ~~ wFeduc_a_1 # Covariance

  # Estimate the covariances between the residuals
  winc_diff_2 ~~ cov*wFeduc_a_2
  winc_diff_3 ~~ cov*wFeduc_a_3
  winc_diff_4 ~~ cov*wFeduc_a_4
  winc_diff_5 ~~ cov*wFeduc_a_5
  winc_diff_6 ~~ cov*wFeduc_a_6
  winc_diff_7 ~~ cov*wFeduc_a_7
  winc_diff_8 ~~ cov*wFeduc_a_8
  winc_diff_9 ~~ cov*wFeduc_a_9
  winc_diff_10 ~~ cov*wFeduc_a_10
  winc_diff_11 ~~ cov*wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_1 ~~ winc_diff_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  winc_diff_2 ~~ vy*winc_diff_2 
  wFeduc_a_2 ~~ vx*wFeduc_a_2
  winc_diff_3 ~~ vy*winc_diff_3
  wFeduc_a_3 ~~ vx*wFeduc_a_3
  winc_diff_4 ~~ vy*winc_diff_4 
  wFeduc_a_4 ~~ vx*wFeduc_a_4
  winc_diff_5 ~~ vy*winc_diff_5
  wFeduc_a_5 ~~ vx*wFeduc_a_5
  winc_diff_6 ~~ vy*winc_diff_6 
  wFeduc_a_6 ~~ vx*wFeduc_a_6
  winc_diff_7 ~~ vy*winc_diff_7 
  wFeduc_a_7 ~~ vx*wFeduc_a_7
  winc_diff_8 ~~ vy*winc_diff_8 
  wFeduc_a_8 ~~ vx*wFeduc_a_8
  winc_diff_9 ~~ vy*winc_diff_9 
  wFeduc_a_9 ~~ vx*wFeduc_a_9
  winc_diff_10 ~~ vy*winc_diff_10 
  wFeduc_a_10 ~~ vx*wFeduc_a_10
  winc_diff_11 ~~ vy*winc_diff_11 
  wFeduc_a_11 ~~ vx*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*winc_diff_1

'
#create and store model
#create filename
filename <-
  file.path(dir,
            "inc_diff_model8_constrained_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
inc_diff_model8_constrained_groups_fit <-
  lavaan(
    inc_diff_model8_constrained_groups,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "ave_2"
  )
  #save model
  save(inc_diff_model8_constrained_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
inc_diff_model8_unconstrained_groups_constrained_lag <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1*Feduc_a_1 + 1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*inc_diff_1 + 1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  winc_diff_1 =~ 1*inc_diff_1
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_2   ~ c(a1, a2)*winc_diff_1 + c(b1, b2)*wFeduc_a_1
  winc_diff_3   ~ c(a1, a2)*winc_diff_2 + c(b1, b2)*wFeduc_a_2
  winc_diff_4   ~ c(a1, a2)*winc_diff_3 + c(b1, b2)*wFeduc_a_3
  winc_diff_5   ~ c(a1, a2)*winc_diff_4 + c(b1, b2)*wFeduc_a_4
  winc_diff_6   ~ c(a1, a2)*winc_diff_5 + c(b1, b2)*wFeduc_a_5
  winc_diff_7   ~ c(a1, a2)*winc_diff_6 + c(b1, b2)*wFeduc_a_6
  winc_diff_8   ~ c(a1, a2)*winc_diff_7 + c(b1, b2)*wFeduc_a_7
  winc_diff_9   ~ c(a1, a2)*winc_diff_8 + c(b1, b2)*wFeduc_a_8
  winc_diff_10  ~ c(a1, a2)*winc_diff_9 + c(b1, b2)*wFeduc_a_9
  winc_diff_11  ~ c(a1, a2)*winc_diff_10 + c(b1, b2)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c2)*winc_diff_1 + c(d1, d2)*wFeduc_a_1
  wFeduc_a_3  ~ c(c1, c2)*winc_diff_2 + c(d1, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2)*winc_diff_3 + c(d1, d2)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2)*winc_diff_4 + c(d1, d2)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2)*winc_diff_5 + c(d1, d2)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2)*winc_diff_6 + c(d1, d2)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2)*winc_diff_7 + c(d1, d2)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2)*winc_diff_8 + c(d1, d2)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2)*winc_diff_9 + c(d1, d2)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2)*winc_diff_10 + c(d1, d2)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_1 ~~ wFeduc_a_1 # Covariance

  # Estimate the covariances between the residuals
  winc_diff_2 ~~ c(cov1, cov2)*wFeduc_a_2
  winc_diff_3 ~~ c(cov1, cov2)*wFeduc_a_3
  winc_diff_4 ~~ c(cov1, cov2)*wFeduc_a_4
  winc_diff_5 ~~ c(cov1, cov2)*wFeduc_a_5
  winc_diff_6 ~~ c(cov1, cov2)*wFeduc_a_6
  winc_diff_7 ~~ c(cov1, cov2)*wFeduc_a_7
  winc_diff_8 ~~ c(cov1, cov2)*wFeduc_a_8
  winc_diff_9 ~~ c(cov1, cov2)*wFeduc_a_9
  winc_diff_10 ~~ c(cov1, cov2)*wFeduc_a_10
  winc_diff_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_1 ~~ winc_diff_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  winc_diff_2 ~~ c(vy1, vy2)*winc_diff_2 
  wFeduc_a_2 ~~ c(vx1, vx2)*wFeduc_a_2
  winc_diff_3 ~~ c(vy1, vy2)*winc_diff_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  winc_diff_4 ~~ c(vy1, vy2)*winc_diff_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  winc_diff_5 ~~ c(vy1, vy2)*winc_diff_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  winc_diff_6 ~~ c(vy1, vy2)*winc_diff_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  winc_diff_7 ~~ c(vy1, vy2)*winc_diff_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  winc_diff_8 ~~ c(vy1, vy2)*winc_diff_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  winc_diff_9 ~~ c(vy1, vy2)*winc_diff_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  winc_diff_10 ~~ c(vy1, vy2)*winc_diff_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  winc_diff_11 ~~ c(vy1, vy2)*winc_diff_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*winc_diff_1

'
#create and store model
#create filename
filename <-
  file.path(dir,
            "inc_diff_model8_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
inc_diff_model8_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    inc_diff_model8_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "ave_2"
  )

  #save model
  save(inc_diff_model8_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {load(file = filename)
}
#create and store model
#create filename
filename <-
  file.path(dir,
            "inc_diff_model8_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  inc_diff_model8_constrained_lag_groups_fit <-
    lavaan(
      main_lavaan_results$`Lavaan model objects`[[3]][[2]],
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "ave_2"
    )
  
  #save model
  save(inc_diff_model8_constrained_lag_groups_fit,
       file = filename)
} else{
  load(file = filename)
}
fit_matrix_inc_diff_m8_constrained_groups <- lavInspect(inc_diff_model8_constrained_lag_groups_fit, what = "fit")
fit_matrix_inc_diff_m8_unconstrained_groups <- lavInspect(inc_diff_model8_unconstrained_groups_constrained_lag_fit, what = "fit")

fit_matrix_inc_diff_M8 <- rbind(fit_matrix_inc_diff_m8_constrained_groups, fit_matrix_inc_diff_m8_unconstrained_groups)

lavTestLRT(inc_diff_model8_constrained_lag_groups_fit, inc_diff_model8_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC inc_diff_model8_unconstrained_groups_constrained_lag_fit 640 149584 150145 inc_diff_model8_constrained_lag_groups_fit 647 149596 150111 Chisq Chisq diff inc_diff_model8_unconstrained_groups_constrained_lag_fit 2761.3
inc_diff_model8_constrained_lag_groups_fit 2787.0 11.179 Df diff Pr(>Chisq) inc_diff_model8_unconstrained_groups_constrained_lag_fit
inc_diff_model8_constrained_lag_groups_fit 7 0.131

Between level interaction (quartiles)

Political Discussion

EU integration

EU_model9_unconstrained_groups_constrained_lag <- 
'

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1*Feduc_a_1 + 1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*eu_1 + 1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  weu_1 =~ 1*eu_1
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_2   ~ c(a1, a2, a3, a4)*weu_1 + c(b1, b2, b3, b4)*wFeduc_a_1
  weu_3   ~ c(a1, a2, a3, a4)*weu_2 + c(b1, b2, b3, b4)*wFeduc_a_2
  weu_4   ~ c(a1, a2, a3, a4)*weu_3 + c(b1, b2, b3, b4)*wFeduc_a_3
  weu_5   ~ c(a1, a2, a3, a4)*weu_4 + c(b1, b2, b3, b4)*wFeduc_a_4
  weu_6   ~ c(a1, a2, a3, a4)*weu_5 + c(b1, b2, b3, b4)*wFeduc_a_5
  weu_7   ~ c(a1, a2, a3, a4)*weu_6 + c(b1, b2, b3, b4)*wFeduc_a_6
  weu_8   ~ c(a1, a2, a3, a4)*weu_7 + c(b1, b2, b3, b4)*wFeduc_a_7
  weu_9   ~ c(a1, a2, a3, a4)*weu_8 + c(b1, b2, b3, b4)*wFeduc_a_8
  weu_10  ~ c(a1, a2, a3, a4)*weu_9 + c(b1, b2, b3, b4)*wFeduc_a_9
  weu_11  ~ c(a1, a2, a3, a4)*weu_10 + c(b1, b2, b3, b4)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c2, c3, c4)*weu_1 + c(d1, d2, d3, d4)*wFeduc_a_1
  wFeduc_a_3  ~ c(c1, c2, c3, c4)*weu_2 + c(d1, d2, d3, d4)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2, c3, c4)*weu_3 + c(d1, d2, d3, d4)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2, c3, c4)*weu_4 + c(d1, d2, d3, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2, c3, c4)*weu_5 + c(d1, d2, d3, d4)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2, c3, c4)*weu_6 + c(d1, d2, d3, d4)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2, c3, c4)*weu_7 + c(d1, d2, d3, d4)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2, c3, c4)*weu_8 + c(d1, d2, d3, d4)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2, c3, c4)*weu_9 + c(d1, d2, d3, d4)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2, c3, c4)*weu_10 + c(d1, d2, d3, d4)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_1 ~~ wFeduc_a_1 # Covariance

   # Estimate the covariances between the residuals
  weu_2 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_2
  weu_3 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_3
  weu_4 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_4
  weu_5 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_5
  weu_6 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_6
  weu_7 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_7
  weu_8 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_8
  weu_9 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_9
  weu_10 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_10
  weu_11 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_11
  
  # Estimate the variance 
  weu_1 ~~ weu_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  weu_2 ~~ c(vy1, vy2, vy3, vy4)*weu_2 
  wFeduc_a_2 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_2
  weu_3 ~~ c(vy1, vy2, vy3, vy4)*weu_3
  wFeduc_a_3 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_3
  weu_4 ~~ c(vy1, vy2, vy3, vy4)*weu_4 
  wFeduc_a_4 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_4
  weu_5 ~~ c(vy1, vy2, vy3, vy4)*weu_5
  wFeduc_a_5 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_5
  weu_6 ~~ c(vy1, vy2, vy3, vy4)*weu_6 
  wFeduc_a_6 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_6
  weu_7 ~~ c(vy1, vy2, vy3, vy4)*weu_7 
  wFeduc_a_7 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_7
  weu_8 ~~ c(vy1, vy2, vy3, vy4)*weu_8 
  wFeduc_a_8 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_8
  weu_9 ~~ c(vy1, vy2, vy3, vy4)*weu_9 
  wFeduc_a_9 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_9
  weu_10 ~~ c(vy1, vy2, vy3, vy4)*weu_10 
  wFeduc_a_10 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_10
  weu_11 ~~ c(vy1, vy2, vy3, vy4)*weu_11 
  wFeduc_a_11 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*weu_1

'
#create and store model
#create filename
filename <-
  file.path(dir,
            "EU_model9_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {

EU_model9_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    EU_model9_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "pol_disc_rec"
  )

 
  #save model
  save(EU_model9_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {
  load(file = filename)
}
#file
filename <-
  file.path(dir,
            "EU_model9_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
EU_model9_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[1]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "pol_disc_rec"
  ) 
  #save model
  save(EU_model9_constrained_lag_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
lavTestLRT(EU_model9_constrained_lag_groups_fit, EU_model9_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq EU_model9_unconstrained_groups_constrained_lag_fit 1280 153392 154513 4055.7 EU_model9_constrained_lag_groups_fit 1301 154286 155269 4991.3 Chisq diff Df diff EU_model9_unconstrained_groups_constrained_lag_fit
EU_model9_constrained_lag_groups_fit 389.85 21 Pr(>Chisq)
EU_model9_unconstrained_groups_constrained_lag_fit
EU_model9_constrained_lag_groups_fit < 2.2e-16 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

cultural inclusion

cult_model9_unconstrained_groups_constrained_lag <- 
'
  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1*Feduc_a_1 + 1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*cult_1 + 1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  wcult_1 =~ 1*cult_1
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects (constrained)
  wcult_2   ~ c(a1, a2, a3, a4)*wcult_1 + c(b1, b2, b3, b4)*wFeduc_a_1
  wcult_3   ~ c(a1, a2, a3, a4)*wcult_2 + c(b1, b2, b3, b4)*wFeduc_a_2
  wcult_4   ~ c(a1, a2, a3, a4)*wcult_3 + c(b1, b2, b3, b4)*wFeduc_a_3
  wcult_5   ~ c(a1, a2, a3, a4)*wcult_4 + c(b1, b2, b3, b4)*wFeduc_a_4
  wcult_6   ~ c(a1, a2, a3, a4)*wcult_5 + c(b1, b2, b3, b4)*wFeduc_a_5
  wcult_7   ~ c(a1, a2, a3, a4)*wcult_6 + c(b1, b2, b3, b4)*wFeduc_a_6
  wcult_8   ~ c(a1, a2, a3, a4)*wcult_7 + c(b1, b2, b3, b4)*wFeduc_a_7
  wcult_9   ~ c(a1, a2, a3, a4)*wcult_8 + c(b1, b2, b3, b4)*wFeduc_a_8
  wcult_10  ~ c(a1, a2, a3, a4)*wcult_9 + c(b1, b2, b3, b4)*wFeduc_a_9
  wcult_11  ~ c(a1, a2, a3, a4)*wcult_10 + c(b1, b2, b3, b4)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c2, c3, c4)*wcult_1 + c(d1, d2, d3, d4)*wFeduc_a_1
  wFeduc_a_3  ~ c(c1, c2, c3, c4)*wcult_2 + c(d1, d2, d3, d4)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2, c3, c4)*wcult_3 + c(d1, d2, d3, d4)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2, c3, c4)*wcult_4 + c(d1, d2, d3, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2, c3, c4)*wcult_5 + c(d1, d2, d3, d4)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2, c3, c4)*wcult_6 + c(d1, d2, d3, d4)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2, c3, c4)*wcult_7 + c(d1, d2, d3, d4)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2, c3, c4)*wcult_8 + c(d1, d2, d3, d4)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2, c3, c4)*wcult_9 + c(d1, d2, d3, d4)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2, c3, c4)*wcult_10 + c(d1, d2, d3, d4)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_1 ~~ wFeduc_a_1 # Covariance

   # Estimate the covariances between the residuals
  wcult_2 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_2
  wcult_3 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_3
  wcult_4 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_4
  wcult_5 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_5
  wcult_6 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_6
  wcult_7 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_7
  wcult_8 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_8
  wcult_9 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_9
  wcult_10 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_10
  wcult_11 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_11
  
  # Estimate the variance 
  wcult_1 ~~ wcult_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  wcult_2 ~~ c(vy1, vy2, vy3, vy4)*wcult_2 
  wFeduc_a_2 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_2
  wcult_3 ~~ c(vy1, vy2, vy3, vy4)*wcult_3
  wFeduc_a_3 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_3
  wcult_4 ~~ c(vy1, vy2, vy3, vy4)*wcult_4 
  wFeduc_a_4 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_4
  wcult_5 ~~ c(vy1, vy2, vy3, vy4)*wcult_5
  wFeduc_a_5 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_5
  wcult_6 ~~ c(vy1, vy2, vy3, vy4)*wcult_6 
  wFeduc_a_6 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_6
  wcult_7 ~~ c(vy1, vy2, vy3, vy4)*wcult_7 
  wFeduc_a_7 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_7
  wcult_8 ~~ c(vy1, vy2, vy3, vy4)*wcult_8 
  wFeduc_a_8 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_8
  wcult_9 ~~ c(vy1, vy2, vy3, vy4)*wcult_9 
  wFeduc_a_9 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_9
  wcult_10 ~~ c(vy1, vy2, vy3, vy4)*wcult_10 
  wFeduc_a_10 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_10
  wcult_11 ~~ c(vy1, vy2, vy3, vy4)*wcult_11 
  wFeduc_a_11 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*wcult_1

'
#filename
filename <-
  file.path(dir,
            "cult_model9_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  cult_model9_unconstrained_groups_constrained_lag_fit <-
    lavaan(
      cult_model9_unconstrained_groups_constrained_lag,
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "pol_disc_rec"
    )
  #save model
  save(cult_model9_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {
  load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "cult_model9_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
cult_model9_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[2]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "pol_disc_rec"
  )
  #save model
  save(cult_model9_constrained_lag_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
lavTestLRT(cult_model9_constrained_lag_groups_fit, cult_model9_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq cult_model9_unconstrained_groups_constrained_lag_fit 1280 146913 148034 3725.8 cult_model9_constrained_lag_groups_fit 1301 147822 148805 4676.0 Chisq diff Df diff cult_model9_unconstrained_groups_constrained_lag_fit
cult_model9_constrained_lag_groups_fit 412 21 Pr(>Chisq)
cult_model9_unconstrained_groups_constrained_lag_fit
cult_model9_constrained_lag_groups_fit < 2.2e-16 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

income differences

inc_diff_model9_unconstrained_groups_constrained_lag <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1*Feduc_a_1 + 1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*inc_diff_1 + 1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  winc_diff_1 =~ 1*inc_diff_1
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_2   ~ c(a1, a2, a3, a4)*winc_diff_1 + c(b1, b2, b3, b4)*wFeduc_a_1
  winc_diff_3   ~ c(a1, a2, a3, a4)*winc_diff_2 + c(b1, b2, b3, b4)*wFeduc_a_2
  winc_diff_4   ~ c(a1, a2, a3, a4)*winc_diff_3 + c(b1, b2, b3, b4)*wFeduc_a_3
  winc_diff_5   ~ c(a1, a2, a3, a4)*winc_diff_4 + c(b1, b2, b3, b4)*wFeduc_a_4
  winc_diff_6   ~ c(a1, a2, a3, a4)*winc_diff_5 + c(b1, b2, b3, b4)*wFeduc_a_5
  winc_diff_7   ~ c(a1, a2, a3, a4)*winc_diff_6 + c(b1, b2, b3, b4)*wFeduc_a_6
  winc_diff_8   ~ c(a1, a2, a3, a4)*winc_diff_7 + c(b1, b2, b3, b4)*wFeduc_a_7
  winc_diff_9   ~ c(a1, a2, a3, a4)*winc_diff_8 + c(b1, b2, b3, b4)*wFeduc_a_8
  winc_diff_10  ~ c(a1, a2, a3, a4)*winc_diff_9 + c(b1, b2, b3, b4)*wFeduc_a_9
  winc_diff_11  ~ c(a1, a2, a3, a4)*winc_diff_10 + c(b1, b2, b3, b4)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c2, c3, c4)*winc_diff_1 + c(d1, d2, d3, d4)*wFeduc_a_1
  wFeduc_a_3  ~ c(c1, c2, c3, c4)*winc_diff_2 + c(d1, d2, d3, d4)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2, c3, c4)*winc_diff_3 + c(d1, d2, d3, d4)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2, c3, c4)*winc_diff_4 + c(d1, d2, d3, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2, c3, c4)*winc_diff_5 + c(d1, d2, d3, d4)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2, c3, c4)*winc_diff_6 + c(d1, d2, d3, d4)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2, c3, c4)*winc_diff_7 + c(d1, d2, d3, d4)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2, c3, c4)*winc_diff_8 + c(d1, d2, d3, d4)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2, c3, c4)*winc_diff_9 + c(d1, d2, d3, d4)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2, c3, c4)*winc_diff_10 + c(d1, d2, d3, d4)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_1 ~~ wFeduc_a_1 # Covariance

   # Estimate the covariances between the residuals
  winc_diff_2 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_2
  winc_diff_3 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_3
  winc_diff_4 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_4
  winc_diff_5 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_5
  winc_diff_6 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_6
  winc_diff_7 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_7
  winc_diff_8 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_8
  winc_diff_9 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_9
  winc_diff_10 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_10
  winc_diff_11 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_1 ~~ winc_diff_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  winc_diff_2 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_2 
  wFeduc_a_2 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_2
  winc_diff_3 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_3
  wFeduc_a_3 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_3
  winc_diff_4 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_4 
  wFeduc_a_4 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_4
  winc_diff_5 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_5
  wFeduc_a_5 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_5
  winc_diff_6 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_6 
  wFeduc_a_6 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_6
  winc_diff_7 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_7 
  wFeduc_a_7 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_7
  winc_diff_8 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_8 
  wFeduc_a_8 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_8
  winc_diff_9 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_9 
  wFeduc_a_9 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_9
  winc_diff_10 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_10 
  wFeduc_a_10 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_10
  winc_diff_11 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_11 
  wFeduc_a_11 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*winc_diff_1

'

#filename
filename <-
  file.path(dir,
            "inc_diff_model9_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
inc_diff_model9_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    inc_diff_model9_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "pol_disc_rec"
  )

  #save model
  save(inc_diff_model9_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {
  load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "inc_diff_model9_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
inc_diff_model9_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[3]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "pol_disc_2"
  )

  #save model
  save(inc_diff_model9_constrained_lag_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
lavTestLRT(inc_diff_model9_constrained_lag_groups_fit, inc_diff_model9_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC inc_diff_model9_constrained_lag_groups_fit 647 149316 149830 inc_diff_model9_unconstrained_groups_constrained_lag_fit 1280 147751 148872 Chisq Chisq diff inc_diff_model9_constrained_lag_groups_fit 2723.8
inc_diff_model9_unconstrained_groups_constrained_lag_fit 3853.4 957.27 Df diff Pr(>Chisq)
inc_diff_model9_constrained_lag_groups_fit
inc_diff_model9_unconstrained_groups_constrained_lag_fit 633 1.181e-15 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

Newness

MyData <- MyData %>%
  mutate(rl_rec = cut2(rl_mean, g = 4),
         rl_2 = cut2(rl_mean, g = 2))

EU integration

EU_model10_unconstrained_groups_constrained_lag <- 
'
  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~ 1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_3   ~ c(a1, a2, a3, a4)*weu_2 + c(b1, b2, b3, b4)*wFeduc_a_2
  weu_4   ~ c(a1, a2, a3, a4)*weu_3 + c(b1, b2, b3, b4)*wFeduc_a_3
  weu_5   ~ c(a1, a2, a3, a4)*weu_4 + c(b1, b2, b3, b4)*wFeduc_a_4
  weu_6   ~ c(a1, a2, a3, a4)*weu_5 + c(b1, b2, b3, b4)*wFeduc_a_5
  weu_7   ~ c(a1, a2, a3, a4)*weu_6 + c(b1, b2, b3, b4)*wFeduc_a_6
  weu_8   ~ c(a1, a2, a3, a4)*weu_7 + c(b1, b2, b3, b4)*wFeduc_a_7
  weu_9   ~ c(a1, a2, a3, a4)*weu_8 + c(b1, b2, b3, b4)*wFeduc_a_8
  weu_10  ~ c(a1, a2, a3, a4)*weu_9 + c(b1, b2, b3, b4)*wFeduc_a_9
  weu_11  ~ c(a1, a2, a3, a4)*weu_10 + c(b1, b2, b3, b4)*wFeduc_a_10
  
  wFeduc_a_3  ~ c(c1, c2, c3, c4)*weu_2 + c(d1, d2, d3, d4)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2, c3, c4)*weu_3 + c(d1, d2, d3, d4)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2, c3, c4)*weu_4 + c(d1, d2, d3, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2, c3, c4)*weu_5 + c(d1, d2, d3, d4)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2, c3, c4)*weu_6 + c(d1, d2, d3, d4)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2, c3, c4)*weu_7 + c(d1, d2, d3, d4)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2, c3, c4)*weu_8 + c(d1, d2, d3, d4)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2, c3, c4)*weu_9 + c(d1, d2, d3, d4)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2, c3, c4)*weu_10 + c(d1, d2, d3, d4)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_2 ~~ wFeduc_a_2 # Covariance

   # Estimate the covariances between the residuals
  weu_3 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_3
  weu_4 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_4
  weu_5 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_5
  weu_6 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_6
  weu_7 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_7
  weu_8 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_8
  weu_9 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_9
  weu_10 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_10
  weu_11 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_11
  
  # Estimate the variance 
  weu_2 ~~ weu_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  weu_3 ~~ c(vy1, vy2, vy3, vy4)*weu_3
  wFeduc_a_3 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_3
  weu_4 ~~ c(vy1, vy2, vy3, vy4)*weu_4 
  wFeduc_a_4 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_4
  weu_5 ~~ c(vy1, vy2, vy3, vy4)*weu_5
  wFeduc_a_5 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_5
  weu_6 ~~ c(vy1, vy2, vy3, vy4)*weu_6 
  wFeduc_a_6 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_6
  weu_7 ~~ c(vy1, vy2, vy3, vy4)*weu_7 
  wFeduc_a_7 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_7
  weu_8 ~~ c(vy1, vy2, vy3, vy4)*weu_8 
  wFeduc_a_8 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_8
  weu_9 ~~ c(vy1, vy2, vy3, vy4)*weu_9 
  wFeduc_a_9 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_9
  weu_10 ~~ c(vy1, vy2, vy3, vy4)*weu_10 
  wFeduc_a_10 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_10
  weu_11 ~~ c(vy1, vy2, vy3, vy4)*weu_11 
  wFeduc_a_11 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*weu_2

'

#filename
filename <-
  file.path(dir,
            "EU_model10_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
EU_model10_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    EU_model10_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "rl_rec"
  )

  #save model
  save(EU_model10_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {
  load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "EU_model10_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
EU_model10_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[1]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "rl_rec"
  )

  #save model
  save(EU_model10_constrained_lag_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
lavTestLRT(EU_model10_constrained_lag_groups_fit, EU_model10_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq EU_model10_unconstrained_groups_constrained_lag_fit 1076 137643 138706 4422 EU_model10_constrained_lag_groups_fit 1301 150384 151363 6619 Chisq diff Df diff EU_model10_unconstrained_groups_constrained_lag_fit
EU_model10_constrained_lag_groups_fit 1658.8 225 Pr(>Chisq)
EU_model10_unconstrained_groups_constrained_lag_fit
EU_model10_constrained_lag_groups_fit < 2.2e-16 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

cultural inclusion

cult_model10_unconstrained_groups_constrained_lag <- 
'

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~  1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables.
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects (constrained)
  wcult_3   ~ c(a1, a2, a3, a4)*wcult_2 + c(b1, b2, b3, b4)*wFeduc_a_2
  wcult_4   ~ c(a1, a2, a3, a4)*wcult_3 + c(b1, b2, b3, b4)*wFeduc_a_3
  wcult_5   ~ c(a1, a2, a3, a4)*wcult_4 + c(b1, b2, b3, b4)*wFeduc_a_4
  wcult_6   ~ c(a1, a2, a3, a4)*wcult_5 + c(b1, b2, b3, b4)*wFeduc_a_5
  wcult_7   ~ c(a1, a2, a3, a4)*wcult_6 + c(b1, b2, b3, b4)*wFeduc_a_6
  wcult_8   ~ c(a1, a2, a3, a4)*wcult_7 + c(b1, b2, b3, b4)*wFeduc_a_7
  wcult_9   ~ c(a1, a2, a3, a4)*wcult_8 + c(b1, b2, b3, b4)*wFeduc_a_8
  wcult_10  ~ c(a1, a2, a3, a4)*wcult_9 + c(b1, b2, b3, b4)*wFeduc_a_9
  wcult_11  ~ c(a1, a2, a3, a4)*wcult_10 + c(b1, b2, b3, b4)*wFeduc_a_10
  
  wFeduc_a_3  ~ c(c1, c2, c3, c4)*wcult_2 + c(d1, d2, d3, d4)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2, c3, c4)*wcult_3 + c(d1, d2, d3, d4)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2, c3, c4)*wcult_4 + c(d1, d2, d3, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2, c3, c4)*wcult_5 + c(d1, d2, d3, d4)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2, c3, c4)*wcult_6 + c(d1, d2, d3, d4)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2, c3, c4)*wcult_7 + c(d1, d2, d3, d4)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2, c3, c4)*wcult_8 + c(d1, d2, d3, d4)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2, c3, c4)*wcult_9 + c(d1, d2, d3, d4)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2, c3, c4)*wcult_10 + c(d1, d2, d3, d4)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_2 ~~ wFeduc_a_2 # Covariance

   # Estimate the covariances between the residuals
  wcult_3 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_3
  wcult_4 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_4
  wcult_5 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_5
  wcult_6 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_6
  wcult_7 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_7
  wcult_8 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_8
  wcult_9 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_9
  wcult_10 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_10
  wcult_11 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_11
  
  # Estimate the variance 
  wcult_2 ~~ wcult_2
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  wcult_3 ~~ c(vy1, vy2, vy3, vy4)*wcult_3
  wFeduc_a_3 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_3
  wcult_4 ~~ c(vy1, vy2, vy3, vy4)*wcult_4 
  wFeduc_a_4 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_4
  wcult_5 ~~ c(vy1, vy2, vy3, vy4)*wcult_5
  wFeduc_a_5 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_5
  wcult_6 ~~ c(vy1, vy2, vy3, vy4)*wcult_6 
  wFeduc_a_6 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_6
  wcult_7 ~~ c(vy1, vy2, vy3, vy4)*wcult_7 
  wFeduc_a_7 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_7
  wcult_8 ~~ c(vy1, vy2, vy3, vy4)*wcult_8 
  wFeduc_a_8 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_8
  wcult_9 ~~ c(vy1, vy2, vy3, vy4)*wcult_9 
  wFeduc_a_9 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_9
  wcult_10 ~~ c(vy1, vy2, vy3, vy4)*wcult_10 
  wFeduc_a_10 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_10
  wcult_11 ~~ c(vy1, vy2, vy3, vy4)*wcult_11 
  wFeduc_a_11 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*wcult_2

'
#filename
filename <-
  file.path(dir,
            "cult_model10_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
  cult_model10_unconstrained_groups_constrained_lag_fit <-
    lavaan(
      cult_model10_unconstrained_groups_constrained_lag,
      data = MyData,
      estimator = 'MLR',
      missing = 'ML',
      meanstructure = T,
      int.ov.free = T,
      group = "rl_rec"
    )
  
  #save model
  save(cult_model10_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {
  load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "cult_model10_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
cult_model10_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[2]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "rl_rec"
  )
  
  #save model
  save(cult_model10_constrained_lag_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
lavTestLRT(cult_model10_constrained_lag_groups_fit, cult_model10_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq cult_model10_unconstrained_groups_constrained_lag_fit 1076 131663 132726 4114.2 cult_model10_constrained_lag_groups_fit 1301 143842 144821 6343.3 Chisq diff Df diff cult_model10_unconstrained_groups_constrained_lag_fit
cult_model10_constrained_lag_groups_fit 1653.8 225 Pr(>Chisq)
cult_model10_unconstrained_groups_constrained_lag_fit
cult_model10_constrained_lag_groups_fit < 2.2e-16 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

income differences

inc_diff_model10_unconstrained_groups_constrained_lag <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables.
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_3   ~ c(a1, a2, a3, a4)*winc_diff_2 + c(b1, b2, b3, b4)*wFeduc_a_2
  winc_diff_4   ~ c(a1, a2, a3, a4)*winc_diff_3 + c(b1, b2, b3, b4)*wFeduc_a_3
  winc_diff_5   ~ c(a1, a2, a3, a4)*winc_diff_4 + c(b1, b2, b3, b4)*wFeduc_a_4
  winc_diff_6   ~ c(a1, a2, a3, a4)*winc_diff_5 + c(b1, b2, b3, b4)*wFeduc_a_5
  winc_diff_7   ~ c(a1, a2, a3, a4)*winc_diff_6 + c(b1, b2, b3, b4)*wFeduc_a_6
  winc_diff_8   ~ c(a1, a2, a3, a4)*winc_diff_7 + c(b1, b2, b3, b4)*wFeduc_a_7
  winc_diff_9   ~ c(a1, a2, a3, a4)*winc_diff_8 + c(b1, b2, b3, b4)*wFeduc_a_8
  winc_diff_10  ~ c(a1, a2, a3, a4)*winc_diff_9 + c(b1, b2, b3, b4)*wFeduc_a_9
  winc_diff_11  ~ c(a1, a2, a3, a4)*winc_diff_10 + c(b1, b2, b3, b4)*wFeduc_a_10
  
  wFeduc_a_3  ~ c(c1, c2, c3, c4)*winc_diff_2 + c(d1, d2, d3, d4)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2, c3, c4)*winc_diff_3 + c(d1, d2, d3, d4)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2, c3, c4)*winc_diff_4 + c(d1, d2, d3, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2, c3, c4)*winc_diff_5 + c(d1, d2, d3, d4)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2, c3, c4)*winc_diff_6 + c(d1, d2, d3, d4)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2, c3, c4)*winc_diff_7 + c(d1, d2, d3, d4)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2, c3, c4)*winc_diff_8 + c(d1, d2, d3, d4)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2, c3, c4)*winc_diff_9 + c(d1, d2, d3, d4)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2, c3, c4)*winc_diff_10 + c(d1, d2, d3, d4)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_2 ~~ wFeduc_a_2 # Covariance

   # Estimate the covariances between the residuals
  winc_diff_3 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_3
  winc_diff_4 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_4
  winc_diff_5 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_5
  winc_diff_6 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_6
  winc_diff_7 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_7
  winc_diff_8 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_8
  winc_diff_9 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_9
  winc_diff_10 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_10
  winc_diff_11 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_2 ~~ winc_diff_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  winc_diff_3 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_3
  wFeduc_a_3 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_3
  winc_diff_4 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_4 
  wFeduc_a_4 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_4
  winc_diff_5 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_5
  wFeduc_a_5 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_5
  winc_diff_6 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_6 
  wFeduc_a_6 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_6
  winc_diff_7 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_7 
  wFeduc_a_7 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_7
  winc_diff_8 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_8 
  wFeduc_a_8 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_8
  winc_diff_9 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_9 
  wFeduc_a_9 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_9
  winc_diff_10 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_10 
  wFeduc_a_10 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_10
  winc_diff_11 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_11 
  wFeduc_a_11 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*winc_diff_2

'
#filename
filename <-
  file.path(dir,
            "inc_diff_model10_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
inc_diff_model10_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    inc_diff_model10_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "rl_rec"
  )
  
  #save model
  save(inc_diff_model10_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {
  load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "inc_diff_model10_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
inc_diff_model10_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[3]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "rl_rec"
  )
  
  #save model
  save(inc_diff_model10_constrained_lag_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
lavTestLRT(inc_diff_model10_constrained_lag_groups_fit, inc_diff_model10_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC inc_diff_model10_unconstrained_groups_constrained_lag_fit 1076 132279 133342 inc_diff_model10_constrained_lag_groups_fit 1301 144738 145717 Chisq Chisq diff inc_diff_model10_unconstrained_groups_constrained_lag_fit 4284.6
inc_diff_model10_constrained_lag_groups_fit 6442.0 1665.7 Df diff Pr(>Chisq) inc_diff_model10_unconstrained_groups_constrained_lag_fit
inc_diff_model10_constrained_lag_groups_fit 225 < 2.2e-16

inc_diff_model10_unconstrained_groups_constrained_lag_fit
inc_diff_model10_constrained_lag_groups_fit *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

Average similarity

MyData <- MyData %>%
  mutate(ave_rec = cut2(ave_mean, g = 4),
         ave_2 = cut2(ave_mean, g = 2))

EU integration

EU_model11_unconstrained_groups_constrained_lag <- 
'

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1*Feduc_a_1 + 1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*eu_1 + 1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  weu_1 =~ 1*eu_1
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_2   ~ c(a1, a2, a3, a4)*weu_1 + c(b1, b2, b3, b4)*wFeduc_a_1
  weu_3   ~ c(a1, a2, a3, a4)*weu_2 + c(b1, b2, b3, b4)*wFeduc_a_2
  weu_4   ~ c(a1, a2, a3, a4)*weu_3 + c(b1, b2, b3, b4)*wFeduc_a_3
  weu_5   ~ c(a1, a2, a3, a4)*weu_4 + c(b1, b2, b3, b4)*wFeduc_a_4
  weu_6   ~ c(a1, a2, a3, a4)*weu_5 + c(b1, b2, b3, b4)*wFeduc_a_5
  weu_7   ~ c(a1, a2, a3, a4)*weu_6 + c(b1, b2, b3, b4)*wFeduc_a_6
  weu_8   ~ c(a1, a2, a3, a4)*weu_7 + c(b1, b2, b3, b4)*wFeduc_a_7
  weu_9   ~ c(a1, a2, a3, a4)*weu_8 + c(b1, b2, b3, b4)*wFeduc_a_8
  weu_10  ~ c(a1, a2, a3, a4)*weu_9 + c(b1, b2, b3, b4)*wFeduc_a_9
  weu_11  ~ c(a1, a2, a3, a4)*weu_10 + c(b1, b2, b3, b4)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c2, c3, c4)*weu_1 + c(d1, d2, d3, d4)*wFeduc_a_1
  wFeduc_a_3  ~ c(c1, c2, c3, c4)*weu_2 + c(d1, d2, d3, d4)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2, c3, c4)*weu_3 + c(d1, d2, d3, d4)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2, c3, c4)*weu_4 + c(d1, d2, d3, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2, c3, c4)*weu_5 + c(d1, d2, d3, d4)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2, c3, c4)*weu_6 + c(d1, d2, d3, d4)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2, c3, c4)*weu_7 + c(d1, d2, d3, d4)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2, c3, c4)*weu_8 + c(d1, d2, d3, d4)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2, c3, c4)*weu_9 + c(d1, d2, d3, d4)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2, c3, c4)*weu_10 + c(d1, d2, d3, d4)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_1 ~~ wFeduc_a_1 # Covariance

   # Estimate the covariances between the residuals
  weu_2 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_2
  weu_3 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_3
  weu_4 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_4
  weu_5 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_5
  weu_6 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_6
  weu_7 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_7
  weu_8 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_8
  weu_9 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_9
  weu_10 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_10
  weu_11 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_11
  
  # Estimate the variance 
  weu_1 ~~ weu_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  weu_2 ~~ c(vy1, vy2, vy3, vy4)*weu_2 
  wFeduc_a_2 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_2
  weu_3 ~~ c(vy1, vy2, vy3, vy4)*weu_3
  wFeduc_a_3 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_3
  weu_4 ~~ c(vy1, vy2, vy3, vy4)*weu_4 
  wFeduc_a_4 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_4
  weu_5 ~~ c(vy1, vy2, vy3, vy4)*weu_5
  wFeduc_a_5 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_5
  weu_6 ~~ c(vy1, vy2, vy3, vy4)*weu_6 
  wFeduc_a_6 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_6
  weu_7 ~~ c(vy1, vy2, vy3, vy4)*weu_7 
  wFeduc_a_7 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_7
  weu_8 ~~ c(vy1, vy2, vy3, vy4)*weu_8 
  wFeduc_a_8 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_8
  weu_9 ~~ c(vy1, vy2, vy3, vy4)*weu_9 
  wFeduc_a_9 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_9
  weu_10 ~~ c(vy1, vy2, vy3, vy4)*weu_10 
  wFeduc_a_10 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_10
  weu_11 ~~ c(vy1, vy2, vy3, vy4)*weu_11 
  wFeduc_a_11 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*weu_1

'
#filename
filename <-
  file.path(dir,
            "EU_model11_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
EU_model11_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    EU_model11_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "ave_rec"
  )

  
  #save model
  save(EU_model11_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {
  load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "EU_model11_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
EU_model11_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[1]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "ave_rec"
  )
  
  #save model
  save(EU_model11_constrained_lag_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
lavTestLRT(EU_model11_constrained_lag_groups_fit, EU_model11_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq EU_model11_unconstrained_groups_constrained_lag_fit 1280 153493 154613 4107.4 EU_model11_constrained_lag_groups_fit 1301 154605 155589 5261.3 Chisq diff Df diff EU_model11_unconstrained_groups_constrained_lag_fit
EU_model11_constrained_lag_groups_fit 453.52 21 Pr(>Chisq)
EU_model11_unconstrained_groups_constrained_lag_fit
EU_model11_constrained_lag_groups_fit < 2.2e-16 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

cultural inclusion

cult_model11_unconstrained_groups_constrained_lag <- 
'

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*cult_1 + 1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  wcult_1 =~ 1*cult_1
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects (constrained)
  wcult_2   ~ c(a1, a2, a3, a4)*wcult_1 + c(b1, b2, b3, b4)*wFeduc_a_1
  wcult_3   ~ c(a1, a2, a3, a4)*wcult_2 + c(b1, b2, b3, b4)*wFeduc_a_2
  wcult_4   ~ c(a1, a2, a3, a4)*wcult_3 + c(b1, b2, b3, b4)*wFeduc_a_3
  wcult_5   ~ c(a1, a2, a3, a4)*wcult_4 + c(b1, b2, b3, b4)*wFeduc_a_4
  wcult_6   ~ c(a1, a2, a3, a4)*wcult_5 + c(b1, b2, b3, b4)*wFeduc_a_5
  wcult_7   ~ c(a1, a2, a3, a4)*wcult_6 + c(b1, b2, b3, b4)*wFeduc_a_6
  wcult_8   ~ c(a1, a2, a3, a4)*wcult_7 + c(b1, b2, b3, b4)*wFeduc_a_7
  wcult_9   ~ c(a1, a2, a3, a4)*wcult_8 + c(b1, b2, b3, b4)*wFeduc_a_8
  wcult_10  ~ c(a1, a2, a3, a4)*wcult_9 + c(b1, b2, b3, b4)*wFeduc_a_9
  wcult_11  ~ c(a1, a2, a3, a4)*wcult_10 + c(b1, b2, b3, b4)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c2, c3, c4)*wcult_1 + c(d1, d2, d3, d4)*wFeduc_a_1
  wFeduc_a_3  ~ c(c1, c2, c3, c4)*wcult_2 + c(d1, d2, d3, d4)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2, c3, c4)*wcult_3 + c(d1, d2, d3, d4)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2, c3, c4)*wcult_4 + c(d1, d2, d3, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2, c3, c4)*wcult_5 + c(d1, d2, d3, d4)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2, c3, c4)*wcult_6 + c(d1, d2, d3, d4)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2, c3, c4)*wcult_7 + c(d1, d2, d3, d4)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2, c3, c4)*wcult_8 + c(d1, d2, d3, d4)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2, c3, c4)*wcult_9 + c(d1, d2, d3, d4)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2, c3, c4)*wcult_10 + c(d1, d2, d3, d4)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_1 ~~ wFeduc_a_1 # Covariance

   # Estimate the covariances between the residuals
  wcult_2 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_2
  wcult_3 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_3
  wcult_4 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_4
  wcult_5 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_5
  wcult_6 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_6
  wcult_7 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_7
  wcult_8 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_8
  wcult_9 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_9
  wcult_10 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_10
  wcult_11 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_11
  
  # Estimate the variance 
  wcult_1 ~~ wcult_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  wcult_2 ~~ c(vy1, vy2, vy3, vy4)*wcult_2 
  wFeduc_a_2 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_2
  wcult_3 ~~ c(vy1, vy2, vy3, vy4)*wcult_3
  wFeduc_a_3 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_3
  wcult_4 ~~ c(vy1, vy2, vy3, vy4)*wcult_4 
  wFeduc_a_4 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_4
  wcult_5 ~~ c(vy1, vy2, vy3, vy4)*wcult_5
  wFeduc_a_5 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_5
  wcult_6 ~~ c(vy1, vy2, vy3, vy4)*wcult_6 
  wFeduc_a_6 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_6
  wcult_7 ~~ c(vy1, vy2, vy3, vy4)*wcult_7 
  wFeduc_a_7 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_7
  wcult_8 ~~ c(vy1, vy2, vy3, vy4)*wcult_8 
  wFeduc_a_8 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_8
  wcult_9 ~~ c(vy1, vy2, vy3, vy4)*wcult_9 
  wFeduc_a_9 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_9
  wcult_10 ~~ c(vy1, vy2, vy3, vy4)*wcult_10 
  wFeduc_a_10 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_10
  wcult_11 ~~ c(vy1, vy2, vy3, vy4)*wcult_11 
  wFeduc_a_11 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*wcult_1

'

#filename
filename <-
  file.path(dir,
            "cult_model11_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
cult_model11_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    cult_model11_unconstrained_groups_constrained_lag,
    estimator = 'MLR',
    data = MyData,
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "ave_rec"
  )
  #save model
  save(cult_model11_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else
  (load(file = filename)
  )

[1] “cult_model11_unconstrained_groups_constrained_lag_fit”

#filename
filename <-
  file.path(dir,
            "cult_model11_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
cult_model11_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[2]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "ave_rec"
  )
  #save model
  save(cult_model11_constrained_lag_groups_fit,
       file = filename)
} else {load(file = filename)
}
lavTestLRT(cult_model11_constrained_lag_groups_fit, cult_model11_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq cult_model11_unconstrained_groups_constrained_lag_fit 1280 147004 148124 3915.4 cult_model11_constrained_lag_groups_fit 1301 148108 149092 5061.9 Chisq diff Df diff cult_model11_unconstrained_groups_constrained_lag_fit
cult_model11_constrained_lag_groups_fit 477 21 Pr(>Chisq)
cult_model11_unconstrained_groups_constrained_lag_fit
cult_model11_constrained_lag_groups_fit < 2.2e-16 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

income differences

inc_diff_model11_unconstrained_groups_constrained_lag <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*inc_diff_1 + 1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  winc_diff_1 =~ 1*inc_diff_1
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_2   ~ c(a1, a2, a3, a4)*winc_diff_1 + c(b1, b2, b3, b4)*wFeduc_a_1
  winc_diff_3   ~ c(a1, a2, a3, a4)*winc_diff_2 + c(b1, b2, b3, b4)*wFeduc_a_2
  winc_diff_4   ~ c(a1, a2, a3, a4)*winc_diff_3 + c(b1, b2, b3, b4)*wFeduc_a_3
  winc_diff_5   ~ c(a1, a2, a3, a4)*winc_diff_4 + c(b1, b2, b3, b4)*wFeduc_a_4
  winc_diff_6   ~ c(a1, a2, a3, a4)*winc_diff_5 + c(b1, b2, b3, b4)*wFeduc_a_5
  winc_diff_7   ~ c(a1, a2, a3, a4)*winc_diff_6 + c(b1, b2, b3, b4)*wFeduc_a_6
  winc_diff_8   ~ c(a1, a2, a3, a4)*winc_diff_7 + c(b1, b2, b3, b4)*wFeduc_a_7
  winc_diff_9   ~ c(a1, a2, a3, a4)*winc_diff_8 + c(b1, b2, b3, b4)*wFeduc_a_8
  winc_diff_10  ~ c(a1, a2, a3, a4)*winc_diff_9 + c(b1, b2, b3, b4)*wFeduc_a_9
  winc_diff_11  ~ c(a1, a2, a3, a4)*winc_diff_10 + c(b1, b2, b3, b4)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c2, c3, c4)*winc_diff_1 + c(d1, d2, d3, d4)*wFeduc_a_1
  wFeduc_a_3  ~ c(c1, c2, c3, c4)*winc_diff_2 + c(d1, d2, d3, d4)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2, c3, c4)*winc_diff_3 + c(d1, d2, d3, d4)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2, c3, c4)*winc_diff_4 + c(d1, d2, d3, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2, c3, c4)*winc_diff_5 + c(d1, d2, d3, d4)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2, c3, c4)*winc_diff_6 + c(d1, d2, d3, d4)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2, c3, c4)*winc_diff_7 + c(d1, d2, d3, d4)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2, c3, c4)*winc_diff_8 + c(d1, d2, d3, d4)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2, c3, c4)*winc_diff_9 + c(d1, d2, d3, d4)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2, c3, c4)*winc_diff_10 + c(d1, d2, d3, d4)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_1 ~~ wFeduc_a_1 # Covariance

   # Estimate the covariances between the residuals
  winc_diff_2 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_2
  winc_diff_3 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_3
  winc_diff_4 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_4
  winc_diff_5 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_5
  winc_diff_6 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_6
  winc_diff_7 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_7
  winc_diff_8 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_8
  winc_diff_9 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_9
  winc_diff_10 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_10
  winc_diff_11 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_1 ~~ winc_diff_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  winc_diff_2 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_2 
  wFeduc_a_2 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_2
  winc_diff_3 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_3
  wFeduc_a_3 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_3
  winc_diff_4 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_4 
  wFeduc_a_4 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_4
  winc_diff_5 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_5
  wFeduc_a_5 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_5
  winc_diff_6 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_6 
  wFeduc_a_6 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_6
  winc_diff_7 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_7 
  wFeduc_a_7 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_7
  winc_diff_8 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_8 
  wFeduc_a_8 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_8
  winc_diff_9 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_9 
  wFeduc_a_9 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_9
  winc_diff_10 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_10 
  wFeduc_a_10 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_10
  winc_diff_11 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_11 
  wFeduc_a_11 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*winc_diff_1

'
#filename
filename <-
  file.path(dir,
            "inc_diff_model11_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
inc_diff_model11_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    inc_diff_model11_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "ave_rec"
  )
  #save model
  save(inc_diff_model11_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "inc_diff_model11_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
inc_diff_model11_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[3]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "ave_rec"
  )
  #save model
  save(inc_diff_model11_constrained_lag_groups_fit,
       file = filename)
} else {load(file = filename)
}
lavTestLRT(inc_diff_model11_constrained_lag_groups_fit, inc_diff_model11_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC inc_diff_model11_unconstrained_groups_constrained_lag_fit 1280 147852 148973 inc_diff_model11_constrained_lag_groups_fit 1301 148958 149942 Chisq Chisq diff inc_diff_model11_unconstrained_groups_constrained_lag_fit 3975.9
inc_diff_model11_constrained_lag_groups_fit 5123.6 476.48 Df diff Pr(>Chisq) inc_diff_model11_unconstrained_groups_constrained_lag_fit
inc_diff_model11_constrained_lag_groups_fit 21 < 2.2e-16

inc_diff_model11_unconstrained_groups_constrained_lag_fit
inc_diff_model11_constrained_lag_groups_fit *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

Between level with -1sd, mean, and +1sd groups

Create groups

# Create z score variables
MyData <- MyData %>% 
  mutate(
    sd_pol = sd(pol_dis, na.rm = T),
    z_pol = as.numeric((pol_dis - mean(pol_dis, na.rm = T))/sd_pol),
    sd_rl = sd(rl_mean, na.rm = T),
    z_rl = (rl_mean - mean(rl_mean, na.rm = T))/sd_rl,
    sd_ave = sd(ave_mean, na.rm = T),
    z_ave = (ave_mean - mean(ave_mean, na.rm = T))/sd_ave
    )

#create three groups variables 
MyData <- MyData %>% 
  mutate(across(.cols = c(z_pol,
                          z_rl,
                          z_ave),
                .fns = ~ case_when(
                  .x < -1 ~ 1,
                  .x > -1 & .x < 1 ~ 2, 
                  .x > 1 ~ 3),
                .names = "cat_{.col}"))

Political Discussion

EU integration

EU_model12_unconstrained_groups_constrained_lag <- 
'
  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*eu_1 + 1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  weu_1 =~ 1*eu_1
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_2   ~ c(a1, a2, a3)*weu_1 + c(b1, b2, b3)*wFeduc_a_1
  weu_3   ~ c(a1, a2, a3)*weu_2 + c(b1, b2, b3)*wFeduc_a_2
  weu_4   ~ c(a1, a2, a3)*weu_3 + c(b1, b2, b3)*wFeduc_a_3
  weu_5   ~ c(a1, a2, a3)*weu_4 + c(b1, b2, b3)*wFeduc_a_4
  weu_6   ~ c(a1, a2, a3)*weu_5 + c(b1, b2, b3)*wFeduc_a_5
  weu_7   ~ c(a1, a2, a3)*weu_6 + c(b1, b2, b3)*wFeduc_a_6
  weu_8   ~ c(a1, a2, a3)*weu_7 + c(b1, b2, b3)*wFeduc_a_7
  weu_9   ~ c(a1, a2, a3)*weu_8 + c(b1, b2, b3)*wFeduc_a_8
  weu_10  ~ c(a1, a2, a3)*weu_9 + c(b1, b2, b3)*wFeduc_a_9
  weu_11  ~ c(a1, a2, a3)*weu_10 + c(b1, b2, b3)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c2, c3)*weu_1 + c(d1, d2, d3)*wFeduc_a_1
  wFeduc_a_3  ~ c(c1, c2, c3)*weu_2 + c(d1, d2, d3)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2, c3)*weu_3 + c(d1, d2, d3)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2, c3)*weu_4 + c(d1, d2, d3)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2, c3)*weu_5 + c(d1, d2, d3)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2, c3)*weu_6 + c(d1, d2, d3)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2, c3)*weu_7 + c(d1, d2, d3)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2, c3)*weu_8 + c(d1, d2, d3)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2, c3)*weu_9 + c(d1, d2, d3)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2, c3)*weu_10 + c(d1, d2, d3)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_1 ~~ wFeduc_a_1 # Covariance

   # Estimate the covariances between the residuals
  weu_2 ~~ c(cov1, cov2, cov3)*wFeduc_a_2
  weu_3 ~~ c(cov1, cov2, cov3)*wFeduc_a_3
  weu_4 ~~ c(cov1, cov2, cov3)*wFeduc_a_4
  weu_5 ~~ c(cov1, cov2, cov3)*wFeduc_a_5
  weu_6 ~~ c(cov1, cov2, cov3)*wFeduc_a_6
  weu_7 ~~ c(cov1, cov2, cov3)*wFeduc_a_7
  weu_8 ~~ c(cov1, cov2, cov3)*wFeduc_a_8
  weu_9 ~~ c(cov1, cov2, cov3)*wFeduc_a_9
  weu_10 ~~ c(cov1, cov2, cov3)*wFeduc_a_10
  weu_11 ~~ c(cov1, cov2, cov3)*wFeduc_a_11
  
  # Estimate the variance 
  weu_1 ~~ weu_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  weu_2 ~~ c(vy1, vy2, vy3)*weu_2 
  wFeduc_a_2 ~~ c(vx1, vx2, vx3)*wFeduc_a_2
  weu_3 ~~ c(vy1, vy2, vy3)*weu_3
  wFeduc_a_3 ~~ c(vx1, vx2, vx3)*wFeduc_a_3
  weu_4 ~~ c(vy1, vy2, vy3)*weu_4 
  wFeduc_a_4 ~~ c(vx1, vx2, vx3)*wFeduc_a_4
  weu_5 ~~ c(vy1, vy2, vy3)*weu_5
  wFeduc_a_5 ~~ c(vx1, vx2, vx3)*wFeduc_a_5
  weu_6 ~~ c(vy1, vy2, vy3)*weu_6 
  wFeduc_a_6 ~~ c(vx1, vx2, vx3)*wFeduc_a_6
  weu_7 ~~ c(vy1, vy2, vy3)*weu_7 
  wFeduc_a_7 ~~ c(vx1, vx2, vx3)*wFeduc_a_7
  weu_8 ~~ c(vy1, vy2, vy3)*weu_8 
  wFeduc_a_8 ~~ c(vx1, vx2, vx3)*wFeduc_a_8
  weu_9 ~~ c(vy1, vy2, vy3)*weu_9 
  wFeduc_a_9 ~~ c(vx1, vx2, vx3)*wFeduc_a_9
  weu_10 ~~ c(vy1, vy2, vy3)*weu_10 
  wFeduc_a_10 ~~ c(vx1, vx2, vx3)*wFeduc_a_10
  weu_11 ~~ c(vy1, vy2, vy3)*weu_11 
  wFeduc_a_11 ~~ c(vx1, vx2, vx3)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*weu_1

'
#filename
filename <-
  file.path(dir,
            "EU_model12_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
EU_model12_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    EU_model12_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "cat_z_pol"
  )
  #save model
  save(EU_model12_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "EU_model12_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
EU_model12_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[1]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "cat_z_pol"
  )
  #save model
  save(EU_model12_constrained_lag_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
lavTestLRT(EU_model12_constrained_lag_groups_fit, EU_model12_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq EU_model12_unconstrained_groups_constrained_lag_fit 960 153471 154312 3444.5 EU_model12_constrained_lag_groups_fit 974 154141 154890 4142.1 Chisq diff Df diff EU_model12_unconstrained_groups_constrained_lag_fit
EU_model12_constrained_lag_groups_fit 389.5 14 Pr(>Chisq)
EU_model12_unconstrained_groups_constrained_lag_fit
EU_model12_constrained_lag_groups_fit < 2.2e-16 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

Cultural inclusion

cult_model12_unconstrained_groups_constrained_lag <- 
'
  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*cult_1 + 1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  wcult_1 =~ 1*cult_1
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects (constrained)
  wcult_2   ~ c(a1, a2, a3)*wcult_1 + c(b1, b2, b3)*wFeduc_a_1
  wcult_3   ~ c(a1, a2, a3)*wcult_2 + c(b1, b2, b3)*wFeduc_a_2
  wcult_4   ~ c(a1, a2, a3)*wcult_3 + c(b1, b2, b3)*wFeduc_a_3
  wcult_5   ~ c(a1, a2, a3)*wcult_4 + c(b1, b2, b3)*wFeduc_a_4
  wcult_6   ~ c(a1, a2, a3)*wcult_5 + c(b1, b2, b3)*wFeduc_a_5
  wcult_7   ~ c(a1, a2, a3)*wcult_6 + c(b1, b2, b3)*wFeduc_a_6
  wcult_8   ~ c(a1, a2, a3)*wcult_7 + c(b1, b2, b3)*wFeduc_a_7
  wcult_9   ~ c(a1, a2, a3)*wcult_8 + c(b1, b2, b3)*wFeduc_a_8
  wcult_10  ~ c(a1, a2, a3)*wcult_9 + c(b1, b2, b3)*wFeduc_a_9
  wcult_11  ~ c(a1, a2, a3)*wcult_10 + c(b1, b2, b3)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c2, c3)*wcult_1 + c(d1, d2, d3)*wFeduc_a_1
  wFeduc_a_3  ~ c(c1, c2, c3)*wcult_2 + c(d1, d2, d3)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2, c3)*wcult_3 + c(d1, d2, d3)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2, c3)*wcult_4 + c(d1, d2, d3)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2, c3)*wcult_5 + c(d1, d2, d3)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2, c3)*wcult_6 + c(d1, d2, d3)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2, c3)*wcult_7 + c(d1, d2, d3)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2, c3)*wcult_8 + c(d1, d2, d3)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2, c3)*wcult_9 + c(d1, d2, d3)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2, c3)*wcult_10 + c(d1, d2, d3)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_1 ~~ wFeduc_a_1 # Covariance

   # Estimate the covariances between the residuals
  wcult_2 ~~ c(cov1, cov2, cov3)*wFeduc_a_2
  wcult_3 ~~ c(cov1, cov2, cov3)*wFeduc_a_3
  wcult_4 ~~ c(cov1, cov2, cov3)*wFeduc_a_4
  wcult_5 ~~ c(cov1, cov2, cov3)*wFeduc_a_5
  wcult_6 ~~ c(cov1, cov2, cov3)*wFeduc_a_6
  wcult_7 ~~ c(cov1, cov2, cov3)*wFeduc_a_7
  wcult_8 ~~ c(cov1, cov2, cov3)*wFeduc_a_8
  wcult_9 ~~ c(cov1, cov2, cov3)*wFeduc_a_9
  wcult_10 ~~ c(cov1, cov2, cov3)*wFeduc_a_10
  wcult_11 ~~ c(cov1, cov2, cov3)*wFeduc_a_11
  
  # Estimate the variance 
  wcult_1 ~~ wcult_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  wcult_2 ~~ c(vy1, vy2, vy3)*wcult_2 
  wFeduc_a_2 ~~ c(vx1, vx2, vx3)*wFeduc_a_2
  wcult_3 ~~ c(vy1, vy2, vy3)*wcult_3
  wFeduc_a_3 ~~ c(vx1, vx2, vx3)*wFeduc_a_3
  wcult_4 ~~ c(vy1, vy2, vy3)*wcult_4 
  wFeduc_a_4 ~~ c(vx1, vx2, vx3)*wFeduc_a_4
  wcult_5 ~~ c(vy1, vy2, vy3)*wcult_5
  wFeduc_a_5 ~~ c(vx1, vx2, vx3)*wFeduc_a_5
  wcult_6 ~~ c(vy1, vy2, vy3)*wcult_6 
  wFeduc_a_6 ~~ c(vx1, vx2, vx3)*wFeduc_a_6
  wcult_7 ~~ c(vy1, vy2, vy3)*wcult_7 
  wFeduc_a_7 ~~ c(vx1, vx2, vx3)*wFeduc_a_7
  wcult_8 ~~ c(vy1, vy2, vy3)*wcult_8 
  wFeduc_a_8 ~~ c(vx1, vx2, vx3)*wFeduc_a_8
  wcult_9 ~~ c(vy1, vy2, vy3)*wcult_9 
  wFeduc_a_9 ~~ c(vx1, vx2, vx3)*wFeduc_a_9
  wcult_10 ~~ c(vy1, vy2, vy3)*wcult_10 
  wFeduc_a_10 ~~ c(vx1, vx2, vx3)*wFeduc_a_10
  wcult_11 ~~ c(vy1, vy2, vy3)*wcult_11 
  wFeduc_a_11 ~~ c(vx1, vx2, vx3)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*wcult_1

'
#filename
filename <-
  file.path(dir,
            "cult_model12_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
cult_model12_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    cult_model12_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "cat_z_pol"
  )
  #save model
  save(cult_model12_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "cult_model12_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
cult_model12_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[2]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "cat_z_pol"
  )
  #save model
  save(cult_model12_constrained_lag_groups_fit,
       file = filename)
} else {load(file = filename)
}
lavTestLRT(cult_model12_constrained_lag_groups_fit, cult_model12_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq cult_model12_unconstrained_groups_constrained_lag_fit 960 146978 147818 3166.3 cult_model12_constrained_lag_groups_fit 974 147680 148429 3897.1 Chisq diff Df diff cult_model12_unconstrained_groups_constrained_lag_fit
cult_model12_constrained_lag_groups_fit 425.72 14 Pr(>Chisq)
cult_model12_unconstrained_groups_constrained_lag_fit
cult_model12_constrained_lag_groups_fit < 2.2e-16 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

Income equality

inc_diff_model12_unconstrained_groups_constrained_lag <- 
'

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*inc_diff_1 + 1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  winc_diff_1 =~ 1*inc_diff_1
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_2   ~ c(a1, a2, a3)*winc_diff_1 + c(b1, b2, b3)*wFeduc_a_1
  winc_diff_3   ~ c(a1, a2, a3)*winc_diff_2 + c(b1, b2, b3)*wFeduc_a_2
  winc_diff_4   ~ c(a1, a2, a3)*winc_diff_3 + c(b1, b2, b3)*wFeduc_a_3
  winc_diff_5   ~ c(a1, a2, a3)*winc_diff_4 + c(b1, b2, b3)*wFeduc_a_4
  winc_diff_6   ~ c(a1, a2, a3)*winc_diff_5 + c(b1, b2, b3)*wFeduc_a_5
  winc_diff_7   ~ c(a1, a2, a3)*winc_diff_6 + c(b1, b2, b3)*wFeduc_a_6
  winc_diff_8   ~ c(a1, a2, a3)*winc_diff_7 + c(b1, b2, b3)*wFeduc_a_7
  winc_diff_9   ~ c(a1, a2, a3)*winc_diff_8 + c(b1, b2, b3)*wFeduc_a_8
  winc_diff_10  ~ c(a1, a2, a3)*winc_diff_9 + c(b1, b2, b3)*wFeduc_a_9
  winc_diff_11  ~ c(a1, a2, a3)*winc_diff_10 + c(b1, b2, b3)*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c(c1, c2, c3)*winc_diff_1 + c(d1, d2, d3)*wFeduc_a_1
  wFeduc_a_3  ~ c(c1, c2, c3)*winc_diff_2 + c(d1, d2, d3)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2, c3)*winc_diff_3 + c(d1, d2, d3)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2, c3)*winc_diff_4 + c(d1, d2, d3)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2, c3)*winc_diff_5 + c(d1, d2, d3)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2, c3)*winc_diff_6 + c(d1, d2, d3)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2, c3)*winc_diff_7 + c(d1, d2, d3)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2, c3)*winc_diff_8 + c(d1, d2, d3)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2, c3)*winc_diff_9 + c(d1, d2, d3)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2, c3)*winc_diff_10 + c(d1, d2, d3)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_1 ~~ wFeduc_a_1 # Covariance

   # Estimate the covariances between the residuals
  winc_diff_2 ~~ c(cov1, cov2, cov3)*wFeduc_a_2
  winc_diff_3 ~~ c(cov1, cov2, cov3)*wFeduc_a_3
  winc_diff_4 ~~ c(cov1, cov2, cov3)*wFeduc_a_4
  winc_diff_5 ~~ c(cov1, cov2, cov3)*wFeduc_a_5
  winc_diff_6 ~~ c(cov1, cov2, cov3)*wFeduc_a_6
  winc_diff_7 ~~ c(cov1, cov2, cov3)*wFeduc_a_7
  winc_diff_8 ~~ c(cov1, cov2, cov3)*wFeduc_a_8
  winc_diff_9 ~~ c(cov1, cov2, cov3)*wFeduc_a_9
  winc_diff_10 ~~ c(cov1, cov2, cov3)*wFeduc_a_10
  winc_diff_11 ~~ c(cov1, cov2, cov3)*wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_1 ~~ winc_diff_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  winc_diff_2 ~~ c(vy1, vy2, vy3)*winc_diff_2 
  wFeduc_a_2 ~~ c(vx1, vx2, vx3)*wFeduc_a_2
  winc_diff_3 ~~ c(vy1, vy2, vy3)*winc_diff_3
  wFeduc_a_3 ~~ c(vx1, vx2, vx3)*wFeduc_a_3
  winc_diff_4 ~~ c(vy1, vy2, vy3)*winc_diff_4 
  wFeduc_a_4 ~~ c(vx1, vx2, vx3)*wFeduc_a_4
  winc_diff_5 ~~ c(vy1, vy2, vy3)*winc_diff_5
  wFeduc_a_5 ~~ c(vx1, vx2, vx3)*wFeduc_a_5
  winc_diff_6 ~~ c(vy1, vy2, vy3)*winc_diff_6 
  wFeduc_a_6 ~~ c(vx1, vx2, vx3)*wFeduc_a_6
  winc_diff_7 ~~ c(vy1, vy2, vy3)*winc_diff_7 
  wFeduc_a_7 ~~ c(vx1, vx2, vx3)*wFeduc_a_7
  winc_diff_8 ~~ c(vy1, vy2, vy3)*winc_diff_8 
  wFeduc_a_8 ~~ c(vx1, vx2, vx3)*wFeduc_a_8
  winc_diff_9 ~~ c(vy1, vy2, vy3)*winc_diff_9 
  wFeduc_a_9 ~~ c(vx1, vx2, vx3)*wFeduc_a_9
  winc_diff_10 ~~ c(vy1, vy2, vy3)*winc_diff_10 
  wFeduc_a_10 ~~ c(vx1, vx2, vx3)*wFeduc_a_10
  winc_diff_11 ~~ c(vy1, vy2, vy3)*winc_diff_11 
  wFeduc_a_11 ~~ c(vx1, vx2, vx3)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*winc_diff_1

'
#filename
filename <-
  file.path(dir,
            "inc_diff_model12_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
inc_diff_model12_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    inc_diff_model12_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "cat_z_pol"
  )

  #save model
  save(inc_diff_model12_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "inc_diff_model12_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
inc_diff_model12_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[3]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "cat_z_pol"
  )

  #save model
  save(inc_diff_model12_constrained_lag_groups_fit,
       file = filename)
} else {load(file = filename)
}
lavTestLRT(inc_diff_model12_constrained_lag_groups_fit, inc_diff_model12_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC inc_diff_model12_unconstrained_groups_constrained_lag_fit 960 147766 148606 inc_diff_model12_constrained_lag_groups_fit 974 148483 149232 Chisq Chisq diff inc_diff_model12_unconstrained_groups_constrained_lag_fit 3257.3
inc_diff_model12_constrained_lag_groups_fit 4002.4 414.88 Df diff Pr(>Chisq) inc_diff_model12_unconstrained_groups_constrained_lag_fit
inc_diff_model12_constrained_lag_groups_fit 14 < 2.2e-16

inc_diff_model12_unconstrained_groups_constrained_lag_fit
inc_diff_model12_constrained_lag_groups_fit *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

Newness

EU integration

EU_model13_unconstrained_groups_constrained_lag <- 
'

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~ 1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables.
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_3   ~ c(a1, a2, a3)*weu_2 + c(b1, b2, b3)*wFeduc_a_2
  weu_4   ~ c(a1, a2, a3)*weu_3 + c(b1, b2, b3)*wFeduc_a_3
  weu_5   ~ c(a1, a2, a3)*weu_4 + c(b1, b2, b3)*wFeduc_a_4
  weu_6   ~ c(a1, a2, a3)*weu_5 + c(b1, b2, b3)*wFeduc_a_5
  weu_7   ~ c(a1, a2, a3)*weu_6 + c(b1, b2, b3)*wFeduc_a_6
  weu_8   ~ c(a1, a2, a3)*weu_7 + c(b1, b2, b3)*wFeduc_a_7
  weu_9   ~ c(a1, a2, a3)*weu_8 + c(b1, b2, b3)*wFeduc_a_8
  weu_10  ~ c(a1, a2, a3)*weu_9 + c(b1, b2, b3)*wFeduc_a_9
  weu_11  ~ c(a1, a2, a3)*weu_10 + c(b1, b2, b3)*wFeduc_a_10
  
  wFeduc_a_3  ~ c(c1, c2, c3)*weu_2 + c(d1, d2, d3)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2, c3)*weu_3 + c(d1, d2, d3)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2, c3)*weu_4 + c(d1, d2, d3)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2, c3)*weu_5 + c(d1, d2, d3)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2, c3)*weu_6 + c(d1, d2, d3)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2, c3)*weu_7 + c(d1, d2, d3)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2, c3)*weu_8 + c(d1, d2, d3)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2, c3)*weu_9 + c(d1, d2, d3)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2, c3)*weu_10 + c(d1, d2, d3)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_2 ~~ wFeduc_a_2 # Covariance

   # Estimate the covariances between the residuals
  weu_3 ~~ c(cov1, cov2, cov3)*wFeduc_a_3
  weu_4 ~~ c(cov1, cov2, cov3)*wFeduc_a_4
  weu_5 ~~ c(cov1, cov2, cov3)*wFeduc_a_5
  weu_6 ~~ c(cov1, cov2, cov3)*wFeduc_a_6
  weu_7 ~~ c(cov1, cov2, cov3)*wFeduc_a_7
  weu_8 ~~ c(cov1, cov2, cov3)*wFeduc_a_8
  weu_9 ~~ c(cov1, cov2, cov3)*wFeduc_a_9
  weu_10 ~~ c(cov1, cov2, cov3)*wFeduc_a_10
  weu_11 ~~ c(cov1, cov2, cov3)*wFeduc_a_11
  
  # Estimate the variance 
  weu_2 ~~ weu_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  weu_3 ~~ c(vy1, vy2, vy3)*weu_3
  wFeduc_a_3 ~~ c(vx1, vx2, vx3)*wFeduc_a_3
  weu_4 ~~ c(vy1, vy2, vy3)*weu_4 
  wFeduc_a_4 ~~ c(vx1, vx2, vx3)*wFeduc_a_4
  weu_5 ~~ c(vy1, vy2, vy3)*weu_5
  wFeduc_a_5 ~~ c(vx1, vx2, vx3)*wFeduc_a_5
  weu_6 ~~ c(vy1, vy2, vy3)*weu_6 
  wFeduc_a_6 ~~ c(vx1, vx2, vx3)*wFeduc_a_6
  weu_7 ~~ c(vy1, vy2, vy3)*weu_7 
  wFeduc_a_7 ~~ c(vx1, vx2, vx3)*wFeduc_a_7
  weu_8 ~~ c(vy1, vy2, vy3)*weu_8 
  wFeduc_a_8 ~~ c(vx1, vx2, vx3)*wFeduc_a_8
  weu_9 ~~ c(vy1, vy2, vy3)*weu_9 
  wFeduc_a_9 ~~ c(vx1, vx2, vx3)*wFeduc_a_9
  weu_10 ~~ c(vy1, vy2, vy3)*weu_10 
  wFeduc_a_10 ~~ c(vx1, vx2, vx3)*wFeduc_a_10
  weu_11 ~~ c(vy1, vy2, vy3)*weu_11 
  wFeduc_a_11 ~~ c(vx1, vx2, vx3)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*weu_2

'

#filename
filename <-
  file.path(dir,
            "EU_model13_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
EU_model13_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    EU_model13_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "cat_z_rl"
  )
  #save model
  save(EU_model13_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "EU_model13_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
EU_model13_constrained_lag_groups_fit <-
  lavaan(
    EU_model7_constrained_lag_groups,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "cat_z_rl"
  )
  #save model
  save(EU_model13_constrained_lag_groups_fit,
       file = filename)
} else {load(file = filename)
}
lavTestLRT(EU_model13_constrained_lag_groups_fit, EU_model13_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq EU_model13_unconstrained_groups_constrained_lag_fit 807 138966 139764 3232.6 EU_model13_constrained_lag_groups_fit 821 139470 140176 3763.9 Chisq diff Df diff EU_model13_unconstrained_groups_constrained_lag_fit
EU_model13_constrained_lag_groups_fit 271.4 14 Pr(>Chisq)
EU_model13_unconstrained_groups_constrained_lag_fit
EU_model13_constrained_lag_groups_fit < 2.2e-16 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

Cultural inclusion

cult_model13_unconstrained_groups_constrained_lag <- 
'
  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~ 1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables.
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects (constrained)
  wcult_3   ~ c(a1, a2, a3)*wcult_2 + c(b1, b2, b3)*wFeduc_a_2
  wcult_4   ~ c(a1, a2, a3)*wcult_3 + c(b1, b2, b3)*wFeduc_a_3
  wcult_5   ~ c(a1, a2, a3)*wcult_4 + c(b1, b2, b3)*wFeduc_a_4
  wcult_6   ~ c(a1, a2, a3)*wcult_5 + c(b1, b2, b3)*wFeduc_a_5
  wcult_7   ~ c(a1, a2, a3)*wcult_6 + c(b1, b2, b3)*wFeduc_a_6
  wcult_8   ~ c(a1, a2, a3)*wcult_7 + c(b1, b2, b3)*wFeduc_a_7
  wcult_9   ~ c(a1, a2, a3)*wcult_8 + c(b1, b2, b3)*wFeduc_a_8
  wcult_10  ~ c(a1, a2, a3)*wcult_9 + c(b1, b2, b3)*wFeduc_a_9
  wcult_11  ~ c(a1, a2, a3)*wcult_10 + c(b1, b2, b3)*wFeduc_a_10
  
  wFeduc_a_3  ~ c(c1, c2, c3)*wcult_2 + c(d1, d2, d3)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2, c3)*wcult_3 + c(d1, d2, d3)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2, c3)*wcult_4 + c(d1, d2, d3)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2, c3)*wcult_5 + c(d1, d2, d3)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2, c3)*wcult_6 + c(d1, d2, d3)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2, c3)*wcult_7 + c(d1, d2, d3)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2, c3)*wcult_8 + c(d1, d2, d3)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2, c3)*wcult_9 + c(d1, d2, d3)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2, c3)*wcult_10 + c(d1, d2, d3)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_2 ~~ wFeduc_a_2 # Covariance

   # Estimate the covariances between the residuals
  wcult_3 ~~ c(cov1, cov2, cov3)*wFeduc_a_3
  wcult_4 ~~ c(cov1, cov2, cov3)*wFeduc_a_4
  wcult_5 ~~ c(cov1, cov2, cov3)*wFeduc_a_5
  wcult_6 ~~ c(cov1, cov2, cov3)*wFeduc_a_6
  wcult_7 ~~ c(cov1, cov2, cov3)*wFeduc_a_7
  wcult_8 ~~ c(cov1, cov2, cov3)*wFeduc_a_8
  wcult_9 ~~ c(cov1, cov2, cov3)*wFeduc_a_9
  wcult_10 ~~ c(cov1, cov2, cov3)*wFeduc_a_10
  wcult_11 ~~ c(cov1, cov2, cov3)*wFeduc_a_11
  
  # Estimate the variance 
  wcult_2 ~~ wcult_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  wcult_3 ~~ c(vy1, vy2, vy3)*wcult_3
  wFeduc_a_3 ~~ c(vx1, vx2, vx3)*wFeduc_a_3
  wcult_4 ~~ c(vy1, vy2, vy3)*wcult_4 
  wFeduc_a_4 ~~ c(vx1, vx2, vx3)*wFeduc_a_4
  wcult_5 ~~ c(vy1, vy2, vy3)*wcult_5
  wFeduc_a_5 ~~ c(vx1, vx2, vx3)*wFeduc_a_5
  wcult_6 ~~ c(vy1, vy2, vy3)*wcult_6 
  wFeduc_a_6 ~~ c(vx1, vx2, vx3)*wFeduc_a_6
  wcult_7 ~~ c(vy1, vy2, vy3)*wcult_7 
  wFeduc_a_7 ~~ c(vx1, vx2, vx3)*wFeduc_a_7
  wcult_8 ~~ c(vy1, vy2, vy3)*wcult_8 
  wFeduc_a_8 ~~ c(vx1, vx2, vx3)*wFeduc_a_8
  wcult_9 ~~ c(vy1, vy2, vy3)*wcult_9 
  wFeduc_a_9 ~~ c(vx1, vx2, vx3)*wFeduc_a_9
  wcult_10 ~~ c(vy1, vy2, vy3)*wcult_10 
  wFeduc_a_10 ~~ c(vx1, vx2, vx3)*wFeduc_a_10
  wcult_11 ~~ c(vy1, vy2, vy3)*wcult_11 
  wFeduc_a_11 ~~ c(vx1, vx2, vx3)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*wcult_2

'
#filename
filename <-
  file.path(dir,
            "cult_model13_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
cult_model13_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    cult_model13_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "cat_z_rl"
  )

  #save model
  save(cult_model13_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "cult_model13_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
cult_model13_constrained_lag_groups_fit <-
  lavaan(
    cult_model7_constrained_lag_groups,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "cat_z_rl"
  )

  #save model
  save(cult_model13_constrained_lag_groups_fit,
       file = filename)
} else {load(file = filename)
}
lavTestLRT(cult_model13_constrained_lag_groups_fit, cult_model13_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq cult_model13_unconstrained_groups_constrained_lag_fit 807 132925 133723 2926.1 cult_model13_constrained_lag_groups_fit 821 133496 134202 3524.4 Chisq diff Df diff cult_model13_unconstrained_groups_constrained_lag_fit
cult_model13_constrained_lag_groups_fit 339.39 14 Pr(>Chisq)
cult_model13_unconstrained_groups_constrained_lag_fit
cult_model13_constrained_lag_groups_fit < 2.2e-16 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

Income equality

inc_diff_model13_unconstrained_groups_constrained_lag <- 
'

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~ 1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables.
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_3   ~ c(a1, a2, a3)*winc_diff_2 + c(b1, b2, b3)*wFeduc_a_2
  winc_diff_4   ~ c(a1, a2, a3)*winc_diff_3 + c(b1, b2, b3)*wFeduc_a_3
  winc_diff_5   ~ c(a1, a2, a3)*winc_diff_4 + c(b1, b2, b3)*wFeduc_a_4
  winc_diff_6   ~ c(a1, a2, a3)*winc_diff_5 + c(b1, b2, b3)*wFeduc_a_5
  winc_diff_7   ~ c(a1, a2, a3)*winc_diff_6 + c(b1, b2, b3)*wFeduc_a_6
  winc_diff_8   ~ c(a1, a2, a3)*winc_diff_7 + c(b1, b2, b3)*wFeduc_a_7
  winc_diff_9   ~ c(a1, a2, a3)*winc_diff_8 + c(b1, b2, b3)*wFeduc_a_8
  winc_diff_10  ~ c(a1, a2, a3)*winc_diff_9 + c(b1, b2, b3)*wFeduc_a_9
  winc_diff_11  ~ c(a1, a2, a3)*winc_diff_10 + c(b1, b2, b3)*wFeduc_a_10
  
  wFeduc_a_3  ~ c(c1, c2, c3)*winc_diff_2 + c(d1, d2, d3)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2, c3)*winc_diff_3 + c(d1, d2, d3)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2, c3)*winc_diff_4 + c(d1, d2, d3)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2, c3)*winc_diff_5 + c(d1, d2, d3)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2, c3)*winc_diff_6 + c(d1, d2, d3)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2, c3)*winc_diff_7 + c(d1, d2, d3)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2, c3)*winc_diff_8 + c(d1, d2, d3)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2, c3)*winc_diff_9 + c(d1, d2, d3)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2, c3)*winc_diff_10 + c(d1, d2, d3)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_2 ~~ wFeduc_a_2 # Covariance

   # Estimate the covariances between the residuals
  winc_diff_3 ~~ c(cov1, cov2, cov3)*wFeduc_a_3
  winc_diff_4 ~~ c(cov1, cov2, cov3)*wFeduc_a_4
  winc_diff_5 ~~ c(cov1, cov2, cov3)*wFeduc_a_5
  winc_diff_6 ~~ c(cov1, cov2, cov3)*wFeduc_a_6
  winc_diff_7 ~~ c(cov1, cov2, cov3)*wFeduc_a_7
  winc_diff_8 ~~ c(cov1, cov2, cov3)*wFeduc_a_8
  winc_diff_9 ~~ c(cov1, cov2, cov3)*wFeduc_a_9
  winc_diff_10 ~~ c(cov1, cov2, cov3)*wFeduc_a_10
  winc_diff_11 ~~ c(cov1, cov2, cov3)*wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_2 ~~ winc_diff_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  winc_diff_3 ~~ c(vy1, vy2, vy3)*winc_diff_3
  wFeduc_a_3 ~~ c(vx1, vx2, vx3)*wFeduc_a_3
  winc_diff_4 ~~ c(vy1, vy2, vy3)*winc_diff_4 
  wFeduc_a_4 ~~ c(vx1, vx2, vx3)*wFeduc_a_4
  winc_diff_5 ~~ c(vy1, vy2, vy3)*winc_diff_5
  wFeduc_a_5 ~~ c(vx1, vx2, vx3)*wFeduc_a_5
  winc_diff_6 ~~ c(vy1, vy2, vy3)*winc_diff_6 
  wFeduc_a_6 ~~ c(vx1, vx2, vx3)*wFeduc_a_6
  winc_diff_7 ~~ c(vy1, vy2, vy3)*winc_diff_7 
  wFeduc_a_7 ~~ c(vx1, vx2, vx3)*wFeduc_a_7
  winc_diff_8 ~~ c(vy1, vy2, vy3)*winc_diff_8 
  wFeduc_a_8 ~~ c(vx1, vx2, vx3)*wFeduc_a_8
  winc_diff_9 ~~ c(vy1, vy2, vy3)*winc_diff_9 
  wFeduc_a_9 ~~ c(vx1, vx2, vx3)*wFeduc_a_9
  winc_diff_10 ~~ c(vy1, vy2, vy3)*winc_diff_10 
  wFeduc_a_10 ~~ c(vx1, vx2, vx3)*wFeduc_a_10
  winc_diff_11 ~~ c(vy1, vy2, vy3)*winc_diff_11 
  wFeduc_a_11 ~~ c(vx1, vx2, vx3)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*winc_diff_2

'
#filename
filename <-
  file.path(dir,
            "inc_diff_model13_unconstrained_groups_constrained_lag_fit")

#estimate model
if (!file.exists(filename)) {
inc_diff_model13_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    inc_diff_model13_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "cat_z_rl"
  )

  #save model
  save(inc_diff_model13_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "inc_diff_model13_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
inc_diff_model13_constrained_lag_groups_fit <-
  lavaan(
    cult_model7_constrained_lag_groups,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "cat_z_rl"
  )

  #save model
  save(inc_diff_model13_constrained_lag_groups_fit,
       file = filename)
} else {load(file = filename)
}
lavTestLRT(inc_diff_model13_constrained_lag_groups_fit, inc_diff_model13_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC inc_diff_model13_unconstrained_groups_constrained_lag_fit 807 133558 134355 inc_diff_model13_constrained_lag_groups_fit 821 133496 134202 Chisq Chisq diff inc_diff_model13_unconstrained_groups_constrained_lag_fit 3135.5
inc_diff_model13_constrained_lag_groups_fit 3524.4 107.45 Df diff Pr(>Chisq) inc_diff_model13_unconstrained_groups_constrained_lag_fit
inc_diff_model13_constrained_lag_groups_fit 14 < 2.2e-16

inc_diff_model13_unconstrained_groups_constrained_lag_fit
inc_diff_model13_constrained_lag_groups_fit *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

Ave sim

EU integration

#filename
filename <-
  file.path(dir,
            "EU_model14_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
EU_model14_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    EU_model12_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "cat_z_ave"
  )

  #save model
  save(EU_model14_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "EU_model14_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
EU_model14_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[1]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "cat_z_ave"
  )

  #save model
  save(EU_model14_constrained_lag_groups_fit,
       file = filename)
} else {load(file = filename)
}
lavTestLRT(EU_model14_constrained_lag_groups_fit, EU_model14_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq EU_model14_unconstrained_groups_constrained_lag_fit 960 153484 154324 3403.3 EU_model14_constrained_lag_groups_fit 974 154432 155182 4379.9 Chisq diff Df diff EU_model14_unconstrained_groups_constrained_lag_fit
EU_model14_constrained_lag_groups_fit 573.46 14 Pr(>Chisq)
EU_model14_unconstrained_groups_constrained_lag_fit
EU_model14_constrained_lag_groups_fit < 2.2e-16 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

Cultural inclusion

#filename
filename <-
  file.path(dir,
            "cult_model14_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
cult_model14_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    cult_model12_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "cat_z_ave"
  )

  #save model
  save(cult_model14_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "cult_model14_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
cult_model14_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[2]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "cat_z_ave"
  )

  #save model
  save(cult_model14_constrained_lag_groups_fit,
       file = filename)
} else {load(file = filename)
}
lavTestLRT(cult_model14_constrained_lag_groups_fit, cult_model14_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq cult_model14_unconstrained_groups_constrained_lag_fit 960 146970 147811 3222.4 cult_model14_constrained_lag_groups_fit 974 147927 148676 4206.7 Chisq diff Df diff cult_model14_unconstrained_groups_constrained_lag_fit
cult_model14_constrained_lag_groups_fit 585.02 14 Pr(>Chisq)
cult_model14_unconstrained_groups_constrained_lag_fit
cult_model14_constrained_lag_groups_fit < 2.2e-16 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

Income equality

#filename
filename <-
  file.path(dir,
            "inc_diff_model14_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
inc_diff_model14_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    inc_diff_model12_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "cat_z_ave"
  )

  #save model
  save(inc_diff_model14_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "inc_diff_model14_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
inc_diff_model14_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[3]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "cat_z_ave"
  )

  #save model
  save(inc_diff_model14_constrained_lag_groups_fit,
       file = filename)
} else {load(file = filename)
}
lavTestLRT(inc_diff_model14_constrained_lag_groups_fit, inc_diff_model14_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC inc_diff_model14_unconstrained_groups_constrained_lag_fit 960 147822 148663 inc_diff_model14_constrained_lag_groups_fit 974 148782 149532 Chisq Chisq diff inc_diff_model14_unconstrained_groups_constrained_lag_fit 3369.5
inc_diff_model14_constrained_lag_groups_fit 4357.6 546.63 Df diff Pr(>Chisq) inc_diff_model14_unconstrained_groups_constrained_lag_fit
inc_diff_model14_constrained_lag_groups_fit 14 < 2.2e-16

inc_diff_model14_unconstrained_groups_constrained_lag_fit
inc_diff_model14_constrained_lag_groups_fit *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

Newness (length liss)

Newness

MyData <- MyData %>%
  rowwise() %>%
  mutate(length_mean = mean(c_across(starts_with("Flength")), na.rm = T)) %>%
  ungroup()

MyData <- MyData %>%
  mutate(length_rec = cut2(length_mean, g = 4),
         length_2 = cut2(length_mean, g = 2))

EU integration

EU_model15_unconstrained_groups_constrained_lag <- 
'
  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~ 1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_3   ~ c(a1, a2, a3, a4)*weu_2 + c(b1, b2, b3, b4)*wFeduc_a_2
  weu_4   ~ c(a1, a2, a3, a4)*weu_3 + c(b1, b2, b3, b4)*wFeduc_a_3
  weu_5   ~ c(a1, a2, a3, a4)*weu_4 + c(b1, b2, b3, b4)*wFeduc_a_4
  weu_6   ~ c(a1, a2, a3, a4)*weu_5 + c(b1, b2, b3, b4)*wFeduc_a_5
  weu_7   ~ c(a1, a2, a3, a4)*weu_6 + c(b1, b2, b3, b4)*wFeduc_a_6
  weu_8   ~ c(a1, a2, a3, a4)*weu_7 + c(b1, b2, b3, b4)*wFeduc_a_7
  weu_9   ~ c(a1, a2, a3, a4)*weu_8 + c(b1, b2, b3, b4)*wFeduc_a_8
  weu_10  ~ c(a1, a2, a3, a4)*weu_9 + c(b1, b2, b3, b4)*wFeduc_a_9
  weu_11  ~ c(a1, a2, a3, a4)*weu_10 + c(b1, b2, b3, b4)*wFeduc_a_10
  
  wFeduc_a_3  ~ c(c1, c2, c3, c4)*weu_2 + c(d1, d2, d3, d4)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2, c3, c4)*weu_3 + c(d1, d2, d3, d4)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2, c3, c4)*weu_4 + c(d1, d2, d3, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2, c3, c4)*weu_5 + c(d1, d2, d3, d4)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2, c3, c4)*weu_6 + c(d1, d2, d3, d4)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2, c3, c4)*weu_7 + c(d1, d2, d3, d4)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2, c3, c4)*weu_8 + c(d1, d2, d3, d4)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2, c3, c4)*weu_9 + c(d1, d2, d3, d4)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2, c3, c4)*weu_10 + c(d1, d2, d3, d4)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_2 ~~ wFeduc_a_2 # Covariance

   # Estimate the covariances between the residuals
  weu_3 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_3
  weu_4 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_4
  weu_5 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_5
  weu_6 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_6
  weu_7 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_7
  weu_8 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_8
  weu_9 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_9
  weu_10 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_10
  weu_11 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_11
  
  # Estimate the variance 
  weu_2 ~~ weu_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  weu_3 ~~ c(vy1, vy2, vy3, vy4)*weu_3
  wFeduc_a_3 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_3
  weu_4 ~~ c(vy1, vy2, vy3, vy4)*weu_4 
  wFeduc_a_4 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_4
  weu_5 ~~ c(vy1, vy2, vy3, vy4)*weu_5
  wFeduc_a_5 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_5
  weu_6 ~~ c(vy1, vy2, vy3, vy4)*weu_6 
  wFeduc_a_6 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_6
  weu_7 ~~ c(vy1, vy2, vy3, vy4)*weu_7 
  wFeduc_a_7 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_7
  weu_8 ~~ c(vy1, vy2, vy3, vy4)*weu_8 
  wFeduc_a_8 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_8
  weu_9 ~~ c(vy1, vy2, vy3, vy4)*weu_9 
  wFeduc_a_9 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_9
  weu_10 ~~ c(vy1, vy2, vy3, vy4)*weu_10 
  wFeduc_a_10 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_10
  weu_11 ~~ c(vy1, vy2, vy3, vy4)*weu_11 
  wFeduc_a_11 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*weu_2

'
#filename
filename <-
  file.path(dir,
            "EU_model15_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
EU_model15_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    EU_model15_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "length_rec"
  )

  #save model
  save(EU_model15_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "EU_model15_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
EU_model15_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[1]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "length_rec"
  )

  #save model
  save(EU_model15_constrained_lag_groups_fit,
       file = filename)
} else {load(file = filename)
}
lavTestLRT(EU_model15_constrained_lag_groups_fit, EU_model15_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq EU_model15_unconstrained_groups_constrained_lag_fit 1076 138628 139690 3608.0 EU_model15_constrained_lag_groups_fit 1301 151429 152407 5172.1 Chisq diff Df diff EU_model15_unconstrained_groups_constrained_lag_fit
EU_model15_constrained_lag_groups_fit 1221.2 225 Pr(>Chisq)
EU_model15_unconstrained_groups_constrained_lag_fit
EU_model15_constrained_lag_groups_fit < 2.2e-16 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

cultural inclusion

cult_model15_unconstrained_groups_constrained_lag <- 
'

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~  1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables.
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects (constrained)
  wcult_3   ~ c(a1, a2, a3, a4)*wcult_2 + c(b1, b2, b3, b4)*wFeduc_a_2
  wcult_4   ~ c(a1, a2, a3, a4)*wcult_3 + c(b1, b2, b3, b4)*wFeduc_a_3
  wcult_5   ~ c(a1, a2, a3, a4)*wcult_4 + c(b1, b2, b3, b4)*wFeduc_a_4
  wcult_6   ~ c(a1, a2, a3, a4)*wcult_5 + c(b1, b2, b3, b4)*wFeduc_a_5
  wcult_7   ~ c(a1, a2, a3, a4)*wcult_6 + c(b1, b2, b3, b4)*wFeduc_a_6
  wcult_8   ~ c(a1, a2, a3, a4)*wcult_7 + c(b1, b2, b3, b4)*wFeduc_a_7
  wcult_9   ~ c(a1, a2, a3, a4)*wcult_8 + c(b1, b2, b3, b4)*wFeduc_a_8
  wcult_10  ~ c(a1, a2, a3, a4)*wcult_9 + c(b1, b2, b3, b4)*wFeduc_a_9
  wcult_11  ~ c(a1, a2, a3, a4)*wcult_10 + c(b1, b2, b3, b4)*wFeduc_a_10
  
  wFeduc_a_3  ~ c(c1, c2, c3, c4)*wcult_2 + c(d1, d2, d3, d4)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2, c3, c4)*wcult_3 + c(d1, d2, d3, d4)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2, c3, c4)*wcult_4 + c(d1, d2, d3, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2, c3, c4)*wcult_5 + c(d1, d2, d3, d4)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2, c3, c4)*wcult_6 + c(d1, d2, d3, d4)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2, c3, c4)*wcult_7 + c(d1, d2, d3, d4)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2, c3, c4)*wcult_8 + c(d1, d2, d3, d4)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2, c3, c4)*wcult_9 + c(d1, d2, d3, d4)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2, c3, c4)*wcult_10 + c(d1, d2, d3, d4)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_2 ~~ wFeduc_a_2 # Covariance

   # Estimate the covariances between the residuals
  wcult_3 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_3
  wcult_4 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_4
  wcult_5 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_5
  wcult_6 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_6
  wcult_7 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_7
  wcult_8 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_8
  wcult_9 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_9
  wcult_10 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_10
  wcult_11 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_11
  
  # Estimate the variance 
  wcult_2 ~~ wcult_2
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  wcult_3 ~~ c(vy1, vy2, vy3, vy4)*wcult_3
  wFeduc_a_3 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_3
  wcult_4 ~~ c(vy1, vy2, vy3, vy4)*wcult_4 
  wFeduc_a_4 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_4
  wcult_5 ~~ c(vy1, vy2, vy3, vy4)*wcult_5
  wFeduc_a_5 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_5
  wcult_6 ~~ c(vy1, vy2, vy3, vy4)*wcult_6 
  wFeduc_a_6 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_6
  wcult_7 ~~ c(vy1, vy2, vy3, vy4)*wcult_7 
  wFeduc_a_7 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_7
  wcult_8 ~~ c(vy1, vy2, vy3, vy4)*wcult_8 
  wFeduc_a_8 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_8
  wcult_9 ~~ c(vy1, vy2, vy3, vy4)*wcult_9 
  wFeduc_a_9 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_9
  wcult_10 ~~ c(vy1, vy2, vy3, vy4)*wcult_10 
  wFeduc_a_10 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_10
  wcult_11 ~~ c(vy1, vy2, vy3, vy4)*wcult_11 
  wFeduc_a_11 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*wcult_2

'
#filename
filename <-
  file.path(dir,
            "cult_model15_unconstrained_groups_constrained_lag_fit")

#estimate model
if (!file.exists(filename)) {
cult_model15_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    cult_model15_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "length_rec"
  )

  #save model
  save(cult_model15_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "cult_model15_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
cult_model15_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[2]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "length_rec"
  )

  #save model
  save(cult_model15_constrained_lag_groups_fit,
       file = filename)
} else {load(file = filename)
}
lavTestLRT(cult_model15_constrained_lag_groups_fit, cult_model15_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq cult_model15_unconstrained_groups_constrained_lag_fit 1076 132597 133659 3301.1 cult_model15_constrained_lag_groups_fit 1301 144845 145823 4897.7 Chisq diff Df diff cult_model15_unconstrained_groups_constrained_lag_fit
cult_model15_constrained_lag_groups_fit 1244.7 225 Pr(>Chisq)
cult_model15_unconstrained_groups_constrained_lag_fit
cult_model15_constrained_lag_groups_fit < 2.2e-16 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

income differences

inc_diff_model15_unconstrained_groups_constrained_lag <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables.
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_3   ~ c(a1, a2, a3, a4)*winc_diff_2 + c(b1, b2, b3, b4)*wFeduc_a_2
  winc_diff_4   ~ c(a1, a2, a3, a4)*winc_diff_3 + c(b1, b2, b3, b4)*wFeduc_a_3
  winc_diff_5   ~ c(a1, a2, a3, a4)*winc_diff_4 + c(b1, b2, b3, b4)*wFeduc_a_4
  winc_diff_6   ~ c(a1, a2, a3, a4)*winc_diff_5 + c(b1, b2, b3, b4)*wFeduc_a_5
  winc_diff_7   ~ c(a1, a2, a3, a4)*winc_diff_6 + c(b1, b2, b3, b4)*wFeduc_a_6
  winc_diff_8   ~ c(a1, a2, a3, a4)*winc_diff_7 + c(b1, b2, b3, b4)*wFeduc_a_7
  winc_diff_9   ~ c(a1, a2, a3, a4)*winc_diff_8 + c(b1, b2, b3, b4)*wFeduc_a_8
  winc_diff_10  ~ c(a1, a2, a3, a4)*winc_diff_9 + c(b1, b2, b3, b4)*wFeduc_a_9
  winc_diff_11  ~ c(a1, a2, a3, a4)*winc_diff_10 + c(b1, b2, b3, b4)*wFeduc_a_10
  
  wFeduc_a_3  ~ c(c1, c2, c3, c4)*winc_diff_2 + c(d1, d2, d3, d4)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2, c3, c4)*winc_diff_3 + c(d1, d2, d3, d4)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2, c3, c4)*winc_diff_4 + c(d1, d2, d3, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2, c3, c4)*winc_diff_5 + c(d1, d2, d3, d4)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2, c3, c4)*winc_diff_6 + c(d1, d2, d3, d4)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2, c3, c4)*winc_diff_7 + c(d1, d2, d3, d4)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2, c3, c4)*winc_diff_8 + c(d1, d2, d3, d4)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2, c3, c4)*winc_diff_9 + c(d1, d2, d3, d4)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2, c3, c4)*winc_diff_10 + c(d1, d2, d3, d4)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_2 ~~ wFeduc_a_2 # Covariance

   # Estimate the covariances between the residuals
  winc_diff_3 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_3
  winc_diff_4 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_4
  winc_diff_5 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_5
  winc_diff_6 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_6
  winc_diff_7 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_7
  winc_diff_8 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_8
  winc_diff_9 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_9
  winc_diff_10 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_10
  winc_diff_11 ~~ c(cov1, cov2, cov3, cov4)*wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_2 ~~ winc_diff_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  winc_diff_3 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_3
  wFeduc_a_3 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_3
  winc_diff_4 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_4 
  wFeduc_a_4 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_4
  winc_diff_5 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_5
  wFeduc_a_5 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_5
  winc_diff_6 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_6 
  wFeduc_a_6 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_6
  winc_diff_7 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_7 
  wFeduc_a_7 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_7
  winc_diff_8 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_8 
  wFeduc_a_8 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_8
  winc_diff_9 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_9 
  wFeduc_a_9 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_9
  winc_diff_10 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_10 
  wFeduc_a_10 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_10
  winc_diff_11 ~~ c(vy1, vy2, vy3, vy4)*winc_diff_11 
  wFeduc_a_11 ~~ c(vx1, vx2, vx3, vx4)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*winc_diff_2

'
#filename
filename <-
  file.path(dir,
            "inc_diff_model15_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
inc_diff_model15_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    inc_diff_model15_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "length_rec"
  )

  #save model
  save(inc_diff_model15_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {load(file = filename)
}
#filename
filename <-
  file.path(dir,
            "inc_diff_model15_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
inc_diff_model15_constrained_lag_groups_fit <-
  lavaan(
    main_lavaan_results$`Lavaan model objects`[[3]][[2]],
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "length_rec"
  )

  #save model
  save(inc_diff_model15_constrained_lag_groups_fit,
       file = filename)
} else {load(file = filename)
}
lavTestLRT(inc_diff_model15_constrained_lag_groups_fit, inc_diff_model15_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC inc_diff_model15_unconstrained_groups_constrained_lag_fit 1076 133147 134209 inc_diff_model15_constrained_lag_groups_fit 1301 145683 146661 Chisq Chisq diff inc_diff_model15_unconstrained_groups_constrained_lag_fit 3438.1
inc_diff_model15_constrained_lag_groups_fit 4964.8 1221.8 Df diff Pr(>Chisq) inc_diff_model15_unconstrained_groups_constrained_lag_fit
inc_diff_model15_constrained_lag_groups_fit 225 < 2.2e-16

inc_diff_model15_unconstrained_groups_constrained_lag_fit
inc_diff_model15_constrained_lag_groups_fit *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

Newness robustness

Two groups

EU integration

EU_model16_constrained_groups <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~ 1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_3   ~ c(a2, a2)*weu_2 + c(b2, b2)*wFeduc_a_2
  weu_4   ~ c(a3, a3)*weu_3 + c(b3, b3)*wFeduc_a_3
  weu_5   ~ c(a4, a4)*weu_4 + c(b4, b4)*wFeduc_a_4
  weu_6   ~ c(a5, a5)*weu_5 + c(b5, b5)*wFeduc_a_5
  weu_7   ~ c(a6, a6)*weu_6 + c(b6, b6)*wFeduc_a_6
  weu_8   ~ c(a7, a7)*weu_7 + c(b7, b7)*wFeduc_a_7
  weu_9   ~ c(a8, a8)*weu_8 + c(b8, b8)*wFeduc_a_8
  weu_10  ~ c(a9, a9)*weu_9 + c(b9, b9)*wFeduc_a_9
  weu_11  ~ c(a10, a10)*weu_10 + c(b10, b10)*wFeduc_a_10
  
  
  wFeduc_a_3  ~ c(c2, c2)*weu_2 + c(d2, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c3, c3)*weu_3 + c(d3, d3)*wFeduc_a_3
  wFeduc_a_5  ~ c(c4, c4)*weu_4 + c(d4, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c5, c5)*weu_5 + c(d5, d5)*wFeduc_a_5
  wFeduc_a_7  ~ c(c6, c6)*weu_6 + c(d6, d6)*wFeduc_a_6
  wFeduc_a_8  ~ c(c7, c7)*weu_7 + c(d7, d7)*wFeduc_a_7
  wFeduc_a_9  ~ c(c8, c8)*weu_8 + c(d8, d8)*wFeduc_a_8
  wFeduc_a_10  ~ c(c9, c9)*weu_9 + c(d9, d9)*wFeduc_a_9
  wFeduc_a_11  ~ c(c10, c10)*weu_10 + c(d10, d10)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_2 ~~ wFeduc_a_2 # Covariance

  # Estimate the covariances between the residuals
  weu_3 ~~ c(cov1, cov2)*wFeduc_a_3
  weu_4 ~~ c(cov1, cov2)*wFeduc_a_4
  weu_5 ~~ c(cov1, cov2)*wFeduc_a_5
  weu_6 ~~ c(cov1, cov2)*wFeduc_a_6
  weu_7 ~~ c(cov1, cov2)*wFeduc_a_7
  weu_8 ~~ c(cov1, cov2)*wFeduc_a_8
  weu_9 ~~ c(cov1, cov2)*wFeduc_a_9
  weu_10 ~~ c(cov1, cov2)*wFeduc_a_10
  weu_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  weu_2 ~~ weu_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  weu_3 ~~ c(vy1, vy2)*weu_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  weu_4 ~~ c(vy1, vy2)*weu_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  weu_5 ~~ c(vy1, vy2)*weu_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  weu_6 ~~ c(vy1, vy2)*weu_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  weu_7 ~~ c(vy1, vy2)*weu_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  weu_8 ~~ c(vy1, vy2)*weu_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  weu_9 ~~ c(vy1, vy2)*weu_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  weu_10 ~~ c(vy1, vy2)*weu_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  weu_11 ~~ c(vy1, vy2)*weu_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*weu_2

'
#filename
filename <-
  file.path(dir,
            "EU_model16_constrained_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
EU_model16_constrained_groups_fit <-
  lavaan(
    EU_model16_constrained_groups,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "length_2"
  )

  #save model
  save(EU_model16_constrained_groups_fit,
       file = filename)
} else {load(file = filename)
}
EU_model16_unconstrained_groups_constrained_lag <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0. 
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_3   ~ c(a1, a2)*weu_2 + c(b1, b2)*wFeduc_a_2
  weu_4   ~ c(a1, a2)*weu_3 + c(b1, b2)*wFeduc_a_3
  weu_5   ~ c(a1, a2)*weu_4 + c(b1, b2)*wFeduc_a_4
  weu_6   ~ c(a1, a2)*weu_5 + c(b1, b2)*wFeduc_a_5
  weu_7   ~ c(a1, a2)*weu_6 + c(b1, b2)*wFeduc_a_6
  weu_8   ~ c(a1, a2)*weu_7 + c(b1, b2)*wFeduc_a_7
  weu_9   ~ c(a1, a2)*weu_8 + c(b1, b2)*wFeduc_a_8
  weu_10  ~ c(a1, a2)*weu_9 + c(b1, b2)*wFeduc_a_9
  weu_11  ~ c(a1, a2)*weu_10 + c(b1, b2)*wFeduc_a_10
  
  wFeduc_a_3  ~ c(c1, c2)*weu_2 + c(d1, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2)*weu_3 + c(d1, d2)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2)*weu_4 + c(d1, d2)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2)*weu_5 + c(d1, d2)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2)*weu_6 + c(d1, d2)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2)*weu_7 + c(d1, d2)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2)*weu_8 + c(d1, d2)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2)*weu_9 + c(d1, d2)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2)*weu_10 + c(d1, d2)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_2 ~~ wFeduc_a_2 # Covariance

   # Estimate the covariances between the residuals
  weu_3 ~~ c(cov1, cov2)*wFeduc_a_3
  weu_4 ~~ c(cov1, cov2)*wFeduc_a_4
  weu_5 ~~ c(cov1, cov2)*wFeduc_a_5
  weu_6 ~~ c(cov1, cov2)*wFeduc_a_6
  weu_7 ~~ c(cov1, cov2)*wFeduc_a_7
  weu_8 ~~ c(cov1, cov2)*wFeduc_a_8
  weu_9 ~~ c(cov1, cov2)*wFeduc_a_9
  weu_10 ~~ c(cov1, cov2)*wFeduc_a_10
  weu_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  weu_2 ~~ weu_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  weu_3 ~~ c(vy1, vy2)*weu_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  weu_4 ~~ c(vy1, vy2)*weu_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  weu_5 ~~ c(vy1, vy2)*weu_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  weu_6 ~~ c(vy1, vy2)*weu_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  weu_7 ~~ c(vy1, vy2)*weu_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  weu_8 ~~ c(vy1, vy2)*weu_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  weu_9 ~~ c(vy1, vy2)*weu_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  weu_10 ~~ c(vy1, vy2)*weu_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  weu_11 ~~ c(vy1, vy2)*weu_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*weu_2

'
#filename
filename <-
  file.path(dir,
            "EU_model16_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
EU_model16_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    EU_model16_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "length_2"
  )

  #save model
  save(EU_model16_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else
  {load(file = filename)
  }
EU_model16_constrained_lag_groups <- '
  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~ 1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_3   ~ a*weu_2 + b*wFeduc_a_2
  weu_4   ~ a*weu_3 + b*wFeduc_a_3
  weu_5   ~ a*weu_4 + b*wFeduc_a_4
  weu_6   ~ a*weu_5 + b*wFeduc_a_5
  weu_7   ~ a*weu_6 + b*wFeduc_a_6
  weu_8   ~ a*weu_7 + b*wFeduc_a_7
  weu_9   ~ a*weu_8 + b*wFeduc_a_8
  weu_10  ~ a*weu_9 + b*wFeduc_a_9
  weu_11  ~ a*weu_10 + b*wFeduc_a_10
  
  wFeduc_a_3  ~ c*weu_2 + d*wFeduc_a_2
  wFeduc_a_4  ~ c*weu_3 + d*wFeduc_a_3
  wFeduc_a_5  ~ c*weu_4 + d*wFeduc_a_4
  wFeduc_a_6  ~ c*weu_5 + d*wFeduc_a_5
  wFeduc_a_7  ~ c*weu_6 + d*wFeduc_a_6
  wFeduc_a_8  ~ c*weu_7 + d*wFeduc_a_7
  wFeduc_a_9  ~ c*weu_8 + d*wFeduc_a_8
  wFeduc_a_10  ~ c*weu_9 + d*wFeduc_a_9
  wFeduc_a_11  ~ c*weu_10 + d*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_2 ~~ wFeduc_a_2 # Covariance

  # Estimate the covariances between the residuals
  weu_3 ~~ cov*wFeduc_a_3
  weu_4 ~~ cov*wFeduc_a_4
  weu_5 ~~ cov*wFeduc_a_5
  weu_6 ~~ cov*wFeduc_a_6
  weu_7 ~~ cov*wFeduc_a_7
  weu_8 ~~ cov*wFeduc_a_8
  weu_9 ~~ cov*wFeduc_a_9
  weu_10 ~~ cov*wFeduc_a_10
  weu_11 ~~ cov*wFeduc_a_11
  
  # Estimate the variance 
  weu_2 ~~ weu_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  weu_3 ~~ vy*weu_3
  wFeduc_a_3 ~~ vx*wFeduc_a_3
  weu_4 ~~ vy*weu_4 
  wFeduc_a_4 ~~ vx*wFeduc_a_4
  weu_5 ~~ vy*weu_5
  wFeduc_a_5 ~~ vx*wFeduc_a_5
  weu_6 ~~ vy*weu_6 
  wFeduc_a_6 ~~ vx*wFeduc_a_6
  weu_7 ~~ vy*weu_7 
  wFeduc_a_7 ~~ vx*wFeduc_a_7
  weu_8 ~~ vy*weu_8 
  wFeduc_a_8 ~~ vx*wFeduc_a_8
  weu_9 ~~ vy*weu_9 
  wFeduc_a_9 ~~ vx*wFeduc_a_9
  weu_10 ~~ vy*weu_10 
  wFeduc_a_10 ~~ vx*wFeduc_a_10
  weu_11 ~~ vy*weu_11 
  wFeduc_a_11 ~~ vx*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*weu_2

'
#filename
filename <-
  file.path(dir,
            "EU_model16_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
EU_model16_constrained_lag_groups_fit <-
  lavaan(
    EU_model16_constrained_lag_groups,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "length_2"
  )

  #save model
  save(EU_model16_constrained_lag_groups_fit,
       file = filename)
} else {load(file = filename)
}
fit_matrix_EU_m16_constrained_groups <- lavInspect(EU_model16_constrained_lag_groups_fit, what = "fit")
fit_matrix_EU_m16_unconstrained_groups <- lavInspect(EU_model16_unconstrained_groups_constrained_lag_fit, what = "fit")

fit_matrix_eu_M16 <- rbind(fit_matrix_EU_m16_constrained_groups, fit_matrix_EU_m16_unconstrained_groups)

lavTestLRT(EU_model16_constrained_lag_groups_fit, EU_model16_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq EU_model16_unconstrained_groups_constrained_lag_fit 538 139960 140491 2322.1 EU_model16_constrained_lag_groups_fit 545 139998 140483 2373.3 Chisq diff Df diff EU_model16_unconstrained_groups_constrained_lag_fit
EU_model16_constrained_lag_groups_fit 22.88 7 Pr(>Chisq)
EU_model16_unconstrained_groups_constrained_lag_fit
EU_model16_constrained_lag_groups_fit 0.001789 ** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

cultural inclusion

cult_model16_constrained_groups <- '
  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~ 1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects (constrained)
  wcult_3   ~ c(a2, a2)*wcult_2 + c(b2, b2)*wFeduc_a_2
  wcult_4   ~ c(a3, a3)*wcult_3 + c(b3, b3)*wFeduc_a_3
  wcult_5   ~ c(a4, a4)*wcult_4 + c(b4, b4)*wFeduc_a_4
  wcult_6   ~ c(a5, a5)*wcult_5 + c(b5, b5)*wFeduc_a_5
  wcult_7   ~ c(a6, a6)*wcult_6 + c(b6, b6)*wFeduc_a_6
  wcult_8   ~ c(a7, a7)*wcult_7 + c(b7, b7)*wFeduc_a_7
  wcult_9   ~ c(a8, a8)*wcult_8 + c(b8, b8)*wFeduc_a_8
  wcult_10  ~ c(a9, a9)*wcult_9 + c(b9, b9)*wFeduc_a_9
  wcult_11  ~ c(a10, a10)*wcult_10 + c(b10, b10)*wFeduc_a_10
  
  
  wFeduc_a_3  ~ c(c2, c2)*wcult_2 + c(d2, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c3, c3)*wcult_3 + c(d3, d3)*wFeduc_a_3
  wFeduc_a_5  ~ c(c4, c4)*wcult_4 + c(d4, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c5, c5)*wcult_5 + c(d5, d5)*wFeduc_a_5
  wFeduc_a_7  ~ c(c6, c6)*wcult_6 + c(d6, d6)*wFeduc_a_6
  wFeduc_a_8  ~ c(c7, c7)*wcult_7 + c(d7, d7)*wFeduc_a_7
  wFeduc_a_9  ~ c(c8, c8)*wcult_8 + c(d8, d8)*wFeduc_a_8
  wFeduc_a_10  ~ c(c9, c9)*wcult_9 + c(d9, d9)*wFeduc_a_9
  wFeduc_a_11  ~ c(c10, c10)*wcult_10 + c(d10, d10)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_2 ~~ wFeduc_a_2 # Covariance

  # Estimate the covariances between the residuals
  wcult_3 ~~ c(cov1, cov2)*wFeduc_a_3
  wcult_4 ~~ c(cov1, cov2)*wFeduc_a_4
  wcult_5 ~~ c(cov1, cov2)*wFeduc_a_5
  wcult_6 ~~ c(cov1, cov2)*wFeduc_a_6
  wcult_7 ~~ c(cov1, cov2)*wFeduc_a_7
  wcult_8 ~~ c(cov1, cov2)*wFeduc_a_8
  wcult_9 ~~ c(cov1, cov2)*wFeduc_a_9
  wcult_10 ~~ c(cov1, cov2)*wFeduc_a_10
  wcult_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  wcult_2 ~~ wcult_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  wcult_3 ~~ c(vy1, vy2)*wcult_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  wcult_4 ~~ c(vy1, vy2)*wcult_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  wcult_5 ~~ c(vy1, vy2)*wcult_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  wcult_6 ~~ c(vy1, vy2)*wcult_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  wcult_7 ~~ c(vy1, vy2)*wcult_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  wcult_8 ~~ c(vy1, vy2)*wcult_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  wcult_9 ~~ c(vy1, vy2)*wcult_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  wcult_10 ~~ c(vy1, vy2)*wcult_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  wcult_11 ~~ c(vy1, vy2)*wcult_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*wcult_2

'
#filename
filename <-
  file.path(dir,
            "cult_model16_constrained_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
cult_model16_constrained_groups_fit <-
  lavaan(
    cult_model16_constrained_groups,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "length_2"
  )


  #save model
  save(cult_model16_constrained_groups_fit,
       file = filename)
} else {
  load(file = filename)
}
cult_model16_unconstrained_groups_constrained_lag <- '
  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0. 
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects (constrained)
  wcult_3   ~ c(a1, a2)*wcult_2 + c(b1, b2)*wFeduc_a_2
  wcult_4   ~ c(a1, a2)*wcult_3 + c(b1, b2)*wFeduc_a_3
  wcult_5   ~ c(a1, a2)*wcult_4 + c(b1, b2)*wFeduc_a_4
  wcult_6   ~ c(a1, a2)*wcult_5 + c(b1, b2)*wFeduc_a_5
  wcult_7   ~ c(a1, a2)*wcult_6 + c(b1, b2)*wFeduc_a_6
  wcult_8   ~ c(a1, a2)*wcult_7 + c(b1, b2)*wFeduc_a_7
  wcult_9   ~ c(a1, a2)*wcult_8 + c(b1, b2)*wFeduc_a_8
  wcult_10  ~ c(a1, a2)*wcult_9 + c(b1, b2)*wFeduc_a_9
  wcult_11  ~ c(a1, a2)*wcult_10 + c(b1, b2)*wFeduc_a_10
  
  wFeduc_a_3  ~ c(c1, c2)*wcult_2 + c(d1, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2)*wcult_3 + c(d1, d2)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2)*wcult_4 + c(d1, d2)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2)*wcult_5 + c(d1, d2)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2)*wcult_6 + c(d1, d2)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2)*wcult_7 + c(d1, d2)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2)*wcult_8 + c(d1, d2)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2)*wcult_9 + c(d1, d2)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2)*wcult_10 + c(d1, d2)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_2 ~~ wFeduc_a_2 # Covariance

   # Estimate the covariances between the residuals
  wcult_3 ~~ c(cov1, cov2)*wFeduc_a_3
  wcult_4 ~~ c(cov1, cov2)*wFeduc_a_4
  wcult_5 ~~ c(cov1, cov2)*wFeduc_a_5
  wcult_6 ~~ c(cov1, cov2)*wFeduc_a_6
  wcult_7 ~~ c(cov1, cov2)*wFeduc_a_7
  wcult_8 ~~ c(cov1, cov2)*wFeduc_a_8
  wcult_9 ~~ c(cov1, cov2)*wFeduc_a_9
  wcult_10 ~~ c(cov1, cov2)*wFeduc_a_10
  wcult_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  wcult_2 ~~ wcult_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  wcult_3 ~~ c(vy1, vy2)*wcult_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  wcult_4 ~~ c(vy1, vy2)*wcult_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  wcult_5 ~~ c(vy1, vy2)*wcult_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  wcult_6 ~~ c(vy1, vy2)*wcult_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  wcult_7 ~~ c(vy1, vy2)*wcult_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  wcult_8 ~~ c(vy1, vy2)*wcult_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  wcult_9 ~~ c(vy1, vy2)*wcult_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  wcult_10 ~~ c(vy1, vy2)*wcult_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  wcult_11 ~~ c(vy1, vy2)*wcult_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*wcult_2

'
#filename
filename <-
  file.path(dir,
            "cult_model16_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
cult_model16_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    cult_model16_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "length_2"
  )

  #save model
  save(cult_model16_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else {load(file = filename)
}
cult_model16_constrained_lag_groups <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~ 1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects (constrained)
  wcult_3   ~ a*wcult_2 + b*wFeduc_a_2
  wcult_4   ~ a*wcult_3 + b*wFeduc_a_3
  wcult_5   ~ a*wcult_4 + b*wFeduc_a_4
  wcult_6   ~ a*wcult_5 + b*wFeduc_a_5
  wcult_7   ~ a*wcult_6 + b*wFeduc_a_6
  wcult_8   ~ a*wcult_7 + b*wFeduc_a_7
  wcult_9   ~ a*wcult_8 + b*wFeduc_a_8
  wcult_10  ~ a*wcult_9 + b*wFeduc_a_9
  wcult_11  ~ a*wcult_10 + b*wFeduc_a_10
  
  wFeduc_a_3  ~ c*wcult_2 + d*wFeduc_a_2
  wFeduc_a_4  ~ c*wcult_3 + d*wFeduc_a_3
  wFeduc_a_5  ~ c*wcult_4 + d*wFeduc_a_4
  wFeduc_a_6  ~ c*wcult_5 + d*wFeduc_a_5
  wFeduc_a_7  ~ c*wcult_6 + d*wFeduc_a_6
  wFeduc_a_8  ~ c*wcult_7 + d*wFeduc_a_7
  wFeduc_a_9  ~ c*wcult_8 + d*wFeduc_a_8
  wFeduc_a_10  ~ c*wcult_9 + d*wFeduc_a_9
  wFeduc_a_11  ~ c*wcult_10 + d*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_2 ~~ wFeduc_a_2 # Covariance

  # Estimate the covariances between the residuals
  wcult_3 ~~ cov*wFeduc_a_3
  wcult_4 ~~ cov*wFeduc_a_4
  wcult_5 ~~ cov*wFeduc_a_5
  wcult_6 ~~ cov*wFeduc_a_6
  wcult_7 ~~ cov*wFeduc_a_7
  wcult_8 ~~ cov*wFeduc_a_8
  wcult_9 ~~ cov*wFeduc_a_9
  wcult_10 ~~ cov*wFeduc_a_10
  wcult_11 ~~ cov*wFeduc_a_11
  
  # Estimate the variance 
  wcult_2 ~~ wcult_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  wcult_3 ~~ vy*wcult_3
  wFeduc_a_3 ~~ vx*wFeduc_a_3
  wcult_4 ~~ vy*wcult_4 
  wFeduc_a_4 ~~ vx*wFeduc_a_4
  wcult_5 ~~ vy*wcult_5
  wFeduc_a_5 ~~ vx*wFeduc_a_5
  wcult_6 ~~ vy*wcult_6 
  wFeduc_a_6 ~~ vx*wFeduc_a_6
  wcult_7 ~~ vy*wcult_7 
  wFeduc_a_7 ~~ vx*wFeduc_a_7
  wcult_8 ~~ vy*wcult_8 
  wFeduc_a_8 ~~ vx*wFeduc_a_8
  wcult_9 ~~ vy*wcult_9 
  wFeduc_a_9 ~~ vx*wFeduc_a_9
  wcult_10 ~~ vy*wcult_10 
  wFeduc_a_10 ~~ vx*wFeduc_a_10
  wcult_11 ~~ vy*wcult_11 
  wFeduc_a_11 ~~ vx*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*wcult_2

'
#filename
filename <-
  file.path(dir,
            "cult_model16_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
cult_model16_constrained_lag_groups_fit <-
  lavaan(
    cult_model16_constrained_lag_groups,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "length_2"
  )

  #save model
  save(cult_model16_constrained_lag_groups_fit,
       file = filename)
} else {load(file = filename)
}
fit_matrix_cult_m16_constrained_groups <- lavInspect(cult_model16_constrained_lag_groups_fit, what = "fit")
fit_matrix_cult_m16_unconstrained_groups <- lavInspect(cult_model16_unconstrained_groups_constrained_lag_fit, what = "fit")

fit_matrix_cult_M16 <- rbind(fit_matrix_cult_m16_constrained_groups, fit_matrix_cult_m16_unconstrained_groups)

lavTestLRT(cult_model16_constrained_lag_groups_fit, cult_model16_unconstrained_groups_constrained_lag_fit)

Scaled Chi-Squared Difference Test (method = “satorra.bentler.2001”)

lavaan->lavTestLRT():
lavaan NOTE: The “Chisq” column contains standard test statistics, not the robust test that should be reported per model. A robust difference test is a function of two standard (not robust) statistics. Df AIC BIC Chisq cult_model16_unconstrained_groups_constrained_lag_fit 538 133950 134481 2049.3 cult_model16_constrained_lag_groups_fit 545 134016 134502 2129.1 Chisq diff Df diff cult_model16_unconstrained_groups_constrained_lag_fit
cult_model16_constrained_lag_groups_fit 38.052 7 Pr(>Chisq)
cult_model16_unconstrained_groups_constrained_lag_fit
cult_model16_constrained_lag_groups_fit 2.962e-06 *** — Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

income differences

inc_diff_model16_constrained_groups <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~ 1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.  
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_3   ~ c(a2, a2)*winc_diff_2 + c(b2, b2)*wFeduc_a_2
  winc_diff_4   ~ c(a3, a3)*winc_diff_3 + c(b3, b3)*wFeduc_a_3
  winc_diff_5   ~ c(a4, a4)*winc_diff_4 + c(b4, b4)*wFeduc_a_4
  winc_diff_6   ~ c(a5, a5)*winc_diff_5 + c(b5, b5)*wFeduc_a_5
  winc_diff_7   ~ c(a6, a6)*winc_diff_6 + c(b6, b6)*wFeduc_a_6
  winc_diff_8   ~ c(a7, a7)*winc_diff_7 + c(b7, b7)*wFeduc_a_7
  winc_diff_9   ~ c(a8, a8)*winc_diff_8 + c(b8, b8)*wFeduc_a_8
  winc_diff_10  ~ c(a9, a9)*winc_diff_9 + c(b9, b9)*wFeduc_a_9
  winc_diff_11  ~ c(a10, a10)*winc_diff_10 + c(b10, b10)*wFeduc_a_10
  
  
  wFeduc_a_3  ~ c(c2, c2)*winc_diff_2 + c(d2, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c3, c3)*winc_diff_3 + c(d3, d3)*wFeduc_a_3
  wFeduc_a_5  ~ c(c4, c4)*winc_diff_4 + c(d4, d4)*wFeduc_a_4
  wFeduc_a_6  ~ c(c5, c5)*winc_diff_5 + c(d5, d5)*wFeduc_a_5
  wFeduc_a_7  ~ c(c6, c6)*winc_diff_6 + c(d6, d6)*wFeduc_a_6
  wFeduc_a_8  ~ c(c7, c7)*winc_diff_7 + c(d7, d7)*wFeduc_a_7
  wFeduc_a_9  ~ c(c8, c8)*winc_diff_8 + c(d8, d8)*wFeduc_a_8
  wFeduc_a_10  ~ c(c9, c9)*winc_diff_9 + c(d9, d9)*wFeduc_a_9
  wFeduc_a_11  ~ c(c10, c10)*winc_diff_10 + c(d10, d10)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_2 ~~ wFeduc_a_2 # Covariance

  # Estimate the covariances between the residuals
  winc_diff_3 ~~ c(cov1, cov2)*wFeduc_a_3
  winc_diff_4 ~~ c(cov1, cov2)*wFeduc_a_4
  winc_diff_5 ~~ c(cov1, cov2)*wFeduc_a_5
  winc_diff_6 ~~ c(cov1, cov2)*wFeduc_a_6
  winc_diff_7 ~~ c(cov1, cov2)*wFeduc_a_7
  winc_diff_8 ~~ c(cov1, cov2)*wFeduc_a_8
  winc_diff_9 ~~ c(cov1, cov2)*wFeduc_a_9
  winc_diff_10 ~~ c(cov1, cov2)*wFeduc_a_10
  winc_diff_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_2 ~~ winc_diff_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  winc_diff_3 ~~ c(vy1, vy2)*winc_diff_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  winc_diff_4 ~~ c(vy1, vy2)*winc_diff_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  winc_diff_5 ~~ c(vy1, vy2)*winc_diff_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  winc_diff_6 ~~ c(vy1, vy2)*winc_diff_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  winc_diff_7 ~~ c(vy1, vy2)*winc_diff_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  winc_diff_8 ~~ c(vy1, vy2)*winc_diff_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  winc_diff_9 ~~ c(vy1, vy2)*winc_diff_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  winc_diff_10 ~~ c(vy1, vy2)*winc_diff_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  winc_diff_11 ~~ c(vy1, vy2)*winc_diff_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*winc_diff_2

'
#filename
filename <-
  file.path(dir,
            "inc_diff_model16_constrained_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
inc_diff_model16_constrained_groups_fit <-
  lavaan(
    inc_diff_model16_constrained_groups,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "length_2"
  )

  #save model
  save(inc_diff_model16_constrained_groups_fit,
       file = filename)
} else {load(file = filename)
}
inc_diff_model16_unconstrained_groups_constrained_lag <-  '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0. 
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_3   ~ c(a1, a2)*winc_diff_2 + c(b1, b2)*wFeduc_a_2
  winc_diff_4   ~ c(a1, a2)*winc_diff_3 + c(b1, b2)*wFeduc_a_3
  winc_diff_5   ~ c(a1, a2)*winc_diff_4 + c(b1, b2)*wFeduc_a_4
  winc_diff_6   ~ c(a1, a2)*winc_diff_5 + c(b1, b2)*wFeduc_a_5
  winc_diff_7   ~ c(a1, a2)*winc_diff_6 + c(b1, b2)*wFeduc_a_6
  winc_diff_8   ~ c(a1, a2)*winc_diff_7 + c(b1, b2)*wFeduc_a_7
  winc_diff_9   ~ c(a1, a2)*winc_diff_8 + c(b1, b2)*wFeduc_a_8
  winc_diff_10  ~ c(a1, a2)*winc_diff_9 + c(b1, b2)*wFeduc_a_9
  winc_diff_11  ~ c(a1, a2)*winc_diff_10 + c(b1, b2)*wFeduc_a_10
  
  wFeduc_a_3  ~ c(c1, c2)*winc_diff_2 + c(d1, d2)*wFeduc_a_2
  wFeduc_a_4  ~ c(c1, c2)*winc_diff_3 + c(d1, d2)*wFeduc_a_3
  wFeduc_a_5  ~ c(c1, c2)*winc_diff_4 + c(d1, d2)*wFeduc_a_4
  wFeduc_a_6  ~ c(c1, c2)*winc_diff_5 + c(d1, d2)*wFeduc_a_5
  wFeduc_a_7  ~ c(c1, c2)*winc_diff_6 + c(d1, d2)*wFeduc_a_6
  wFeduc_a_8  ~ c(c1, c2)*winc_diff_7 + c(d1, d2)*wFeduc_a_7
  wFeduc_a_9  ~ c(c1, c2)*winc_diff_8 + c(d1, d2)*wFeduc_a_8
  wFeduc_a_10  ~ c(c1, c2)*winc_diff_9 + c(d1, d2)*wFeduc_a_9
  wFeduc_a_11  ~ c(c1, c2)*winc_diff_10 + c(d1, d2)*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_2 ~~ wFeduc_a_2 # Covariance

   # Estimate the covariances between the residuals
  winc_diff_3 ~~ c(cov1, cov2)*wFeduc_a_3
  winc_diff_4 ~~ c(cov1, cov2)*wFeduc_a_4
  winc_diff_5 ~~ c(cov1, cov2)*wFeduc_a_5
  winc_diff_6 ~~ c(cov1, cov2)*wFeduc_a_6
  winc_diff_7 ~~ c(cov1, cov2)*wFeduc_a_7
  winc_diff_8 ~~ c(cov1, cov2)*wFeduc_a_8
  winc_diff_9 ~~ c(cov1, cov2)*wFeduc_a_9
  winc_diff_10 ~~ c(cov1, cov2)*wFeduc_a_10
  winc_diff_11 ~~ c(cov1, cov2)*wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_2 ~~ winc_diff_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  winc_diff_3 ~~ c(vy1, vy2)*winc_diff_3
  wFeduc_a_3 ~~ c(vx1, vx2)*wFeduc_a_3
  winc_diff_4 ~~ c(vy1, vy2)*winc_diff_4 
  wFeduc_a_4 ~~ c(vx1, vx2)*wFeduc_a_4
  winc_diff_5 ~~ c(vy1, vy2)*winc_diff_5
  wFeduc_a_5 ~~ c(vx1, vx2)*wFeduc_a_5
  winc_diff_6 ~~ c(vy1, vy2)*winc_diff_6 
  wFeduc_a_6 ~~ c(vx1, vx2)*wFeduc_a_6
  winc_diff_7 ~~ c(vy1, vy2)*winc_diff_7 
  wFeduc_a_7 ~~ c(vx1, vx2)*wFeduc_a_7
  winc_diff_8 ~~ c(vy1, vy2)*winc_diff_8 
  wFeduc_a_8 ~~ c(vx1, vx2)*wFeduc_a_8
  winc_diff_9 ~~ c(vy1, vy2)*winc_diff_9 
  wFeduc_a_9 ~~ c(vx1, vx2)*wFeduc_a_9
  winc_diff_10 ~~ c(vy1, vy2)*winc_diff_10 
  wFeduc_a_10 ~~ c(vx1, vx2)*wFeduc_a_10
  winc_diff_11 ~~ c(vy1, vy2)*winc_diff_11 
  wFeduc_a_11 ~~ c(vx1, vx2)*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*winc_diff_2

'
#filename
filename <-
  file.path(dir,
            "inc_diff_model16_unconstrained_groups_constrained_lag_fit.Rdata")

#estimate model
if (!file.exists(filename)) {

inc_diff_model16_unconstrained_groups_constrained_lag_fit <-
  lavaan(
    inc_diff_model16_unconstrained_groups_constrained_lag,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "length_2"
  )

  #save model
  save(inc_diff_model16_unconstrained_groups_constrained_lag_fit,
       file = filename)
} else
  (load(file = filename)
  )
inc_diff_model16_constrained_lag_groups <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1*Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~ 1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  # Set the residual variances of all FX variables to 0.
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_3   ~ a*winc_diff_2 + b*wFeduc_a_2
  winc_diff_4   ~ a*winc_diff_3 + b*wFeduc_a_3
  winc_diff_5   ~ a*winc_diff_4 + b*wFeduc_a_4
  winc_diff_6   ~ a*winc_diff_5 + b*wFeduc_a_5
  winc_diff_7   ~ a*winc_diff_6 + b*wFeduc_a_6
  winc_diff_8   ~ a*winc_diff_7 + b*wFeduc_a_7
  winc_diff_9   ~ a*winc_diff_8 + b*wFeduc_a_8
  winc_diff_10  ~ a*winc_diff_9 + b*wFeduc_a_9
  winc_diff_11  ~ a*winc_diff_10 + b*wFeduc_a_10
  
  wFeduc_a_3  ~ c*winc_diff_2 + d*wFeduc_a_2
  wFeduc_a_4  ~ c*winc_diff_3 + d*wFeduc_a_3
  wFeduc_a_5  ~ c*winc_diff_4 + d*wFeduc_a_4
  wFeduc_a_6  ~ c*winc_diff_5 + d*wFeduc_a_5
  wFeduc_a_7  ~ c*winc_diff_6 + d*wFeduc_a_6
  wFeduc_a_8  ~ c*winc_diff_7 + d*wFeduc_a_7
  wFeduc_a_9  ~ c*winc_diff_8 + d*wFeduc_a_8
  wFeduc_a_10  ~ c*winc_diff_9 + d*wFeduc_a_9
  wFeduc_a_11  ~ c*winc_diff_10 + d*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_2 ~~ wFeduc_a_2 # Covariance

  # Estimate the covariances between the residuals
  winc_diff_3 ~~ cov*wFeduc_a_3
  winc_diff_4 ~~ cov*wFeduc_a_4
  winc_diff_5 ~~ cov*wFeduc_a_5
  winc_diff_6 ~~ cov*wFeduc_a_6
  winc_diff_7 ~~ cov*wFeduc_a_7
  winc_diff_8 ~~ cov*wFeduc_a_8
  winc_diff_9 ~~ cov*wFeduc_a_9
  winc_diff_10 ~~ cov*wFeduc_a_10
  winc_diff_11 ~~ cov*wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_2 ~~ winc_diff_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  
  # Estimate the residual variance
  winc_diff_3 ~~ vy*winc_diff_3
  wFeduc_a_3 ~~ vx*wFeduc_a_3
  winc_diff_4 ~~ vy*winc_diff_4 
  wFeduc_a_4 ~~ vx*wFeduc_a_4
  winc_diff_5 ~~ vy*winc_diff_5
  wFeduc_a_5 ~~ vx*wFeduc_a_5
  winc_diff_6 ~~ vy*winc_diff_6 
  wFeduc_a_6 ~~ vx*wFeduc_a_6
  winc_diff_7 ~~ vy*winc_diff_7 
  wFeduc_a_7 ~~ vx*wFeduc_a_7
  winc_diff_8 ~~ vy*winc_diff_8 
  wFeduc_a_8 ~~ vx*wFeduc_a_8
  winc_diff_9 ~~ vy*winc_diff_9 
  wFeduc_a_9 ~~ vx*wFeduc_a_9
  winc_diff_10 ~~ vy*winc_diff_10 
  wFeduc_a_10 ~~ vx*wFeduc_a_10
  winc_diff_11 ~~ vy*winc_diff_11 
  wFeduc_a_11 ~~ vx*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_2 + 0*winc_diff_2

'
#filename
filename <-
  file.path(dir,
            "inc_diff_model16_constrained_lag_groups_fit.Rdata")

#estimate model
if (!file.exists(filename)) {
inc_diff_model16_constrained_lag_groups_fit <-
  lavaan(
    inc_diff_model16_constrained_lag_groups,
    data = MyData,
    estimator = 'MLR',
    missing = 'ML',
    meanstructure = T,
    int.ov.free = T,
    group = "length_2"
  )

  #save model
  save(inc_diff_model16_constrained_lag_groups_fit,
       file = filename)
} else {load(file = filename)
}

Export results

save.image(file = "results/riclpm/24-08-21_lavaan-moderation-results.Rdata")
LS0tDQp0aXRsZTogIk1vZGVyYXRpb24gYW5hbHlzaXMiDQphdXRob3I6ICJUaGlqbWVuIEplcm9lbnNlIg0KZGF0ZTogIkxhc3QgY29tcGlsZWQgb24gYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgDQogICAgdG9jOiBUUlVFDQogICAgdG9jX2RlcHRoOiAzDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICBjYWNoZSA9IFRSVUUsDQogIG1lc3NhZ2UgPSBGQUxTRSwNCiAgd2FybmluZyA9IEZBTFNFLA0KICByZXN1bHRzID0gImFzaXMiLA0KICBmaWcuYWxpZ24gPSAiY2VudGVyIg0KKQ0KYGBgDQoNCiMgR29hbA0KDQpFc3RpbWF0aW9uIG9mIG1vZGVyYXRpb24gYW5hbHlzZXMuIA0KDQojIFNldCB1cCBhbmQgZGF0YSBpbXBvcnQNCg0KYGBge3IgbGlicmFyaWVzIGFuZCBkYXRhIGltcG9ydH0NCiNsaWJyYXJ5DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkobGF2YWFuKQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeShkb1BhcmFsbGVsKQ0KbGlicmFyeShwYXJhbGxlbCkNCg0KI2dldCBkYXRhIGFuZCBlc3RpbWF0ZXMNCmxvYWQoInJlc3VsdHMvcHJlZGljdGVkX21lYW5zLzI0MDgxNl9wcmVkLW1lYW5zLWNsZWFuZWQtZGYuUmRhdGEiKQ0KbG9hZChmaWxlID0gInJlc3VsdHMvcmljbHBtLzI0MDgxNl9sYXZhYW4tbWFpbi1yZXN1bHRzLlJkYXRhIikNCg0KDQojY3JlYXRlIGJldHdlZW4gbGV2ZWwgdmFyaWFibGVzDQpNeURhdGEgPC0gcHJlZF9yZXN1bHRzJGRmX2NvbWJpbmVkICU+JSANCiAgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKGJldHdlZW5fZWR1YyA9IG1lYW4oY19hY3Jvc3MoY29scyA9IG1hdGNoZXMoIl5lZHVjX1tbOmRpZ2l0Ol1dezEsMn0iKSksbmEucm0gPSBUKSwNCiAgICAgICAgIGJldHdlZW5fYWdlID0gbWVhbihjX2Fjcm9zcyhjb2xzID0gbWF0Y2hlcygiXmFnZV9bWzpkaWdpdDpdXXsxLDJ9IikpLG5hLnJtID0gVCksDQogICAgICAgICBiZXR3ZWVuX2ZlbWFsZSA9IG1lYW4oY19hY3Jvc3MoY29scyA9IG1hdGNoZXMoIl5mZW1hbGVfW1s6ZGlnaXQ6XV17MSwyfSIpKSxuYS5ybSA9IFQpLA0KICAgICAgICAgYmV0d2Vlbl9vcmlnaW4gPSBtZWFuKGNfYWNyb3NzKGNvbHMgPSBtYXRjaGVzKCJeb3JpZ2luX1tbOmRpZ2l0Ol1dezEsMn0iKSksbmEucm0gPSBUKSkgJT4lDQogIHVuZ3JvdXAoKQ0KDQojY3JlYXRlIGRpciBmb3Igc3RvcmluZyBtb2RlbCBvYmplY3RzDQpkaXIgPC0gZmlsZS5wYXRoKCJyZXN1bHRzIiwgInJpY2xwbSIsICJtb2RlcmF0aW9uX21vZGVscyIpIA0KYGBgDQoNCg0KDQojIEJldHdlZW4gbGV2ZWwgaW50ZXJhY3Rpb24gKG1lZGlhbiBzcGxpdCkNCg0KIyMgUG9saXRpY2FsIERpc2N1c3Npb24NCg0KYGBge3IgY3JlYXRlIGJldHdlZW4gdmFyaWFibGVzIHBvbH0NCmxpYnJhcnkoSG1pc2MpICN1c2VkIHRvIGNyZWF0ZSBjdXRzIGluIGEgdmFyaWFibGUNCg0KI2NyZWF0ZSBiZXR3ZWVuIG1lYW4NCk15RGF0YSA8LSBNeURhdGEgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKHBvbF9kaXMgPSBtZWFuKGNfYWNyb3NzKHN0YXJ0c193aXRoKCJGcG9sIikpLCBuYS5ybSA9IFQpKSAlPiUNCiAgdW5ncm91cCgpDQoNCiNjcmVhdGUgZGlmZmVyZW50IGdyb3Vwcw0KTXlEYXRhIDwtIE15RGF0YSAlPiUNCiAgbXV0YXRlKHBvbF9kaXNjX3JlYyA9IGN1dDIocG9sX2RpcywgZyA9IDQpLA0KICAgICAgICAgcG9sX2Rpc2NfMiA9IGN1dDIocG9sX2RpcywgZyA9IDIpKQ0KDQpgYGANCg0KIyMjIEVVIGludGVncmF0aW9uDQoNCmBgYHtyIGV1IG1vZGVsIDYgY29ucyBncm91cHMgdW5jb25zIGxhZ3N9DQoNCkVVX21vZGVsNl9jb25zdHJhaW5lZF9ncm91cHMgPC0gJw0KDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSogRmVkdWNfYV8xICsgMSogRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+ICAxKmV1XzEgKyAxKmV1XzIgKyAxKmV1XzMgKyAxKmV1XzQgKyAxKmV1XzUgKyAxKmV1XzYgKyAxKmV1XzcgKyAxKmV1XzggKyAxKmV1XzkgKyAxKmV1XzEwICsgMSpldV8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQogIA0KICAjIFJlZ3Jlc3Npb24gb2YgcmFuZG9tIGludGVyY2VwdHMgb24gejENCiAgUkl4ICsgUkl5IH4gYmV0d2Vlbl9lZHVjICsgYmV0d2Vlbl9hZ2UgKyBiZXR3ZWVuX29yaWdpbiArIGJldHdlZW5fZmVtYWxlIyBDb25zdHJhaW5lZCBvdmVyIHRpbWUuDQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuICANCiAgRmVkdWNfYV8xIH5+IDAqRmVkdWNfYV8xDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4gDQogIHdGZWR1Y19hXzEgPX4gMSpGZWR1Y19hXzENCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgd2V1XzEgPX4gMSpldV8xDQogIHdldV8yID1+IDEqZXVfMg0KICB3ZXVfMyA9fiAxKmV1XzMNCiAgd2V1XzQgPX4gMSpldV80DQogIHdldV81ID1+IDEqZXVfNQ0KICB3ZXVfNiA9fiAxKmV1XzYNCiAgd2V1XzcgPX4gMSpldV83DQogIHdldV84ID1+IDEqZXVfOA0KICB3ZXVfOSA9fiAxKmV1XzkNCiAgd2V1XzEwID1+IDEqZXVfMTANCiAgd2V1XzExID1+IDEqZXVfMTEgDQogIA0KICAjIEVzdGltYXRlIHRoZSBsYWdnZWQgZWZmZWN0cyAoY29uc3RyYWluZWQpDQogIHdldV8yICAgfiBjKGExLCBhMSkqd2V1XzEgKyBjKGIxLCBiMSkqd0ZlZHVjX2FfMQ0KICB3ZXVfMyAgIH4gYyhhMiwgYTIpKndldV8yICsgYyhiMiwgYjIpKndGZWR1Y19hXzINCiAgd2V1XzQgICB+IGMoYTMsIGEzKSp3ZXVfMyArIGMoYjMsIGIzKSp3RmVkdWNfYV8zDQogIHdldV81ICAgfiBjKGE0LCBhNCkqd2V1XzQgKyBjKGI0LCBiNCkqd0ZlZHVjX2FfNA0KICB3ZXVfNiAgIH4gYyhhNSwgYTUpKndldV81ICsgYyhiNSwgYjUpKndGZWR1Y19hXzUNCiAgd2V1XzcgICB+IGMoYTYsIGE2KSp3ZXVfNiArIGMoYjYsIGI2KSp3RmVkdWNfYV82DQogIHdldV84ICAgfiBjKGE3LCBhNykqd2V1XzcgKyBjKGI3LCBiNykqd0ZlZHVjX2FfNw0KICB3ZXVfOSAgIH4gYyhhOCwgYTgpKndldV84ICsgYyhiOCwgYjgpKndGZWR1Y19hXzgNCiAgd2V1XzEwICB+IGMoYTksIGE5KSp3ZXVfOSArIGMoYjksIGI5KSp3RmVkdWNfYV85DQogIHdldV8xMSAgfiBjKGExMCwgYTEwKSp3ZXVfMTAgKyBjKGIxMCwgYjEwKSp3RmVkdWNfYV8xMA0KICANCiAgDQogIHdGZWR1Y19hXzIgIH4gYyhjMSwgYzEpKndldV8xICsgYyhkMSwgZDEpKndGZWR1Y19hXzENCiAgd0ZlZHVjX2FfMyAgfiBjKGMyLCBjMikqd2V1XzIgKyBjKGQyLCBkMikqd0ZlZHVjX2FfMg0KICB3RmVkdWNfYV80ICB+IGMoYzMsIGMzKSp3ZXVfMyArIGMoZDMsIGQzKSp3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gYyhjNCwgYzQpKndldV80ICsgYyhkNCwgZDQpKndGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNiAgfiBjKGM1LCBjNSkqd2V1XzUgKyBjKGQ1LCBkNSkqd0ZlZHVjX2FfNQ0KICB3RmVkdWNfYV83ICB+IGMoYzYsIGM2KSp3ZXVfNiArIGMoZDYsIGQ2KSp3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gYyhjNywgYzcpKndldV83ICsgYyhkNywgZDcpKndGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOSAgfiBjKGM4LCBjOCkqd2V1XzggKyBjKGQ4LCBkOCkqd0ZlZHVjX2FfOA0KICB3RmVkdWNfYV8xMCAgfiBjKGM5LCBjOSkqd2V1XzkgKyBjKGQ5LCBkOSkqd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiBjKGMxMCwgYzEwKSp3ZXVfMTAgKyBjKGQxMCwgZDEwKSp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdldV8xIH5+IHdGZWR1Y19hXzEgIyBDb3ZhcmlhbmNlDQoNCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZXMgYmV0d2VlbiB0aGUgcmVzaWR1YWxzDQogIHdldV8yIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMg0KICB3ZXVfMyB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzMNCiAgd2V1XzQgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV80DQogIHdldV81IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNQ0KICB3ZXVfNiB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzYNCiAgd2V1Xzcgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV83DQogIHdldV84IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfOA0KICB3ZXVfOSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzkNCiAgd2V1XzEwIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMTANCiAgd2V1XzExIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3ZXVfMSB+fiB3ZXVfMSANCiAgd0ZlZHVjX2FfMSB+fiB3RmVkdWNfYV8xDQogIA0KICAjIEVzdGltYXRlIHRoZSByZXNpZHVhbCB2YXJpYW5jZQ0KICB3ZXVfMiB+fiBjKHZ5MSwgdnkyKSp3ZXVfMiANCiAgd0ZlZHVjX2FfMiB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8yDQogIHdldV8zIH5+IGModnkxLCB2eTIpKndldV8zDQogIHdGZWR1Y19hXzMgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMw0KICB3ZXVfNCB+fiBjKHZ5MSwgdnkyKSp3ZXVfNCANCiAgd0ZlZHVjX2FfNCB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV80DQogIHdldV81IH5+IGModnkxLCB2eTIpKndldV81DQogIHdGZWR1Y19hXzUgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNQ0KICB3ZXVfNiB+fiBjKHZ5MSwgdnkyKSp3ZXVfNiANCiAgd0ZlZHVjX2FfNiB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV82DQogIHdldV83IH5+IGModnkxLCB2eTIpKndldV83IA0KICB3RmVkdWNfYV83IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzcNCiAgd2V1Xzggfn4gYyh2eTEsIHZ5Mikqd2V1XzggDQogIHdGZWR1Y19hXzggfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfOA0KICB3ZXVfOSB+fiBjKHZ5MSwgdnkyKSp3ZXVfOSANCiAgd0ZlZHVjX2FfOSB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV85DQogIHdldV8xMCB+fiBjKHZ5MSwgdnkyKSp3ZXVfMTAgDQogIHdGZWR1Y19hXzEwIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzEwDQogIHdldV8xMSB+fiBjKHZ5MSwgdnkyKSp3ZXVfMTEgDQogIHdGZWR1Y19hXzExIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzEgKyAwKndldV8xDQoNCicNCg0KDQojY3JlYXRlIGFuZCBzdG9yZSBtb2RlbA0KI2NyZWF0ZSBmaWxlbmFtZQ0KZmlsZW5hbWUgPC0gZmlsZS5wYXRoKGRpciwgIkVVX21vZGVsNl9jb25zdHJhaW5lZF9ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZighZmlsZS5leGlzdHMoZmlsZW5hbWUpKXsNCkVVX21vZGVsNl9jb25zdHJhaW5lZF9ncm91cHNfZml0IDwtICNlc3RpbWF0ZSBtb2RlbA0KICBsYXZhYW4oDQogICAgRVVfbW9kZWw2X2NvbnN0cmFpbmVkX2dyb3VwcywNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJwb2xfZGlzY18yIg0KICApDQoNCiNzYXZlIG1vZGVsDQpzYXZlKEVVX21vZGVsNl9jb25zdHJhaW5lZF9ncm91cHNfZml0LA0KICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Ugew0KICBsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCg0KYGBgDQoNCg0KYGBge3IgRVUgbW9kZWwgNiB1bmNvbnN0cmFpbmVkIGdyb3VwcyBhbmQgY29uc3RyYWluZWQgbGFnc30NCkVVX21vZGVsNl91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcgPC0gJw0KDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSogRmVkdWNfYV8xICsgMSogRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+ICAxKmV1XzEgKyAxKmV1XzIgKyAxKmV1XzMgKyAxKmV1XzQgKyAxKmV1XzUgKyAxKmV1XzYgKyAxKmV1XzcgKyAxKmV1XzggKyAxKmV1XzkgKyAxKmV1XzEwICsgMSpldV8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQogIA0KICAjIFJlZ3Jlc3Npb24gb2YgcmFuZG9tIGludGVyY2VwdHMgb24gejENCiAgUkl4ICsgUkl5IH4gYmV0d2Vlbl9lZHVjICsgYmV0d2Vlbl9hZ2UgKyBiZXR3ZWVuX29yaWdpbiArIGJldHdlZW5fZmVtYWxlIyBDb25zdHJhaW5lZCBvdmVyIHRpbWUuDQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuICANCiAgRmVkdWNfYV8xIH5+IDAqRmVkdWNfYV8xDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4gDQogIHdGZWR1Y19hXzEgPX4gMSpGZWR1Y19hXzENCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgd2V1XzEgPX4gMSpldV8xDQogIHdldV8yID1+IDEqZXVfMg0KICB3ZXVfMyA9fiAxKmV1XzMNCiAgd2V1XzQgPX4gMSpldV80DQogIHdldV81ID1+IDEqZXVfNQ0KICB3ZXVfNiA9fiAxKmV1XzYNCiAgd2V1XzcgPX4gMSpldV83DQogIHdldV84ID1+IDEqZXVfOA0KICB3ZXVfOSA9fiAxKmV1XzkNCiAgd2V1XzEwID1+IDEqZXVfMTANCiAgd2V1XzExID1+IDEqZXVfMTEgDQogIA0KICAjIEVzdGltYXRlIHRoZSBsYWdnZWQgZWZmZWN0cyAoY29uc3RyYWluZWQpDQogIHdldV8yICAgfiBjKGExLCBhMikqd2V1XzEgKyBjKGIxLCBiMikqd0ZlZHVjX2FfMQ0KICB3ZXVfMyAgIH4gYyhhMSwgYTIpKndldV8yICsgYyhiMSwgYjIpKndGZWR1Y19hXzINCiAgd2V1XzQgICB+IGMoYTEsIGEyKSp3ZXVfMyArIGMoYjEsIGIyKSp3RmVkdWNfYV8zDQogIHdldV81ICAgfiBjKGExLCBhMikqd2V1XzQgKyBjKGIxLCBiMikqd0ZlZHVjX2FfNA0KICB3ZXVfNiAgIH4gYyhhMSwgYTIpKndldV81ICsgYyhiMSwgYjIpKndGZWR1Y19hXzUNCiAgd2V1XzcgICB+IGMoYTEsIGEyKSp3ZXVfNiArIGMoYjEsIGIyKSp3RmVkdWNfYV82DQogIHdldV84ICAgfiBjKGExLCBhMikqd2V1XzcgKyBjKGIxLCBiMikqd0ZlZHVjX2FfNw0KICB3ZXVfOSAgIH4gYyhhMSwgYTIpKndldV84ICsgYyhiMSwgYjIpKndGZWR1Y19hXzgNCiAgd2V1XzEwICB+IGMoYTEsIGEyKSp3ZXVfOSArIGMoYjEsIGIyKSp3RmVkdWNfYV85DQogIHdldV8xMSAgfiBjKGExLCBhMikqd2V1XzEwICsgYyhiMSwgYjIpKndGZWR1Y19hXzEwDQogIA0KICANCiAgd0ZlZHVjX2FfMiAgfiBjKGMxLCBjMikqd2V1XzEgKyBjKGQxLCBkMikqd0ZlZHVjX2FfMQ0KICB3RmVkdWNfYV8zICB+IGMoYzEsIGMyKSp3ZXVfMiArIGMoZDEsIGQyKSp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyhjMSwgYzIpKndldV8zICsgYyhkMSwgZDIpKndGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNSAgfiBjKGMxLCBjMikqd2V1XzQgKyBjKGQxLCBkMikqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMoYzEsIGMyKSp3ZXVfNSArIGMoZDEsIGQyKSp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyhjMSwgYzIpKndldV82ICsgYyhkMSwgZDIpKndGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfOCAgfiBjKGMxLCBjMikqd2V1XzcgKyBjKGQxLCBkMikqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMoYzEsIGMyKSp3ZXVfOCArIGMoZDEsIGQyKSp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMoYzEsIGMyKSp3ZXVfOSArIGMoZDEsIGQyKSp3RmVkdWNfYV85DQogIHdGZWR1Y19hXzExICB+IGMoYzEsIGMyKSp3ZXVfMTAgKyBjKGQxLCBkMikqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3ZXVfMSB+fiB3RmVkdWNfYV8xICMgQ292YXJpYW5jZQ0KDQogICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2V1XzIgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV8yDQogIHdldV8zIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMw0KICB3ZXVfNCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzQNCiAgd2V1XzUgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV81DQogIHdldV82IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNg0KICB3ZXVfNyB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzcNCiAgd2V1Xzggfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV84DQogIHdldV85IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfOQ0KICB3ZXVfMTAgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV8xMA0KICB3ZXVfMTEgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV8xMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgDQogIHdldV8xIH5+IHdldV8xIA0KICB3RmVkdWNfYV8xIH5+IHdGZWR1Y19hXzENCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdldV8yIH5+IGModnkxLCB2eTIpKndldV8yIA0KICB3RmVkdWNfYV8yIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzINCiAgd2V1XzMgfn4gYyh2eTEsIHZ5Mikqd2V1XzMNCiAgd0ZlZHVjX2FfMyB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8zDQogIHdldV80IH5+IGModnkxLCB2eTIpKndldV80IA0KICB3RmVkdWNfYV80IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzQNCiAgd2V1XzUgfn4gYyh2eTEsIHZ5Mikqd2V1XzUNCiAgd0ZlZHVjX2FfNSB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV81DQogIHdldV82IH5+IGModnkxLCB2eTIpKndldV82IA0KICB3RmVkdWNfYV82IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzYNCiAgd2V1Xzcgfn4gYyh2eTEsIHZ5Mikqd2V1XzcgDQogIHdGZWR1Y19hXzcgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNw0KICB3ZXVfOCB+fiBjKHZ5MSwgdnkyKSp3ZXVfOCANCiAgd0ZlZHVjX2FfOCB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV84DQogIHdldV85IH5+IGModnkxLCB2eTIpKndldV85IA0KICB3RmVkdWNfYV85IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzkNCiAgd2V1XzEwIH5+IGModnkxLCB2eTIpKndldV8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMTANCiAgd2V1XzExIH5+IGModnkxLCB2eTIpKndldV8xMSANCiAgd0ZlZHVjX2FfMTEgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMTENCiAgDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMgQURESVRJT05BTCBDT05TVFJBSU5UUyAjDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIFNldCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgYmV0d2Vlbi1mYWN0b3JzIChyYW5kb20gaW50ZXJjZXB0cykgYW5kIHdpdGhpbi0NCiAgIyBmYWN0b3JzIGF0IHdhdmUgMSBhdCAwLiANCiAgUkl4ICsgUkl5IH5+IDAqd0ZlZHVjX2FfMSArIDAqd2V1XzENCg0KJw0KDQojY3JlYXRlIGFuZCBzdG9yZSBtb2RlbA0KI2NyZWF0ZSBmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJFVV9tb2RlbDZfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCiAgRVVfbW9kZWw2X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQgPC0NCiAgICBsYXZhYW4oDQogICAgICBFVV9tb2RlbDZfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnLA0KICAgICAgZGF0YSA9IE15RGF0YSwNCiAgICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgICAgbWlzc2luZyA9ICdNTCcsDQogICAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICAgIGludC5vdi5mcmVlID0gVCwNCiAgICAgIGdyb3VwID0gInBvbF9kaXNjXzIiDQogICAgKQ0KICANCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShFVV9tb2RlbDZfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Ugew0KICAgIGxvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KDQpgYGANCg0KYGBge3IgZXUgbTYgY29uc3RyYWluZWQgZ3JvdXBzIGxhZ30NCiNjcmVhdGUgYW5kIHN0b3JlIG1vZGVsDQojY3JlYXRlIGZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgIkVVX21vZGVsNl9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCiAgRVVfbW9kZWw2X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0IDwtDQogICAgbGF2YWFuKA0KICAgICAgbWFpbl9sYXZhYW5fcmVzdWx0cyRgTGF2YWFuIG1vZGVsIG9iamVjdHNgW1sxXV1bWzJdXSwNCiAgICAgIGRhdGEgPSBNeURhdGEsDQogICAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgICBncm91cCA9ICJwb2xfZGlzY18yIg0KICAgICkNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShFVV9tb2RlbDZfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHsNCiAgbG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQpgYGANCg0KYGBge3IgZXUgbTYgbHJ0ZXN0fQ0KZml0X21hdHJpeF9FVV9tNl9jb25zdHJhaW5lZF9ncm91cHMgPC0gbGF2SW5zcGVjdChFVV9tb2RlbDZfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsIHdoYXQgPSAiZml0IikNCmZpdF9tYXRyaXhfRVVfbTZfdW5jb25zdHJhaW5lZF9ncm91cHMgPC0gbGF2SW5zcGVjdChFVV9tb2RlbDZfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCwgd2hhdCA9ICJmaXQiKQ0KDQpmaXRfbWF0cml4X2V1X002IDwtIHJiaW5kKGZpdF9tYXRyaXhfRVVfbTZfY29uc3RyYWluZWRfZ3JvdXBzLCBmaXRfbWF0cml4X0VVX202X3VuY29uc3RyYWluZWRfZ3JvdXBzKQ0KDQpsYXZUZXN0TFJUKEVVX21vZGVsNl9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwgRVVfbW9kZWw2X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQpDQoNCg0KYGBgDQoNCiMjIyBjdWx0dXJhbCBpbmNsdXNpb24NCg0KDQpgYGB7ciBjdWx0IG1vZGVsIDYgY29ucyAgZ3JvdXBzIHVuY29ucyBsYWdzfQ0KDQpjdWx0X21vZGVsNl9jb25zdHJhaW5lZF9ncm91cHMgPC0gJw0KDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSogRmVkdWNfYV8xICsgMSogRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+ICAxKmN1bHRfMSArIDEqY3VsdF8yICsgMSpjdWx0XzMgKyAxKmN1bHRfNCArIDEqY3VsdF81ICsgMSpjdWx0XzYgKyAxKmN1bHRfNyArIDEqY3VsdF84ICsgMSpjdWx0XzkgKyAxKmN1bHRfMTAgKyAxKmN1bHRfMTENCg0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSBhbmQgY292YXJpYW5jZSBvZiB0aGUgcmFuZG9tIGludGVyY2VwdHMuIA0KICBSSXggfn4gUkl4DQogIFJJeSB+fiBSSXkNCiAgUkl4IH5+IFJJeQ0KICANCiAgIyBSZWdyZXNzaW9uIG9mIHJhbmRvbSBpbnRlcmNlcHRzIG9uIHoxDQogIFJJeCArIFJJeSB+IGJldHdlZW5fZWR1YyArIGJldHdlZW5fYWdlICsgYmV0d2Vlbl9vcmlnaW4gKyBiZXR3ZWVuX2ZlbWFsZSMgQ29uc3RyYWluZWQgb3ZlciB0aW1lLg0KDQogICMgU2V0IHRoZSByZXNpZHVhbCB2YXJpYW5jZXMgb2YgYWxsIEZYIHZhcmlhYmxlcyB0byAwLiAgDQogIEZlZHVjX2FfMSB+fiAwKkZlZHVjX2FfMQ0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQoNCiAgIyMjIyMjIyMjIyMjIyMjDQogICMgV0lUSElOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAgIyBDcmVhdGUgd2l0aGluLXBlcnNvbiBjZW50ZXJlZCB2YXJpYWJsZXMuIA0KICB3RmVkdWNfYV8xID1+IDEqRmVkdWNfYV8xDQogIHdGZWR1Y19hXzIgPX4gMSpGZWR1Y19hXzINCiAgd0ZlZHVjX2FfMyA9fiAxKkZlZHVjX2FfMw0KICB3RmVkdWNfYV80ID1+IDEqRmVkdWNfYV80DQogIHdGZWR1Y19hXzUgPX4gMSpGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNiA9fiAxKkZlZHVjX2FfNg0KICB3RmVkdWNfYV83ID1+IDEqRmVkdWNfYV83DQogIHdGZWR1Y19hXzggPX4gMSpGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfOSA9fiAxKkZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMCA9fiAxKkZlZHVjX2FfMTANCiAgd0ZlZHVjX2FfMTEgPX4gMSpGZWR1Y19hXzExDQogIHdjdWx0XzEgPX4gMSpjdWx0XzENCiAgd2N1bHRfMiA9fiAxKmN1bHRfMg0KICB3Y3VsdF8zID1+IDEqY3VsdF8zDQogIHdjdWx0XzQgPX4gMSpjdWx0XzQNCiAgd2N1bHRfNSA9fiAxKmN1bHRfNQ0KICB3Y3VsdF82ID1+IDEqY3VsdF82DQogIHdjdWx0XzcgPX4gMSpjdWx0XzcNCiAgd2N1bHRfOCA9fiAxKmN1bHRfOA0KICB3Y3VsdF85ID1+IDEqY3VsdF85DQogIHdjdWx0XzEwID1+IDEqY3VsdF8xMA0KICB3Y3VsdF8xMSA9fiAxKmN1bHRfMTEgDQogIA0KICAjIEVzdGltYXRlIHRoZSBsYWdnZWQgZWZmZWN0cyAoY29uc3RyYWluZWQpDQogIHdjdWx0XzIgICB+IGMoYTEsIGExKSp3Y3VsdF8xICsgYyhiMSwgYjEpKndGZWR1Y19hXzENCiAgd2N1bHRfMyAgIH4gYyhhMiwgYTIpKndjdWx0XzIgKyBjKGIyLCBiMikqd0ZlZHVjX2FfMg0KICB3Y3VsdF80ICAgfiBjKGEzLCBhMykqd2N1bHRfMyArIGMoYjMsIGIzKSp3RmVkdWNfYV8zDQogIHdjdWx0XzUgICB+IGMoYTQsIGE0KSp3Y3VsdF80ICsgYyhiNCwgYjQpKndGZWR1Y19hXzQNCiAgd2N1bHRfNiAgIH4gYyhhNSwgYTUpKndjdWx0XzUgKyBjKGI1LCBiNSkqd0ZlZHVjX2FfNQ0KICB3Y3VsdF83ICAgfiBjKGE2LCBhNikqd2N1bHRfNiArIGMoYjYsIGI2KSp3RmVkdWNfYV82DQogIHdjdWx0XzggICB+IGMoYTcsIGE3KSp3Y3VsdF83ICsgYyhiNywgYjcpKndGZWR1Y19hXzcNCiAgd2N1bHRfOSAgIH4gYyhhOCwgYTgpKndjdWx0XzggKyBjKGI4LCBiOCkqd0ZlZHVjX2FfOA0KICB3Y3VsdF8xMCAgfiBjKGE5LCBhOSkqd2N1bHRfOSArIGMoYjksIGI5KSp3RmVkdWNfYV85DQogIHdjdWx0XzExICB+IGMoYTEwLCBhMTApKndjdWx0XzEwICsgYyhiMTAsIGIxMCkqd0ZlZHVjX2FfMTANCiAgDQogIA0KICB3RmVkdWNfYV8yICB+IGMoYzEsIGMxKSp3Y3VsdF8xICsgYyhkMSwgZDEpKndGZWR1Y19hXzENCiAgd0ZlZHVjX2FfMyAgfiBjKGMyLCBjMikqd2N1bHRfMiArIGMoZDIsIGQyKSp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyhjMywgYzMpKndjdWx0XzMgKyBjKGQzLCBkMykqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMoYzQsIGM0KSp3Y3VsdF80ICsgYyhkNCwgZDQpKndGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNiAgfiBjKGM1LCBjNSkqd2N1bHRfNSArIGMoZDUsIGQ1KSp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyhjNiwgYzYpKndjdWx0XzYgKyBjKGQ2LCBkNikqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMoYzcsIGM3KSp3Y3VsdF83ICsgYyhkNywgZDcpKndGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOSAgfiBjKGM4LCBjOCkqd2N1bHRfOCArIGMoZDgsIGQ4KSp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMoYzksIGM5KSp3Y3VsdF85ICsgYyhkOSwgZDkpKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyhjMTAsIGMxMCkqd2N1bHRfMTAgKyBjKGQxMCwgZDEwKSp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdjdWx0XzEgfn4gd0ZlZHVjX2FfMSAjIENvdmFyaWFuY2UNCg0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2N1bHRfMiB+fiBjb3Yqd0ZlZHVjX2FfMg0KICB3Y3VsdF8zIH5+IGNvdip3RmVkdWNfYV8zDQogIHdjdWx0XzQgfn4gY292KndGZWR1Y19hXzQNCiAgd2N1bHRfNSB+fiBjb3Yqd0ZlZHVjX2FfNQ0KICB3Y3VsdF82IH5+IGNvdip3RmVkdWNfYV82DQogIHdjdWx0Xzcgfn4gY292KndGZWR1Y19hXzcNCiAgd2N1bHRfOCB+fiBjb3Yqd0ZlZHVjX2FfOA0KICB3Y3VsdF85IH5+IGNvdip3RmVkdWNfYV85DQogIHdjdWx0XzEwIH5+IGNvdip3RmVkdWNfYV8xMA0KICB3Y3VsdF8xMSB+fiBjb3Yqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3Y3VsdF8xIH5+IHdjdWx0XzEgDQogIHdGZWR1Y19hXzEgfn4gd0ZlZHVjX2FfMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2N1bHRfMiB+fiB2eSp3Y3VsdF8yIA0KICB3RmVkdWNfYV8yIH5+IHZ4KndGZWR1Y19hXzINCiAgd2N1bHRfMyB+fiB2eSp3Y3VsdF8zDQogIHdGZWR1Y19hXzMgfn4gdngqd0ZlZHVjX2FfMw0KICB3Y3VsdF80IH5+IHZ5KndjdWx0XzQgDQogIHdGZWR1Y19hXzQgfn4gdngqd0ZlZHVjX2FfNA0KICB3Y3VsdF81IH5+IHZ5KndjdWx0XzUNCiAgd0ZlZHVjX2FfNSB+fiB2eCp3RmVkdWNfYV81DQogIHdjdWx0XzYgfn4gdnkqd2N1bHRfNiANCiAgd0ZlZHVjX2FfNiB+fiB2eCp3RmVkdWNfYV82DQogIHdjdWx0Xzcgfn4gdnkqd2N1bHRfNyANCiAgd0ZlZHVjX2FfNyB+fiB2eCp3RmVkdWNfYV83DQogIHdjdWx0Xzggfn4gdnkqd2N1bHRfOCANCiAgd0ZlZHVjX2FfOCB+fiB2eCp3RmVkdWNfYV84DQogIHdjdWx0Xzkgfn4gdnkqd2N1bHRfOSANCiAgd0ZlZHVjX2FfOSB+fiB2eCp3RmVkdWNfYV85DQogIHdjdWx0XzEwIH5+IHZ5KndjdWx0XzEwIA0KICB3RmVkdWNfYV8xMCB+fiB2eCp3RmVkdWNfYV8xMA0KICB3Y3VsdF8xMSB+fiB2eSp3Y3VsdF8xMSANCiAgd0ZlZHVjX2FfMTEgfn4gdngqd0ZlZHVjX2FfMTENCiAgDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMgQURESVRJT05BTCBDT05TVFJBSU5UUyAjDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIFNldCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgYmV0d2Vlbi1mYWN0b3JzIChyYW5kb20gaW50ZXJjZXB0cykgYW5kIHdpdGhpbi0NCiAgIyBmYWN0b3JzIGF0IHdhdmUgMSBhdCAwLiANCiAgUkl4ICsgUkl5IH5+IDAqd0ZlZHVjX2FfMSArIDAqd2N1bHRfMQ0KDQonDQoNCiNjcmVhdGUgYW5kIHN0b3JlIG1vZGVsDQojY3JlYXRlIGZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImN1bHRfbW9kZWw2X2NvbnN0cmFpbmVkX2dyb3Vwc19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQogIGN1bHRfbW9kZWw2X2NvbnN0cmFpbmVkX2dyb3Vwc19maXQgPC0NCiAgICBsYXZhYW4oDQogICAgICBjdWx0X21vZGVsNl9jb25zdHJhaW5lZF9ncm91cHMsDQogICAgICBkYXRhID0gTXlEYXRhLA0KICAgICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgICBtaXNzaW5nID0gJ01MJywNCiAgICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgICAgaW50Lm92LmZyZWUgPSBULA0KICAgICAgZ3JvdXAgPSAicG9sX2Rpc2NfMiINCiAgICApDQogICNzYXZlIG1vZGVsDQogIHNhdmUoY3VsdF9tb2RlbDZfY29uc3RyYWluZWRfZ3JvdXBzX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2V7DQogIGxvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KDQpgYGANCg0KDQpgYGB7ciBjdWx0IG1vZGVsIDYgdW5jb25zIGdyb3VwcyBhbmQgY29ucyBsYWdzfQ0KY3VsdF9tb2RlbDZfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnIDwtICcNCg0KICAjIyMjIyMjIyMjIyMjIyMjDQogICMgQkVUV0VFTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgIyBDcmVhdGUgYmV0d2VlbiBjb21wb25lbnRzIChyYW5kb20gaW50ZXJjZXB0cykNCiAgUkl4ID1+IDEqIEZlZHVjX2FfMSArIDEqIEZlZHVjX2FfMiArIDEqRmVkdWNfYV8zICsgMSpGZWR1Y19hXzQgKyAxKkZlZHVjX2FfNSArIDEqRmVkdWNfYV82ICsgMSpGZWR1Y19hXzcgKyAxKkZlZHVjX2FfOCArIDEqRmVkdWNfYV85ICsgMSpGZWR1Y19hXzEwICsgMSpGZWR1Y19hXzExDQogIFJJeSA9fiAgMSpjdWx0XzEgKyAxKmN1bHRfMiArIDEqY3VsdF8zICsgMSpjdWx0XzQgKyAxKmN1bHRfNSArIDEqY3VsdF82ICsgMSpjdWx0XzcgKyAxKmN1bHRfOCArIDEqY3VsdF85ICsgMSpjdWx0XzEwICsgMSpjdWx0XzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gIA0KICBGZWR1Y19hXzEgfn4gMCpGZWR1Y19hXzENCiAgRmVkdWNfYV8yIH5+IDAqRmVkdWNfYV8yDQogIEZlZHVjX2FfMyB+fiAwKkZlZHVjX2FfMw0KICBGZWR1Y19hXzQgfn4gMCpGZWR1Y19hXzQNCiAgRmVkdWNfYV81IH5+IDAqRmVkdWNfYV81DQogIEZlZHVjX2FfNiB+fiAwKkZlZHVjX2FfNg0KICBGZWR1Y19hXzcgfn4gMCpGZWR1Y19hXzcNCiAgRmVkdWNfYV84IH5+IDAqRmVkdWNfYV84DQogIEZlZHVjX2FfOSB+fiAwKkZlZHVjX2FfOQ0KICBGZWR1Y19hXzEwIH5+IDAqRmVkdWNfYV8xMA0KICBGZWR1Y19hXzExIH5+IDAqRmVkdWNfYV8xMQ0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMSA9fiAxKkZlZHVjX2FfMQ0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3Y3VsdF8xID1+IDEqY3VsdF8xDQogIHdjdWx0XzIgPX4gMSpjdWx0XzINCiAgd2N1bHRfMyA9fiAxKmN1bHRfMw0KICB3Y3VsdF80ID1+IDEqY3VsdF80DQogIHdjdWx0XzUgPX4gMSpjdWx0XzUNCiAgd2N1bHRfNiA9fiAxKmN1bHRfNg0KICB3Y3VsdF83ID1+IDEqY3VsdF83DQogIHdjdWx0XzggPX4gMSpjdWx0XzgNCiAgd2N1bHRfOSA9fiAxKmN1bHRfOQ0KICB3Y3VsdF8xMCA9fiAxKmN1bHRfMTANCiAgd2N1bHRfMTEgPX4gMSpjdWx0XzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3Y3VsdF8yICAgfiBjKGExLCBhMikqd2N1bHRfMSArIGMoYjEsIGIyKSp3RmVkdWNfYV8xDQogIHdjdWx0XzMgICB+IGMoYTEsIGEyKSp3Y3VsdF8yICsgYyhiMSwgYjIpKndGZWR1Y19hXzINCiAgd2N1bHRfNCAgIH4gYyhhMSwgYTIpKndjdWx0XzMgKyBjKGIxLCBiMikqd0ZlZHVjX2FfMw0KICB3Y3VsdF81ICAgfiBjKGExLCBhMikqd2N1bHRfNCArIGMoYjEsIGIyKSp3RmVkdWNfYV80DQogIHdjdWx0XzYgICB+IGMoYTEsIGEyKSp3Y3VsdF81ICsgYyhiMSwgYjIpKndGZWR1Y19hXzUNCiAgd2N1bHRfNyAgIH4gYyhhMSwgYTIpKndjdWx0XzYgKyBjKGIxLCBiMikqd0ZlZHVjX2FfNg0KICB3Y3VsdF84ICAgfiBjKGExLCBhMikqd2N1bHRfNyArIGMoYjEsIGIyKSp3RmVkdWNfYV83DQogIHdjdWx0XzkgICB+IGMoYTEsIGEyKSp3Y3VsdF84ICsgYyhiMSwgYjIpKndGZWR1Y19hXzgNCiAgd2N1bHRfMTAgIH4gYyhhMSwgYTIpKndjdWx0XzkgKyBjKGIxLCBiMikqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMSAgfiBjKGExLCBhMikqd2N1bHRfMTAgKyBjKGIxLCBiMikqd0ZlZHVjX2FfMTANCiAgDQogIA0KICB3RmVkdWNfYV8yICB+IGMoYzEsIGMyKSp3Y3VsdF8xICsgYyhkMSwgZDIpKndGZWR1Y19hXzENCiAgd0ZlZHVjX2FfMyAgfiBjKGMxLCBjMikqd2N1bHRfMiArIGMoZDEsIGQyKSp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyhjMSwgYzIpKndjdWx0XzMgKyBjKGQxLCBkMikqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMoYzEsIGMyKSp3Y3VsdF80ICsgYyhkMSwgZDIpKndGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNiAgfiBjKGMxLCBjMikqd2N1bHRfNSArIGMoZDEsIGQyKSp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyhjMSwgYzIpKndjdWx0XzYgKyBjKGQxLCBkMikqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMoYzEsIGMyKSp3Y3VsdF83ICsgYyhkMSwgZDIpKndGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOSAgfiBjKGMxLCBjMikqd2N1bHRfOCArIGMoZDEsIGQyKSp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMoYzEsIGMyKSp3Y3VsdF85ICsgYyhkMSwgZDIpKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyhjMSwgYzIpKndjdWx0XzEwICsgYyhkMSwgZDIpKndGZWR1Y19hXzEwDQogIA0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlIGF0IHRoZSBmaXJzdCB3YXZlLiANCiAgd2N1bHRfMSB+fiB3RmVkdWNfYV8xICMgQ292YXJpYW5jZQ0KDQogICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2N1bHRfMiB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzINCiAgd2N1bHRfMyB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzMNCiAgd2N1bHRfNCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzQNCiAgd2N1bHRfNSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzUNCiAgd2N1bHRfNiB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzYNCiAgd2N1bHRfNyB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzcNCiAgd2N1bHRfOCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzgNCiAgd2N1bHRfOSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzkNCiAgd2N1bHRfMTAgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV8xMA0KICB3Y3VsdF8xMSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2N1bHRfMSB+fiB3Y3VsdF8xIA0KICB3RmVkdWNfYV8xIH5+IHdGZWR1Y19hXzENCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdjdWx0XzIgfn4gYyh2eTEsIHZ5Mikqd2N1bHRfMiANCiAgd0ZlZHVjX2FfMiB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8yDQogIHdjdWx0XzMgfn4gYyh2eTEsIHZ5Mikqd2N1bHRfMw0KICB3RmVkdWNfYV8zIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzMNCiAgd2N1bHRfNCB+fiBjKHZ5MSwgdnkyKSp3Y3VsdF80IA0KICB3RmVkdWNfYV80IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzQNCiAgd2N1bHRfNSB+fiBjKHZ5MSwgdnkyKSp3Y3VsdF81DQogIHdGZWR1Y19hXzUgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNQ0KICB3Y3VsdF82IH5+IGModnkxLCB2eTIpKndjdWx0XzYgDQogIHdGZWR1Y19hXzYgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNg0KICB3Y3VsdF83IH5+IGModnkxLCB2eTIpKndjdWx0XzcgDQogIHdGZWR1Y19hXzcgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNw0KICB3Y3VsdF84IH5+IGModnkxLCB2eTIpKndjdWx0XzggDQogIHdGZWR1Y19hXzggfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfOA0KICB3Y3VsdF85IH5+IGModnkxLCB2eTIpKndjdWx0XzkgDQogIHdGZWR1Y19hXzkgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMCB+fiBjKHZ5MSwgdnkyKSp3Y3VsdF8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMTANCiAgd2N1bHRfMTEgfn4gYyh2eTEsIHZ5Mikqd2N1bHRfMTEgDQogIHdGZWR1Y19hXzExIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzEgKyAwKndjdWx0XzENCg0KDQonDQoNCiNjcmVhdGUgYW5kIHN0b3JlIG1vZGVsDQojY3JlYXRlIGZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImN1bHRfbW9kZWw2X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQogIGN1bHRfbW9kZWw2X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQgPC0NCiAgICBsYXZhYW4oDQogICAgICBjdWx0X21vZGVsNl91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcsDQogICAgICBkYXRhID0gTXlEYXRhLA0KICAgICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgICBtaXNzaW5nID0gJ01MJywNCiAgICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgICAgaW50Lm92LmZyZWUgPSBULA0KICAgICAgZ3JvdXAgPSAicG9sX2Rpc2NfMiINCiAgICApDQogICNzYXZlIG1vZGVsDQogIHNhdmUoY3VsdF9tb2RlbDZfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Ugew0KICBsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCiAgfQ0KDQpgYGANCg0KYGBge3IgY3VsdCBtNiBjb25zdHJhaW5lZCBncm91cHMgbGFnfQ0KI2NyZWF0ZSBhbmQgc3RvcmUgbW9kZWwNCiNjcmVhdGUgZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiY3VsdF9tb2RlbDZfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQogIGN1bHRfbW9kZWw2X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0IDwtDQogICAgbGF2YWFuKA0KICAgICAgbWFpbl9sYXZhYW5fcmVzdWx0cyRgTGF2YWFuIG1vZGVsIG9iamVjdHNgW1syXV1bWzJdXSwNCiAgICAgIGRhdGEgPSBNeURhdGEsDQogICAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgICBncm91cCA9ICJwb2xfZGlzY18yIg0KICAgICkNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShjdWx0X21vZGVsNl9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2V7DQogIGxvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KYGBgDQoNCmBgYHtyIGN1bHQgbTYgbHJ0ZXN0fQ0KZml0X21hdHJpeF9jdWx0X202X2NvbnN0cmFpbmVkX2dyb3VwcyA8LSBsYXZJbnNwZWN0KGN1bHRfbW9kZWw2X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LCB3aGF0ID0gImZpdCIpDQpmaXRfbWF0cml4X2N1bHRfbTZfdW5jb25zdHJhaW5lZF9ncm91cHMgPC0gbGF2SW5zcGVjdChjdWx0X21vZGVsNl91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0LCB3aGF0ID0gImZpdCIpDQoNCmZpdF9tYXRyaXhfY3VsdF9NMSA8LSByYmluZChmaXRfbWF0cml4X2N1bHRfbTZfY29uc3RyYWluZWRfZ3JvdXBzLCBmaXRfbWF0cml4X2N1bHRfbTZfdW5jb25zdHJhaW5lZF9ncm91cHMpDQoNCmxhdlRlc3RMUlQoY3VsdF9tb2RlbDZfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsIGN1bHRfbW9kZWw2X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQpDQpgYGANCg0KIyMjIGluY29tZSBkaWZmZXJlbmNlcw0KDQpgYGB7ciBpbmNfZGlmZiBtb2RlbCA2IGNvbnN0IGdyb3VwcyB1bmNvbnN0IGxhZ3N9DQoNCmluY19kaWZmX21vZGVsNl9jb25zdHJhaW5lZF9ncm91cHMgPC0gJw0KDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSogRmVkdWNfYV8xICsgMSogRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+ICAxKmluY19kaWZmXzEgKyAxKmluY19kaWZmXzIgKyAxKmluY19kaWZmXzMgKyAxKmluY19kaWZmXzQgKyAxKmluY19kaWZmXzUgKyAxKmluY19kaWZmXzYgKyAxKmluY19kaWZmXzcgKyAxKmluY19kaWZmXzggKyAxKmluY19kaWZmXzkgKyAxKmluY19kaWZmXzEwICsgMSppbmNfZGlmZl8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQogIA0KICAjIFJlZ3Jlc3Npb24gb2YgcmFuZG9tIGludGVyY2VwdHMgb24gejENCiAgUkl4ICsgUkl5IH4gYmV0d2Vlbl9lZHVjICsgYmV0d2Vlbl9hZ2UgKyBiZXR3ZWVuX29yaWdpbiArIGJldHdlZW5fZmVtYWxlIyBDb25zdHJhaW5lZCBvdmVyIHRpbWUuDQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuICANCiAgRmVkdWNfYV8xIH5+IDAqRmVkdWNfYV8xDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4gDQogIHdGZWR1Y19hXzEgPX4gMSpGZWR1Y19hXzENCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgd2luY19kaWZmXzEgPX4gMSppbmNfZGlmZl8xDQogIHdpbmNfZGlmZl8yID1+IDEqaW5jX2RpZmZfMg0KICB3aW5jX2RpZmZfMyA9fiAxKmluY19kaWZmXzMNCiAgd2luY19kaWZmXzQgPX4gMSppbmNfZGlmZl80DQogIHdpbmNfZGlmZl81ID1+IDEqaW5jX2RpZmZfNQ0KICB3aW5jX2RpZmZfNiA9fiAxKmluY19kaWZmXzYNCiAgd2luY19kaWZmXzcgPX4gMSppbmNfZGlmZl83DQogIHdpbmNfZGlmZl84ID1+IDEqaW5jX2RpZmZfOA0KICB3aW5jX2RpZmZfOSA9fiAxKmluY19kaWZmXzkNCiAgd2luY19kaWZmXzEwID1+IDEqaW5jX2RpZmZfMTANCiAgd2luY19kaWZmXzExID1+IDEqaW5jX2RpZmZfMTEgDQogIA0KICAjIEVzdGltYXRlIHRoZSBsYWdnZWQgZWZmZWN0cyAoY29uc3RyYWluZWQpDQogIHdpbmNfZGlmZl8yICAgfiBjKGExLCBhMSkqd2luY19kaWZmXzEgKyBjKGIxLCBiMSkqd0ZlZHVjX2FfMQ0KICB3aW5jX2RpZmZfMyAgIH4gYyhhMiwgYTIpKndpbmNfZGlmZl8yICsgYyhiMiwgYjIpKndGZWR1Y19hXzINCiAgd2luY19kaWZmXzQgICB+IGMoYTMsIGEzKSp3aW5jX2RpZmZfMyArIGMoYjMsIGIzKSp3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl81ICAgfiBjKGE0LCBhNCkqd2luY19kaWZmXzQgKyBjKGI0LCBiNCkqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNiAgIH4gYyhhNSwgYTUpKndpbmNfZGlmZl81ICsgYyhiNSwgYjUpKndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzcgICB+IGMoYTYsIGE2KSp3aW5jX2RpZmZfNiArIGMoYjYsIGI2KSp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl84ICAgfiBjKGE3LCBhNykqd2luY19kaWZmXzcgKyBjKGI3LCBiNykqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOSAgIH4gYyhhOCwgYTgpKndpbmNfZGlmZl84ICsgYyhiOCwgYjgpKndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzEwICB+IGMoYTksIGE5KSp3aW5jX2RpZmZfOSArIGMoYjksIGI5KSp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMSAgfiBjKGExMCwgYTEwKSp3aW5jX2RpZmZfMTAgKyBjKGIxMCwgYjEwKSp3RmVkdWNfYV8xMA0KICANCiAgDQogIHdGZWR1Y19hXzIgIH4gYyhjMSwgYzEpKndpbmNfZGlmZl8xICsgYyhkMSwgZDEpKndGZWR1Y19hXzENCiAgd0ZlZHVjX2FfMyAgfiBjKGMyLCBjMikqd2luY19kaWZmXzIgKyBjKGQyLCBkMikqd0ZlZHVjX2FfMg0KICB3RmVkdWNfYV80ICB+IGMoYzMsIGMzKSp3aW5jX2RpZmZfMyArIGMoZDMsIGQzKSp3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gYyhjNCwgYzQpKndpbmNfZGlmZl80ICsgYyhkNCwgZDQpKndGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNiAgfiBjKGM1LCBjNSkqd2luY19kaWZmXzUgKyBjKGQ1LCBkNSkqd0ZlZHVjX2FfNQ0KICB3RmVkdWNfYV83ICB+IGMoYzYsIGM2KSp3aW5jX2RpZmZfNiArIGMoZDYsIGQ2KSp3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gYyhjNywgYzcpKndpbmNfZGlmZl83ICsgYyhkNywgZDcpKndGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOSAgfiBjKGM4LCBjOCkqd2luY19kaWZmXzggKyBjKGQ4LCBkOCkqd0ZlZHVjX2FfOA0KICB3RmVkdWNfYV8xMCAgfiBjKGM5LCBjOSkqd2luY19kaWZmXzkgKyBjKGQ5LCBkOSkqd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiBjKGMxMCwgYzEwKSp3aW5jX2RpZmZfMTAgKyBjKGQxMCwgZDEwKSp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdpbmNfZGlmZl8xIH5+IHdGZWR1Y19hXzEgIyBDb3ZhcmlhbmNlDQoNCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZXMgYmV0d2VlbiB0aGUgcmVzaWR1YWxzDQogIHdpbmNfZGlmZl8yIH5+IGNvdip3RmVkdWNfYV8yDQogIHdpbmNfZGlmZl8zIH5+IGNvdip3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl80IH5+IGNvdip3RmVkdWNfYV80DQogIHdpbmNfZGlmZl81IH5+IGNvdip3RmVkdWNfYV81DQogIHdpbmNfZGlmZl82IH5+IGNvdip3RmVkdWNfYV82DQogIHdpbmNfZGlmZl83IH5+IGNvdip3RmVkdWNfYV83DQogIHdpbmNfZGlmZl84IH5+IGNvdip3RmVkdWNfYV84DQogIHdpbmNfZGlmZl85IH5+IGNvdip3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMCB+fiBjb3Yqd0ZlZHVjX2FfMTANCiAgd2luY19kaWZmXzExIH5+IGNvdip3RmVkdWNfYV8xMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgDQogIHdpbmNfZGlmZl8xIH5+IHdpbmNfZGlmZl8xIA0KICB3RmVkdWNfYV8xIH5+IHdGZWR1Y19hXzENCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdpbmNfZGlmZl8yIH5+IHZ5KndpbmNfZGlmZl8yIA0KICB3RmVkdWNfYV8yIH5+IHZ4KndGZWR1Y19hXzINCiAgd2luY19kaWZmXzMgfn4gdnkqd2luY19kaWZmXzMNCiAgd0ZlZHVjX2FfMyB+fiB2eCp3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl80IH5+IHZ5KndpbmNfZGlmZl80IA0KICB3RmVkdWNfYV80IH5+IHZ4KndGZWR1Y19hXzQNCiAgd2luY19kaWZmXzUgfn4gdnkqd2luY19kaWZmXzUNCiAgd0ZlZHVjX2FfNSB+fiB2eCp3RmVkdWNfYV81DQogIHdpbmNfZGlmZl82IH5+IHZ5KndpbmNfZGlmZl82IA0KICB3RmVkdWNfYV82IH5+IHZ4KndGZWR1Y19hXzYNCiAgd2luY19kaWZmXzcgfn4gdnkqd2luY19kaWZmXzcgDQogIHdGZWR1Y19hXzcgfn4gdngqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOCB+fiB2eSp3aW5jX2RpZmZfOCANCiAgd0ZlZHVjX2FfOCB+fiB2eCp3RmVkdWNfYV84DQogIHdpbmNfZGlmZl85IH5+IHZ5KndpbmNfZGlmZl85IA0KICB3RmVkdWNfYV85IH5+IHZ4KndGZWR1Y19hXzkNCiAgd2luY19kaWZmXzEwIH5+IHZ5KndpbmNfZGlmZl8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gdngqd0ZlZHVjX2FfMTANCiAgd2luY19kaWZmXzExIH5+IHZ5KndpbmNfZGlmZl8xMSANCiAgd0ZlZHVjX2FfMTEgfn4gdngqd0ZlZHVjX2FfMTENCiAgDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMgQURESVRJT05BTCBDT05TVFJBSU5UUyAjDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIFNldCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgYmV0d2Vlbi1mYWN0b3JzIChyYW5kb20gaW50ZXJjZXB0cykgYW5kIHdpdGhpbi0NCiAgIyBmYWN0b3JzIGF0IHdhdmUgMSBhdCAwLiANCiAgUkl4ICsgUkl5IH5+IDAqd0ZlZHVjX2FfMSArIDAqd2luY19kaWZmXzENCg0KJw0KI2NyZWF0ZSBhbmQgc3RvcmUgbW9kZWwNCiNjcmVhdGUgZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiaW5jX2RpZmZfbW9kZWw2X2NvbnN0cmFpbmVkX2dyb3Vwc19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQogIGluY19kaWZmX21vZGVsNl9jb25zdHJhaW5lZF9ncm91cHNfZml0IDwtDQogICAgbGF2YWFuKA0KICAgICAgaW5jX2RpZmZfbW9kZWw2X2NvbnN0cmFpbmVkX2dyb3VwcywNCiAgICAgIGRhdGEgPSBNeURhdGEsDQogICAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgICBncm91cCA9ICJwb2xfZGlzY18yIg0KICAgICkNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShpbmNfZGlmZl9tb2RlbDZfY29uc3RyYWluZWRfZ3JvdXBzX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Ugew0KICAgIGxvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KDQpgYGANCg0KDQpgYGB7ciBpbmNfZGlmZiBtb2RlbCA2IHVuY29uc3QgZ3JvdXBzIGFuZCBjb25zdCBsYWdzfQ0KaW5jX2RpZmZfbW9kZWw2X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZyA8LSAnDQoNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAxKiBGZWR1Y19hXzEgKyAxKiBGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqaW5jX2RpZmZfMSArIDEqaW5jX2RpZmZfMiArIDEqaW5jX2RpZmZfMyArIDEqaW5jX2RpZmZfNCArIDEqaW5jX2RpZmZfNSArIDEqaW5jX2RpZmZfNiArIDEqaW5jX2RpZmZfNyArIDEqaW5jX2RpZmZfOCArIDEqaW5jX2RpZmZfOSArIDEqaW5jX2RpZmZfMTAgKyAxKmluY19kaWZmXzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gIA0KICBGZWR1Y19hXzEgfn4gMCpGZWR1Y19hXzENCiAgRmVkdWNfYV8yIH5+IDAqRmVkdWNfYV8yDQogIEZlZHVjX2FfMyB+fiAwKkZlZHVjX2FfMw0KICBGZWR1Y19hXzQgfn4gMCpGZWR1Y19hXzQNCiAgRmVkdWNfYV81IH5+IDAqRmVkdWNfYV81DQogIEZlZHVjX2FfNiB+fiAwKkZlZHVjX2FfNg0KICBGZWR1Y19hXzcgfn4gMCpGZWR1Y19hXzcNCiAgRmVkdWNfYV84IH5+IDAqRmVkdWNfYV84DQogIEZlZHVjX2FfOSB+fiAwKkZlZHVjX2FfOQ0KICBGZWR1Y19hXzEwIH5+IDAqRmVkdWNfYV8xMA0KICBGZWR1Y19hXzExIH5+IDAqRmVkdWNfYV8xMQ0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMSA9fiAxKkZlZHVjX2FfMQ0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3aW5jX2RpZmZfMSA9fiAxKmluY19kaWZmXzENCiAgd2luY19kaWZmXzIgPX4gMSppbmNfZGlmZl8yDQogIHdpbmNfZGlmZl8zID1+IDEqaW5jX2RpZmZfMw0KICB3aW5jX2RpZmZfNCA9fiAxKmluY19kaWZmXzQNCiAgd2luY19kaWZmXzUgPX4gMSppbmNfZGlmZl81DQogIHdpbmNfZGlmZl82ID1+IDEqaW5jX2RpZmZfNg0KICB3aW5jX2RpZmZfNyA9fiAxKmluY19kaWZmXzcNCiAgd2luY19kaWZmXzggPX4gMSppbmNfZGlmZl84DQogIHdpbmNfZGlmZl85ID1+IDEqaW5jX2RpZmZfOQ0KICB3aW5jX2RpZmZfMTAgPX4gMSppbmNfZGlmZl8xMA0KICB3aW5jX2RpZmZfMTEgPX4gMSppbmNfZGlmZl8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2luY19kaWZmXzIgICB+IGMoYTEsIGEyKSp3aW5jX2RpZmZfMSArIGMoYjEsIGIyKSp3RmVkdWNfYV8xDQogIHdpbmNfZGlmZl8zICAgfiBjKGExLCBhMikqd2luY19kaWZmXzIgKyBjKGIxLCBiMikqd0ZlZHVjX2FfMg0KICB3aW5jX2RpZmZfNCAgIH4gYyhhMSwgYTIpKndpbmNfZGlmZl8zICsgYyhiMSwgYjIpKndGZWR1Y19hXzMNCiAgd2luY19kaWZmXzUgICB+IGMoYTEsIGEyKSp3aW5jX2RpZmZfNCArIGMoYjEsIGIyKSp3RmVkdWNfYV80DQogIHdpbmNfZGlmZl82ICAgfiBjKGExLCBhMikqd2luY19kaWZmXzUgKyBjKGIxLCBiMikqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNyAgIH4gYyhhMSwgYTIpKndpbmNfZGlmZl82ICsgYyhiMSwgYjIpKndGZWR1Y19hXzYNCiAgd2luY19kaWZmXzggICB+IGMoYTEsIGEyKSp3aW5jX2RpZmZfNyArIGMoYjEsIGIyKSp3RmVkdWNfYV83DQogIHdpbmNfZGlmZl85ICAgfiBjKGExLCBhMikqd2luY19kaWZmXzggKyBjKGIxLCBiMikqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfMTAgIH4gYyhhMSwgYTIpKndpbmNfZGlmZl85ICsgYyhiMSwgYjIpKndGZWR1Y19hXzkNCiAgd2luY19kaWZmXzExICB+IGMoYTEsIGEyKSp3aW5jX2RpZmZfMTAgKyBjKGIxLCBiMikqd0ZlZHVjX2FfMTANCiAgDQogIA0KICB3RmVkdWNfYV8yICB+IGMoYzEsIGMyKSp3aW5jX2RpZmZfMSArIGMoZDEsIGQyKSp3RmVkdWNfYV8xDQogIHdGZWR1Y19hXzMgIH4gYyhjMSwgYzIpKndpbmNfZGlmZl8yICsgYyhkMSwgZDIpKndGZWR1Y19hXzINCiAgd0ZlZHVjX2FfNCAgfiBjKGMxLCBjMikqd2luY19kaWZmXzMgKyBjKGQxLCBkMikqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMoYzEsIGMyKSp3aW5jX2RpZmZfNCArIGMoZDEsIGQyKSp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyhjMSwgYzIpKndpbmNfZGlmZl81ICsgYyhkMSwgZDIpKndGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNyAgfiBjKGMxLCBjMikqd2luY19kaWZmXzYgKyBjKGQxLCBkMikqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMoYzEsIGMyKSp3aW5jX2RpZmZfNyArIGMoZDEsIGQyKSp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyhjMSwgYzIpKndpbmNfZGlmZl84ICsgYyhkMSwgZDIpKndGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfMTAgIH4gYyhjMSwgYzIpKndpbmNfZGlmZl85ICsgYyhkMSwgZDIpKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyhjMSwgYzIpKndpbmNfZGlmZl8xMCArIGMoZDEsIGQyKSp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdpbmNfZGlmZl8xIH5+IHdGZWR1Y19hXzEgIyBDb3ZhcmlhbmNlDQoNCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZXMgYmV0d2VlbiB0aGUgcmVzaWR1YWxzDQogIHdpbmNfZGlmZl8yIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMg0KICB3aW5jX2RpZmZfMyB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzMNCiAgd2luY19kaWZmXzQgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV80DQogIHdpbmNfZGlmZl81IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNiB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzYNCiAgd2luY19kaWZmXzcgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV83DQogIHdpbmNfZGlmZl84IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfOSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzkNCiAgd2luY19kaWZmXzEwIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMTANCiAgd2luY19kaWZmXzExIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3aW5jX2RpZmZfMSB+fiB3aW5jX2RpZmZfMSANCiAgd0ZlZHVjX2FfMSB+fiB3RmVkdWNfYV8xDQogIA0KICAjIEVzdGltYXRlIHRoZSByZXNpZHVhbCB2YXJpYW5jZQ0KICB3aW5jX2RpZmZfMiB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfMiANCiAgd0ZlZHVjX2FfMiB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8yDQogIHdpbmNfZGlmZl8zIH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl8zDQogIHdGZWR1Y19hXzMgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNCB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfNCANCiAgd0ZlZHVjX2FfNCB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV80DQogIHdpbmNfZGlmZl81IH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl81DQogIHdGZWR1Y19hXzUgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNiB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfNiANCiAgd0ZlZHVjX2FfNiB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl83IH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl83IA0KICB3RmVkdWNfYV83IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzcNCiAgd2luY19kaWZmXzggfn4gYyh2eTEsIHZ5Mikqd2luY19kaWZmXzggDQogIHdGZWR1Y19hXzggfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfOSB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfOSANCiAgd0ZlZHVjX2FfOSB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMCB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfMTAgDQogIHdGZWR1Y19hXzEwIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzEwDQogIHdpbmNfZGlmZl8xMSB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfMTEgDQogIHdGZWR1Y19hXzExIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzEgKyAwKndpbmNfZGlmZl8xDQoNCicNCiNjcmVhdGUgYW5kIHN0b3JlIG1vZGVsDQojY3JlYXRlIGZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImluY19kaWZmX21vZGVsNl91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KICBpbmNfZGlmZl9tb2RlbDZfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCA8LQ0KICAgIGxhdmFhbigNCiAgICAgIGluY19kaWZmX21vZGVsNl91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcsDQogICAgICBkYXRhID0gTXlEYXRhLA0KICAgICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgICBtaXNzaW5nID0gJ01MJywNCiAgICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgICAgaW50Lm92LmZyZWUgPSBULA0KICAgICAgZ3JvdXAgPSAicG9sX2Rpc2NfMiINCiAgICApDQogICNzYXZlIG1vZGVsDQogIHNhdmUoaW5jX2RpZmZfbW9kZWw2X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlDQogIChsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCiAgIA0KICApDQoNCmBgYA0KDQpgYGB7ciBpbmNfZGlmZiBtNiBjb25zdHJhaW5lZCBncm91cHMgbGFnfQ0KI2NyZWF0ZSBhbmQgc3RvcmUgbW9kZWwNCiNjcmVhdGUgZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiaW5jX2RpZmZfbW9kZWw2X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KICBpbmNfZGlmZl9tb2RlbDZfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQgPC0NCiAgICBsYXZhYW4oDQogICAgICBtYWluX2xhdmFhbl9yZXN1bHRzJGBMYXZhYW4gbW9kZWwgb2JqZWN0c2BbWzNdXVtbMl1dLA0KICAgICAgZGF0YSA9IE15RGF0YSwNCiAgICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgICAgbWlzc2luZyA9ICdNTCcsDQogICAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICAgIGludC5vdi5mcmVlID0gVCwNCiAgICAgIGdyb3VwID0gInBvbF9kaXNjXzIiDQogICAgKQ0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKGluY19kaWZmX21vZGVsNl9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Ugew0KICBsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBpbmNfZGlmZiBtNiBscnRlc3R9DQpmaXRfbWF0cml4X2luY19kaWZmX202X2NvbnN0cmFpbmVkX2dyb3VwcyA8LSBsYXZJbnNwZWN0KGluY19kaWZmX21vZGVsNl9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwgd2hhdCA9ICJmaXQiKQ0KZml0X21hdHJpeF9pbmNfZGlmZl9tNl91bmNvbnN0cmFpbmVkX2dyb3VwcyA8LSBsYXZJbnNwZWN0KGluY19kaWZmX21vZGVsNl91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0LCB3aGF0ID0gImZpdCIpDQoNCmZpdF9tYXRyaXhfaW5jX2RpZmZfTTEgPC0gcmJpbmQoZml0X21hdHJpeF9pbmNfZGlmZl9tNl9jb25zdHJhaW5lZF9ncm91cHMsIGZpdF9tYXRyaXhfaW5jX2RpZmZfbTZfdW5jb25zdHJhaW5lZF9ncm91cHMpDQoNCmxhdlRlc3RMUlQoaW5jX2RpZmZfbW9kZWw2X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LCBpbmNfZGlmZl9tb2RlbDZfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCkNCmBgYA0KDQojIyBOZXduZXNzDQoNCmBgYHtyIGNyZWF0ZSBiZXR3ZWVuIHZhcmlhYmxlc25ld25lc3N9DQojY3JlYXRlIGJldHdlZW4gbGV2ZWwgdmFyaWFibGUNCk15RGF0YSA8LSBNeURhdGEgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKHJsX21lYW4gPSBtZWFuKGNfYWNyb3NzKHN0YXJ0c193aXRoKCJGcmwiKSksIG5hLnJtID0gVCkpICU+JQ0KICB1bmdyb3VwKCkNCg0KI2NyZWF0ZSBncm91cHMNCk15RGF0YSA8LSBNeURhdGEgJT4lDQogIG11dGF0ZShybF9yZWMgPSBjdXQyKHJsX21lYW4sIGcgPSA1KSwNCiAgICAgICAgIHJsXzIgPSBjdXQyKHJsX21lYW4sIGcgPSAyKSkNCg0KYGBgDQoNCiMjIyBFVSBpbnRlZ3JhdGlvbg0KDQpgYGB7ciBldSBtb2RlbCA3IGNvbnN0cmFpbmVkIGdyb3VwcyB1bmNvbnN0cmFpbmVkIGxhZ3N9DQoNCkVVX21vZGVsN19jb25zdHJhaW5lZF9ncm91cHMgPC0gJw0KDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSogRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+IDEqZXVfMiArIDEqZXVfMyArIDEqZXVfNCArIDEqZXVfNSArIDEqZXVfNiArIDEqZXVfNyArIDEqZXVfOCArIDEqZXVfOSArIDEqZXVfMTAgKyAxKmV1XzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gIA0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQoNCiAgIyMjIyMjIyMjIyMjIyMjDQogICMgV0lUSElOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAgIyBDcmVhdGUgd2l0aGluLXBlcnNvbiBjZW50ZXJlZCB2YXJpYWJsZXMuIA0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3ZXVfMiA9fiAxKmV1XzINCiAgd2V1XzMgPX4gMSpldV8zDQogIHdldV80ID1+IDEqZXVfNA0KICB3ZXVfNSA9fiAxKmV1XzUNCiAgd2V1XzYgPX4gMSpldV82DQogIHdldV83ID1+IDEqZXVfNw0KICB3ZXVfOCA9fiAxKmV1XzgNCiAgd2V1XzkgPX4gMSpldV85DQogIHdldV8xMCA9fiAxKmV1XzEwDQogIHdldV8xMSA9fiAxKmV1XzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3ZXVfMyAgIH4gYyhhMiwgYTIpKndldV8yICsgYyhiMiwgYjIpKndGZWR1Y19hXzINCiAgd2V1XzQgICB+IGMoYTMsIGEzKSp3ZXVfMyArIGMoYjMsIGIzKSp3RmVkdWNfYV8zDQogIHdldV81ICAgfiBjKGE0LCBhNCkqd2V1XzQgKyBjKGI0LCBiNCkqd0ZlZHVjX2FfNA0KICB3ZXVfNiAgIH4gYyhhNSwgYTUpKndldV81ICsgYyhiNSwgYjUpKndGZWR1Y19hXzUNCiAgd2V1XzcgICB+IGMoYTYsIGE2KSp3ZXVfNiArIGMoYjYsIGI2KSp3RmVkdWNfYV82DQogIHdldV84ICAgfiBjKGE3LCBhNykqd2V1XzcgKyBjKGI3LCBiNykqd0ZlZHVjX2FfNw0KICB3ZXVfOSAgIH4gYyhhOCwgYTgpKndldV84ICsgYyhiOCwgYjgpKndGZWR1Y19hXzgNCiAgd2V1XzEwICB+IGMoYTksIGE5KSp3ZXVfOSArIGMoYjksIGI5KSp3RmVkdWNfYV85DQogIHdldV8xMSAgfiBjKGExMCwgYTEwKSp3ZXVfMTAgKyBjKGIxMCwgYjEwKSp3RmVkdWNfYV8xMA0KICANCiAgDQogIHdGZWR1Y19hXzMgIH4gYyhjMiwgYzIpKndldV8yICsgYyhkMiwgZDIpKndGZWR1Y19hXzINCiAgd0ZlZHVjX2FfNCAgfiBjKGMzLCBjMykqd2V1XzMgKyBjKGQzLCBkMykqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMoYzQsIGM0KSp3ZXVfNCArIGMoZDQsIGQ0KSp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyhjNSwgYzUpKndldV81ICsgYyhkNSwgZDUpKndGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNyAgfiBjKGM2LCBjNikqd2V1XzYgKyBjKGQ2LCBkNikqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMoYzcsIGM3KSp3ZXVfNyArIGMoZDcsIGQ3KSp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyhjOCwgYzgpKndldV84ICsgYyhkOCwgZDgpKndGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfMTAgIH4gYyhjOSwgYzkpKndldV85ICsgYyhkOSwgZDkpKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyhjMTAsIGMxMCkqd2V1XzEwICsgYyhkMTAsIGQxMCkqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3ZXVfMiB+fiB3RmVkdWNfYV8yICMgQ292YXJpYW5jZQ0KDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3ZXVfMyB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzMNCiAgd2V1XzQgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV80DQogIHdldV81IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNQ0KICB3ZXVfNiB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzYNCiAgd2V1Xzcgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV83DQogIHdldV84IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfOA0KICB3ZXVfOSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzkNCiAgd2V1XzEwIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMTANCiAgd2V1XzExIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3ZXVfMiB+fiB3ZXVfMiANCiAgd0ZlZHVjX2FfMiB+fiB3RmVkdWNfYV8yDQogIA0KICAjIEVzdGltYXRlIHRoZSByZXNpZHVhbCB2YXJpYW5jZQ0KICB3ZXVfMyB+fiBjKHZ5MSwgdnkyKSp3ZXVfMw0KICB3RmVkdWNfYV8zIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzMNCiAgd2V1XzQgfn4gYyh2eTEsIHZ5Mikqd2V1XzQgDQogIHdGZWR1Y19hXzQgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNA0KICB3ZXVfNSB+fiBjKHZ5MSwgdnkyKSp3ZXVfNQ0KICB3RmVkdWNfYV81IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzUNCiAgd2V1XzYgfn4gYyh2eTEsIHZ5Mikqd2V1XzYgDQogIHdGZWR1Y19hXzYgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNg0KICB3ZXVfNyB+fiBjKHZ5MSwgdnkyKSp3ZXVfNyANCiAgd0ZlZHVjX2FfNyB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV83DQogIHdldV84IH5+IGModnkxLCB2eTIpKndldV84IA0KICB3RmVkdWNfYV84IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzgNCiAgd2V1Xzkgfn4gYyh2eTEsIHZ5Mikqd2V1XzkgDQogIHdGZWR1Y19hXzkgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfOQ0KICB3ZXVfMTAgfn4gYyh2eTEsIHZ5Mikqd2V1XzEwIA0KICB3RmVkdWNfYV8xMCB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8xMA0KICB3ZXVfMTEgfn4gYyh2eTEsIHZ5Mikqd2V1XzExIA0KICB3RmVkdWNfYV8xMSB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8xMQ0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8yICsgMCp3ZXVfMg0KDQonDQoNCiNjcmVhdGUgYW5kIHN0b3JlIG1vZGVsDQojY3JlYXRlIGZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgIkVVX21vZGVsN19jb25zdHJhaW5lZF9ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KICBFVV9tb2RlbDdfY29uc3RyYWluZWRfZ3JvdXBzX2ZpdCA8LQ0KICAgIGxhdmFhbigNCiAgICAgIEVVX21vZGVsN19jb25zdHJhaW5lZF9ncm91cHMsDQogICAgICBkYXRhID0gTXlEYXRhLA0KICAgICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgICBtaXNzaW5nID0gJ01MJywNCiAgICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgICAgaW50Lm92LmZyZWUgPSBULA0KICAgICAgZ3JvdXAgPSAicmxfMiINCiAgICApDQogICNzYXZlIG1vZGVsDQogIHNhdmUoRVVfbW9kZWw3X2NvbnN0cmFpbmVkX2dyb3Vwc19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHsNCiAgbG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQoNCmBgYA0KDQoNCmBgYHtyIEVVIG1vZGVsIDcgdW5jb25zdCBncm91cHMgYW5kIGNvbnN0IGxhZ3N9DQpFVV9tb2RlbDdfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnIDwtICcNCg0KICAjIyMjIyMjIyMjIyMjIyMjDQogICMgQkVUV0VFTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgIyBDcmVhdGUgYmV0d2VlbiBjb21wb25lbnRzIChyYW5kb20gaW50ZXJjZXB0cykNCiAgUkl4ID1+IDEqIEZlZHVjX2FfMiArIDEqRmVkdWNfYV8zICsgMSpGZWR1Y19hXzQgKyAxKkZlZHVjX2FfNSArIDEqRmVkdWNfYV82ICsgMSpGZWR1Y19hXzcgKyAxKkZlZHVjX2FfOCArIDEqRmVkdWNfYV85ICsgMSpGZWR1Y19hXzEwICsgMSpGZWR1Y19hXzExDQogIFJJeSA9fiAgMSpldV8yICsgMSpldV8zICsgMSpldV80ICsgMSpldV81ICsgMSpldV82ICsgMSpldV83ICsgMSpldV84ICsgMSpldV85ICsgMSpldV8xMCArIDEqZXVfMTENCg0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSBhbmQgY292YXJpYW5jZSBvZiB0aGUgcmFuZG9tIGludGVyY2VwdHMuIA0KICBSSXggfn4gUkl4DQogIFJJeSB+fiBSSXkNCiAgUkl4IH5+IFJJeQ0KICANCiAgIyBSZWdyZXNzaW9uIG9mIHJhbmRvbSBpbnRlcmNlcHRzIG9uIHoxDQogIFJJeCArIFJJeSB+IGJldHdlZW5fZWR1YyArIGJldHdlZW5fYWdlICsgYmV0d2Vlbl9vcmlnaW4gKyBiZXR3ZWVuX2ZlbWFsZSMgQ29uc3RyYWluZWQgb3ZlciB0aW1lLg0KDQogICMgU2V0IHRoZSByZXNpZHVhbCB2YXJpYW5jZXMgb2YgYWxsIEZYIHZhcmlhYmxlcyB0byAwLiANCiAgRmVkdWNfYV8yIH5+IDAqRmVkdWNfYV8yDQogIEZlZHVjX2FfMyB+fiAwKkZlZHVjX2FfMw0KICBGZWR1Y19hXzQgfn4gMCpGZWR1Y19hXzQNCiAgRmVkdWNfYV81IH5+IDAqRmVkdWNfYV81DQogIEZlZHVjX2FfNiB+fiAwKkZlZHVjX2FfNg0KICBGZWR1Y19hXzcgfn4gMCpGZWR1Y19hXzcNCiAgRmVkdWNfYV84IH5+IDAqRmVkdWNfYV84DQogIEZlZHVjX2FfOSB+fiAwKkZlZHVjX2FfOQ0KICBGZWR1Y19hXzEwIH5+IDAqRmVkdWNfYV8xMA0KICBGZWR1Y19hXzExIH5+IDAqRmVkdWNfYV8xMQ0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgDQogIHdldV8yID1+IDEqZXVfMg0KICB3ZXVfMyA9fiAxKmV1XzMNCiAgd2V1XzQgPX4gMSpldV80DQogIHdldV81ID1+IDEqZXVfNQ0KICB3ZXVfNiA9fiAxKmV1XzYNCiAgd2V1XzcgPX4gMSpldV83DQogIHdldV84ID1+IDEqZXVfOA0KICB3ZXVfOSA9fiAxKmV1XzkNCiAgd2V1XzEwID1+IDEqZXVfMTANCiAgd2V1XzExID1+IDEqZXVfMTEgDQogIA0KICAjIEVzdGltYXRlIHRoZSBsYWdnZWQgZWZmZWN0cyAoY29uc3RyYWluZWQpDQogIHdldV8zICAgfiBjKGExLCBhMikqd2V1XzIgKyBjKGIxLCBiMikqd0ZlZHVjX2FfMg0KICB3ZXVfNCAgIH4gYyhhMSwgYTIpKndldV8zICsgYyhiMSwgYjIpKndGZWR1Y19hXzMNCiAgd2V1XzUgICB+IGMoYTEsIGEyKSp3ZXVfNCArIGMoYjEsIGIyKSp3RmVkdWNfYV80DQogIHdldV82ICAgfiBjKGExLCBhMikqd2V1XzUgKyBjKGIxLCBiMikqd0ZlZHVjX2FfNQ0KICB3ZXVfNyAgIH4gYyhhMSwgYTIpKndldV82ICsgYyhiMSwgYjIpKndGZWR1Y19hXzYNCiAgd2V1XzggICB+IGMoYTEsIGEyKSp3ZXVfNyArIGMoYjEsIGIyKSp3RmVkdWNfYV83DQogIHdldV85ICAgfiBjKGExLCBhMikqd2V1XzggKyBjKGIxLCBiMikqd0ZlZHVjX2FfOA0KICB3ZXVfMTAgIH4gYyhhMSwgYTIpKndldV85ICsgYyhiMSwgYjIpKndGZWR1Y19hXzkNCiAgd2V1XzExICB+IGMoYTEsIGEyKSp3ZXVfMTAgKyBjKGIxLCBiMikqd0ZlZHVjX2FfMTANCiAgDQogIHdGZWR1Y19hXzMgIH4gYyhjMSwgYzIpKndldV8yICsgYyhkMSwgZDIpKndGZWR1Y19hXzINCiAgd0ZlZHVjX2FfNCAgfiBjKGMxLCBjMikqd2V1XzMgKyBjKGQxLCBkMikqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMoYzEsIGMyKSp3ZXVfNCArIGMoZDEsIGQyKSp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyhjMSwgYzIpKndldV81ICsgYyhkMSwgZDIpKndGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNyAgfiBjKGMxLCBjMikqd2V1XzYgKyBjKGQxLCBkMikqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMoYzEsIGMyKSp3ZXVfNyArIGMoZDEsIGQyKSp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyhjMSwgYzIpKndldV84ICsgYyhkMSwgZDIpKndGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfMTAgIH4gYyhjMSwgYzIpKndldV85ICsgYyhkMSwgZDIpKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyhjMSwgYzIpKndldV8xMCArIGMoZDEsIGQyKSp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdldV8yIH5+IHdGZWR1Y19hXzIgIyBDb3ZhcmlhbmNlDQoNCiAgICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3ZXVfMyB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzMNCiAgd2V1XzQgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV80DQogIHdldV81IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNQ0KICB3ZXVfNiB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzYNCiAgd2V1Xzcgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV83DQogIHdldV84IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfOA0KICB3ZXVfOSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzkNCiAgd2V1XzEwIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMTANCiAgd2V1XzExIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3ZXVfMiB+fiB3ZXVfMiANCiAgd0ZlZHVjX2FfMiB+fiB3RmVkdWNfYV8yDQogIA0KICAjIEVzdGltYXRlIHRoZSByZXNpZHVhbCB2YXJpYW5jZQ0KICB3ZXVfMyB+fiBjKHZ5MSwgdnkyKSp3ZXVfMw0KICB3RmVkdWNfYV8zIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzMNCiAgd2V1XzQgfn4gYyh2eTEsIHZ5Mikqd2V1XzQgDQogIHdGZWR1Y19hXzQgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNA0KICB3ZXVfNSB+fiBjKHZ5MSwgdnkyKSp3ZXVfNQ0KICB3RmVkdWNfYV81IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzUNCiAgd2V1XzYgfn4gYyh2eTEsIHZ5Mikqd2V1XzYgDQogIHdGZWR1Y19hXzYgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNg0KICB3ZXVfNyB+fiBjKHZ5MSwgdnkyKSp3ZXVfNyANCiAgd0ZlZHVjX2FfNyB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV83DQogIHdldV84IH5+IGModnkxLCB2eTIpKndldV84IA0KICB3RmVkdWNfYV84IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzgNCiAgd2V1Xzkgfn4gYyh2eTEsIHZ5Mikqd2V1XzkgDQogIHdGZWR1Y19hXzkgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfOQ0KICB3ZXVfMTAgfn4gYyh2eTEsIHZ5Mikqd2V1XzEwIA0KICB3RmVkdWNfYV8xMCB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8xMA0KICB3ZXVfMTEgfn4gYyh2eTEsIHZ5Mikqd2V1XzExIA0KICB3RmVkdWNfYV8xMSB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8xMQ0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8yICsgMCp3ZXVfMg0KDQonDQoNCiNjcmVhdGUgYW5kIHN0b3JlIG1vZGVsDQojY3JlYXRlIGZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgIkVVX21vZGVsN191bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KICBFVV9tb2RlbDdfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCA8LQ0KICAgIGxhdmFhbigNCiAgICAgIEVVX21vZGVsN191bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcsDQogICAgICBkYXRhID0gTXlEYXRhLA0KICAgICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgICBtaXNzaW5nID0gJ01MJywNCiAgICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgICAgaW50Lm92LmZyZWUgPSBULA0KICAgICAgZ3JvdXAgPSAicmxfMiINCiAgICApDQogICNzYXZlIG1vZGVsDQogIHNhdmUoRVVfbW9kZWw3X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHsNCiAgbG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQpgYGANCg0KYGBge3IgZXUgbTcgY29uc3RyYWluZWQgZ3JvdXBzIGxhZ30NCkVVX21vZGVsN19jb25zdHJhaW5lZF9sYWdfZ3JvdXBzIDwtICcNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAxKiBGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gMSpldV8yICsgMSpldV8zICsgMSpldV80ICsgMSpldV81ICsgMSpldV82ICsgMSpldV83ICsgMSpldV84ICsgMSpldV85ICsgMSpldV8xMCArIDEqZXVfMTENCg0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSBhbmQgY292YXJpYW5jZSBvZiB0aGUgcmFuZG9tIGludGVyY2VwdHMuIA0KICBSSXggfn4gUkl4DQogIFJJeSB+fiBSSXkNCiAgUkl4IH5+IFJJeQ0KICANCiAgIyBSZWdyZXNzaW9uIG9mIHJhbmRvbSBpbnRlcmNlcHRzIG9uIHoxDQogIFJJeCArIFJJeSB+IGJldHdlZW5fZWR1YyArIGJldHdlZW5fYWdlICsgYmV0d2Vlbl9vcmlnaW4gKyBiZXR3ZWVuX2ZlbWFsZSMgQ29uc3RyYWluZWQgb3ZlciB0aW1lLg0KDQogICMgU2V0IHRoZSByZXNpZHVhbCB2YXJpYW5jZXMgb2YgYWxsIEZYIHZhcmlhYmxlcyB0byAwLg0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQoNCiAgIyMjIyMjIyMjIyMjIyMjDQogICMgV0lUSElOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAgIyBDcmVhdGUgd2l0aGluLXBlcnNvbiBjZW50ZXJlZCB2YXJpYWJsZXMuIA0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3ZXVfMiA9fiAxKmV1XzINCiAgd2V1XzMgPX4gMSpldV8zDQogIHdldV80ID1+IDEqZXVfNA0KICB3ZXVfNSA9fiAxKmV1XzUNCiAgd2V1XzYgPX4gMSpldV82DQogIHdldV83ID1+IDEqZXVfNw0KICB3ZXVfOCA9fiAxKmV1XzgNCiAgd2V1XzkgPX4gMSpldV85DQogIHdldV8xMCA9fiAxKmV1XzEwDQogIHdldV8xMSA9fiAxKmV1XzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3ZXVfMyAgIH4gYSp3ZXVfMiArIGIqd0ZlZHVjX2FfMg0KICB3ZXVfNCAgIH4gYSp3ZXVfMyArIGIqd0ZlZHVjX2FfMw0KICB3ZXVfNSAgIH4gYSp3ZXVfNCArIGIqd0ZlZHVjX2FfNA0KICB3ZXVfNiAgIH4gYSp3ZXVfNSArIGIqd0ZlZHVjX2FfNQ0KICB3ZXVfNyAgIH4gYSp3ZXVfNiArIGIqd0ZlZHVjX2FfNg0KICB3ZXVfOCAgIH4gYSp3ZXVfNyArIGIqd0ZlZHVjX2FfNw0KICB3ZXVfOSAgIH4gYSp3ZXVfOCArIGIqd0ZlZHVjX2FfOA0KICB3ZXVfMTAgIH4gYSp3ZXVfOSArIGIqd0ZlZHVjX2FfOQ0KICB3ZXVfMTEgIH4gYSp3ZXVfMTAgKyBiKndGZWR1Y19hXzEwDQogIA0KICB3RmVkdWNfYV8zICB+IGMqd2V1XzIgKyBkKndGZWR1Y19hXzINCiAgd0ZlZHVjX2FfNCAgfiBjKndldV8zICsgZCp3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gYyp3ZXVfNCArIGQqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMqd2V1XzUgKyBkKndGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNyAgfiBjKndldV82ICsgZCp3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gYyp3ZXVfNyArIGQqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMqd2V1XzggKyBkKndGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfMTAgIH4gYyp3ZXVfOSArIGQqd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiBjKndldV8xMCArIGQqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3ZXVfMiB+fiB3RmVkdWNfYV8yICMgQ292YXJpYW5jZQ0KDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3ZXVfMyB+fiBjb3Yqd0ZlZHVjX2FfMw0KICB3ZXVfNCB+fiBjb3Yqd0ZlZHVjX2FfNA0KICB3ZXVfNSB+fiBjb3Yqd0ZlZHVjX2FfNQ0KICB3ZXVfNiB+fiBjb3Yqd0ZlZHVjX2FfNg0KICB3ZXVfNyB+fiBjb3Yqd0ZlZHVjX2FfNw0KICB3ZXVfOCB+fiBjb3Yqd0ZlZHVjX2FfOA0KICB3ZXVfOSB+fiBjb3Yqd0ZlZHVjX2FfOQ0KICB3ZXVfMTAgfn4gY292KndGZWR1Y19hXzEwDQogIHdldV8xMSB+fiBjb3Yqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3ZXVfMiB+fiB3ZXVfMiANCiAgd0ZlZHVjX2FfMiB+fiB3RmVkdWNfYV8yDQogIA0KICAjIEVzdGltYXRlIHRoZSByZXNpZHVhbCB2YXJpYW5jZQ0KICB3ZXVfMyB+fiB2eSp3ZXVfMw0KICB3RmVkdWNfYV8zIH5+IHZ4KndGZWR1Y19hXzMNCiAgd2V1XzQgfn4gdnkqd2V1XzQgDQogIHdGZWR1Y19hXzQgfn4gdngqd0ZlZHVjX2FfNA0KICB3ZXVfNSB+fiB2eSp3ZXVfNQ0KICB3RmVkdWNfYV81IH5+IHZ4KndGZWR1Y19hXzUNCiAgd2V1XzYgfn4gdnkqd2V1XzYgDQogIHdGZWR1Y19hXzYgfn4gdngqd0ZlZHVjX2FfNg0KICB3ZXVfNyB+fiB2eSp3ZXVfNyANCiAgd0ZlZHVjX2FfNyB+fiB2eCp3RmVkdWNfYV83DQogIHdldV84IH5+IHZ5KndldV84IA0KICB3RmVkdWNfYV84IH5+IHZ4KndGZWR1Y19hXzgNCiAgd2V1Xzkgfn4gdnkqd2V1XzkgDQogIHdGZWR1Y19hXzkgfn4gdngqd0ZlZHVjX2FfOQ0KICB3ZXVfMTAgfn4gdnkqd2V1XzEwIA0KICB3RmVkdWNfYV8xMCB+fiB2eCp3RmVkdWNfYV8xMA0KICB3ZXVfMTEgfn4gdnkqd2V1XzExIA0KICB3RmVkdWNfYV8xMSB+fiB2eCp3RmVkdWNfYV8xMQ0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8yICsgMCp3ZXVfMg0KDQonDQoNCiNjcmVhdGUgYW5kIHN0b3JlIG1vZGVsDQojY3JlYXRlIGZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgIkVVX21vZGVsN19jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCiAgRVVfbW9kZWw3X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0IDwtDQogICAgbGF2YWFuKA0KICAgICAgRVVfbW9kZWw3X2NvbnN0cmFpbmVkX2xhZ19ncm91cHMsDQogICAgICBkYXRhID0gTXlEYXRhLA0KICAgICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgICBtaXNzaW5nID0gJ01MJywNCiAgICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgICAgaW50Lm92LmZyZWUgPSBULA0KICAgICAgZ3JvdXAgPSAicmxfMiINCiAgICApDQogICNzYXZlIG1vZGVsDQogIHNhdmUoRVVfbW9kZWw3X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZSB7DQogIGxvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KYGBgDQoNCmBgYHtyIGV1IG03IGxyTXlEYXRhfQ0KZml0X21hdHJpeF9FVV9tN19jb25zdHJhaW5lZF9ncm91cHMgPC0gbGF2SW5zcGVjdChFVV9tb2RlbDdfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsIHdoYXQgPSAiZml0IikNCmZpdF9tYXRyaXhfRVVfbTdfdW5jb25zdHJhaW5lZF9ncm91cHMgPC0gbGF2SW5zcGVjdChFVV9tb2RlbDdfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCwgd2hhdCA9ICJmaXQiKQ0KDQpmaXRfbWF0cml4X2V1X00xIDwtIHJiaW5kKGZpdF9tYXRyaXhfRVVfbTdfY29uc3RyYWluZWRfZ3JvdXBzLCBmaXRfbWF0cml4X0VVX203X3VuY29uc3RyYWluZWRfZ3JvdXBzKQ0KDQpsYXZUZXN0TFJUKEVVX21vZGVsN19jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwgRVVfbW9kZWw3X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQpDQoNCg0KYGBgDQoNCiMjIyBjdWx0dXJhbCBpbmNsdXNpb24NCg0KDQpgYGB7ciBjdWx0IG1vZGVsIDcgY29uc3QgZ3JvdXBzIHVuY29uIGxhZ3N9DQoNCmN1bHRfbW9kZWw3X2NvbnN0cmFpbmVkX2dyb3VwcyA8LSAnDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSogRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+IDEqY3VsdF8yICsgMSpjdWx0XzMgKyAxKmN1bHRfNCArIDEqY3VsdF81ICsgMSpjdWx0XzYgKyAxKmN1bHRfNyArIDEqY3VsdF84ICsgMSpjdWx0XzkgKyAxKmN1bHRfMTAgKyAxKmN1bHRfMTENCg0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSBhbmQgY292YXJpYW5jZSBvZiB0aGUgcmFuZG9tIGludGVyY2VwdHMuIA0KICBSSXggfn4gUkl4DQogIFJJeSB+fiBSSXkNCiAgUkl4IH5+IFJJeQ0KICANCiAgIyBSZWdyZXNzaW9uIG9mIHJhbmRvbSBpbnRlcmNlcHRzIG9uIHoxDQogIFJJeCArIFJJeSB+IGJldHdlZW5fZWR1YyArIGJldHdlZW5fYWdlICsgYmV0d2Vlbl9vcmlnaW4gKyBiZXR3ZWVuX2ZlbWFsZSMgQ29uc3RyYWluZWQgb3ZlciB0aW1lLg0KDQogICMgU2V0IHRoZSByZXNpZHVhbCB2YXJpYW5jZXMgb2YgYWxsIEZYIHZhcmlhYmxlcyB0byAwLiAgDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4gDQogIHdGZWR1Y19hXzIgPX4gMSpGZWR1Y19hXzINCiAgd0ZlZHVjX2FfMyA9fiAxKkZlZHVjX2FfMw0KICB3RmVkdWNfYV80ID1+IDEqRmVkdWNfYV80DQogIHdGZWR1Y19hXzUgPX4gMSpGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNiA9fiAxKkZlZHVjX2FfNg0KICB3RmVkdWNfYV83ID1+IDEqRmVkdWNfYV83DQogIHdGZWR1Y19hXzggPX4gMSpGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfOSA9fiAxKkZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMCA9fiAxKkZlZHVjX2FfMTANCiAgd0ZlZHVjX2FfMTEgPX4gMSpGZWR1Y19hXzExDQogIHdjdWx0XzIgPX4gMSpjdWx0XzINCiAgd2N1bHRfMyA9fiAxKmN1bHRfMw0KICB3Y3VsdF80ID1+IDEqY3VsdF80DQogIHdjdWx0XzUgPX4gMSpjdWx0XzUNCiAgd2N1bHRfNiA9fiAxKmN1bHRfNg0KICB3Y3VsdF83ID1+IDEqY3VsdF83DQogIHdjdWx0XzggPX4gMSpjdWx0XzgNCiAgd2N1bHRfOSA9fiAxKmN1bHRfOQ0KICB3Y3VsdF8xMCA9fiAxKmN1bHRfMTANCiAgd2N1bHRfMTEgPX4gMSpjdWx0XzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3Y3VsdF8zICAgfiBjKGEyLCBhMikqd2N1bHRfMiArIGMoYjIsIGIyKSp3RmVkdWNfYV8yDQogIHdjdWx0XzQgICB+IGMoYTMsIGEzKSp3Y3VsdF8zICsgYyhiMywgYjMpKndGZWR1Y19hXzMNCiAgd2N1bHRfNSAgIH4gYyhhNCwgYTQpKndjdWx0XzQgKyBjKGI0LCBiNCkqd0ZlZHVjX2FfNA0KICB3Y3VsdF82ICAgfiBjKGE1LCBhNSkqd2N1bHRfNSArIGMoYjUsIGI1KSp3RmVkdWNfYV81DQogIHdjdWx0XzcgICB+IGMoYTYsIGE2KSp3Y3VsdF82ICsgYyhiNiwgYjYpKndGZWR1Y19hXzYNCiAgd2N1bHRfOCAgIH4gYyhhNywgYTcpKndjdWx0XzcgKyBjKGI3LCBiNykqd0ZlZHVjX2FfNw0KICB3Y3VsdF85ICAgfiBjKGE4LCBhOCkqd2N1bHRfOCArIGMoYjgsIGI4KSp3RmVkdWNfYV84DQogIHdjdWx0XzEwICB+IGMoYTksIGE5KSp3Y3VsdF85ICsgYyhiOSwgYjkpKndGZWR1Y19hXzkNCiAgd2N1bHRfMTEgIH4gYyhhMTAsIGExMCkqd2N1bHRfMTAgKyBjKGIxMCwgYjEwKSp3RmVkdWNfYV8xMA0KICANCiAgDQogIHdGZWR1Y19hXzMgIH4gYyhjMiwgYzIpKndjdWx0XzIgKyBjKGQyLCBkMikqd0ZlZHVjX2FfMg0KICB3RmVkdWNfYV80ICB+IGMoYzMsIGMzKSp3Y3VsdF8zICsgYyhkMywgZDMpKndGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNSAgfiBjKGM0LCBjNCkqd2N1bHRfNCArIGMoZDQsIGQ0KSp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyhjNSwgYzUpKndjdWx0XzUgKyBjKGQ1LCBkNSkqd0ZlZHVjX2FfNQ0KICB3RmVkdWNfYV83ICB+IGMoYzYsIGM2KSp3Y3VsdF82ICsgYyhkNiwgZDYpKndGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfOCAgfiBjKGM3LCBjNykqd2N1bHRfNyArIGMoZDcsIGQ3KSp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyhjOCwgYzgpKndjdWx0XzggKyBjKGQ4LCBkOCkqd0ZlZHVjX2FfOA0KICB3RmVkdWNfYV8xMCAgfiBjKGM5LCBjOSkqd2N1bHRfOSArIGMoZDksIGQ5KSp3RmVkdWNfYV85DQogIHdGZWR1Y19hXzExICB+IGMoYzEwLCBjMTApKndjdWx0XzEwICsgYyhkMTAsIGQxMCkqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3Y3VsdF8yIH5+IHdGZWR1Y19hXzIgIyBDb3ZhcmlhbmNlDQoNCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZXMgYmV0d2VlbiB0aGUgcmVzaWR1YWxzDQogIHdjdWx0XzMgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV8zDQogIHdjdWx0XzQgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV80DQogIHdjdWx0XzUgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV81DQogIHdjdWx0XzYgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV82DQogIHdjdWx0Xzcgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV83DQogIHdjdWx0Xzggfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV84DQogIHdjdWx0Xzkgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV85DQogIHdjdWx0XzEwIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMTANCiAgd2N1bHRfMTEgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV8xMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgDQogIHdjdWx0XzIgfn4gd2N1bHRfMiANCiAgd0ZlZHVjX2FfMiB+fiB3RmVkdWNfYV8yDQogIA0KICAjIEVzdGltYXRlIHRoZSByZXNpZHVhbCB2YXJpYW5jZQ0KICB3Y3VsdF8zIH5+IGModnkxLCB2eTIpKndjdWx0XzMNCiAgd0ZlZHVjX2FfMyB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8zDQogIHdjdWx0XzQgfn4gYyh2eTEsIHZ5Mikqd2N1bHRfNCANCiAgd0ZlZHVjX2FfNCB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV80DQogIHdjdWx0XzUgfn4gYyh2eTEsIHZ5Mikqd2N1bHRfNQ0KICB3RmVkdWNfYV81IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzUNCiAgd2N1bHRfNiB+fiBjKHZ5MSwgdnkyKSp3Y3VsdF82IA0KICB3RmVkdWNfYV82IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzYNCiAgd2N1bHRfNyB+fiBjKHZ5MSwgdnkyKSp3Y3VsdF83IA0KICB3RmVkdWNfYV83IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzcNCiAgd2N1bHRfOCB+fiBjKHZ5MSwgdnkyKSp3Y3VsdF84IA0KICB3RmVkdWNfYV84IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzgNCiAgd2N1bHRfOSB+fiBjKHZ5MSwgdnkyKSp3Y3VsdF85IA0KICB3RmVkdWNfYV85IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzkNCiAgd2N1bHRfMTAgfn4gYyh2eTEsIHZ5Mikqd2N1bHRfMTAgDQogIHdGZWR1Y19hXzEwIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzEwDQogIHdjdWx0XzExIH5+IGModnkxLCB2eTIpKndjdWx0XzExIA0KICB3RmVkdWNfYV8xMSB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8xMQ0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8yICsgMCp3Y3VsdF8yDQoNCicNCiNjcmVhdGUgYW5kIHN0b3JlIG1vZGVsDQojY3JlYXRlIGZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImN1bHRfbW9kZWw3X2NvbnN0cmFpbmVkX2dyb3Vwc19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQpjdWx0X21vZGVsN19jb25zdHJhaW5lZF9ncm91cHNfZml0IDwtDQogIGxhdmFhbigNCiAgICBjdWx0X21vZGVsN19jb25zdHJhaW5lZF9ncm91cHMsDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAicmxfMiINCiAgKQ0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKGN1bHRfbW9kZWw3X2NvbnN0cmFpbmVkX2dyb3Vwc19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHsNCiAgbG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQoNCmBgYA0KDQoNCmBgYHtyIGN1bHQgbW9kZWwgNyB1bmNvbnN0IGdyb3VwcyBhbmQgY29uc3QgbGFnc30NCmN1bHRfbW9kZWw3X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZyA8LSAnDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSogRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+ICAxKmN1bHRfMiArIDEqY3VsdF8zICsgMSpjdWx0XzQgKyAxKmN1bHRfNSArIDEqY3VsdF82ICsgMSpjdWx0XzcgKyAxKmN1bHRfOCArIDEqY3VsdF85ICsgMSpjdWx0XzEwICsgMSpjdWx0XzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4gDQogIHdGZWR1Y19hXzIgPX4gMSpGZWR1Y19hXzINCiAgd0ZlZHVjX2FfMyA9fiAxKkZlZHVjX2FfMw0KICB3RmVkdWNfYV80ID1+IDEqRmVkdWNfYV80DQogIHdGZWR1Y19hXzUgPX4gMSpGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNiA9fiAxKkZlZHVjX2FfNg0KICB3RmVkdWNfYV83ID1+IDEqRmVkdWNfYV83DQogIHdGZWR1Y19hXzggPX4gMSpGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfOSA9fiAxKkZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMCA9fiAxKkZlZHVjX2FfMTANCiAgd0ZlZHVjX2FfMTEgPX4gMSpGZWR1Y19hXzExDQogIA0KICB3Y3VsdF8yID1+IDEqY3VsdF8yDQogIHdjdWx0XzMgPX4gMSpjdWx0XzMNCiAgd2N1bHRfNCA9fiAxKmN1bHRfNA0KICB3Y3VsdF81ID1+IDEqY3VsdF81DQogIHdjdWx0XzYgPX4gMSpjdWx0XzYNCiAgd2N1bHRfNyA9fiAxKmN1bHRfNw0KICB3Y3VsdF84ID1+IDEqY3VsdF84DQogIHdjdWx0XzkgPX4gMSpjdWx0XzkNCiAgd2N1bHRfMTAgPX4gMSpjdWx0XzEwDQogIHdjdWx0XzExID1+IDEqY3VsdF8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2N1bHRfMyAgIH4gYyhhMSwgYTIpKndjdWx0XzIgKyBjKGIxLCBiMikqd0ZlZHVjX2FfMg0KICB3Y3VsdF80ICAgfiBjKGExLCBhMikqd2N1bHRfMyArIGMoYjEsIGIyKSp3RmVkdWNfYV8zDQogIHdjdWx0XzUgICB+IGMoYTEsIGEyKSp3Y3VsdF80ICsgYyhiMSwgYjIpKndGZWR1Y19hXzQNCiAgd2N1bHRfNiAgIH4gYyhhMSwgYTIpKndjdWx0XzUgKyBjKGIxLCBiMikqd0ZlZHVjX2FfNQ0KICB3Y3VsdF83ICAgfiBjKGExLCBhMikqd2N1bHRfNiArIGMoYjEsIGIyKSp3RmVkdWNfYV82DQogIHdjdWx0XzggICB+IGMoYTEsIGEyKSp3Y3VsdF83ICsgYyhiMSwgYjIpKndGZWR1Y19hXzcNCiAgd2N1bHRfOSAgIH4gYyhhMSwgYTIpKndjdWx0XzggKyBjKGIxLCBiMikqd0ZlZHVjX2FfOA0KICB3Y3VsdF8xMCAgfiBjKGExLCBhMikqd2N1bHRfOSArIGMoYjEsIGIyKSp3RmVkdWNfYV85DQogIHdjdWx0XzExICB+IGMoYTEsIGEyKSp3Y3VsdF8xMCArIGMoYjEsIGIyKSp3RmVkdWNfYV8xMA0KICANCiAgd0ZlZHVjX2FfMyAgfiBjKGMxLCBjMikqd2N1bHRfMiArIGMoZDEsIGQyKSp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyhjMSwgYzIpKndjdWx0XzMgKyBjKGQxLCBkMikqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMoYzEsIGMyKSp3Y3VsdF80ICsgYyhkMSwgZDIpKndGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNiAgfiBjKGMxLCBjMikqd2N1bHRfNSArIGMoZDEsIGQyKSp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyhjMSwgYzIpKndjdWx0XzYgKyBjKGQxLCBkMikqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMoYzEsIGMyKSp3Y3VsdF83ICsgYyhkMSwgZDIpKndGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOSAgfiBjKGMxLCBjMikqd2N1bHRfOCArIGMoZDEsIGQyKSp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMoYzEsIGMyKSp3Y3VsdF85ICsgYyhkMSwgZDIpKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyhjMSwgYzIpKndjdWx0XzEwICsgYyhkMSwgZDIpKndGZWR1Y19hXzEwDQogIA0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlIGF0IHRoZSBmaXJzdCB3YXZlLiANCiAgd2N1bHRfMiB+fiB3RmVkdWNfYV8yICMgQ292YXJpYW5jZQ0KDQogICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2N1bHRfMyB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzMNCiAgd2N1bHRfNCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzQNCiAgd2N1bHRfNSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzUNCiAgd2N1bHRfNiB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzYNCiAgd2N1bHRfNyB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzcNCiAgd2N1bHRfOCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzgNCiAgd2N1bHRfOSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzkNCiAgd2N1bHRfMTAgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV8xMA0KICB3Y3VsdF8xMSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2N1bHRfMiB+fiB3Y3VsdF8yIA0KICB3RmVkdWNfYV8yIH5+IHdGZWR1Y19hXzINCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdjdWx0XzMgfn4gYyh2eTEsIHZ5Mikqd2N1bHRfMw0KICB3RmVkdWNfYV8zIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzMNCiAgd2N1bHRfNCB+fiBjKHZ5MSwgdnkyKSp3Y3VsdF80IA0KICB3RmVkdWNfYV80IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzQNCiAgd2N1bHRfNSB+fiBjKHZ5MSwgdnkyKSp3Y3VsdF81DQogIHdGZWR1Y19hXzUgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNQ0KICB3Y3VsdF82IH5+IGModnkxLCB2eTIpKndjdWx0XzYgDQogIHdGZWR1Y19hXzYgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNg0KICB3Y3VsdF83IH5+IGModnkxLCB2eTIpKndjdWx0XzcgDQogIHdGZWR1Y19hXzcgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNw0KICB3Y3VsdF84IH5+IGModnkxLCB2eTIpKndjdWx0XzggDQogIHdGZWR1Y19hXzggfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfOA0KICB3Y3VsdF85IH5+IGModnkxLCB2eTIpKndjdWx0XzkgDQogIHdGZWR1Y19hXzkgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMCB+fiBjKHZ5MSwgdnkyKSp3Y3VsdF8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMTANCiAgd2N1bHRfMTEgfn4gYyh2eTEsIHZ5Mikqd2N1bHRfMTEgDQogIHdGZWR1Y19hXzExIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzIgKyAwKndjdWx0XzINCg0KJw0KI2NyZWF0ZSBhbmQgc3RvcmUgbW9kZWwNCiNjcmVhdGUgZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiY3VsdF9tb2RlbDdfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCmN1bHRfbW9kZWw3X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQgPC0NCiAgbGF2YWFuKA0KICAgIGN1bHRfbW9kZWw3X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZywNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJybF8yIg0KICApDQogICNzYXZlIG1vZGVsDQogIHNhdmUoY3VsdF9tb2RlbDdfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Ugew0KICBsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCg0KYGBgDQoNCmBgYHtyIGN1bHQgbTcgY29uc3RyYWluZWQgZ3JvdXBzIGxhZ30NCmN1bHRfbW9kZWw3X2NvbnN0cmFpbmVkX2xhZ19ncm91cHMgPC0gJw0KDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSogRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+IDEqY3VsdF8yICsgMSpjdWx0XzMgKyAxKmN1bHRfNCArIDEqY3VsdF81ICsgMSpjdWx0XzYgKyAxKmN1bHRfNyArIDEqY3VsdF84ICsgMSpjdWx0XzkgKyAxKmN1bHRfMTAgKyAxKmN1bHRfMTENCg0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSBhbmQgY292YXJpYW5jZSBvZiB0aGUgcmFuZG9tIGludGVyY2VwdHMuIA0KICBSSXggfn4gUkl4DQogIFJJeSB+fiBSSXkNCiAgUkl4IH5+IFJJeQ0KICANCiAgIyBSZWdyZXNzaW9uIG9mIHJhbmRvbSBpbnRlcmNlcHRzIG9uIHoxDQogIFJJeCArIFJJeSB+IGJldHdlZW5fZWR1YyArIGJldHdlZW5fYWdlICsgYmV0d2Vlbl9vcmlnaW4gKyBiZXR3ZWVuX2ZlbWFsZSMgQ29uc3RyYWluZWQgb3ZlciB0aW1lLg0KDQogICMgU2V0IHRoZSByZXNpZHVhbCB2YXJpYW5jZXMgb2YgYWxsIEZYIHZhcmlhYmxlcyB0byAwLg0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQoNCiAgIyMjIyMjIyMjIyMjIyMjDQogICMgV0lUSElOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAgIyBDcmVhdGUgd2l0aGluLXBlcnNvbiBjZW50ZXJlZCB2YXJpYWJsZXMuIA0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3Y3VsdF8yID1+IDEqY3VsdF8yDQogIHdjdWx0XzMgPX4gMSpjdWx0XzMNCiAgd2N1bHRfNCA9fiAxKmN1bHRfNA0KICB3Y3VsdF81ID1+IDEqY3VsdF81DQogIHdjdWx0XzYgPX4gMSpjdWx0XzYNCiAgd2N1bHRfNyA9fiAxKmN1bHRfNw0KICB3Y3VsdF84ID1+IDEqY3VsdF84DQogIHdjdWx0XzkgPX4gMSpjdWx0XzkNCiAgd2N1bHRfMTAgPX4gMSpjdWx0XzEwDQogIHdjdWx0XzExID1+IDEqY3VsdF8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2N1bHRfMyAgIH4gYSp3Y3VsdF8yICsgYip3RmVkdWNfYV8yDQogIHdjdWx0XzQgICB+IGEqd2N1bHRfMyArIGIqd0ZlZHVjX2FfMw0KICB3Y3VsdF81ICAgfiBhKndjdWx0XzQgKyBiKndGZWR1Y19hXzQNCiAgd2N1bHRfNiAgIH4gYSp3Y3VsdF81ICsgYip3RmVkdWNfYV81DQogIHdjdWx0XzcgICB+IGEqd2N1bHRfNiArIGIqd0ZlZHVjX2FfNg0KICB3Y3VsdF84ICAgfiBhKndjdWx0XzcgKyBiKndGZWR1Y19hXzcNCiAgd2N1bHRfOSAgIH4gYSp3Y3VsdF84ICsgYip3RmVkdWNfYV84DQogIHdjdWx0XzEwICB+IGEqd2N1bHRfOSArIGIqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMSAgfiBhKndjdWx0XzEwICsgYip3RmVkdWNfYV8xMA0KICANCiAgd0ZlZHVjX2FfMyAgfiBjKndjdWx0XzIgKyBkKndGZWR1Y19hXzINCiAgd0ZlZHVjX2FfNCAgfiBjKndjdWx0XzMgKyBkKndGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNSAgfiBjKndjdWx0XzQgKyBkKndGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNiAgfiBjKndjdWx0XzUgKyBkKndGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNyAgfiBjKndjdWx0XzYgKyBkKndGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfOCAgfiBjKndjdWx0XzcgKyBkKndGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOSAgfiBjKndjdWx0XzggKyBkKndGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfMTAgIH4gYyp3Y3VsdF85ICsgZCp3RmVkdWNfYV85DQogIHdGZWR1Y19hXzExICB+IGMqd2N1bHRfMTAgKyBkKndGZWR1Y19hXzEwDQogIA0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlIGF0IHRoZSBmaXJzdCB3YXZlLiANCiAgd2N1bHRfMiB+fiB3RmVkdWNfYV8yICMgQ292YXJpYW5jZQ0KDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3Y3VsdF8zIH5+IGNvdip3RmVkdWNfYV8zDQogIHdjdWx0XzQgfn4gY292KndGZWR1Y19hXzQNCiAgd2N1bHRfNSB+fiBjb3Yqd0ZlZHVjX2FfNQ0KICB3Y3VsdF82IH5+IGNvdip3RmVkdWNfYV82DQogIHdjdWx0Xzcgfn4gY292KndGZWR1Y19hXzcNCiAgd2N1bHRfOCB+fiBjb3Yqd0ZlZHVjX2FfOA0KICB3Y3VsdF85IH5+IGNvdip3RmVkdWNfYV85DQogIHdjdWx0XzEwIH5+IGNvdip3RmVkdWNfYV8xMA0KICB3Y3VsdF8xMSB+fiBjb3Yqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3Y3VsdF8yIH5+IHdjdWx0XzIgDQogIHdGZWR1Y19hXzIgfn4gd0ZlZHVjX2FfMg0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2N1bHRfMyB+fiB2eSp3Y3VsdF8zDQogIHdGZWR1Y19hXzMgfn4gdngqd0ZlZHVjX2FfMw0KICB3Y3VsdF80IH5+IHZ5KndjdWx0XzQgDQogIHdGZWR1Y19hXzQgfn4gdngqd0ZlZHVjX2FfNA0KICB3Y3VsdF81IH5+IHZ5KndjdWx0XzUNCiAgd0ZlZHVjX2FfNSB+fiB2eCp3RmVkdWNfYV81DQogIHdjdWx0XzYgfn4gdnkqd2N1bHRfNiANCiAgd0ZlZHVjX2FfNiB+fiB2eCp3RmVkdWNfYV82DQogIHdjdWx0Xzcgfn4gdnkqd2N1bHRfNyANCiAgd0ZlZHVjX2FfNyB+fiB2eCp3RmVkdWNfYV83DQogIHdjdWx0Xzggfn4gdnkqd2N1bHRfOCANCiAgd0ZlZHVjX2FfOCB+fiB2eCp3RmVkdWNfYV84DQogIHdjdWx0Xzkgfn4gdnkqd2N1bHRfOSANCiAgd0ZlZHVjX2FfOSB+fiB2eCp3RmVkdWNfYV85DQogIHdjdWx0XzEwIH5+IHZ5KndjdWx0XzEwIA0KICB3RmVkdWNfYV8xMCB+fiB2eCp3RmVkdWNfYV8xMA0KICB3Y3VsdF8xMSB+fiB2eSp3Y3VsdF8xMSANCiAgd0ZlZHVjX2FfMTEgfn4gdngqd0ZlZHVjX2FfMTENCiAgDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMgQURESVRJT05BTCBDT05TVFJBSU5UUyAjDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIFNldCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgYmV0d2Vlbi1mYWN0b3JzIChyYW5kb20gaW50ZXJjZXB0cykgYW5kIHdpdGhpbi0NCiAgIyBmYWN0b3JzIGF0IHdhdmUgMSBhdCAwLiANCiAgUkl4ICsgUkl5IH5+IDAqd0ZlZHVjX2FfMiArIDAqd2N1bHRfMg0KDQonDQoNCg0KI2NyZWF0ZSBhbmQgc3RvcmUgbW9kZWwNCiNjcmVhdGUgZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiY3VsdF9tb2RlbDdfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQogIGN1bHRfbW9kZWw3X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0IDwtDQogICAgbGF2YWFuKA0KICAgICAgY3VsdF9tb2RlbDdfY29uc3RyYWluZWRfbGFnX2dyb3VwcywNCiAgICAgIGRhdGEgPSBNeURhdGEsDQogICAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgICBncm91cCA9ICJybF8yIg0KICAgICkNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShjdWx0X21vZGVsN19jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Ugew0KICBsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBjdWx0IG03IGxyTXlEYXRhfQ0KZml0X21hdHJpeF9jdWx0X203X2NvbnN0cmFpbmVkX2dyb3VwcyA8LSBsYXZJbnNwZWN0KGN1bHRfbW9kZWw3X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LCB3aGF0ID0gImZpdCIpDQpmaXRfbWF0cml4X2N1bHRfbTdfdW5jb25zdHJhaW5lZF9ncm91cHMgPC0gbGF2SW5zcGVjdChjdWx0X21vZGVsN191bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0LCB3aGF0ID0gImZpdCIpDQoNCmZpdF9tYXRyaXhfY3VsdF9NMSA8LSByYmluZChmaXRfbWF0cml4X2N1bHRfbTdfY29uc3RyYWluZWRfZ3JvdXBzLCBmaXRfbWF0cml4X2N1bHRfbTdfdW5jb25zdHJhaW5lZF9ncm91cHMpDQoNCmxhdlRlc3RMUlQoY3VsdF9tb2RlbDdfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsIGN1bHRfbW9kZWw3X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQpDQpgYGANCg0KIyMjIGluY29tZSBkaWZmZXJlbmNlcw0KDQpgYGB7ciBpbmNfZGlmZiBtb2RlbCA3IGNvbnN0IGdyb3VwcyB1bmNvbnN0IGxhZ3N9DQoNCmluY19kaWZmX21vZGVsN19jb25zdHJhaW5lZF9ncm91cHMgPC0gJw0KDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSogRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+IDEqaW5jX2RpZmZfMiArIDEqaW5jX2RpZmZfMyArIDEqaW5jX2RpZmZfNCArIDEqaW5jX2RpZmZfNSArIDEqaW5jX2RpZmZfNiArIDEqaW5jX2RpZmZfNyArIDEqaW5jX2RpZmZfOCArIDEqaW5jX2RpZmZfOSArIDEqaW5jX2RpZmZfMTAgKyAxKmluY19kaWZmXzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gIA0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQoNCiAgIyMjIyMjIyMjIyMjIyMjDQogICMgV0lUSElOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAgIyBDcmVhdGUgd2l0aGluLXBlcnNvbiBjZW50ZXJlZCB2YXJpYWJsZXMuIA0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3aW5jX2RpZmZfMiA9fiAxKmluY19kaWZmXzINCiAgd2luY19kaWZmXzMgPX4gMSppbmNfZGlmZl8zDQogIHdpbmNfZGlmZl80ID1+IDEqaW5jX2RpZmZfNA0KICB3aW5jX2RpZmZfNSA9fiAxKmluY19kaWZmXzUNCiAgd2luY19kaWZmXzYgPX4gMSppbmNfZGlmZl82DQogIHdpbmNfZGlmZl83ID1+IDEqaW5jX2RpZmZfNw0KICB3aW5jX2RpZmZfOCA9fiAxKmluY19kaWZmXzgNCiAgd2luY19kaWZmXzkgPX4gMSppbmNfZGlmZl85DQogIHdpbmNfZGlmZl8xMCA9fiAxKmluY19kaWZmXzEwDQogIHdpbmNfZGlmZl8xMSA9fiAxKmluY19kaWZmXzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3aW5jX2RpZmZfMyAgIH4gYyhhMiwgYTIpKndpbmNfZGlmZl8yICsgYyhiMiwgYjIpKndGZWR1Y19hXzINCiAgd2luY19kaWZmXzQgICB+IGMoYTMsIGEzKSp3aW5jX2RpZmZfMyArIGMoYjMsIGIzKSp3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl81ICAgfiBjKGE0LCBhNCkqd2luY19kaWZmXzQgKyBjKGI0LCBiNCkqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNiAgIH4gYyhhNSwgYTUpKndpbmNfZGlmZl81ICsgYyhiNSwgYjUpKndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzcgICB+IGMoYTYsIGE2KSp3aW5jX2RpZmZfNiArIGMoYjYsIGI2KSp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl84ICAgfiBjKGE3LCBhNykqd2luY19kaWZmXzcgKyBjKGI3LCBiNykqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOSAgIH4gYyhhOCwgYTgpKndpbmNfZGlmZl84ICsgYyhiOCwgYjgpKndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzEwICB+IGMoYTksIGE5KSp3aW5jX2RpZmZfOSArIGMoYjksIGI5KSp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMSAgfiBjKGExMCwgYTEwKSp3aW5jX2RpZmZfMTAgKyBjKGIxMCwgYjEwKSp3RmVkdWNfYV8xMA0KICANCiAgDQogIHdGZWR1Y19hXzMgIH4gYyhjMiwgYzIpKndpbmNfZGlmZl8yICsgYyhkMiwgZDIpKndGZWR1Y19hXzINCiAgd0ZlZHVjX2FfNCAgfiBjKGMzLCBjMykqd2luY19kaWZmXzMgKyBjKGQzLCBkMykqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMoYzQsIGM0KSp3aW5jX2RpZmZfNCArIGMoZDQsIGQ0KSp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyhjNSwgYzUpKndpbmNfZGlmZl81ICsgYyhkNSwgZDUpKndGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNyAgfiBjKGM2LCBjNikqd2luY19kaWZmXzYgKyBjKGQ2LCBkNikqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMoYzcsIGM3KSp3aW5jX2RpZmZfNyArIGMoZDcsIGQ3KSp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyhjOCwgYzgpKndpbmNfZGlmZl84ICsgYyhkOCwgZDgpKndGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfMTAgIH4gYyhjOSwgYzkpKndpbmNfZGlmZl85ICsgYyhkOSwgZDkpKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyhjMTAsIGMxMCkqd2luY19kaWZmXzEwICsgYyhkMTAsIGQxMCkqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3aW5jX2RpZmZfMiB+fiB3RmVkdWNfYV8yICMgQ292YXJpYW5jZQ0KDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3aW5jX2RpZmZfMyB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzMNCiAgd2luY19kaWZmXzQgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV80DQogIHdpbmNfZGlmZl81IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNiB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzYNCiAgd2luY19kaWZmXzcgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV83DQogIHdpbmNfZGlmZl84IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfOSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzkNCiAgd2luY19kaWZmXzEwIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMTANCiAgd2luY19kaWZmXzExIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3aW5jX2RpZmZfMiB+fiB3aW5jX2RpZmZfMiANCiAgd0ZlZHVjX2FfMiB+fiB3RmVkdWNfYV8yDQogIA0KICAjIEVzdGltYXRlIHRoZSByZXNpZHVhbCB2YXJpYW5jZQ0KICB3aW5jX2RpZmZfMyB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfMw0KICB3RmVkdWNfYV8zIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzMNCiAgd2luY19kaWZmXzQgfn4gYyh2eTEsIHZ5Mikqd2luY19kaWZmXzQgDQogIHdGZWR1Y19hXzQgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNSB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfNQ0KICB3RmVkdWNfYV81IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzYgfn4gYyh2eTEsIHZ5Mikqd2luY19kaWZmXzYgDQogIHdGZWR1Y19hXzYgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNg0KICB3aW5jX2RpZmZfNyB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfNyANCiAgd0ZlZHVjX2FfNyB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV83DQogIHdpbmNfZGlmZl84IH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl84IA0KICB3RmVkdWNfYV84IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzkgfn4gYyh2eTEsIHZ5Mikqd2luY19kaWZmXzkgDQogIHdGZWR1Y19hXzkgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfOQ0KICB3aW5jX2RpZmZfMTAgfn4gYyh2eTEsIHZ5Mikqd2luY19kaWZmXzEwIA0KICB3RmVkdWNfYV8xMCB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8xMA0KICB3aW5jX2RpZmZfMTEgfn4gYyh2eTEsIHZ5Mikqd2luY19kaWZmXzExIA0KICB3RmVkdWNfYV8xMSB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8xMQ0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8yICsgMCp3aW5jX2RpZmZfMg0KDQonDQojY3JlYXRlIGFuZCBzdG9yZSBtb2RlbA0KI2NyZWF0ZSBmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJpbmNfZGlmZl9tb2RlbDdfY29uc3RyYWluZWRfZ3JvdXBzX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCiAgaW5jX2RpZmZfbW9kZWw3X2NvbnN0cmFpbmVkX2dyb3Vwc19maXQgPC0NCiAgICBsYXZhYW4oDQogICAgICBpbmNfZGlmZl9tb2RlbDdfY29uc3RyYWluZWRfZ3JvdXBzLA0KICAgICAgZGF0YSA9IE15RGF0YSwNCiAgICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgICAgbWlzc2luZyA9ICdNTCcsDQogICAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICAgIGludC5vdi5mcmVlID0gVCwNCiAgICAgIGdyb3VwID0gInJsXzIiDQogICAgKQ0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKGluY19kaWZmX21vZGVsN19jb25zdHJhaW5lZF9ncm91cHNfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZXsNCiAgbG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQoNCmBgYA0KDQoNCmBgYHtyIGluY19kaWZmIG1vZGVsIDcgdW5jb25zIGdyb3VwcyBhbmQgY29uc3QgbGFnc30NCmluY19kaWZmX21vZGVsN191bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcgPC0gICcNCg0KICAjIyMjIyMjIyMjIyMjIyMjDQogICMgQkVUV0VFTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgIyBDcmVhdGUgYmV0d2VlbiBjb21wb25lbnRzIChyYW5kb20gaW50ZXJjZXB0cykNCiAgUkl4ID1+IDEqRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+ICAxKmluY19kaWZmXzIgKyAxKmluY19kaWZmXzMgKyAxKmluY19kaWZmXzQgKyAxKmluY19kaWZmXzUgKyAxKmluY19kaWZmXzYgKyAxKmluY19kaWZmXzcgKyAxKmluY19kaWZmXzggKyAxKmluY19kaWZmXzkgKyAxKmluY19kaWZmXzEwICsgMSppbmNfZGlmZl8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQogIA0KICAjIFJlZ3Jlc3Npb24gb2YgcmFuZG9tIGludGVyY2VwdHMgb24gejENCiAgUkl4ICsgUkl5IH4gYmV0d2Vlbl9lZHVjICsgYmV0d2Vlbl9hZ2UgKyBiZXR3ZWVuX29yaWdpbiArIGJldHdlZW5fZmVtYWxlIyBDb25zdHJhaW5lZCBvdmVyIHRpbWUuDQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuIA0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQoNCiAgIyMjIyMjIyMjIyMjIyMjDQogICMgV0lUSElOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAgIyBDcmVhdGUgd2l0aGluLXBlcnNvbiBjZW50ZXJlZCB2YXJpYWJsZXMuIA0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICANCiAgd2luY19kaWZmXzIgPX4gMSppbmNfZGlmZl8yDQogIHdpbmNfZGlmZl8zID1+IDEqaW5jX2RpZmZfMw0KICB3aW5jX2RpZmZfNCA9fiAxKmluY19kaWZmXzQNCiAgd2luY19kaWZmXzUgPX4gMSppbmNfZGlmZl81DQogIHdpbmNfZGlmZl82ID1+IDEqaW5jX2RpZmZfNg0KICB3aW5jX2RpZmZfNyA9fiAxKmluY19kaWZmXzcNCiAgd2luY19kaWZmXzggPX4gMSppbmNfZGlmZl84DQogIHdpbmNfZGlmZl85ID1+IDEqaW5jX2RpZmZfOQ0KICB3aW5jX2RpZmZfMTAgPX4gMSppbmNfZGlmZl8xMA0KICB3aW5jX2RpZmZfMTEgPX4gMSppbmNfZGlmZl8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2luY19kaWZmXzMgICB+IGMoYTEsIGEyKSp3aW5jX2RpZmZfMiArIGMoYjEsIGIyKSp3RmVkdWNfYV8yDQogIHdpbmNfZGlmZl80ICAgfiBjKGExLCBhMikqd2luY19kaWZmXzMgKyBjKGIxLCBiMikqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNSAgIH4gYyhhMSwgYTIpKndpbmNfZGlmZl80ICsgYyhiMSwgYjIpKndGZWR1Y19hXzQNCiAgd2luY19kaWZmXzYgICB+IGMoYTEsIGEyKSp3aW5jX2RpZmZfNSArIGMoYjEsIGIyKSp3RmVkdWNfYV81DQogIHdpbmNfZGlmZl83ICAgfiBjKGExLCBhMikqd2luY19kaWZmXzYgKyBjKGIxLCBiMikqd0ZlZHVjX2FfNg0KICB3aW5jX2RpZmZfOCAgIH4gYyhhMSwgYTIpKndpbmNfZGlmZl83ICsgYyhiMSwgYjIpKndGZWR1Y19hXzcNCiAgd2luY19kaWZmXzkgICB+IGMoYTEsIGEyKSp3aW5jX2RpZmZfOCArIGMoYjEsIGIyKSp3RmVkdWNfYV84DQogIHdpbmNfZGlmZl8xMCAgfiBjKGExLCBhMikqd2luY19kaWZmXzkgKyBjKGIxLCBiMikqd0ZlZHVjX2FfOQ0KICB3aW5jX2RpZmZfMTEgIH4gYyhhMSwgYTIpKndpbmNfZGlmZl8xMCArIGMoYjEsIGIyKSp3RmVkdWNfYV8xMA0KICANCiAgd0ZlZHVjX2FfMyAgfiBjKGMxLCBjMikqd2luY19kaWZmXzIgKyBjKGQxLCBkMikqd0ZlZHVjX2FfMg0KICB3RmVkdWNfYV80ICB+IGMoYzEsIGMyKSp3aW5jX2RpZmZfMyArIGMoZDEsIGQyKSp3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gYyhjMSwgYzIpKndpbmNfZGlmZl80ICsgYyhkMSwgZDIpKndGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNiAgfiBjKGMxLCBjMikqd2luY19kaWZmXzUgKyBjKGQxLCBkMikqd0ZlZHVjX2FfNQ0KICB3RmVkdWNfYV83ICB+IGMoYzEsIGMyKSp3aW5jX2RpZmZfNiArIGMoZDEsIGQyKSp3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gYyhjMSwgYzIpKndpbmNfZGlmZl83ICsgYyhkMSwgZDIpKndGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOSAgfiBjKGMxLCBjMikqd2luY19kaWZmXzggKyBjKGQxLCBkMikqd0ZlZHVjX2FfOA0KICB3RmVkdWNfYV8xMCAgfiBjKGMxLCBjMikqd2luY19kaWZmXzkgKyBjKGQxLCBkMikqd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiBjKGMxLCBjMikqd2luY19kaWZmXzEwICsgYyhkMSwgZDIpKndGZWR1Y19hXzEwDQogIA0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlIGF0IHRoZSBmaXJzdCB3YXZlLiANCiAgd2luY19kaWZmXzIgfn4gd0ZlZHVjX2FfMiAjIENvdmFyaWFuY2UNCg0KICAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZXMgYmV0d2VlbiB0aGUgcmVzaWR1YWxzDQogIHdpbmNfZGlmZl8zIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzQNCiAgd2luY19kaWZmXzUgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV81DQogIHdpbmNfZGlmZl82IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNg0KICB3aW5jX2RpZmZfNyB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzcNCiAgd2luY19kaWZmXzggfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV84DQogIHdpbmNfZGlmZl85IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfOQ0KICB3aW5jX2RpZmZfMTAgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV8xMA0KICB3aW5jX2RpZmZfMTEgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV8xMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgDQogIHdpbmNfZGlmZl8yIH5+IHdpbmNfZGlmZl8yIA0KICB3RmVkdWNfYV8yIH5+IHdGZWR1Y19hXzINCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdpbmNfZGlmZl8zIH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl8zDQogIHdGZWR1Y19hXzMgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNCB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfNCANCiAgd0ZlZHVjX2FfNCB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV80DQogIHdpbmNfZGlmZl81IH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl81DQogIHdGZWR1Y19hXzUgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNiB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfNiANCiAgd0ZlZHVjX2FfNiB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl83IH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl83IA0KICB3RmVkdWNfYV83IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzcNCiAgd2luY19kaWZmXzggfn4gYyh2eTEsIHZ5Mikqd2luY19kaWZmXzggDQogIHdGZWR1Y19hXzggfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfOSB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfOSANCiAgd0ZlZHVjX2FfOSB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMCB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfMTAgDQogIHdGZWR1Y19hXzEwIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzEwDQogIHdpbmNfZGlmZl8xMSB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfMTEgDQogIHdGZWR1Y19hXzExIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzIgKyAwKndpbmNfZGlmZl8yDQoNCicNCiNjcmVhdGUgYW5kIHN0b3JlIG1vZGVsDQojY3JlYXRlIGZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImluY19kaWZmX21vZGVsN191bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KICBpbmNfZGlmZl9tb2RlbDdfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCA8LQ0KICAgIGxhdmFhbigNCiAgICAgIGluY19kaWZmX21vZGVsN191bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcsDQogICAgICBkYXRhID0gTXlEYXRhLA0KICAgICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgICBtaXNzaW5nID0gJ01MJywNCiAgICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgICAgaW50Lm92LmZyZWUgPSBULA0KICAgICAgZ3JvdXAgPSAicmxfMiINCiAgICApDQogICNzYXZlIG1vZGVsDQogIHNhdmUoaW5jX2RpZmZfbW9kZWw3X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHsNCiAgbG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQpgYGANCg0KYGBge3IgaW5jX2RpZmYgbTcgY29uc3RyYWluZWQgZ3JvdXBzIGxhZ30NCmluY19kaWZmX21vZGVsN19jb25zdHJhaW5lZF9sYWdfZ3JvdXBzIDwtICcNCg0KICAjIyMjIyMjIyMjIyMjIyMjDQogICMgQkVUV0VFTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgIyBDcmVhdGUgYmV0d2VlbiBjb21wb25lbnRzIChyYW5kb20gaW50ZXJjZXB0cykNCiAgUkl4ID1+IDEqRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+IDEqaW5jX2RpZmZfMiArIDEqaW5jX2RpZmZfMyArIDEqaW5jX2RpZmZfNCArIDEqaW5jX2RpZmZfNSArIDEqaW5jX2RpZmZfNiArIDEqaW5jX2RpZmZfNyArIDEqaW5jX2RpZmZfOCArIDEqaW5jX2RpZmZfOSArIDEqaW5jX2RpZmZfMTAgKyAxKmluY19kaWZmXzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4NCiAgRmVkdWNfYV8yIH5+IDAqRmVkdWNfYV8yDQogIEZlZHVjX2FfMyB+fiAwKkZlZHVjX2FfMw0KICBGZWR1Y19hXzQgfn4gMCpGZWR1Y19hXzQNCiAgRmVkdWNfYV81IH5+IDAqRmVkdWNfYV81DQogIEZlZHVjX2FfNiB+fiAwKkZlZHVjX2FfNg0KICBGZWR1Y19hXzcgfn4gMCpGZWR1Y19hXzcNCiAgRmVkdWNfYV84IH5+IDAqRmVkdWNfYV84DQogIEZlZHVjX2FfOSB+fiAwKkZlZHVjX2FfOQ0KICBGZWR1Y19hXzEwIH5+IDAqRmVkdWNfYV8xMA0KICBGZWR1Y19hXzExIH5+IDAqRmVkdWNfYV8xMQ0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgd2luY19kaWZmXzIgPX4gMSppbmNfZGlmZl8yDQogIHdpbmNfZGlmZl8zID1+IDEqaW5jX2RpZmZfMw0KICB3aW5jX2RpZmZfNCA9fiAxKmluY19kaWZmXzQNCiAgd2luY19kaWZmXzUgPX4gMSppbmNfZGlmZl81DQogIHdpbmNfZGlmZl82ID1+IDEqaW5jX2RpZmZfNg0KICB3aW5jX2RpZmZfNyA9fiAxKmluY19kaWZmXzcNCiAgd2luY19kaWZmXzggPX4gMSppbmNfZGlmZl84DQogIHdpbmNfZGlmZl85ID1+IDEqaW5jX2RpZmZfOQ0KICB3aW5jX2RpZmZfMTAgPX4gMSppbmNfZGlmZl8xMA0KICB3aW5jX2RpZmZfMTEgPX4gMSppbmNfZGlmZl8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2luY19kaWZmXzMgICB+IGEqd2luY19kaWZmXzIgKyBiKndGZWR1Y19hXzINCiAgd2luY19kaWZmXzQgICB+IGEqd2luY19kaWZmXzMgKyBiKndGZWR1Y19hXzMNCiAgd2luY19kaWZmXzUgICB+IGEqd2luY19kaWZmXzQgKyBiKndGZWR1Y19hXzQNCiAgd2luY19kaWZmXzYgICB+IGEqd2luY19kaWZmXzUgKyBiKndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzcgICB+IGEqd2luY19kaWZmXzYgKyBiKndGZWR1Y19hXzYNCiAgd2luY19kaWZmXzggICB+IGEqd2luY19kaWZmXzcgKyBiKndGZWR1Y19hXzcNCiAgd2luY19kaWZmXzkgICB+IGEqd2luY19kaWZmXzggKyBiKndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzEwICB+IGEqd2luY19kaWZmXzkgKyBiKndGZWR1Y19hXzkNCiAgd2luY19kaWZmXzExICB+IGEqd2luY19kaWZmXzEwICsgYip3RmVkdWNfYV8xMA0KICANCiAgd0ZlZHVjX2FfMyAgfiBjKndpbmNfZGlmZl8yICsgZCp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyp3aW5jX2RpZmZfMyArIGQqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMqd2luY19kaWZmXzQgKyBkKndGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNiAgfiBjKndpbmNfZGlmZl81ICsgZCp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyp3aW5jX2RpZmZfNiArIGQqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMqd2luY19kaWZmXzcgKyBkKndGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOSAgfiBjKndpbmNfZGlmZl84ICsgZCp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMqd2luY19kaWZmXzkgKyBkKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyp3aW5jX2RpZmZfMTAgKyBkKndGZWR1Y19hXzEwDQogIA0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlIGF0IHRoZSBmaXJzdCB3YXZlLiANCiAgd2luY19kaWZmXzIgfn4gd0ZlZHVjX2FfMiAjIENvdmFyaWFuY2UNCg0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2luY19kaWZmXzMgfn4gY292KndGZWR1Y19hXzMNCiAgd2luY19kaWZmXzQgfn4gY292KndGZWR1Y19hXzQNCiAgd2luY19kaWZmXzUgfn4gY292KndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzYgfn4gY292KndGZWR1Y19hXzYNCiAgd2luY19kaWZmXzcgfn4gY292KndGZWR1Y19hXzcNCiAgd2luY19kaWZmXzggfn4gY292KndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzkgfn4gY292KndGZWR1Y19hXzkNCiAgd2luY19kaWZmXzEwIH5+IGNvdip3RmVkdWNfYV8xMA0KICB3aW5jX2RpZmZfMTEgfn4gY292KndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2luY19kaWZmXzIgfn4gd2luY19kaWZmXzIgDQogIHdGZWR1Y19hXzIgfn4gd0ZlZHVjX2FfMg0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2luY19kaWZmXzMgfn4gdnkqd2luY19kaWZmXzMNCiAgd0ZlZHVjX2FfMyB+fiB2eCp3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl80IH5+IHZ5KndpbmNfZGlmZl80IA0KICB3RmVkdWNfYV80IH5+IHZ4KndGZWR1Y19hXzQNCiAgd2luY19kaWZmXzUgfn4gdnkqd2luY19kaWZmXzUNCiAgd0ZlZHVjX2FfNSB+fiB2eCp3RmVkdWNfYV81DQogIHdpbmNfZGlmZl82IH5+IHZ5KndpbmNfZGlmZl82IA0KICB3RmVkdWNfYV82IH5+IHZ4KndGZWR1Y19hXzYNCiAgd2luY19kaWZmXzcgfn4gdnkqd2luY19kaWZmXzcgDQogIHdGZWR1Y19hXzcgfn4gdngqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOCB+fiB2eSp3aW5jX2RpZmZfOCANCiAgd0ZlZHVjX2FfOCB+fiB2eCp3RmVkdWNfYV84DQogIHdpbmNfZGlmZl85IH5+IHZ5KndpbmNfZGlmZl85IA0KICB3RmVkdWNfYV85IH5+IHZ4KndGZWR1Y19hXzkNCiAgd2luY19kaWZmXzEwIH5+IHZ5KndpbmNfZGlmZl8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gdngqd0ZlZHVjX2FfMTANCiAgd2luY19kaWZmXzExIH5+IHZ5KndpbmNfZGlmZl8xMSANCiAgd0ZlZHVjX2FfMTEgfn4gdngqd0ZlZHVjX2FfMTENCiAgDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMgQURESVRJT05BTCBDT05TVFJBSU5UUyAjDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIFNldCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgYmV0d2Vlbi1mYWN0b3JzIChyYW5kb20gaW50ZXJjZXB0cykgYW5kIHdpdGhpbi0NCiAgIyBmYWN0b3JzIGF0IHdhdmUgMSBhdCAwLiANCiAgUkl4ICsgUkl5IH5+IDAqd0ZlZHVjX2FfMiArIDAqd2luY19kaWZmXzINCg0KJw0KI2NyZWF0ZSBhbmQgc3RvcmUgbW9kZWwNCiNjcmVhdGUgZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiaW5jX2RpZmZfbW9kZWw3X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KICBpbmNfZGlmZl9tb2RlbDdfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQgPC0NCiAgICBsYXZhYW4oDQogICAgICBpbmNfZGlmZl9tb2RlbDdfY29uc3RyYWluZWRfbGFnX2dyb3VwcywNCiAgICAgIGRhdGEgPSBNeURhdGEsDQogICAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgICBncm91cCA9ICJybF8yIg0KICAgICkNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShpbmNfZGlmZl9tb2RlbDdfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlew0KICBsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQoNCmBgYHtyIGluY19kaWZmIG03IGxydGVzdH0NCmZpdF9tYXRyaXhfaW5jX2RpZmZfbTdfY29uc3RyYWluZWRfZ3JvdXBzIDwtIGxhdkluc3BlY3QoaW5jX2RpZmZfbW9kZWw3X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LCB3aGF0ID0gImZpdCIpDQpmaXRfbWF0cml4X2luY19kaWZmX203X3VuY29uc3RyYWluZWRfZ3JvdXBzIDwtIGxhdkluc3BlY3QoaW5jX2RpZmZfbW9kZWw3X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsIHdoYXQgPSAiZml0IikNCg0KZml0X21hdHJpeF9pbmNfZGlmZl9NNyA8LSByYmluZChmaXRfbWF0cml4X2luY19kaWZmX203X2NvbnN0cmFpbmVkX2dyb3VwcywgZml0X21hdHJpeF9pbmNfZGlmZl9tN191bmNvbnN0cmFpbmVkX2dyb3VwcykNCg0KbGF2VGVzdExSVChpbmNfZGlmZl9tb2RlbDdfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsIGluY19kaWZmX21vZGVsN191bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0KQ0KYGBgDQoNCiMjIEF2ZXJhZ2Ugc2ltaWxhcml0eQ0KDQpgYGB7ciBjcmVhdGUgYmV0d2VlbiB2YXJpYWJsZXMgYXZlIHNpbSB9DQojY3JlYXRlIEF2ZSBTaW0gYmV3ZWVuIG1lYXN1cmUNCk15RGF0YSA8LSBNeURhdGEgJT4lDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKGF2ZV9tZWFuID0gbWVhbihjX2Fjcm9zcyhzdGFydHNfd2l0aCgiRmF2IikpLCBuYS5ybSA9IFQpKSAlPiUNCiAgdW5ncm91cCgpDQoNCiNjcmVhdGUgYmV0d2VlbiBzY29yZXMNCk15RGF0YSA8LSBNeURhdGEgJT4lDQogIG11dGF0ZShhdmVfcmVjID0gY3V0MihhdmVfbWVhbiwgZyA9IDUpLA0KICAgICAgICAgYXZlXzIgPSBjdXQyKGF2ZV9tZWFuLCBnID0gMikpDQpgYGANCg0KIyMjIEVVIGludGVncmF0aW9uDQoNCmBgYHtyIGV1IG1vZGVsIDggY29uc3RyYWluZWQgZ3JvdXBzIHVuY29uc3RyYWluZWQgbGFnc30NCkVVX21vZGVsOF9jb25zdHJhaW5lZF9ncm91cHMgPC0gJw0KDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSpGZWR1Y19hXzEgKyAxKkZlZHVjX2FfMiArIDEqRmVkdWNfYV8zICsgMSpGZWR1Y19hXzQgKyAxKkZlZHVjX2FfNSArIDEqRmVkdWNfYV82ICsgMSpGZWR1Y19hXzcgKyAxKkZlZHVjX2FfOCArIDEqRmVkdWNfYV85ICsgMSpGZWR1Y19hXzEwICsgMSpGZWR1Y19hXzExDQogIFJJeSA9fiAgMSpldV8xICsgMSpldV8yICsgMSpldV8zICsgMSpldV80ICsgMSpldV81ICsgMSpldV82ICsgMSpldV83ICsgMSpldV84ICsgMSpldV85ICsgMSpldV8xMCArIDEqZXVfMTENCg0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSBhbmQgY292YXJpYW5jZSBvZiB0aGUgcmFuZG9tIGludGVyY2VwdHMuIA0KICBSSXggfn4gUkl4DQogIFJJeSB+fiBSSXkNCiAgUkl4IH5+IFJJeQ0KICANCiAgIyBSZWdyZXNzaW9uIG9mIHJhbmRvbSBpbnRlcmNlcHRzIG9uIHoxDQogIFJJeCArIFJJeSB+IGJldHdlZW5fZWR1YyArIGJldHdlZW5fYWdlICsgYmV0d2Vlbl9vcmlnaW4gKyBiZXR3ZWVuX2ZlbWFsZSMgQ29uc3RyYWluZWQgb3ZlciB0aW1lLg0KDQogICMgU2V0IHRoZSByZXNpZHVhbCB2YXJpYW5jZXMgb2YgYWxsIEZYIHZhcmlhYmxlcyB0byAwLiAgDQogIEZlZHVjX2FfMSB+fiAwKkZlZHVjX2FfMQ0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQoNCiAgIyMjIyMjIyMjIyMjIyMjDQogICMgV0lUSElOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAgIyBDcmVhdGUgd2l0aGluLXBlcnNvbiBjZW50ZXJlZCB2YXJpYWJsZXMuIA0KICB3RmVkdWNfYV8xID1+IDEqRmVkdWNfYV8xDQogIHdGZWR1Y19hXzIgPX4gMSpGZWR1Y19hXzINCiAgd0ZlZHVjX2FfMyA9fiAxKkZlZHVjX2FfMw0KICB3RmVkdWNfYV80ID1+IDEqRmVkdWNfYV80DQogIHdGZWR1Y19hXzUgPX4gMSpGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNiA9fiAxKkZlZHVjX2FfNg0KICB3RmVkdWNfYV83ID1+IDEqRmVkdWNfYV83DQogIHdGZWR1Y19hXzggPX4gMSpGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfOSA9fiAxKkZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMCA9fiAxKkZlZHVjX2FfMTANCiAgd0ZlZHVjX2FfMTEgPX4gMSpGZWR1Y19hXzExDQogIHdldV8xID1+IDEqZXVfMQ0KICB3ZXVfMiA9fiAxKmV1XzINCiAgd2V1XzMgPX4gMSpldV8zDQogIHdldV80ID1+IDEqZXVfNA0KICB3ZXVfNSA9fiAxKmV1XzUNCiAgd2V1XzYgPX4gMSpldV82DQogIHdldV83ID1+IDEqZXVfNw0KICB3ZXVfOCA9fiAxKmV1XzgNCiAgd2V1XzkgPX4gMSpldV85DQogIHdldV8xMCA9fiAxKmV1XzEwDQogIHdldV8xMSA9fiAxKmV1XzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3ZXVfMiAgIH4gYyhhMSwgYTEpKndldV8xICsgYyhiMSwgYjEpKndGZWR1Y19hXzENCiAgd2V1XzMgICB+IGMoYTIsIGEyKSp3ZXVfMiArIGMoYjIsIGIyKSp3RmVkdWNfYV8yDQogIHdldV80ICAgfiBjKGEzLCBhMykqd2V1XzMgKyBjKGIzLCBiMykqd0ZlZHVjX2FfMw0KICB3ZXVfNSAgIH4gYyhhNCwgYTQpKndldV80ICsgYyhiNCwgYjQpKndGZWR1Y19hXzQNCiAgd2V1XzYgICB+IGMoYTUsIGE1KSp3ZXVfNSArIGMoYjUsIGI1KSp3RmVkdWNfYV81DQogIHdldV83ICAgfiBjKGE2LCBhNikqd2V1XzYgKyBjKGI2LCBiNikqd0ZlZHVjX2FfNg0KICB3ZXVfOCAgIH4gYyhhNywgYTcpKndldV83ICsgYyhiNywgYjcpKndGZWR1Y19hXzcNCiAgd2V1XzkgICB+IGMoYTgsIGE4KSp3ZXVfOCArIGMoYjgsIGI4KSp3RmVkdWNfYV84DQogIHdldV8xMCAgfiBjKGE5LCBhOSkqd2V1XzkgKyBjKGI5LCBiOSkqd0ZlZHVjX2FfOQ0KICB3ZXVfMTEgIH4gYyhhMTAsIGExMCkqd2V1XzEwICsgYyhiMTAsIGIxMCkqd0ZlZHVjX2FfMTANCiAgDQogIA0KICB3RmVkdWNfYV8yICB+IGMoYzEsIGMxKSp3ZXVfMSArIGMoZDEsIGQxKSp3RmVkdWNfYV8xDQogIHdGZWR1Y19hXzMgIH4gYyhjMiwgYzIpKndldV8yICsgYyhkMiwgZDIpKndGZWR1Y19hXzINCiAgd0ZlZHVjX2FfNCAgfiBjKGMzLCBjMykqd2V1XzMgKyBjKGQzLCBkMykqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMoYzQsIGM0KSp3ZXVfNCArIGMoZDQsIGQ0KSp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyhjNSwgYzUpKndldV81ICsgYyhkNSwgZDUpKndGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNyAgfiBjKGM2LCBjNikqd2V1XzYgKyBjKGQ2LCBkNikqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMoYzcsIGM3KSp3ZXVfNyArIGMoZDcsIGQ3KSp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyhjOCwgYzgpKndldV84ICsgYyhkOCwgZDgpKndGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfMTAgIH4gYyhjOSwgYzkpKndldV85ICsgYyhkOSwgZDkpKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyhjMTAsIGMxMCkqd2V1XzEwICsgYyhkMTAsIGQxMCkqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3ZXVfMSB+fiB3RmVkdWNfYV8xICMgQ292YXJpYW5jZQ0KDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3ZXVfMiB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzINCiAgd2V1XzMgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV8zDQogIHdldV80IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNA0KICB3ZXVfNSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzUNCiAgd2V1XzYgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV82DQogIHdldV83IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNw0KICB3ZXVfOCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzgNCiAgd2V1Xzkgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV85DQogIHdldV8xMCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzEwDQogIHdldV8xMSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2V1XzEgfn4gd2V1XzEgDQogIHdGZWR1Y19hXzEgfn4gd0ZlZHVjX2FfMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2V1XzIgfn4gYyh2eTEsIHZ5Mikqd2V1XzIgDQogIHdGZWR1Y19hXzIgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMg0KICB3ZXVfMyB+fiBjKHZ5MSwgdnkyKSp3ZXVfMw0KICB3RmVkdWNfYV8zIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzMNCiAgd2V1XzQgfn4gYyh2eTEsIHZ5Mikqd2V1XzQgDQogIHdGZWR1Y19hXzQgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNA0KICB3ZXVfNSB+fiBjKHZ5MSwgdnkyKSp3ZXVfNQ0KICB3RmVkdWNfYV81IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzUNCiAgd2V1XzYgfn4gYyh2eTEsIHZ5Mikqd2V1XzYgDQogIHdGZWR1Y19hXzYgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNg0KICB3ZXVfNyB+fiBjKHZ5MSwgdnkyKSp3ZXVfNyANCiAgd0ZlZHVjX2FfNyB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV83DQogIHdldV84IH5+IGModnkxLCB2eTIpKndldV84IA0KICB3RmVkdWNfYV84IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzgNCiAgd2V1Xzkgfn4gYyh2eTEsIHZ5Mikqd2V1XzkgDQogIHdGZWR1Y19hXzkgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfOQ0KICB3ZXVfMTAgfn4gYyh2eTEsIHZ5Mikqd2V1XzEwIA0KICB3RmVkdWNfYV8xMCB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8xMA0KICB3ZXVfMTEgfn4gYyh2eTEsIHZ5Mikqd2V1XzExIA0KICB3RmVkdWNfYV8xMSB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8xMQ0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8xICsgMCp3ZXVfMQ0KDQonDQoNCiNjcmVhdGUgYW5kIHN0b3JlIG1vZGVsDQojY3JlYXRlIGZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgIkVVX21vZGVsOF9jb25zdHJhaW5lZF9ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KICBFVV9tb2RlbDhfY29uc3RyYWluZWRfZ3JvdXBzX2ZpdCA8LQ0KICAgIGxhdmFhbigNCiAgICAgIEVVX21vZGVsOF9jb25zdHJhaW5lZF9ncm91cHMsDQogICAgICBkYXRhID0gTXlEYXRhLA0KICAgICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgICBtaXNzaW5nID0gJ01MJywNCiAgICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgICAgaW50Lm92LmZyZWUgPSBULA0KICAgICAgZ3JvdXAgPSAiYXZlXzIiDQogICAgKQ0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKEVVX21vZGVsOF9jb25zdHJhaW5lZF9ncm91cHNfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZSB7DQogIGxvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KYGBgDQoNCg0KYGBge3IgRVUgbW9kZWwgOCB1bmNvbnN0IGdyb3VwcyBhbmQgY29uc3QgbGFnc30NCkVVX21vZGVsOF91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcgPC0gDQonDQojIyMjIyMjIyMjIyMjIyMjDQogICMgQkVUV0VFTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgIyBDcmVhdGUgYmV0d2VlbiBjb21wb25lbnRzIChyYW5kb20gaW50ZXJjZXB0cykNCiAgUkl4ID1+IDEqRmVkdWNfYV8xICsgMSpGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqZXVfMSArIDEqZXVfMiArIDEqZXVfMyArIDEqZXVfNCArIDEqZXVfNSArIDEqZXVfNiArIDEqZXVfNyArIDEqZXVfOCArIDEqZXVfOSArIDEqZXVfMTAgKyAxKmV1XzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gIA0KICBGZWR1Y19hXzEgfn4gMCpGZWR1Y19hXzENCiAgRmVkdWNfYV8yIH5+IDAqRmVkdWNfYV8yDQogIEZlZHVjX2FfMyB+fiAwKkZlZHVjX2FfMw0KICBGZWR1Y19hXzQgfn4gMCpGZWR1Y19hXzQNCiAgRmVkdWNfYV81IH5+IDAqRmVkdWNfYV81DQogIEZlZHVjX2FfNiB+fiAwKkZlZHVjX2FfNg0KICBGZWR1Y19hXzcgfn4gMCpGZWR1Y19hXzcNCiAgRmVkdWNfYV84IH5+IDAqRmVkdWNfYV84DQogIEZlZHVjX2FfOSB+fiAwKkZlZHVjX2FfOQ0KICBGZWR1Y19hXzEwIH5+IDAqRmVkdWNfYV8xMA0KICBGZWR1Y19hXzExIH5+IDAqRmVkdWNfYV8xMQ0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMSA9fiAxKkZlZHVjX2FfMQ0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3ZXVfMSA9fiAxKmV1XzENCiAgd2V1XzIgPX4gMSpldV8yDQogIHdldV8zID1+IDEqZXVfMw0KICB3ZXVfNCA9fiAxKmV1XzQNCiAgd2V1XzUgPX4gMSpldV81DQogIHdldV82ID1+IDEqZXVfNg0KICB3ZXVfNyA9fiAxKmV1XzcNCiAgd2V1XzggPX4gMSpldV84DQogIHdldV85ID1+IDEqZXVfOQ0KICB3ZXVfMTAgPX4gMSpldV8xMA0KICB3ZXVfMTEgPX4gMSpldV8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2V1XzIgICB+IGMoYTEsIGEyKSp3ZXVfMSArIGMoYjEsIGIyKSp3RmVkdWNfYV8xDQogIHdldV8zICAgfiBjKGExLCBhMikqd2V1XzIgKyBjKGIxLCBiMikqd0ZlZHVjX2FfMg0KICB3ZXVfNCAgIH4gYyhhMSwgYTIpKndldV8zICsgYyhiMSwgYjIpKndGZWR1Y19hXzMNCiAgd2V1XzUgICB+IGMoYTEsIGEyKSp3ZXVfNCArIGMoYjEsIGIyKSp3RmVkdWNfYV80DQogIHdldV82ICAgfiBjKGExLCBhMikqd2V1XzUgKyBjKGIxLCBiMikqd0ZlZHVjX2FfNQ0KICB3ZXVfNyAgIH4gYyhhMSwgYTIpKndldV82ICsgYyhiMSwgYjIpKndGZWR1Y19hXzYNCiAgd2V1XzggICB+IGMoYTEsIGEyKSp3ZXVfNyArIGMoYjEsIGIyKSp3RmVkdWNfYV83DQogIHdldV85ICAgfiBjKGExLCBhMikqd2V1XzggKyBjKGIxLCBiMikqd0ZlZHVjX2FfOA0KICB3ZXVfMTAgIH4gYyhhMSwgYTIpKndldV85ICsgYyhiMSwgYjIpKndGZWR1Y19hXzkNCiAgd2V1XzExICB+IGMoYTEsIGEyKSp3ZXVfMTAgKyBjKGIxLCBiMikqd0ZlZHVjX2FfMTANCiAgDQogIA0KICB3RmVkdWNfYV8yICB+IGMoYzEsIGMyKSp3ZXVfMSArIGMoZDEsIGQyKSp3RmVkdWNfYV8xDQogIHdGZWR1Y19hXzMgIH4gYyhjMSwgYzIpKndldV8yICsgYyhkMSwgZDIpKndGZWR1Y19hXzINCiAgd0ZlZHVjX2FfNCAgfiBjKGMxLCBjMikqd2V1XzMgKyBjKGQxLCBkMikqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMoYzEsIGMyKSp3ZXVfNCArIGMoZDEsIGQyKSp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyhjMSwgYzIpKndldV81ICsgYyhkMSwgZDIpKndGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNyAgfiBjKGMxLCBjMikqd2V1XzYgKyBjKGQxLCBkMikqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMoYzEsIGMyKSp3ZXVfNyArIGMoZDEsIGQyKSp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyhjMSwgYzIpKndldV84ICsgYyhkMSwgZDIpKndGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfMTAgIH4gYyhjMSwgYzIpKndldV85ICsgYyhkMSwgZDIpKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyhjMSwgYzIpKndldV8xMCArIGMoZDEsIGQyKSp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdldV8xIH5+IHdGZWR1Y19hXzEgIyBDb3ZhcmlhbmNlDQoNCiAgICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3ZXVfMiB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzINCiAgd2V1XzMgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV8zDQogIHdldV80IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNA0KICB3ZXVfNSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzUNCiAgd2V1XzYgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV82DQogIHdldV83IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNw0KICB3ZXVfOCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzgNCiAgd2V1Xzkgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV85DQogIHdldV8xMCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzEwDQogIHdldV8xMSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2V1XzEgfn4gd2V1XzEgDQogIHdGZWR1Y19hXzEgfn4gd0ZlZHVjX2FfMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2V1XzIgfn4gYyh2eTEsIHZ5Mikqd2V1XzIgDQogIHdGZWR1Y19hXzIgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMg0KICB3ZXVfMyB+fiBjKHZ5MSwgdnkyKSp3ZXVfMw0KICB3RmVkdWNfYV8zIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzMNCiAgd2V1XzQgfn4gYyh2eTEsIHZ5Mikqd2V1XzQgDQogIHdGZWR1Y19hXzQgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNA0KICB3ZXVfNSB+fiBjKHZ5MSwgdnkyKSp3ZXVfNQ0KICB3RmVkdWNfYV81IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzUNCiAgd2V1XzYgfn4gYyh2eTEsIHZ5Mikqd2V1XzYgDQogIHdGZWR1Y19hXzYgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNg0KICB3ZXVfNyB+fiBjKHZ5MSwgdnkyKSp3ZXVfNyANCiAgd0ZlZHVjX2FfNyB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV83DQogIHdldV84IH5+IGModnkxLCB2eTIpKndldV84IA0KICB3RmVkdWNfYV84IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzgNCiAgd2V1Xzkgfn4gYyh2eTEsIHZ5Mikqd2V1XzkgDQogIHdGZWR1Y19hXzkgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfOQ0KICB3ZXVfMTAgfn4gYyh2eTEsIHZ5Mikqd2V1XzEwIA0KICB3RmVkdWNfYV8xMCB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8xMA0KICB3ZXVfMTEgfn4gYyh2eTEsIHZ5Mikqd2V1XzExIA0KICB3RmVkdWNfYV8xMSB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8xMQ0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8xICsgMCp3ZXVfMQ0KDQonDQojY3JlYXRlIGFuZCBzdG9yZSBtb2RlbA0KI2NyZWF0ZSBmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJFVV9tb2RlbDhfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCiAgRVVfbW9kZWw4X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQgPC0NCiAgICBsYXZhYW4oDQogICAgICBFVV9tb2RlbDhfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnLA0KICAgICAgZGF0YSA9IE15RGF0YSwNCiAgICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgICAgbWlzc2luZyA9ICdNTCcsDQogICAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICAgIGludC5vdi5mcmVlID0gVCwNCiAgICAgIGdyb3VwID0gImF2ZV8yIg0KICAgICkNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShFVV9tb2RlbDhfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Ugew0KICBsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBldSBtOCBjb25zdHJhaW5lZCBncm91cHMgbGFnfQ0KI2NyZWF0ZSBhbmQgc3RvcmUgbW9kZWwNCiNjcmVhdGUgZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiRVVfbW9kZWw4X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KICBFVV9tb2RlbDhfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQgPC0NCiAgICBsYXZhYW4oDQogICAgICBtYWluX2xhdmFhbl9yZXN1bHRzJGBMYXZhYW4gbW9kZWwgb2JqZWN0c2BbWzFdXVtbMl1dLA0KICAgICAgZGF0YSA9IE15RGF0YSwNCiAgICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgICAgbWlzc2luZyA9ICdNTCcsDQogICAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICAgIGludC5vdi5mcmVlID0gVCwNCiAgICAgIGdyb3VwID0gImF2ZV8yIg0KICAgICkNCiAgDQogICNzYXZlIG1vZGVsDQogIHNhdmUoRVVfbW9kZWw4X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZSB7DQogIGxvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KYGBgDQoNCmBgYHtyIGV1IG04IGxyTXlEYXRhfQ0KZml0X21hdHJpeF9FVV9tOF9jb25zdHJhaW5lZF9ncm91cHMgPC0gbGF2SW5zcGVjdChFVV9tb2RlbDhfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsIHdoYXQgPSAiZml0IikNCmZpdF9tYXRyaXhfRVVfbThfdW5jb25zdHJhaW5lZF9ncm91cHMgPC0gbGF2SW5zcGVjdChFVV9tb2RlbDhfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCwgd2hhdCA9ICJmaXQiKQ0KDQpmaXRfbWF0cml4X2V1X004IDwtIHJiaW5kKGZpdF9tYXRyaXhfRVVfbThfY29uc3RyYWluZWRfZ3JvdXBzLCBmaXRfbWF0cml4X0VVX204X3VuY29uc3RyYWluZWRfZ3JvdXBzKQ0KDQpsYXZUZXN0TFJUKEVVX21vZGVsOF9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwgRVVfbW9kZWw4X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQpDQpgYGANCg0KIyMjIGN1bHR1cmFsIGluY2x1c2lvbg0KDQoNCmBgYHtyIGN1bHQgbW9kZWwgOCBjb25zdCBncm91cHMgdW5jb25zdCBsYWdzfQ0KDQpjdWx0X21vZGVsOF9jb25zdHJhaW5lZF9ncm91cHMgPC0gDQonICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSpGZWR1Y19hXzEgKyAxKkZlZHVjX2FfMiArIDEqRmVkdWNfYV8zICsgMSpGZWR1Y19hXzQgKyAxKkZlZHVjX2FfNSArIDEqRmVkdWNfYV82ICsgMSpGZWR1Y19hXzcgKyAxKkZlZHVjX2FfOCArIDEqRmVkdWNfYV85ICsgMSpGZWR1Y19hXzEwICsgMSpGZWR1Y19hXzExDQogIFJJeSA9fiAgMSpjdWx0XzEgKyAxKmN1bHRfMiArIDEqY3VsdF8zICsgMSpjdWx0XzQgKyAxKmN1bHRfNSArIDEqY3VsdF82ICsgMSpjdWx0XzcgKyAxKmN1bHRfOCArIDEqY3VsdF85ICsgMSpjdWx0XzEwICsgMSpjdWx0XzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gIA0KICBGZWR1Y19hXzEgfn4gMCpGZWR1Y19hXzENCiAgRmVkdWNfYV8yIH5+IDAqRmVkdWNfYV8yDQogIEZlZHVjX2FfMyB+fiAwKkZlZHVjX2FfMw0KICBGZWR1Y19hXzQgfn4gMCpGZWR1Y19hXzQNCiAgRmVkdWNfYV81IH5+IDAqRmVkdWNfYV81DQogIEZlZHVjX2FfNiB+fiAwKkZlZHVjX2FfNg0KICBGZWR1Y19hXzcgfn4gMCpGZWR1Y19hXzcNCiAgRmVkdWNfYV84IH5+IDAqRmVkdWNfYV84DQogIEZlZHVjX2FfOSB+fiAwKkZlZHVjX2FfOQ0KICBGZWR1Y19hXzEwIH5+IDAqRmVkdWNfYV8xMA0KICBGZWR1Y19hXzExIH5+IDAqRmVkdWNfYV8xMQ0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMSA9fiAxKkZlZHVjX2FfMQ0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3Y3VsdF8xID1+IDEqY3VsdF8xDQogIHdjdWx0XzIgPX4gMSpjdWx0XzINCiAgd2N1bHRfMyA9fiAxKmN1bHRfMw0KICB3Y3VsdF80ID1+IDEqY3VsdF80DQogIHdjdWx0XzUgPX4gMSpjdWx0XzUNCiAgd2N1bHRfNiA9fiAxKmN1bHRfNg0KICB3Y3VsdF83ID1+IDEqY3VsdF83DQogIHdjdWx0XzggPX4gMSpjdWx0XzgNCiAgd2N1bHRfOSA9fiAxKmN1bHRfOQ0KICB3Y3VsdF8xMCA9fiAxKmN1bHRfMTANCiAgd2N1bHRfMTEgPX4gMSpjdWx0XzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3Y3VsdF8yICAgfiBjKGExLCBhMSkqd2N1bHRfMSArIGMoYjEsIGIxKSp3RmVkdWNfYV8xDQogIHdjdWx0XzMgICB+IGMoYTIsIGEyKSp3Y3VsdF8yICsgYyhiMiwgYjIpKndGZWR1Y19hXzINCiAgd2N1bHRfNCAgIH4gYyhhMywgYTMpKndjdWx0XzMgKyBjKGIzLCBiMykqd0ZlZHVjX2FfMw0KICB3Y3VsdF81ICAgfiBjKGE0LCBhNCkqd2N1bHRfNCArIGMoYjQsIGI0KSp3RmVkdWNfYV80DQogIHdjdWx0XzYgICB+IGMoYTUsIGE1KSp3Y3VsdF81ICsgYyhiNSwgYjUpKndGZWR1Y19hXzUNCiAgd2N1bHRfNyAgIH4gYyhhNiwgYTYpKndjdWx0XzYgKyBjKGI2LCBiNikqd0ZlZHVjX2FfNg0KICB3Y3VsdF84ICAgfiBjKGE3LCBhNykqd2N1bHRfNyArIGMoYjcsIGI3KSp3RmVkdWNfYV83DQogIHdjdWx0XzkgICB+IGMoYTgsIGE4KSp3Y3VsdF84ICsgYyhiOCwgYjgpKndGZWR1Y19hXzgNCiAgd2N1bHRfMTAgIH4gYyhhOSwgYTkpKndjdWx0XzkgKyBjKGI5LCBiOSkqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMSAgfiBjKGExMCwgYTEwKSp3Y3VsdF8xMCArIGMoYjEwLCBiMTApKndGZWR1Y19hXzEwDQogIA0KICANCiAgd0ZlZHVjX2FfMiAgfiBjKGMxLCBjMSkqd2N1bHRfMSArIGMoZDEsIGQxKSp3RmVkdWNfYV8xDQogIHdGZWR1Y19hXzMgIH4gYyhjMiwgYzIpKndjdWx0XzIgKyBjKGQyLCBkMikqd0ZlZHVjX2FfMg0KICB3RmVkdWNfYV80ICB+IGMoYzMsIGMzKSp3Y3VsdF8zICsgYyhkMywgZDMpKndGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNSAgfiBjKGM0LCBjNCkqd2N1bHRfNCArIGMoZDQsIGQ0KSp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyhjNSwgYzUpKndjdWx0XzUgKyBjKGQ1LCBkNSkqd0ZlZHVjX2FfNQ0KICB3RmVkdWNfYV83ICB+IGMoYzYsIGM2KSp3Y3VsdF82ICsgYyhkNiwgZDYpKndGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfOCAgfiBjKGM3LCBjNykqd2N1bHRfNyArIGMoZDcsIGQ3KSp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyhjOCwgYzgpKndjdWx0XzggKyBjKGQ4LCBkOCkqd0ZlZHVjX2FfOA0KICB3RmVkdWNfYV8xMCAgfiBjKGM5LCBjOSkqd2N1bHRfOSArIGMoZDksIGQ5KSp3RmVkdWNfYV85DQogIHdGZWR1Y19hXzExICB+IGMoYzEwLCBjMTApKndjdWx0XzEwICsgYyhkMTAsIGQxMCkqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3Y3VsdF8xIH5+IHdGZWR1Y19hXzEgIyBDb3ZhcmlhbmNlDQoNCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZXMgYmV0d2VlbiB0aGUgcmVzaWR1YWxzDQogIHdjdWx0XzIgfn4gY292KndGZWR1Y19hXzINCiAgd2N1bHRfMyB+fiBjb3Yqd0ZlZHVjX2FfMw0KICB3Y3VsdF80IH5+IGNvdip3RmVkdWNfYV80DQogIHdjdWx0XzUgfn4gY292KndGZWR1Y19hXzUNCiAgd2N1bHRfNiB+fiBjb3Yqd0ZlZHVjX2FfNg0KICB3Y3VsdF83IH5+IGNvdip3RmVkdWNfYV83DQogIHdjdWx0Xzggfn4gY292KndGZWR1Y19hXzgNCiAgd2N1bHRfOSB+fiBjb3Yqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMCB+fiBjb3Yqd0ZlZHVjX2FfMTANCiAgd2N1bHRfMTEgfn4gY292KndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2N1bHRfMSB+fiB3Y3VsdF8xIA0KICB3RmVkdWNfYV8xIH5+IHdGZWR1Y19hXzENCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdjdWx0XzIgfn4gdnkqd2N1bHRfMiANCiAgd0ZlZHVjX2FfMiB+fiB2eCp3RmVkdWNfYV8yDQogIHdjdWx0XzMgfn4gdnkqd2N1bHRfMw0KICB3RmVkdWNfYV8zIH5+IHZ4KndGZWR1Y19hXzMNCiAgd2N1bHRfNCB+fiB2eSp3Y3VsdF80IA0KICB3RmVkdWNfYV80IH5+IHZ4KndGZWR1Y19hXzQNCiAgd2N1bHRfNSB+fiB2eSp3Y3VsdF81DQogIHdGZWR1Y19hXzUgfn4gdngqd0ZlZHVjX2FfNQ0KICB3Y3VsdF82IH5+IHZ5KndjdWx0XzYgDQogIHdGZWR1Y19hXzYgfn4gdngqd0ZlZHVjX2FfNg0KICB3Y3VsdF83IH5+IHZ5KndjdWx0XzcgDQogIHdGZWR1Y19hXzcgfn4gdngqd0ZlZHVjX2FfNw0KICB3Y3VsdF84IH5+IHZ5KndjdWx0XzggDQogIHdGZWR1Y19hXzggfn4gdngqd0ZlZHVjX2FfOA0KICB3Y3VsdF85IH5+IHZ5KndjdWx0XzkgDQogIHdGZWR1Y19hXzkgfn4gdngqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMCB+fiB2eSp3Y3VsdF8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gdngqd0ZlZHVjX2FfMTANCiAgd2N1bHRfMTEgfn4gdnkqd2N1bHRfMTEgDQogIHdGZWR1Y19hXzExIH5+IHZ4KndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzEgKyAwKndjdWx0XzEnDQoNCiNjcmVhdGUgYW5kIHN0b3JlIG1vZGVsDQojY3JlYXRlIGZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImN1bHRfbW9kZWw4X2NvbnN0cmFpbmVkX2dyb3Vwc19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQogIGN1bHRfbW9kZWw4X2NvbnN0cmFpbmVkX2dyb3Vwc19maXQgPC0NCiAgICBsYXZhYW4oDQogICAgICBjdWx0X21vZGVsOF9jb25zdHJhaW5lZF9ncm91cHMsDQogICAgICBkYXRhID0gTXlEYXRhLA0KICAgICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgICBtaXNzaW5nID0gJ01MJywNCiAgICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgICAgaW50Lm92LmZyZWUgPSBULA0KICAgICAgZ3JvdXAgPSAiYXZlXzIiDQogICAgKQ0KICANCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShjdWx0X21vZGVsOF9jb25zdHJhaW5lZF9ncm91cHNfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZSB7DQogIGxvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KDQpgYGANCg0KDQpgYGB7ciBjdWx0IG1vZGVsIDggdW5jb25zIGdyb3VwcyBhbmQgY29ucyBsYWdzfQ0KY3VsdF9tb2RlbDhfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnIDwtICcNCg0KICAjIyMjIyMjIyMjIyMjIyMjDQogICMgQkVUV0VFTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgIyBDcmVhdGUgYmV0d2VlbiBjb21wb25lbnRzIChyYW5kb20gaW50ZXJjZXB0cykNCiAgUkl4ID1+IDEqRmVkdWNfYV8xICsgMSpGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqY3VsdF8xICsgMSpjdWx0XzIgKyAxKmN1bHRfMyArIDEqY3VsdF80ICsgMSpjdWx0XzUgKyAxKmN1bHRfNiArIDEqY3VsdF83ICsgMSpjdWx0XzggKyAxKmN1bHRfOSArIDEqY3VsdF8xMCArIDEqY3VsdF8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQogIA0KICAjIFJlZ3Jlc3Npb24gb2YgcmFuZG9tIGludGVyY2VwdHMgb24gejENCiAgUkl4ICsgUkl5IH4gYmV0d2Vlbl9lZHVjICsgYmV0d2Vlbl9hZ2UgKyBiZXR3ZWVuX29yaWdpbiArIGJldHdlZW5fZmVtYWxlIyBDb25zdHJhaW5lZCBvdmVyIHRpbWUuDQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuICANCiAgRmVkdWNfYV8xIH5+IDAqRmVkdWNfYV8xDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4gDQogIHdGZWR1Y19hXzEgPX4gMSpGZWR1Y19hXzENCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgd2N1bHRfMSA9fiAxKmN1bHRfMQ0KICB3Y3VsdF8yID1+IDEqY3VsdF8yDQogIHdjdWx0XzMgPX4gMSpjdWx0XzMNCiAgd2N1bHRfNCA9fiAxKmN1bHRfNA0KICB3Y3VsdF81ID1+IDEqY3VsdF81DQogIHdjdWx0XzYgPX4gMSpjdWx0XzYNCiAgd2N1bHRfNyA9fiAxKmN1bHRfNw0KICB3Y3VsdF84ID1+IDEqY3VsdF84DQogIHdjdWx0XzkgPX4gMSpjdWx0XzkNCiAgd2N1bHRfMTAgPX4gMSpjdWx0XzEwDQogIHdjdWx0XzExID1+IDEqY3VsdF8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2N1bHRfMiAgIH4gYyhhMSwgYTIpKndjdWx0XzEgKyBjKGIxLCBiMikqd0ZlZHVjX2FfMQ0KICB3Y3VsdF8zICAgfiBjKGExLCBhMikqd2N1bHRfMiArIGMoYjEsIGIyKSp3RmVkdWNfYV8yDQogIHdjdWx0XzQgICB+IGMoYTEsIGEyKSp3Y3VsdF8zICsgYyhiMSwgYjIpKndGZWR1Y19hXzMNCiAgd2N1bHRfNSAgIH4gYyhhMSwgYTIpKndjdWx0XzQgKyBjKGIxLCBiMikqd0ZlZHVjX2FfNA0KICB3Y3VsdF82ICAgfiBjKGExLCBhMikqd2N1bHRfNSArIGMoYjEsIGIyKSp3RmVkdWNfYV81DQogIHdjdWx0XzcgICB+IGMoYTEsIGEyKSp3Y3VsdF82ICsgYyhiMSwgYjIpKndGZWR1Y19hXzYNCiAgd2N1bHRfOCAgIH4gYyhhMSwgYTIpKndjdWx0XzcgKyBjKGIxLCBiMikqd0ZlZHVjX2FfNw0KICB3Y3VsdF85ICAgfiBjKGExLCBhMikqd2N1bHRfOCArIGMoYjEsIGIyKSp3RmVkdWNfYV84DQogIHdjdWx0XzEwICB+IGMoYTEsIGEyKSp3Y3VsdF85ICsgYyhiMSwgYjIpKndGZWR1Y19hXzkNCiAgd2N1bHRfMTEgIH4gYyhhMSwgYTIpKndjdWx0XzEwICsgYyhiMSwgYjIpKndGZWR1Y19hXzEwDQogIA0KICANCiAgd0ZlZHVjX2FfMiAgfiBjKGMxLCBjMikqd2N1bHRfMSArIGMoZDEsIGQyKSp3RmVkdWNfYV8xDQogIHdGZWR1Y19hXzMgIH4gYyhjMSwgYzIpKndjdWx0XzIgKyBjKGQxLCBkMikqd0ZlZHVjX2FfMg0KICB3RmVkdWNfYV80ICB+IGMoYzEsIGMyKSp3Y3VsdF8zICsgYyhkMSwgZDIpKndGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNSAgfiBjKGMxLCBjMikqd2N1bHRfNCArIGMoZDEsIGQyKSp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyhjMSwgYzIpKndjdWx0XzUgKyBjKGQxLCBkMikqd0ZlZHVjX2FfNQ0KICB3RmVkdWNfYV83ICB+IGMoYzEsIGMyKSp3Y3VsdF82ICsgYyhkMSwgZDIpKndGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfOCAgfiBjKGMxLCBjMikqd2N1bHRfNyArIGMoZDEsIGQyKSp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyhjMSwgYzIpKndjdWx0XzggKyBjKGQxLCBkMikqd0ZlZHVjX2FfOA0KICB3RmVkdWNfYV8xMCAgfiBjKGMxLCBjMikqd2N1bHRfOSArIGMoZDEsIGQyKSp3RmVkdWNfYV85DQogIHdGZWR1Y19hXzExICB+IGMoYzEsIGMyKSp3Y3VsdF8xMCArIGMoZDEsIGQyKSp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdjdWx0XzEgfn4gd0ZlZHVjX2FfMSAjIENvdmFyaWFuY2UNCg0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2N1bHRfMiB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzINCiAgd2N1bHRfMyB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzMNCiAgd2N1bHRfNCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzQNCiAgd2N1bHRfNSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzUNCiAgd2N1bHRfNiB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzYNCiAgd2N1bHRfNyB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzcNCiAgd2N1bHRfOCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzgNCiAgd2N1bHRfOSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzkNCiAgd2N1bHRfMTAgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV8xMA0KICB3Y3VsdF8xMSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2N1bHRfMSB+fiB3Y3VsdF8xIA0KICB3RmVkdWNfYV8xIH5+IHdGZWR1Y19hXzENCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdjdWx0XzIgfn4gYyh2eTEsIHZ5Mikqd2N1bHRfMiANCiAgd0ZlZHVjX2FfMiB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8yDQogIHdjdWx0XzMgfn4gYyh2eTEsIHZ5Mikqd2N1bHRfMw0KICB3RmVkdWNfYV8zIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzMNCiAgd2N1bHRfNCB+fiBjKHZ5MSwgdnkyKSp3Y3VsdF80IA0KICB3RmVkdWNfYV80IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzQNCiAgd2N1bHRfNSB+fiBjKHZ5MSwgdnkyKSp3Y3VsdF81DQogIHdGZWR1Y19hXzUgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNQ0KICB3Y3VsdF82IH5+IGModnkxLCB2eTIpKndjdWx0XzYgDQogIHdGZWR1Y19hXzYgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNg0KICB3Y3VsdF83IH5+IGModnkxLCB2eTIpKndjdWx0XzcgDQogIHdGZWR1Y19hXzcgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNw0KICB3Y3VsdF84IH5+IGModnkxLCB2eTIpKndjdWx0XzggDQogIHdGZWR1Y19hXzggfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfOA0KICB3Y3VsdF85IH5+IGModnkxLCB2eTIpKndjdWx0XzkgDQogIHdGZWR1Y19hXzkgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMCB+fiBjKHZ5MSwgdnkyKSp3Y3VsdF8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMTANCiAgd2N1bHRfMTEgfn4gYyh2eTEsIHZ5Mikqd2N1bHRfMTEgDQogIHdGZWR1Y19hXzExIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzExDQogIA0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8xICsgMCp3Y3VsdF8xDQoNCicNCiNjcmVhdGUgYW5kIHN0b3JlIG1vZGVsDQojY3JlYXRlIGZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImN1bHRfbW9kZWw4X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQpjdWx0X21vZGVsOF91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0IDwtDQogIGxhdmFhbigNCiAgICBjdWx0X21vZGVsOF91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcsDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAiYXZlXzIiDQogICkNCg0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKGN1bHRfbW9kZWw4X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHsNCiAgbG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQoNCmBgYA0KDQpgYGB7ciBjdWx0IG04IGNvbnN0cmFpbmVkIGdyb3VwcyBsYWd9DQojY3JlYXRlIGFuZCBzdG9yZSBtb2RlbA0KI2NyZWF0ZSBmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJjdWx0X21vZGVsOF9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCmN1bHRfbW9kZWw4X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0IDwtDQogIGxhdmFhbigNCiAgICBtYWluX2xhdmFhbl9yZXN1bHRzJGBMYXZhYW4gbW9kZWwgb2JqZWN0c2BbWzJdXVtbMl1dLA0KICAgIGRhdGEgPSBNeURhdGEsDQogICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgbWlzc2luZyA9ICdNTCcsDQogICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgaW50Lm92LmZyZWUgPSBULA0KICAgIGdyb3VwID0gImF2ZV8yIg0KICApDQoNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShjdWx0X21vZGVsOF9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2V7DQogIGxvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KICB9DQpgYGANCg0KYGBge3IgY3VsdCBtOCBscnRlc3R9DQpmaXRfbWF0cml4X2N1bHRfbThfY29uc3RyYWluZWRfZ3JvdXBzIDwtIGxhdkluc3BlY3QoY3VsdF9tb2RlbDhfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsIHdoYXQgPSAiZml0IikNCmZpdF9tYXRyaXhfY3VsdF9tOF91bmNvbnN0cmFpbmVkX2dyb3VwcyA8LSBsYXZJbnNwZWN0KGN1bHRfbW9kZWw4X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsIHdoYXQgPSAiZml0IikNCg0KZml0X21hdHJpeF9jdWx0X004IDwtIHJiaW5kKGZpdF9tYXRyaXhfY3VsdF9tOF9jb25zdHJhaW5lZF9ncm91cHMsIGZpdF9tYXRyaXhfY3VsdF9tOF91bmNvbnN0cmFpbmVkX2dyb3VwcykNCg0KbGF2VGVzdExSVChjdWx0X21vZGVsOF9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwgY3VsdF9tb2RlbDhfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCkNCmBgYA0KDQojIyMgaW5jb21lIGRpZmZlcmVuY2VzDQoNCmBgYHtyIGluY19kaWZmIG1vZGVsIDggY29uc3QgZ3JvdXBzIHVuY29ucyBsYWdzfQ0KDQppbmNfZGlmZl9tb2RlbDhfY29uc3RyYWluZWRfZ3JvdXBzIDwtICcNCg0KICAjIyMjIyMjIyMjIyMjIyMjDQogICMgQkVUV0VFTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgIyBDcmVhdGUgYmV0d2VlbiBjb21wb25lbnRzIChyYW5kb20gaW50ZXJjZXB0cykNCiAgUkl4ID1+IDEqRmVkdWNfYV8xICsgMSpGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqaW5jX2RpZmZfMSArIDEqaW5jX2RpZmZfMiArIDEqaW5jX2RpZmZfMyArIDEqaW5jX2RpZmZfNCArIDEqaW5jX2RpZmZfNSArIDEqaW5jX2RpZmZfNiArIDEqaW5jX2RpZmZfNyArIDEqaW5jX2RpZmZfOCArIDEqaW5jX2RpZmZfOSArIDEqaW5jX2RpZmZfMTAgKyAxKmluY19kaWZmXzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gIA0KICBGZWR1Y19hXzEgfn4gMCpGZWR1Y19hXzENCiAgRmVkdWNfYV8yIH5+IDAqRmVkdWNfYV8yDQogIEZlZHVjX2FfMyB+fiAwKkZlZHVjX2FfMw0KICBGZWR1Y19hXzQgfn4gMCpGZWR1Y19hXzQNCiAgRmVkdWNfYV81IH5+IDAqRmVkdWNfYV81DQogIEZlZHVjX2FfNiB+fiAwKkZlZHVjX2FfNg0KICBGZWR1Y19hXzcgfn4gMCpGZWR1Y19hXzcNCiAgRmVkdWNfYV84IH5+IDAqRmVkdWNfYV84DQogIEZlZHVjX2FfOSB+fiAwKkZlZHVjX2FfOQ0KICBGZWR1Y19hXzEwIH5+IDAqRmVkdWNfYV8xMA0KICBGZWR1Y19hXzExIH5+IDAqRmVkdWNfYV8xMQ0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMSA9fiAxKkZlZHVjX2FfMQ0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3aW5jX2RpZmZfMSA9fiAxKmluY19kaWZmXzENCiAgd2luY19kaWZmXzIgPX4gMSppbmNfZGlmZl8yDQogIHdpbmNfZGlmZl8zID1+IDEqaW5jX2RpZmZfMw0KICB3aW5jX2RpZmZfNCA9fiAxKmluY19kaWZmXzQNCiAgd2luY19kaWZmXzUgPX4gMSppbmNfZGlmZl81DQogIHdpbmNfZGlmZl82ID1+IDEqaW5jX2RpZmZfNg0KICB3aW5jX2RpZmZfNyA9fiAxKmluY19kaWZmXzcNCiAgd2luY19kaWZmXzggPX4gMSppbmNfZGlmZl84DQogIHdpbmNfZGlmZl85ID1+IDEqaW5jX2RpZmZfOQ0KICB3aW5jX2RpZmZfMTAgPX4gMSppbmNfZGlmZl8xMA0KICB3aW5jX2RpZmZfMTEgPX4gMSppbmNfZGlmZl8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2luY19kaWZmXzIgICB+IGMoYTEsIGExKSp3aW5jX2RpZmZfMSArIGMoYjEsIGIxKSp3RmVkdWNfYV8xDQogIHdpbmNfZGlmZl8zICAgfiBjKGEyLCBhMikqd2luY19kaWZmXzIgKyBjKGIyLCBiMikqd0ZlZHVjX2FfMg0KICB3aW5jX2RpZmZfNCAgIH4gYyhhMywgYTMpKndpbmNfZGlmZl8zICsgYyhiMywgYjMpKndGZWR1Y19hXzMNCiAgd2luY19kaWZmXzUgICB+IGMoYTQsIGE0KSp3aW5jX2RpZmZfNCArIGMoYjQsIGI0KSp3RmVkdWNfYV80DQogIHdpbmNfZGlmZl82ICAgfiBjKGE1LCBhNSkqd2luY19kaWZmXzUgKyBjKGI1LCBiNSkqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNyAgIH4gYyhhNiwgYTYpKndpbmNfZGlmZl82ICsgYyhiNiwgYjYpKndGZWR1Y19hXzYNCiAgd2luY19kaWZmXzggICB+IGMoYTcsIGE3KSp3aW5jX2RpZmZfNyArIGMoYjcsIGI3KSp3RmVkdWNfYV83DQogIHdpbmNfZGlmZl85ICAgfiBjKGE4LCBhOCkqd2luY19kaWZmXzggKyBjKGI4LCBiOCkqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfMTAgIH4gYyhhOSwgYTkpKndpbmNfZGlmZl85ICsgYyhiOSwgYjkpKndGZWR1Y19hXzkNCiAgd2luY19kaWZmXzExICB+IGMoYTEwLCBhMTApKndpbmNfZGlmZl8xMCArIGMoYjEwLCBiMTApKndGZWR1Y19hXzEwDQogIA0KICANCiAgd0ZlZHVjX2FfMiAgfiBjKGMxLCBjMSkqd2luY19kaWZmXzEgKyBjKGQxLCBkMSkqd0ZlZHVjX2FfMQ0KICB3RmVkdWNfYV8zICB+IGMoYzIsIGMyKSp3aW5jX2RpZmZfMiArIGMoZDIsIGQyKSp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyhjMywgYzMpKndpbmNfZGlmZl8zICsgYyhkMywgZDMpKndGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNSAgfiBjKGM0LCBjNCkqd2luY19kaWZmXzQgKyBjKGQ0LCBkNCkqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMoYzUsIGM1KSp3aW5jX2RpZmZfNSArIGMoZDUsIGQ1KSp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyhjNiwgYzYpKndpbmNfZGlmZl82ICsgYyhkNiwgZDYpKndGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfOCAgfiBjKGM3LCBjNykqd2luY19kaWZmXzcgKyBjKGQ3LCBkNykqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMoYzgsIGM4KSp3aW5jX2RpZmZfOCArIGMoZDgsIGQ4KSp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMoYzksIGM5KSp3aW5jX2RpZmZfOSArIGMoZDksIGQ5KSp3RmVkdWNfYV85DQogIHdGZWR1Y19hXzExICB+IGMoYzEwLCBjMTApKndpbmNfZGlmZl8xMCArIGMoZDEwLCBkMTApKndGZWR1Y19hXzEwDQogIA0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlIGF0IHRoZSBmaXJzdCB3YXZlLiANCiAgd2luY19kaWZmXzEgfn4gd0ZlZHVjX2FfMSAjIENvdmFyaWFuY2UNCg0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2luY19kaWZmXzIgfn4gY292KndGZWR1Y19hXzINCiAgd2luY19kaWZmXzMgfn4gY292KndGZWR1Y19hXzMNCiAgd2luY19kaWZmXzQgfn4gY292KndGZWR1Y19hXzQNCiAgd2luY19kaWZmXzUgfn4gY292KndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzYgfn4gY292KndGZWR1Y19hXzYNCiAgd2luY19kaWZmXzcgfn4gY292KndGZWR1Y19hXzcNCiAgd2luY19kaWZmXzggfn4gY292KndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzkgfn4gY292KndGZWR1Y19hXzkNCiAgd2luY19kaWZmXzEwIH5+IGNvdip3RmVkdWNfYV8xMA0KICB3aW5jX2RpZmZfMTEgfn4gY292KndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2luY19kaWZmXzEgfn4gd2luY19kaWZmXzEgDQogIHdGZWR1Y19hXzEgfn4gd0ZlZHVjX2FfMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2luY19kaWZmXzIgfn4gdnkqd2luY19kaWZmXzIgDQogIHdGZWR1Y19hXzIgfn4gdngqd0ZlZHVjX2FfMg0KICB3aW5jX2RpZmZfMyB+fiB2eSp3aW5jX2RpZmZfMw0KICB3RmVkdWNfYV8zIH5+IHZ4KndGZWR1Y19hXzMNCiAgd2luY19kaWZmXzQgfn4gdnkqd2luY19kaWZmXzQgDQogIHdGZWR1Y19hXzQgfn4gdngqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNSB+fiB2eSp3aW5jX2RpZmZfNQ0KICB3RmVkdWNfYV81IH5+IHZ4KndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzYgfn4gdnkqd2luY19kaWZmXzYgDQogIHdGZWR1Y19hXzYgfn4gdngqd0ZlZHVjX2FfNg0KICB3aW5jX2RpZmZfNyB+fiB2eSp3aW5jX2RpZmZfNyANCiAgd0ZlZHVjX2FfNyB+fiB2eCp3RmVkdWNfYV83DQogIHdpbmNfZGlmZl84IH5+IHZ5KndpbmNfZGlmZl84IA0KICB3RmVkdWNfYV84IH5+IHZ4KndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzkgfn4gdnkqd2luY19kaWZmXzkgDQogIHdGZWR1Y19hXzkgfn4gdngqd0ZlZHVjX2FfOQ0KICB3aW5jX2RpZmZfMTAgfn4gdnkqd2luY19kaWZmXzEwIA0KICB3RmVkdWNfYV8xMCB+fiB2eCp3RmVkdWNfYV8xMA0KICB3aW5jX2RpZmZfMTEgfn4gdnkqd2luY19kaWZmXzExIA0KICB3RmVkdWNfYV8xMSB+fiB2eCp3RmVkdWNfYV8xMQ0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8xICsgMCp3aW5jX2RpZmZfMQ0KDQonDQojY3JlYXRlIGFuZCBzdG9yZSBtb2RlbA0KI2NyZWF0ZSBmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJpbmNfZGlmZl9tb2RlbDhfY29uc3RyYWluZWRfZ3JvdXBzX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCmluY19kaWZmX21vZGVsOF9jb25zdHJhaW5lZF9ncm91cHNfZml0IDwtDQogIGxhdmFhbigNCiAgICBpbmNfZGlmZl9tb2RlbDhfY29uc3RyYWluZWRfZ3JvdXBzLA0KICAgIGRhdGEgPSBNeURhdGEsDQogICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgbWlzc2luZyA9ICdNTCcsDQogICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgaW50Lm92LmZyZWUgPSBULA0KICAgIGdyb3VwID0gImF2ZV8yIg0KICApDQogICNzYXZlIG1vZGVsDQogIHNhdmUoaW5jX2RpZmZfbW9kZWw4X2NvbnN0cmFpbmVkX2dyb3Vwc19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHsNCiAgbG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQpgYGANCg0KDQpgYGB7ciBpbmNfZGlmZiBtb2RlbCA4IHVuY29ucyBncm91cHMgYW5kIGNvbnN0IGxhZ3N9DQppbmNfZGlmZl9tb2RlbDhfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnIDwtICcNCg0KICAjIyMjIyMjIyMjIyMjIyMjDQogICMgQkVUV0VFTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgIyBDcmVhdGUgYmV0d2VlbiBjb21wb25lbnRzIChyYW5kb20gaW50ZXJjZXB0cykNCiAgUkl4ID1+IDEqRmVkdWNfYV8xICsgMSpGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqaW5jX2RpZmZfMSArIDEqaW5jX2RpZmZfMiArIDEqaW5jX2RpZmZfMyArIDEqaW5jX2RpZmZfNCArIDEqaW5jX2RpZmZfNSArIDEqaW5jX2RpZmZfNiArIDEqaW5jX2RpZmZfNyArIDEqaW5jX2RpZmZfOCArIDEqaW5jX2RpZmZfOSArIDEqaW5jX2RpZmZfMTAgKyAxKmluY19kaWZmXzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gIA0KICBGZWR1Y19hXzEgfn4gMCpGZWR1Y19hXzENCiAgRmVkdWNfYV8yIH5+IDAqRmVkdWNfYV8yDQogIEZlZHVjX2FfMyB+fiAwKkZlZHVjX2FfMw0KICBGZWR1Y19hXzQgfn4gMCpGZWR1Y19hXzQNCiAgRmVkdWNfYV81IH5+IDAqRmVkdWNfYV81DQogIEZlZHVjX2FfNiB+fiAwKkZlZHVjX2FfNg0KICBGZWR1Y19hXzcgfn4gMCpGZWR1Y19hXzcNCiAgRmVkdWNfYV84IH5+IDAqRmVkdWNfYV84DQogIEZlZHVjX2FfOSB+fiAwKkZlZHVjX2FfOQ0KICBGZWR1Y19hXzEwIH5+IDAqRmVkdWNfYV8xMA0KICBGZWR1Y19hXzExIH5+IDAqRmVkdWNfYV8xMQ0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMSA9fiAxKkZlZHVjX2FfMQ0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3aW5jX2RpZmZfMSA9fiAxKmluY19kaWZmXzENCiAgd2luY19kaWZmXzIgPX4gMSppbmNfZGlmZl8yDQogIHdpbmNfZGlmZl8zID1+IDEqaW5jX2RpZmZfMw0KICB3aW5jX2RpZmZfNCA9fiAxKmluY19kaWZmXzQNCiAgd2luY19kaWZmXzUgPX4gMSppbmNfZGlmZl81DQogIHdpbmNfZGlmZl82ID1+IDEqaW5jX2RpZmZfNg0KICB3aW5jX2RpZmZfNyA9fiAxKmluY19kaWZmXzcNCiAgd2luY19kaWZmXzggPX4gMSppbmNfZGlmZl84DQogIHdpbmNfZGlmZl85ID1+IDEqaW5jX2RpZmZfOQ0KICB3aW5jX2RpZmZfMTAgPX4gMSppbmNfZGlmZl8xMA0KICB3aW5jX2RpZmZfMTEgPX4gMSppbmNfZGlmZl8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2luY19kaWZmXzIgICB+IGMoYTEsIGEyKSp3aW5jX2RpZmZfMSArIGMoYjEsIGIyKSp3RmVkdWNfYV8xDQogIHdpbmNfZGlmZl8zICAgfiBjKGExLCBhMikqd2luY19kaWZmXzIgKyBjKGIxLCBiMikqd0ZlZHVjX2FfMg0KICB3aW5jX2RpZmZfNCAgIH4gYyhhMSwgYTIpKndpbmNfZGlmZl8zICsgYyhiMSwgYjIpKndGZWR1Y19hXzMNCiAgd2luY19kaWZmXzUgICB+IGMoYTEsIGEyKSp3aW5jX2RpZmZfNCArIGMoYjEsIGIyKSp3RmVkdWNfYV80DQogIHdpbmNfZGlmZl82ICAgfiBjKGExLCBhMikqd2luY19kaWZmXzUgKyBjKGIxLCBiMikqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNyAgIH4gYyhhMSwgYTIpKndpbmNfZGlmZl82ICsgYyhiMSwgYjIpKndGZWR1Y19hXzYNCiAgd2luY19kaWZmXzggICB+IGMoYTEsIGEyKSp3aW5jX2RpZmZfNyArIGMoYjEsIGIyKSp3RmVkdWNfYV83DQogIHdpbmNfZGlmZl85ICAgfiBjKGExLCBhMikqd2luY19kaWZmXzggKyBjKGIxLCBiMikqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfMTAgIH4gYyhhMSwgYTIpKndpbmNfZGlmZl85ICsgYyhiMSwgYjIpKndGZWR1Y19hXzkNCiAgd2luY19kaWZmXzExICB+IGMoYTEsIGEyKSp3aW5jX2RpZmZfMTAgKyBjKGIxLCBiMikqd0ZlZHVjX2FfMTANCiAgDQogIA0KICB3RmVkdWNfYV8yICB+IGMoYzEsIGMyKSp3aW5jX2RpZmZfMSArIGMoZDEsIGQyKSp3RmVkdWNfYV8xDQogIHdGZWR1Y19hXzMgIH4gYyhjMSwgYzIpKndpbmNfZGlmZl8yICsgYyhkMSwgZDIpKndGZWR1Y19hXzINCiAgd0ZlZHVjX2FfNCAgfiBjKGMxLCBjMikqd2luY19kaWZmXzMgKyBjKGQxLCBkMikqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMoYzEsIGMyKSp3aW5jX2RpZmZfNCArIGMoZDEsIGQyKSp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyhjMSwgYzIpKndpbmNfZGlmZl81ICsgYyhkMSwgZDIpKndGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNyAgfiBjKGMxLCBjMikqd2luY19kaWZmXzYgKyBjKGQxLCBkMikqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMoYzEsIGMyKSp3aW5jX2RpZmZfNyArIGMoZDEsIGQyKSp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyhjMSwgYzIpKndpbmNfZGlmZl84ICsgYyhkMSwgZDIpKndGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfMTAgIH4gYyhjMSwgYzIpKndpbmNfZGlmZl85ICsgYyhkMSwgZDIpKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyhjMSwgYzIpKndpbmNfZGlmZl8xMCArIGMoZDEsIGQyKSp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdpbmNfZGlmZl8xIH5+IHdGZWR1Y19hXzEgIyBDb3ZhcmlhbmNlDQoNCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZXMgYmV0d2VlbiB0aGUgcmVzaWR1YWxzDQogIHdpbmNfZGlmZl8yIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMg0KICB3aW5jX2RpZmZfMyB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzMNCiAgd2luY19kaWZmXzQgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV80DQogIHdpbmNfZGlmZl81IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNiB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzYNCiAgd2luY19kaWZmXzcgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV83DQogIHdpbmNfZGlmZl84IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfOSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzkNCiAgd2luY19kaWZmXzEwIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMTANCiAgd2luY19kaWZmXzExIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3aW5jX2RpZmZfMSB+fiB3aW5jX2RpZmZfMSANCiAgd0ZlZHVjX2FfMSB+fiB3RmVkdWNfYV8xDQogIA0KICAjIEVzdGltYXRlIHRoZSByZXNpZHVhbCB2YXJpYW5jZQ0KICB3aW5jX2RpZmZfMiB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfMiANCiAgd0ZlZHVjX2FfMiB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8yDQogIHdpbmNfZGlmZl8zIH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl8zDQogIHdGZWR1Y19hXzMgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNCB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfNCANCiAgd0ZlZHVjX2FfNCB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV80DQogIHdpbmNfZGlmZl81IH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl81DQogIHdGZWR1Y19hXzUgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNiB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfNiANCiAgd0ZlZHVjX2FfNiB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl83IH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl83IA0KICB3RmVkdWNfYV83IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzcNCiAgd2luY19kaWZmXzggfn4gYyh2eTEsIHZ5Mikqd2luY19kaWZmXzggDQogIHdGZWR1Y19hXzggfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfOSB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfOSANCiAgd0ZlZHVjX2FfOSB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMCB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfMTAgDQogIHdGZWR1Y19hXzEwIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzEwDQogIHdpbmNfZGlmZl8xMSB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfMTEgDQogIHdGZWR1Y19hXzExIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzEgKyAwKndpbmNfZGlmZl8xDQoNCicNCiNjcmVhdGUgYW5kIHN0b3JlIG1vZGVsDQojY3JlYXRlIGZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImluY19kaWZmX21vZGVsOF91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KaW5jX2RpZmZfbW9kZWw4X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQgPC0NCiAgbGF2YWFuKA0KICAgIGluY19kaWZmX21vZGVsOF91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcsDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAiYXZlXzIiDQogICkNCg0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKGluY19kaWZmX21vZGVsOF91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZSB7bG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQpgYGANCg0KYGBge3IgaW5jX2RpZmYgbTggY29uc3RyYWluZWQgZ3JvdXBzIGxhZ30NCiNjcmVhdGUgYW5kIHN0b3JlIG1vZGVsDQojY3JlYXRlIGZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImluY19kaWZmX21vZGVsOF9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCiAgaW5jX2RpZmZfbW9kZWw4X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0IDwtDQogICAgbGF2YWFuKA0KICAgICAgbWFpbl9sYXZhYW5fcmVzdWx0cyRgTGF2YWFuIG1vZGVsIG9iamVjdHNgW1szXV1bWzJdXSwNCiAgICAgIGRhdGEgPSBNeURhdGEsDQogICAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgICBncm91cCA9ICJhdmVfMiINCiAgICApDQogIA0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKGluY19kaWZmX21vZGVsOF9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2V7DQogIGxvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KYGBgDQoNCmBgYHtyIGluY19kaWZmIG04IGxydGVzdH0NCmZpdF9tYXRyaXhfaW5jX2RpZmZfbThfY29uc3RyYWluZWRfZ3JvdXBzIDwtIGxhdkluc3BlY3QoaW5jX2RpZmZfbW9kZWw4X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LCB3aGF0ID0gImZpdCIpDQpmaXRfbWF0cml4X2luY19kaWZmX204X3VuY29uc3RyYWluZWRfZ3JvdXBzIDwtIGxhdkluc3BlY3QoaW5jX2RpZmZfbW9kZWw4X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsIHdoYXQgPSAiZml0IikNCg0KZml0X21hdHJpeF9pbmNfZGlmZl9NOCA8LSByYmluZChmaXRfbWF0cml4X2luY19kaWZmX204X2NvbnN0cmFpbmVkX2dyb3VwcywgZml0X21hdHJpeF9pbmNfZGlmZl9tOF91bmNvbnN0cmFpbmVkX2dyb3VwcykNCg0KbGF2VGVzdExSVChpbmNfZGlmZl9tb2RlbDhfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsIGluY19kaWZmX21vZGVsOF91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0KQ0KYGBgDQoNCg0KDQojIEJldHdlZW4gbGV2ZWwgaW50ZXJhY3Rpb24gKHF1YXJ0aWxlcykNCg0KIyMgUG9saXRpY2FsIERpc2N1c3Npb24NCg0KIyMjIEVVIGludGVncmF0aW9uDQoNCmBgYHtyIEVVIG1vZGVsIDkgdW5jb25zdCBncm91cHMgYW5kIGNvbnN0IGxhZ3N9DQpFVV9tb2RlbDlfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnIDwtIA0KJw0KDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSpGZWR1Y19hXzEgKyAxKkZlZHVjX2FfMiArIDEqRmVkdWNfYV8zICsgMSpGZWR1Y19hXzQgKyAxKkZlZHVjX2FfNSArIDEqRmVkdWNfYV82ICsgMSpGZWR1Y19hXzcgKyAxKkZlZHVjX2FfOCArIDEqRmVkdWNfYV85ICsgMSpGZWR1Y19hXzEwICsgMSpGZWR1Y19hXzExDQogIFJJeSA9fiAgMSpldV8xICsgMSpldV8yICsgMSpldV8zICsgMSpldV80ICsgMSpldV81ICsgMSpldV82ICsgMSpldV83ICsgMSpldV84ICsgMSpldV85ICsgMSpldV8xMCArIDEqZXVfMTENCg0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSBhbmQgY292YXJpYW5jZSBvZiB0aGUgcmFuZG9tIGludGVyY2VwdHMuIA0KICBSSXggfn4gUkl4DQogIFJJeSB+fiBSSXkNCiAgUkl4IH5+IFJJeQ0KICANCiAgIyBSZWdyZXNzaW9uIG9mIHJhbmRvbSBpbnRlcmNlcHRzIG9uIHoxDQogIFJJeCArIFJJeSB+IGJldHdlZW5fZWR1YyArIGJldHdlZW5fYWdlICsgYmV0d2Vlbl9vcmlnaW4gKyBiZXR3ZWVuX2ZlbWFsZSMgQ29uc3RyYWluZWQgb3ZlciB0aW1lLg0KDQogICMgU2V0IHRoZSByZXNpZHVhbCB2YXJpYW5jZXMgb2YgYWxsIEZYIHZhcmlhYmxlcyB0byAwLiAgDQogIEZlZHVjX2FfMSB+fiAwKkZlZHVjX2FfMQ0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQoNCiAgIyMjIyMjIyMjIyMjIyMjDQogICMgV0lUSElOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAgIyBDcmVhdGUgd2l0aGluLXBlcnNvbiBjZW50ZXJlZCB2YXJpYWJsZXMuIA0KICB3RmVkdWNfYV8xID1+IDEqRmVkdWNfYV8xDQogIHdGZWR1Y19hXzIgPX4gMSpGZWR1Y19hXzINCiAgd0ZlZHVjX2FfMyA9fiAxKkZlZHVjX2FfMw0KICB3RmVkdWNfYV80ID1+IDEqRmVkdWNfYV80DQogIHdGZWR1Y19hXzUgPX4gMSpGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNiA9fiAxKkZlZHVjX2FfNg0KICB3RmVkdWNfYV83ID1+IDEqRmVkdWNfYV83DQogIHdGZWR1Y19hXzggPX4gMSpGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfOSA9fiAxKkZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMCA9fiAxKkZlZHVjX2FfMTANCiAgd0ZlZHVjX2FfMTEgPX4gMSpGZWR1Y19hXzExDQogIHdldV8xID1+IDEqZXVfMQ0KICB3ZXVfMiA9fiAxKmV1XzINCiAgd2V1XzMgPX4gMSpldV8zDQogIHdldV80ID1+IDEqZXVfNA0KICB3ZXVfNSA9fiAxKmV1XzUNCiAgd2V1XzYgPX4gMSpldV82DQogIHdldV83ID1+IDEqZXVfNw0KICB3ZXVfOCA9fiAxKmV1XzgNCiAgd2V1XzkgPX4gMSpldV85DQogIHdldV8xMCA9fiAxKmV1XzEwDQogIHdldV8xMSA9fiAxKmV1XzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3ZXVfMiAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2V1XzEgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV8xDQogIHdldV8zICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3ZXVfMiArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzINCiAgd2V1XzQgICB+IGMoYTEsIGEyLCBhMywgYTQpKndldV8zICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfMw0KICB3ZXVfNSAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2V1XzQgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV80DQogIHdldV82ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3ZXVfNSArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzUNCiAgd2V1XzcgICB+IGMoYTEsIGEyLCBhMywgYTQpKndldV82ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfNg0KICB3ZXVfOCAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2V1XzcgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV83DQogIHdldV85ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3ZXVfOCArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzgNCiAgd2V1XzEwICB+IGMoYTEsIGEyLCBhMywgYTQpKndldV85ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfOQ0KICB3ZXVfMTEgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2V1XzEwICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfMTANCiAgDQogIA0KICB3RmVkdWNfYV8yICB+IGMoYzEsIGMyLCBjMywgYzQpKndldV8xICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfMQ0KICB3RmVkdWNfYV8zICB+IGMoYzEsIGMyLCBjMywgYzQpKndldV8yICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfMg0KICB3RmVkdWNfYV80ICB+IGMoYzEsIGMyLCBjMywgYzQpKndldV8zICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMoYzEsIGMyLCBjMywgYzQpKndldV80ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMoYzEsIGMyLCBjMywgYzQpKndldV81ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfNQ0KICB3RmVkdWNfYV83ICB+IGMoYzEsIGMyLCBjMywgYzQpKndldV82ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMoYzEsIGMyLCBjMywgYzQpKndldV83ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMoYzEsIGMyLCBjMywgYzQpKndldV84ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfOA0KICB3RmVkdWNfYV8xMCAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3ZXVfOSArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2V1XzEwICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3ZXVfMSB+fiB3RmVkdWNfYV8xICMgQ292YXJpYW5jZQ0KDQogICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2V1XzIgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV8yDQogIHdldV8zIH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfMw0KICB3ZXVfNCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzQNCiAgd2V1XzUgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV81DQogIHdldV82IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNg0KICB3ZXVfNyB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzcNCiAgd2V1Xzggfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV84DQogIHdldV85IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfOQ0KICB3ZXVfMTAgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV8xMA0KICB3ZXVfMTEgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV8xMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgDQogIHdldV8xIH5+IHdldV8xIA0KICB3RmVkdWNfYV8xIH5+IHdGZWR1Y19hXzENCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdldV8yIH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3ZXVfMiANCiAgd0ZlZHVjX2FfMiB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfMg0KICB3ZXVfMyB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2V1XzMNCiAgd0ZlZHVjX2FfMyB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfMw0KICB3ZXVfNCB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2V1XzQgDQogIHdGZWR1Y19hXzQgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzQNCiAgd2V1XzUgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndldV81DQogIHdGZWR1Y19hXzUgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzUNCiAgd2V1XzYgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndldV82IA0KICB3RmVkdWNfYV82IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV82DQogIHdldV83IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3ZXVfNyANCiAgd0ZlZHVjX2FfNyB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfNw0KICB3ZXVfOCB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2V1XzggDQogIHdGZWR1Y19hXzggfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzgNCiAgd2V1Xzkgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndldV85IA0KICB3RmVkdWNfYV85IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV85DQogIHdldV8xMCB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2V1XzEwIA0KICB3RmVkdWNfYV8xMCB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfMTANCiAgd2V1XzExIH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3ZXVfMTEgDQogIHdGZWR1Y19hXzExIH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV8xMQ0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8xICsgMCp3ZXVfMQ0KDQonDQojY3JlYXRlIGFuZCBzdG9yZSBtb2RlbA0KI2NyZWF0ZSBmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJFVV9tb2RlbDlfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCg0KRVVfbW9kZWw5X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQgPC0NCiAgbGF2YWFuKA0KICAgIEVVX21vZGVsOV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcsDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAicG9sX2Rpc2NfcmVjIg0KICApDQoNCiANCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShFVV9tb2RlbDlfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Ugew0KICBsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBldSBtOSBjb25zdHJhaW5lZCBncm91cHMgbGFnfQ0KI2ZpbGUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiRVVfbW9kZWw5X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KRVVfbW9kZWw5X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0IDwtDQogIGxhdmFhbigNCiAgICBtYWluX2xhdmFhbl9yZXN1bHRzJGBMYXZhYW4gbW9kZWwgb2JqZWN0c2BbWzFdXVtbMl1dLA0KICAgIGRhdGEgPSBNeURhdGEsDQogICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgbWlzc2luZyA9ICdNTCcsDQogICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgaW50Lm92LmZyZWUgPSBULA0KICAgIGdyb3VwID0gInBvbF9kaXNjX3JlYyINCiAgKSANCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShFVV9tb2RlbDlfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHsNCiAgbG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQpgYGANCg0KYGBge3IgZXUgbTkgbHJ0ZXN0fQ0KbGF2VGVzdExSVChFVV9tb2RlbDlfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsIEVVX21vZGVsOV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0KQ0KDQoNCmBgYA0KDQojIyMgY3VsdHVyYWwgaW5jbHVzaW9uDQoNCmBgYHtyIGN1bHQgbW9kZWwgOSB1bmNvbnN0IGdyb3VwcyBhbmQgY29ucyBsYWdzfQ0KY3VsdF9tb2RlbDlfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnIDwtIA0KJw0KICAjIyMjIyMjIyMjIyMjIyMjDQogICMgQkVUV0VFTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgIyBDcmVhdGUgYmV0d2VlbiBjb21wb25lbnRzIChyYW5kb20gaW50ZXJjZXB0cykNCiAgUkl4ID1+IDEqRmVkdWNfYV8xICsgMSpGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqY3VsdF8xICsgMSpjdWx0XzIgKyAxKmN1bHRfMyArIDEqY3VsdF80ICsgMSpjdWx0XzUgKyAxKmN1bHRfNiArIDEqY3VsdF83ICsgMSpjdWx0XzggKyAxKmN1bHRfOSArIDEqY3VsdF8xMCArIDEqY3VsdF8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQogIA0KICAjIFJlZ3Jlc3Npb24gb2YgcmFuZG9tIGludGVyY2VwdHMgb24gejENCiAgUkl4ICsgUkl5IH4gYmV0d2Vlbl9lZHVjICsgYmV0d2Vlbl9hZ2UgKyBiZXR3ZWVuX29yaWdpbiArIGJldHdlZW5fZmVtYWxlIyBDb25zdHJhaW5lZCBvdmVyIHRpbWUuDQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuICANCiAgRmVkdWNfYV8xIH5+IDAqRmVkdWNfYV8xDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4gDQogIHdGZWR1Y19hXzEgPX4gMSpGZWR1Y19hXzENCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgd2N1bHRfMSA9fiAxKmN1bHRfMQ0KICB3Y3VsdF8yID1+IDEqY3VsdF8yDQogIHdjdWx0XzMgPX4gMSpjdWx0XzMNCiAgd2N1bHRfNCA9fiAxKmN1bHRfNA0KICB3Y3VsdF81ID1+IDEqY3VsdF81DQogIHdjdWx0XzYgPX4gMSpjdWx0XzYNCiAgd2N1bHRfNyA9fiAxKmN1bHRfNw0KICB3Y3VsdF84ID1+IDEqY3VsdF84DQogIHdjdWx0XzkgPX4gMSpjdWx0XzkNCiAgd2N1bHRfMTAgPX4gMSpjdWx0XzEwDQogIHdjdWx0XzExID1+IDEqY3VsdF8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2N1bHRfMiAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2N1bHRfMSArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzENCiAgd2N1bHRfMyAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2N1bHRfMiArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzINCiAgd2N1bHRfNCAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2N1bHRfMyArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzMNCiAgd2N1bHRfNSAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2N1bHRfNCArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzQNCiAgd2N1bHRfNiAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2N1bHRfNSArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzUNCiAgd2N1bHRfNyAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2N1bHRfNiArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzYNCiAgd2N1bHRfOCAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2N1bHRfNyArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzcNCiAgd2N1bHRfOSAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2N1bHRfOCArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzgNCiAgd2N1bHRfMTAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2N1bHRfOSArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzkNCiAgd2N1bHRfMTEgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2N1bHRfMTAgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV8xMA0KICANCiAgDQogIHdGZWR1Y19hXzIgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2N1bHRfMSArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzENCiAgd0ZlZHVjX2FfMyAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3Y3VsdF8yICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfMg0KICB3RmVkdWNfYV80ICB+IGMoYzEsIGMyLCBjMywgYzQpKndjdWx0XzMgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2N1bHRfNCArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNiAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3Y3VsdF81ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfNQ0KICB3RmVkdWNfYV83ICB+IGMoYzEsIGMyLCBjMywgYzQpKndjdWx0XzYgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2N1bHRfNyArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOSAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3Y3VsdF84ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfOA0KICB3RmVkdWNfYV8xMCAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3Y3VsdF85ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3Y3VsdF8xMCArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzEwDQogIA0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlIGF0IHRoZSBmaXJzdCB3YXZlLiANCiAgd2N1bHRfMSB+fiB3RmVkdWNfYV8xICMgQ292YXJpYW5jZQ0KDQogICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2N1bHRfMiB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzINCiAgd2N1bHRfMyB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzMNCiAgd2N1bHRfNCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzQNCiAgd2N1bHRfNSB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzUNCiAgd2N1bHRfNiB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzYNCiAgd2N1bHRfNyB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzcNCiAgd2N1bHRfOCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzgNCiAgd2N1bHRfOSB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzkNCiAgd2N1bHRfMTAgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV8xMA0KICB3Y3VsdF8xMSB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2N1bHRfMSB+fiB3Y3VsdF8xIA0KICB3RmVkdWNfYV8xIH5+IHdGZWR1Y19hXzENCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdjdWx0XzIgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndjdWx0XzIgDQogIHdGZWR1Y19hXzIgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzINCiAgd2N1bHRfMyB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2N1bHRfMw0KICB3RmVkdWNfYV8zIH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV8zDQogIHdjdWx0XzQgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndjdWx0XzQgDQogIHdGZWR1Y19hXzQgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzQNCiAgd2N1bHRfNSB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2N1bHRfNQ0KICB3RmVkdWNfYV81IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV81DQogIHdjdWx0XzYgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndjdWx0XzYgDQogIHdGZWR1Y19hXzYgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzYNCiAgd2N1bHRfNyB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2N1bHRfNyANCiAgd0ZlZHVjX2FfNyB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfNw0KICB3Y3VsdF84IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3Y3VsdF84IA0KICB3RmVkdWNfYV84IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV84DQogIHdjdWx0Xzkgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndjdWx0XzkgDQogIHdGZWR1Y19hXzkgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzkNCiAgd2N1bHRfMTAgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndjdWx0XzEwIA0KICB3RmVkdWNfYV8xMCB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfMTANCiAgd2N1bHRfMTEgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndjdWx0XzExIA0KICB3RmVkdWNfYV8xMSB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfMTENCiAgDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMgQURESVRJT05BTCBDT05TVFJBSU5UUyAjDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIFNldCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgYmV0d2Vlbi1mYWN0b3JzIChyYW5kb20gaW50ZXJjZXB0cykgYW5kIHdpdGhpbi0NCiAgIyBmYWN0b3JzIGF0IHdhdmUgMSBhdCAwLiANCiAgUkl4ICsgUkl5IH5+IDAqd0ZlZHVjX2FfMSArIDAqd2N1bHRfMQ0KDQonDQojZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiY3VsdF9tb2RlbDlfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCiAgY3VsdF9tb2RlbDlfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCA8LQ0KICAgIGxhdmFhbigNCiAgICAgIGN1bHRfbW9kZWw5X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZywNCiAgICAgIGRhdGEgPSBNeURhdGEsDQogICAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgICBncm91cCA9ICJwb2xfZGlzY19yZWMiDQogICAgKQ0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKGN1bHRfbW9kZWw5X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHsNCiAgbG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQoNCmBgYA0KDQpgYGB7ciBjdWx0IG05IGNvbnN0cmFpbmVkIGdyb3VwcyBsYWd9DQojZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiY3VsdF9tb2RlbDlfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQpjdWx0X21vZGVsOV9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgbWFpbl9sYXZhYW5fcmVzdWx0cyRgTGF2YWFuIG1vZGVsIG9iamVjdHNgW1syXV1bWzJdXSwNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJwb2xfZGlzY19yZWMiDQogICkNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShjdWx0X21vZGVsOV9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Ugew0KICBsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCg0KYGBgDQoNCmBgYHtyIGN1bHQgbTkgbHJ0ZXN0fQ0KbGF2VGVzdExSVChjdWx0X21vZGVsOV9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwgY3VsdF9tb2RlbDlfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCkNCmBgYA0KDQojIyMgaW5jb21lIGRpZmZlcmVuY2VzDQoNCmBgYHtyIGluY19kaWZmIG1vZGVsIDkgdW5jb25zdCBncm91cHMgYW5kIGNvbnN0IGxhZ3N9DQppbmNfZGlmZl9tb2RlbDlfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnIDwtICcNCg0KICAjIyMjIyMjIyMjIyMjIyMjDQogICMgQkVUV0VFTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgIyBDcmVhdGUgYmV0d2VlbiBjb21wb25lbnRzIChyYW5kb20gaW50ZXJjZXB0cykNCiAgUkl4ID1+IDEqRmVkdWNfYV8xICsgMSpGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqaW5jX2RpZmZfMSArIDEqaW5jX2RpZmZfMiArIDEqaW5jX2RpZmZfMyArIDEqaW5jX2RpZmZfNCArIDEqaW5jX2RpZmZfNSArIDEqaW5jX2RpZmZfNiArIDEqaW5jX2RpZmZfNyArIDEqaW5jX2RpZmZfOCArIDEqaW5jX2RpZmZfOSArIDEqaW5jX2RpZmZfMTAgKyAxKmluY19kaWZmXzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4NCiAgRmVkdWNfYV8xIH5+IDAqRmVkdWNfYV8xDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4gDQogIHdGZWR1Y19hXzEgPX4gMSpGZWR1Y19hXzENCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgd2luY19kaWZmXzEgPX4gMSppbmNfZGlmZl8xDQogIHdpbmNfZGlmZl8yID1+IDEqaW5jX2RpZmZfMg0KICB3aW5jX2RpZmZfMyA9fiAxKmluY19kaWZmXzMNCiAgd2luY19kaWZmXzQgPX4gMSppbmNfZGlmZl80DQogIHdpbmNfZGlmZl81ID1+IDEqaW5jX2RpZmZfNQ0KICB3aW5jX2RpZmZfNiA9fiAxKmluY19kaWZmXzYNCiAgd2luY19kaWZmXzcgPX4gMSppbmNfZGlmZl83DQogIHdpbmNfZGlmZl84ID1+IDEqaW5jX2RpZmZfOA0KICB3aW5jX2RpZmZfOSA9fiAxKmluY19kaWZmXzkNCiAgd2luY19kaWZmXzEwID1+IDEqaW5jX2RpZmZfMTANCiAgd2luY19kaWZmXzExID1+IDEqaW5jX2RpZmZfMTEgDQogIA0KICAjIEVzdGltYXRlIHRoZSBsYWdnZWQgZWZmZWN0cyAoY29uc3RyYWluZWQpDQogIHdpbmNfZGlmZl8yICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3aW5jX2RpZmZfMSArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzENCiAgd2luY19kaWZmXzMgICB+IGMoYTEsIGEyLCBhMywgYTQpKndpbmNfZGlmZl8yICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfMg0KICB3aW5jX2RpZmZfNCAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2luY19kaWZmXzMgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl81ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3aW5jX2RpZmZfNCArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzQNCiAgd2luY19kaWZmXzYgICB+IGMoYTEsIGEyLCBhMywgYTQpKndpbmNfZGlmZl81ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNyAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2luY19kaWZmXzYgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl84ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3aW5jX2RpZmZfNyArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzcNCiAgd2luY19kaWZmXzkgICB+IGMoYTEsIGEyLCBhMywgYTQpKndpbmNfZGlmZl84ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfMTAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2luY19kaWZmXzkgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMSAgfiBjKGExLCBhMiwgYTMsIGE0KSp3aW5jX2RpZmZfMTAgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV8xMA0KICANCiAgDQogIHdGZWR1Y19hXzIgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2luY19kaWZmXzEgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV8xDQogIHdGZWR1Y19hXzMgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2luY19kaWZmXzIgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2luY19kaWZmXzMgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2luY19kaWZmXzQgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2luY19kaWZmXzUgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2luY19kaWZmXzYgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2luY19kaWZmXzcgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2luY19kaWZmXzggKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMoYzEsIGMyLCBjMywgYzQpKndpbmNfZGlmZl85ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3aW5jX2RpZmZfMTAgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdpbmNfZGlmZl8xIH5+IHdGZWR1Y19hXzEgIyBDb3ZhcmlhbmNlDQoNCiAgICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3aW5jX2RpZmZfMiB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzINCiAgd2luY19kaWZmXzMgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl80IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNSB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzYgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl83IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzkgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzEwDQogIHdpbmNfZGlmZl8xMSB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2luY19kaWZmXzEgfn4gd2luY19kaWZmXzEgDQogIHdGZWR1Y19hXzEgfn4gd0ZlZHVjX2FfMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2luY19kaWZmXzIgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndpbmNfZGlmZl8yIA0KICB3RmVkdWNfYV8yIH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV8yDQogIHdpbmNfZGlmZl8zIH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3aW5jX2RpZmZfMw0KICB3RmVkdWNfYV8zIH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl80IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3aW5jX2RpZmZfNCANCiAgd0ZlZHVjX2FfNCB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNSB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2luY19kaWZmXzUNCiAgd0ZlZHVjX2FfNSB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNiB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2luY19kaWZmXzYgDQogIHdGZWR1Y19hXzYgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzYNCiAgd2luY19kaWZmXzcgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndpbmNfZGlmZl83IA0KICB3RmVkdWNfYV83IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV83DQogIHdpbmNfZGlmZl84IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3aW5jX2RpZmZfOCANCiAgd0ZlZHVjX2FfOCB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfOSB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2luY19kaWZmXzkgDQogIHdGZWR1Y19hXzkgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzkNCiAgd2luY19kaWZmXzEwIH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3aW5jX2RpZmZfMTAgDQogIHdGZWR1Y19hXzEwIH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV8xMA0KICB3aW5jX2RpZmZfMTEgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndpbmNfZGlmZl8xMSANCiAgd0ZlZHVjX2FfMTEgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzEgKyAwKndpbmNfZGlmZl8xDQoNCicNCg0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImluY19kaWZmX21vZGVsOV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KaW5jX2RpZmZfbW9kZWw5X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQgPC0NCiAgbGF2YWFuKA0KICAgIGluY19kaWZmX21vZGVsOV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcsDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAicG9sX2Rpc2NfcmVjIg0KICApDQoNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShpbmNfZGlmZl9tb2RlbDlfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Ugew0KICBsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBpbmNfZGlmZiBtOSBjb25zdHJhaW5lZCBncm91cHMgbGFnfQ0KDQojZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiaW5jX2RpZmZfbW9kZWw5X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KaW5jX2RpZmZfbW9kZWw5X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0IDwtDQogIGxhdmFhbigNCiAgICBtYWluX2xhdmFhbl9yZXN1bHRzJGBMYXZhYW4gbW9kZWwgb2JqZWN0c2BbWzNdXVtbMl1dLA0KICAgIGRhdGEgPSBNeURhdGEsDQogICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgbWlzc2luZyA9ICdNTCcsDQogICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgaW50Lm92LmZyZWUgPSBULA0KICAgIGdyb3VwID0gInBvbF9kaXNjXzIiDQogICkNCg0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKGluY19kaWZmX21vZGVsOV9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Ugew0KICBsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBpbmNfZGlmZiBtOSBscnRlc3R9DQpsYXZUZXN0TFJUKGluY19kaWZmX21vZGVsOV9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwgaW5jX2RpZmZfbW9kZWw5X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQpDQpgYGANCg0KIyMgTmV3bmVzcw0KDQpgYGB7ciBjcmVhdGUgYmV0d2VlbiB2YXJpYWJsZXMgbmV3bmVzcyB9DQpNeURhdGEgPC0gTXlEYXRhICU+JQ0KICBtdXRhdGUocmxfcmVjID0gY3V0MihybF9tZWFuLCBnID0gNCksDQogICAgICAgICBybF8yID0gY3V0MihybF9tZWFuLCBnID0gMikpDQpgYGANCg0KIyMjIEVVIGludGVncmF0aW9uDQoNCg0KYGBge3IgRVUgbW9kZWwgMTAgdW5jb25zdCBncm91cHMgYW5kIGNvbnN0IGxhZ3N9DQpFVV9tb2RlbDEwX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZyA8LSANCicNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAxKkZlZHVjX2FfMiArIDEqRmVkdWNfYV8zICsgMSpGZWR1Y19hXzQgKyAxKkZlZHVjX2FfNSArIDEqRmVkdWNfYV82ICsgMSpGZWR1Y19hXzcgKyAxKkZlZHVjX2FfOCArIDEqRmVkdWNfYV85ICsgMSpGZWR1Y19hXzEwICsgMSpGZWR1Y19hXzExDQogIFJJeSA9fiAxKmV1XzIgKyAxKmV1XzMgKyAxKmV1XzQgKyAxKmV1XzUgKyAxKmV1XzYgKyAxKmV1XzcgKyAxKmV1XzggKyAxKmV1XzkgKyAxKmV1XzEwICsgMSpldV8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQogIA0KICAjIFJlZ3Jlc3Npb24gb2YgcmFuZG9tIGludGVyY2VwdHMgb24gejENCiAgUkl4ICsgUkl5IH4gYmV0d2Vlbl9lZHVjICsgYmV0d2Vlbl9hZ2UgKyBiZXR3ZWVuX29yaWdpbiArIGJldHdlZW5fZmVtYWxlIyBDb25zdHJhaW5lZCBvdmVyIHRpbWUuDQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4gDQogIHdGZWR1Y19hXzIgPX4gMSpGZWR1Y19hXzINCiAgd0ZlZHVjX2FfMyA9fiAxKkZlZHVjX2FfMw0KICB3RmVkdWNfYV80ID1+IDEqRmVkdWNfYV80DQogIHdGZWR1Y19hXzUgPX4gMSpGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNiA9fiAxKkZlZHVjX2FfNg0KICB3RmVkdWNfYV83ID1+IDEqRmVkdWNfYV83DQogIHdGZWR1Y19hXzggPX4gMSpGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfOSA9fiAxKkZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMCA9fiAxKkZlZHVjX2FfMTANCiAgd0ZlZHVjX2FfMTEgPX4gMSpGZWR1Y19hXzExDQogIHdldV8yID1+IDEqZXVfMg0KICB3ZXVfMyA9fiAxKmV1XzMNCiAgd2V1XzQgPX4gMSpldV80DQogIHdldV81ID1+IDEqZXVfNQ0KICB3ZXVfNiA9fiAxKmV1XzYNCiAgd2V1XzcgPX4gMSpldV83DQogIHdldV84ID1+IDEqZXVfOA0KICB3ZXVfOSA9fiAxKmV1XzkNCiAgd2V1XzEwID1+IDEqZXVfMTANCiAgd2V1XzExID1+IDEqZXVfMTEgDQogIA0KICAjIEVzdGltYXRlIHRoZSBsYWdnZWQgZWZmZWN0cyAoY29uc3RyYWluZWQpDQogIHdldV8zICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3ZXVfMiArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzINCiAgd2V1XzQgICB+IGMoYTEsIGEyLCBhMywgYTQpKndldV8zICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfMw0KICB3ZXVfNSAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2V1XzQgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV80DQogIHdldV82ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3ZXVfNSArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzUNCiAgd2V1XzcgICB+IGMoYTEsIGEyLCBhMywgYTQpKndldV82ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfNg0KICB3ZXVfOCAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2V1XzcgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV83DQogIHdldV85ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3ZXVfOCArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzgNCiAgd2V1XzEwICB+IGMoYTEsIGEyLCBhMywgYTQpKndldV85ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfOQ0KICB3ZXVfMTEgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2V1XzEwICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfMTANCiAgDQogIHdGZWR1Y19hXzMgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2V1XzIgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2V1XzMgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2V1XzQgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2V1XzUgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2V1XzYgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2V1XzcgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2V1XzggKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMoYzEsIGMyLCBjMywgYzQpKndldV85ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3ZXVfMTAgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdldV8yIH5+IHdGZWR1Y19hXzIgIyBDb3ZhcmlhbmNlDQoNCiAgICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3ZXVfMyB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzMNCiAgd2V1XzQgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV80DQogIHdldV81IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNQ0KICB3ZXVfNiB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzYNCiAgd2V1Xzcgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV83DQogIHdldV84IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfOA0KICB3ZXVfOSB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzkNCiAgd2V1XzEwIH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfMTANCiAgd2V1XzExIH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3ZXVfMiB+fiB3ZXVfMiANCiAgd0ZlZHVjX2FfMiB+fiB3RmVkdWNfYV8yDQogIA0KICAjIEVzdGltYXRlIHRoZSByZXNpZHVhbCB2YXJpYW5jZQ0KICB3ZXVfMyB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2V1XzMNCiAgd0ZlZHVjX2FfMyB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfMw0KICB3ZXVfNCB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2V1XzQgDQogIHdGZWR1Y19hXzQgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzQNCiAgd2V1XzUgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndldV81DQogIHdGZWR1Y19hXzUgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzUNCiAgd2V1XzYgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndldV82IA0KICB3RmVkdWNfYV82IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV82DQogIHdldV83IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3ZXVfNyANCiAgd0ZlZHVjX2FfNyB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfNw0KICB3ZXVfOCB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2V1XzggDQogIHdGZWR1Y19hXzggfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzgNCiAgd2V1Xzkgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndldV85IA0KICB3RmVkdWNfYV85IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV85DQogIHdldV8xMCB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2V1XzEwIA0KICB3RmVkdWNfYV8xMCB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfMTANCiAgd2V1XzExIH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3ZXVfMTEgDQogIHdGZWR1Y19hXzExIH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV8xMQ0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8yICsgMCp3ZXVfMg0KDQonDQoNCiNmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJFVV9tb2RlbDEwX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQpFVV9tb2RlbDEwX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQgPC0NCiAgbGF2YWFuKA0KICAgIEVVX21vZGVsMTBfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnLA0KICAgIGRhdGEgPSBNeURhdGEsDQogICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgbWlzc2luZyA9ICdNTCcsDQogICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgaW50Lm92LmZyZWUgPSBULA0KICAgIGdyb3VwID0gInJsX3JlYyINCiAgKQ0KDQogICNzYXZlIG1vZGVsDQogIHNhdmUoRVVfbW9kZWwxMF91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZSB7DQogIGxvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KYGBgDQoNCmBgYHtyIGV1IG0xMCBjb25zdHJhaW5lZCBncm91cHMgbGFnfQ0KDQojZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiRVVfbW9kZWwxMF9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCkVVX21vZGVsMTBfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQgPC0NCiAgbGF2YWFuKA0KICAgIG1haW5fbGF2YWFuX3Jlc3VsdHMkYExhdmFhbiBtb2RlbCBvYmplY3RzYFtbMV1dW1syXV0sDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAicmxfcmVjIg0KICApDQoNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShFVV9tb2RlbDEwX2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZSB7DQogIGxvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KYGBgDQoNCmBgYHtyIGV1IG0xMCBscnRlc3R9DQpsYXZUZXN0TFJUKEVVX21vZGVsMTBfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsIEVVX21vZGVsMTBfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCkNCmBgYA0KDQojIyMgY3VsdHVyYWwgaW5jbHVzaW9uDQoNCg0KDQpgYGB7ciBjdWx0IG1vZGVsIDEwIHVuY29ucyBncm91cHMgYW5kIGNvbnMgbGFnc30NCmN1bHRfbW9kZWwxMF91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcgPC0gDQonDQoNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAgMSpGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqY3VsdF8yICsgMSpjdWx0XzMgKyAxKmN1bHRfNCArIDEqY3VsdF81ICsgMSpjdWx0XzYgKyAxKmN1bHRfNyArIDEqY3VsdF84ICsgMSpjdWx0XzkgKyAxKmN1bHRfMTAgKyAxKmN1bHRfMTENCg0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSBhbmQgY292YXJpYW5jZSBvZiB0aGUgcmFuZG9tIGludGVyY2VwdHMuIA0KICBSSXggfn4gUkl4DQogIFJJeSB+fiBSSXkNCiAgUkl4IH5+IFJJeQ0KICANCiAgIyBSZWdyZXNzaW9uIG9mIHJhbmRvbSBpbnRlcmNlcHRzIG9uIHoxDQogIFJJeCArIFJJeSB+IGJldHdlZW5fZWR1YyArIGJldHdlZW5fYWdlICsgYmV0d2Vlbl9vcmlnaW4gKyBiZXR3ZWVuX2ZlbWFsZSMgQ29uc3RyYWluZWQgb3ZlciB0aW1lLg0KDQogICMgU2V0IHRoZSByZXNpZHVhbCB2YXJpYW5jZXMgb2YgYWxsIEZYIHZhcmlhYmxlcyB0byAwLg0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQoNCiAgIyMjIyMjIyMjIyMjIyMjDQogICMgV0lUSElOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAgIyBDcmVhdGUgd2l0aGluLXBlcnNvbiBjZW50ZXJlZCB2YXJpYWJsZXMuDQogIHdGZWR1Y19hXzIgPX4gMSpGZWR1Y19hXzINCiAgd0ZlZHVjX2FfMyA9fiAxKkZlZHVjX2FfMw0KICB3RmVkdWNfYV80ID1+IDEqRmVkdWNfYV80DQogIHdGZWR1Y19hXzUgPX4gMSpGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNiA9fiAxKkZlZHVjX2FfNg0KICB3RmVkdWNfYV83ID1+IDEqRmVkdWNfYV83DQogIHdGZWR1Y19hXzggPX4gMSpGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfOSA9fiAxKkZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMCA9fiAxKkZlZHVjX2FfMTANCiAgd0ZlZHVjX2FfMTEgPX4gMSpGZWR1Y19hXzExDQogIHdjdWx0XzIgPX4gMSpjdWx0XzINCiAgd2N1bHRfMyA9fiAxKmN1bHRfMw0KICB3Y3VsdF80ID1+IDEqY3VsdF80DQogIHdjdWx0XzUgPX4gMSpjdWx0XzUNCiAgd2N1bHRfNiA9fiAxKmN1bHRfNg0KICB3Y3VsdF83ID1+IDEqY3VsdF83DQogIHdjdWx0XzggPX4gMSpjdWx0XzgNCiAgd2N1bHRfOSA9fiAxKmN1bHRfOQ0KICB3Y3VsdF8xMCA9fiAxKmN1bHRfMTANCiAgd2N1bHRfMTEgPX4gMSpjdWx0XzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3Y3VsdF8zICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF8yICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfMg0KICB3Y3VsdF80ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF8zICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfMw0KICB3Y3VsdF81ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF80ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfNA0KICB3Y3VsdF82ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF81ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfNQ0KICB3Y3VsdF83ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF82ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfNg0KICB3Y3VsdF84ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF83ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfNw0KICB3Y3VsdF85ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF84ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfOA0KICB3Y3VsdF8xMCAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF85ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMSAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF8xMCArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzEwDQogIA0KICB3RmVkdWNfYV8zICB+IGMoYzEsIGMyLCBjMywgYzQpKndjdWx0XzIgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2N1bHRfMyArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNSAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3Y3VsdF80ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMoYzEsIGMyLCBjMywgYzQpKndjdWx0XzUgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2N1bHRfNiArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfOCAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3Y3VsdF83ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMoYzEsIGMyLCBjMywgYzQpKndjdWx0XzggKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMoYzEsIGMyLCBjMywgYzQpKndjdWx0XzkgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV85DQogIHdGZWR1Y19hXzExICB+IGMoYzEsIGMyLCBjMywgYzQpKndjdWx0XzEwICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3Y3VsdF8yIH5+IHdGZWR1Y19hXzIgIyBDb3ZhcmlhbmNlDQoNCiAgICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3Y3VsdF8zIH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfMw0KICB3Y3VsdF80IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNA0KICB3Y3VsdF81IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNQ0KICB3Y3VsdF82IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNg0KICB3Y3VsdF83IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNw0KICB3Y3VsdF84IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfOA0KICB3Y3VsdF85IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzEwDQogIHdjdWx0XzExIH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3Y3VsdF8yIH5+IHdjdWx0XzINCiAgd0ZlZHVjX2FfMiB+fiB3RmVkdWNfYV8yDQogIA0KICAjIEVzdGltYXRlIHRoZSByZXNpZHVhbCB2YXJpYW5jZQ0KICB3Y3VsdF8zIH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3Y3VsdF8zDQogIHdGZWR1Y19hXzMgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzMNCiAgd2N1bHRfNCB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2N1bHRfNCANCiAgd0ZlZHVjX2FfNCB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfNA0KICB3Y3VsdF81IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3Y3VsdF81DQogIHdGZWR1Y19hXzUgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzUNCiAgd2N1bHRfNiB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2N1bHRfNiANCiAgd0ZlZHVjX2FfNiB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfNg0KICB3Y3VsdF83IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3Y3VsdF83IA0KICB3RmVkdWNfYV83IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV83DQogIHdjdWx0Xzggfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndjdWx0XzggDQogIHdGZWR1Y19hXzggfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzgNCiAgd2N1bHRfOSB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2N1bHRfOSANCiAgd0ZlZHVjX2FfOSB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMCB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2N1bHRfMTAgDQogIHdGZWR1Y19hXzEwIH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV8xMA0KICB3Y3VsdF8xMSB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2N1bHRfMTEgDQogIHdGZWR1Y19hXzExIH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV8xMQ0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8yICsgMCp3Y3VsdF8yDQoNCicNCiNmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJjdWx0X21vZGVsMTBfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCiAgY3VsdF9tb2RlbDEwX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQgPC0NCiAgICBsYXZhYW4oDQogICAgICBjdWx0X21vZGVsMTBfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnLA0KICAgICAgZGF0YSA9IE15RGF0YSwNCiAgICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgICAgbWlzc2luZyA9ICdNTCcsDQogICAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICAgIGludC5vdi5mcmVlID0gVCwNCiAgICAgIGdyb3VwID0gInJsX3JlYyINCiAgICApDQogIA0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKGN1bHRfbW9kZWwxMF91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZSB7DQogIGxvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KYGBgDQoNCmBgYHtyIGN1bHQgbTEwIGNvbnN0cmFpbmVkIGdyb3VwcyBsYWd9DQojZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiY3VsdF9tb2RlbDEwX2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KY3VsdF9tb2RlbDEwX2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0IDwtDQogIGxhdmFhbigNCiAgICBtYWluX2xhdmFhbl9yZXN1bHRzJGBMYXZhYW4gbW9kZWwgb2JqZWN0c2BbWzJdXVtbMl1dLA0KICAgIGRhdGEgPSBNeURhdGEsDQogICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgbWlzc2luZyA9ICdNTCcsDQogICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgaW50Lm92LmZyZWUgPSBULA0KICAgIGdyb3VwID0gInJsX3JlYyINCiAgKQ0KICANCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShjdWx0X21vZGVsMTBfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHsNCiAgbG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQpgYGANCg0KYGBge3IgY3VsdCBtMTAgbHJ0ZXN0fQ0KbGF2VGVzdExSVChjdWx0X21vZGVsMTBfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsIGN1bHRfbW9kZWwxMF91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0KQ0KYGBgDQoNCiMjIyBpbmNvbWUgZGlmZmVyZW5jZXMNCg0KYGBge3IgaW5jX2RpZmYgbW9kZWwgMTAgdW5jb25zdCBncm91cHMgYW5kIGNvbnN0IGxhZ3N9DQppbmNfZGlmZl9tb2RlbDEwX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZyA8LSAnDQoNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAxKkZlZHVjX2FfMiArIDEqRmVkdWNfYV8zICsgMSpGZWR1Y19hXzQgKyAxKkZlZHVjX2FfNSArIDEqRmVkdWNfYV82ICsgMSpGZWR1Y19hXzcgKyAxKkZlZHVjX2FfOCArIDEqRmVkdWNfYV85ICsgMSpGZWR1Y19hXzEwICsgMSpGZWR1Y19hXzExDQogIFJJeSA9fiAgMSppbmNfZGlmZl8yICsgMSppbmNfZGlmZl8zICsgMSppbmNfZGlmZl80ICsgMSppbmNfZGlmZl81ICsgMSppbmNfZGlmZl82ICsgMSppbmNfZGlmZl83ICsgMSppbmNfZGlmZl84ICsgMSppbmNfZGlmZl85ICsgMSppbmNfZGlmZl8xMCArIDEqaW5jX2RpZmZfMTENCg0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSBhbmQgY292YXJpYW5jZSBvZiB0aGUgcmFuZG9tIGludGVyY2VwdHMuIA0KICBSSXggfn4gUkl4DQogIFJJeSB+fiBSSXkNCiAgUkl4IH5+IFJJeQ0KICANCiAgIyBSZWdyZXNzaW9uIG9mIHJhbmRvbSBpbnRlcmNlcHRzIG9uIHoxDQogIFJJeCArIFJJeSB+IGJldHdlZW5fZWR1YyArIGJldHdlZW5fYWdlICsgYmV0d2Vlbl9vcmlnaW4gKyBiZXR3ZWVuX2ZlbWFsZSMgQ29uc3RyYWluZWQgb3ZlciB0aW1lLg0KDQogICMgU2V0IHRoZSByZXNpZHVhbCB2YXJpYW5jZXMgb2YgYWxsIEZYIHZhcmlhYmxlcyB0byAwLg0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQoNCiAgIyMjIyMjIyMjIyMjIyMjDQogICMgV0lUSElOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAgIyBDcmVhdGUgd2l0aGluLXBlcnNvbiBjZW50ZXJlZCB2YXJpYWJsZXMuDQogIHdGZWR1Y19hXzIgPX4gMSpGZWR1Y19hXzINCiAgd0ZlZHVjX2FfMyA9fiAxKkZlZHVjX2FfMw0KICB3RmVkdWNfYV80ID1+IDEqRmVkdWNfYV80DQogIHdGZWR1Y19hXzUgPX4gMSpGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNiA9fiAxKkZlZHVjX2FfNg0KICB3RmVkdWNfYV83ID1+IDEqRmVkdWNfYV83DQogIHdGZWR1Y19hXzggPX4gMSpGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfOSA9fiAxKkZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMCA9fiAxKkZlZHVjX2FfMTANCiAgd0ZlZHVjX2FfMTEgPX4gMSpGZWR1Y19hXzExDQogIA0KICB3aW5jX2RpZmZfMiA9fiAxKmluY19kaWZmXzINCiAgd2luY19kaWZmXzMgPX4gMSppbmNfZGlmZl8zDQogIHdpbmNfZGlmZl80ID1+IDEqaW5jX2RpZmZfNA0KICB3aW5jX2RpZmZfNSA9fiAxKmluY19kaWZmXzUNCiAgd2luY19kaWZmXzYgPX4gMSppbmNfZGlmZl82DQogIHdpbmNfZGlmZl83ID1+IDEqaW5jX2RpZmZfNw0KICB3aW5jX2RpZmZfOCA9fiAxKmluY19kaWZmXzgNCiAgd2luY19kaWZmXzkgPX4gMSppbmNfZGlmZl85DQogIHdpbmNfZGlmZl8xMCA9fiAxKmluY19kaWZmXzEwDQogIHdpbmNfZGlmZl8xMSA9fiAxKmluY19kaWZmXzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3aW5jX2RpZmZfMyAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2luY19kaWZmXzIgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV8yDQogIHdpbmNfZGlmZl80ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3aW5jX2RpZmZfMyArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzMNCiAgd2luY19kaWZmXzUgICB+IGMoYTEsIGEyLCBhMywgYTQpKndpbmNfZGlmZl80ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNiAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2luY19kaWZmXzUgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV81DQogIHdpbmNfZGlmZl83ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3aW5jX2RpZmZfNiArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzYNCiAgd2luY19kaWZmXzggICB+IGMoYTEsIGEyLCBhMywgYTQpKndpbmNfZGlmZl83ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOSAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2luY19kaWZmXzggKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV84DQogIHdpbmNfZGlmZl8xMCAgfiBjKGExLCBhMiwgYTMsIGE0KSp3aW5jX2RpZmZfOSArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzkNCiAgd2luY19kaWZmXzExICB+IGMoYTEsIGEyLCBhMywgYTQpKndpbmNfZGlmZl8xMCArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzEwDQogIA0KICB3RmVkdWNfYV8zICB+IGMoYzEsIGMyLCBjMywgYzQpKndpbmNfZGlmZl8yICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfMg0KICB3RmVkdWNfYV80ICB+IGMoYzEsIGMyLCBjMywgYzQpKndpbmNfZGlmZl8zICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMoYzEsIGMyLCBjMywgYzQpKndpbmNfZGlmZl80ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMoYzEsIGMyLCBjMywgYzQpKndpbmNfZGlmZl81ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfNQ0KICB3RmVkdWNfYV83ICB+IGMoYzEsIGMyLCBjMywgYzQpKndpbmNfZGlmZl82ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMoYzEsIGMyLCBjMywgYzQpKndpbmNfZGlmZl83ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMoYzEsIGMyLCBjMywgYzQpKndpbmNfZGlmZl84ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfOA0KICB3RmVkdWNfYV8xMCAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3aW5jX2RpZmZfOSArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2luY19kaWZmXzEwICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3aW5jX2RpZmZfMiB+fiB3RmVkdWNfYV8yICMgQ292YXJpYW5jZQ0KDQogICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2luY19kaWZmXzMgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl80IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNSB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzYgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl83IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzkgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzEwDQogIHdpbmNfZGlmZl8xMSB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2luY19kaWZmXzIgfn4gd2luY19kaWZmXzIgDQogIHdGZWR1Y19hXzIgfn4gd0ZlZHVjX2FfMg0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2luY19kaWZmXzMgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndpbmNfZGlmZl8zDQogIHdGZWR1Y19hXzMgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzMNCiAgd2luY19kaWZmXzQgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndpbmNfZGlmZl80IA0KICB3RmVkdWNfYV80IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV80DQogIHdpbmNfZGlmZl81IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3aW5jX2RpZmZfNQ0KICB3RmVkdWNfYV81IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV81DQogIHdpbmNfZGlmZl82IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3aW5jX2RpZmZfNiANCiAgd0ZlZHVjX2FfNiB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfNg0KICB3aW5jX2RpZmZfNyB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2luY19kaWZmXzcgDQogIHdGZWR1Y19hXzcgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzcNCiAgd2luY19kaWZmXzggfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndpbmNfZGlmZl84IA0KICB3RmVkdWNfYV84IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV84DQogIHdpbmNfZGlmZl85IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3aW5jX2RpZmZfOSANCiAgd0ZlZHVjX2FfOSB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfOQ0KICB3aW5jX2RpZmZfMTAgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndpbmNfZGlmZl8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzEwDQogIHdpbmNfZGlmZl8xMSB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2luY19kaWZmXzExIA0KICB3RmVkdWNfYV8xMSB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfMTENCiAgDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMgQURESVRJT05BTCBDT05TVFJBSU5UUyAjDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIFNldCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgYmV0d2Vlbi1mYWN0b3JzIChyYW5kb20gaW50ZXJjZXB0cykgYW5kIHdpdGhpbi0NCiAgIyBmYWN0b3JzIGF0IHdhdmUgMSBhdCAwLiANCiAgUkl4ICsgUkl5IH5+IDAqd0ZlZHVjX2FfMiArIDAqd2luY19kaWZmXzINCg0KJw0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImluY19kaWZmX21vZGVsMTBfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCmluY19kaWZmX21vZGVsMTBfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgaW5jX2RpZmZfbW9kZWwxMF91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcsDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAicmxfcmVjIg0KICApDQogIA0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKGluY19kaWZmX21vZGVsMTBfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Ugew0KICBsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBpbmNfZGlmZiBtMTAgY29uc3RyYWluZWQgZ3JvdXBzIGxhZ30NCiNmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJpbmNfZGlmZl9tb2RlbDEwX2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KaW5jX2RpZmZfbW9kZWwxMF9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgbWFpbl9sYXZhYW5fcmVzdWx0cyRgTGF2YWFuIG1vZGVsIG9iamVjdHNgW1szXV1bWzJdXSwNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJybF9yZWMiDQogICkNCiAgDQogICNzYXZlIG1vZGVsDQogIHNhdmUoaW5jX2RpZmZfbW9kZWwxMF9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Ugew0KICBsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBpbmNfZGlmZiBtMTAgbHJ0ZXN0fQ0KbGF2VGVzdExSVChpbmNfZGlmZl9tb2RlbDEwX2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LCBpbmNfZGlmZl9tb2RlbDEwX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQpDQpgYGANCg0KDQojIyBBdmVyYWdlIHNpbWlsYXJpdHkNCg0KYGBge3IgY3JlYXRlIGJldHdlZW4gdmFyaWFibGVzIGF2ZSBzaW1zIH0NCk15RGF0YSA8LSBNeURhdGEgJT4lDQogIG11dGF0ZShhdmVfcmVjID0gY3V0MihhdmVfbWVhbiwgZyA9IDQpLA0KICAgICAgICAgYXZlXzIgPSBjdXQyKGF2ZV9tZWFuLCBnID0gMikpDQpgYGANCg0KIyMjIEVVIGludGVncmF0aW9uDQoNCmBgYHtyIEVVIG1vZGVsIDExIHVuY29uc3QgZ3JvdXBzIGFuZCBjb25zdCBsYWdzfQ0KRVVfbW9kZWwxMV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcgPC0gDQonDQoNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAxKkZlZHVjX2FfMSArIDEqRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+ICAxKmV1XzEgKyAxKmV1XzIgKyAxKmV1XzMgKyAxKmV1XzQgKyAxKmV1XzUgKyAxKmV1XzYgKyAxKmV1XzcgKyAxKmV1XzggKyAxKmV1XzkgKyAxKmV1XzEwICsgMSpldV8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQogIA0KICAjIFJlZ3Jlc3Npb24gb2YgcmFuZG9tIGludGVyY2VwdHMgb24gejENCiAgUkl4ICsgUkl5IH4gYmV0d2Vlbl9lZHVjICsgYmV0d2Vlbl9hZ2UgKyBiZXR3ZWVuX29yaWdpbiArIGJldHdlZW5fZmVtYWxlIyBDb25zdHJhaW5lZCBvdmVyIHRpbWUuDQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuICANCiAgRmVkdWNfYV8xIH5+IDAqRmVkdWNfYV8xDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4gDQogIHdGZWR1Y19hXzEgPX4gMSpGZWR1Y19hXzENCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgd2V1XzEgPX4gMSpldV8xDQogIHdldV8yID1+IDEqZXVfMg0KICB3ZXVfMyA9fiAxKmV1XzMNCiAgd2V1XzQgPX4gMSpldV80DQogIHdldV81ID1+IDEqZXVfNQ0KICB3ZXVfNiA9fiAxKmV1XzYNCiAgd2V1XzcgPX4gMSpldV83DQogIHdldV84ID1+IDEqZXVfOA0KICB3ZXVfOSA9fiAxKmV1XzkNCiAgd2V1XzEwID1+IDEqZXVfMTANCiAgd2V1XzExID1+IDEqZXVfMTEgDQogIA0KICAjIEVzdGltYXRlIHRoZSBsYWdnZWQgZWZmZWN0cyAoY29uc3RyYWluZWQpDQogIHdldV8yICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3ZXVfMSArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzENCiAgd2V1XzMgICB+IGMoYTEsIGEyLCBhMywgYTQpKndldV8yICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfMg0KICB3ZXVfNCAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2V1XzMgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV8zDQogIHdldV81ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3ZXVfNCArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzQNCiAgd2V1XzYgICB+IGMoYTEsIGEyLCBhMywgYTQpKndldV81ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfNQ0KICB3ZXVfNyAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2V1XzYgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV82DQogIHdldV84ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3ZXVfNyArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzcNCiAgd2V1XzkgICB+IGMoYTEsIGEyLCBhMywgYTQpKndldV84ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfOA0KICB3ZXVfMTAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2V1XzkgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV85DQogIHdldV8xMSAgfiBjKGExLCBhMiwgYTMsIGE0KSp3ZXVfMTAgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV8xMA0KICANCiAgDQogIHdGZWR1Y19hXzIgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2V1XzEgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV8xDQogIHdGZWR1Y19hXzMgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2V1XzIgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2V1XzMgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2V1XzQgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2V1XzUgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2V1XzYgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2V1XzcgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2V1XzggKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMoYzEsIGMyLCBjMywgYzQpKndldV85ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3ZXVfMTAgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdldV8xIH5+IHdGZWR1Y19hXzEgIyBDb3ZhcmlhbmNlDQoNCiAgICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3ZXVfMiB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzINCiAgd2V1XzMgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV8zDQogIHdldV80IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNA0KICB3ZXVfNSB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzUNCiAgd2V1XzYgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV82DQogIHdldV83IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNw0KICB3ZXVfOCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzgNCiAgd2V1Xzkgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV85DQogIHdldV8xMCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzEwDQogIHdldV8xMSB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2V1XzEgfn4gd2V1XzEgDQogIHdGZWR1Y19hXzEgfn4gd0ZlZHVjX2FfMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2V1XzIgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndldV8yIA0KICB3RmVkdWNfYV8yIH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV8yDQogIHdldV8zIH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3ZXVfMw0KICB3RmVkdWNfYV8zIH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV8zDQogIHdldV80IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3ZXVfNCANCiAgd0ZlZHVjX2FfNCB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfNA0KICB3ZXVfNSB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2V1XzUNCiAgd0ZlZHVjX2FfNSB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfNQ0KICB3ZXVfNiB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2V1XzYgDQogIHdGZWR1Y19hXzYgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzYNCiAgd2V1Xzcgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndldV83IA0KICB3RmVkdWNfYV83IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV83DQogIHdldV84IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3ZXVfOCANCiAgd0ZlZHVjX2FfOCB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfOA0KICB3ZXVfOSB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2V1XzkgDQogIHdGZWR1Y19hXzkgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzkNCiAgd2V1XzEwIH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3ZXVfMTAgDQogIHdGZWR1Y19hXzEwIH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV8xMA0KICB3ZXVfMTEgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndldV8xMSANCiAgd0ZlZHVjX2FfMTEgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzEgKyAwKndldV8xDQoNCicNCiNmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJFVV9tb2RlbDExX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQpFVV9tb2RlbDExX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQgPC0NCiAgbGF2YWFuKA0KICAgIEVVX21vZGVsMTFfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnLA0KICAgIGRhdGEgPSBNeURhdGEsDQogICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgbWlzc2luZyA9ICdNTCcsDQogICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgaW50Lm92LmZyZWUgPSBULA0KICAgIGdyb3VwID0gImF2ZV9yZWMiDQogICkNCg0KICANCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShFVV9tb2RlbDExX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHsNCiAgbG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQoNCmBgYA0KDQpgYGB7ciBldSBtMTEgY29uc3RyYWluZWQgZ3JvdXBzIGxhZ30NCiNmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJFVV9tb2RlbDExX2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KRVVfbW9kZWwxMV9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgbWFpbl9sYXZhYW5fcmVzdWx0cyRgTGF2YWFuIG1vZGVsIG9iamVjdHNgW1sxXV1bWzJdXSwNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJhdmVfcmVjIg0KICApDQogIA0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKEVVX21vZGVsMTFfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHsNCiAgbG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQpgYGANCg0KYGBge3IgZXUgbTExIGxydGVzdH0NCmxhdlRlc3RMUlQoRVVfbW9kZWwxMV9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwgRVVfbW9kZWwxMV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0KQ0KDQoNCmBgYA0KDQojIyMgY3VsdHVyYWwgaW5jbHVzaW9uDQoNCmBgYHtyIGN1bHQgbW9kZWwgMTEgdW5jb25zIGdyb3VwcyBhbmQgY29ucyBsYWdzfQ0KY3VsdF9tb2RlbDExX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZyA8LSANCicNCg0KICAjIyMjIyMjIyMjIyMjIyMjDQogICMgQkVUV0VFTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgIyBDcmVhdGUgYmV0d2VlbiBjb21wb25lbnRzIChyYW5kb20gaW50ZXJjZXB0cykNCiAgUkl4ID1+IDEqIEZlZHVjX2FfMSArIDEqIEZlZHVjX2FfMiArIDEqRmVkdWNfYV8zICsgMSpGZWR1Y19hXzQgKyAxKkZlZHVjX2FfNSArIDEqRmVkdWNfYV82ICsgMSpGZWR1Y19hXzcgKyAxKkZlZHVjX2FfOCArIDEqRmVkdWNfYV85ICsgMSpGZWR1Y19hXzEwICsgMSpGZWR1Y19hXzExDQogIFJJeSA9fiAgMSpjdWx0XzEgKyAxKmN1bHRfMiArIDEqY3VsdF8zICsgMSpjdWx0XzQgKyAxKmN1bHRfNSArIDEqY3VsdF82ICsgMSpjdWx0XzcgKyAxKmN1bHRfOCArIDEqY3VsdF85ICsgMSpjdWx0XzEwICsgMSpjdWx0XzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gIA0KICBGZWR1Y19hXzEgfn4gMCpGZWR1Y19hXzENCiAgRmVkdWNfYV8yIH5+IDAqRmVkdWNfYV8yDQogIEZlZHVjX2FfMyB+fiAwKkZlZHVjX2FfMw0KICBGZWR1Y19hXzQgfn4gMCpGZWR1Y19hXzQNCiAgRmVkdWNfYV81IH5+IDAqRmVkdWNfYV81DQogIEZlZHVjX2FfNiB+fiAwKkZlZHVjX2FfNg0KICBGZWR1Y19hXzcgfn4gMCpGZWR1Y19hXzcNCiAgRmVkdWNfYV84IH5+IDAqRmVkdWNfYV84DQogIEZlZHVjX2FfOSB+fiAwKkZlZHVjX2FfOQ0KICBGZWR1Y19hXzEwIH5+IDAqRmVkdWNfYV8xMA0KICBGZWR1Y19hXzExIH5+IDAqRmVkdWNfYV8xMQ0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMSA9fiAxKkZlZHVjX2FfMQ0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3Y3VsdF8xID1+IDEqY3VsdF8xDQogIHdjdWx0XzIgPX4gMSpjdWx0XzINCiAgd2N1bHRfMyA9fiAxKmN1bHRfMw0KICB3Y3VsdF80ID1+IDEqY3VsdF80DQogIHdjdWx0XzUgPX4gMSpjdWx0XzUNCiAgd2N1bHRfNiA9fiAxKmN1bHRfNg0KICB3Y3VsdF83ID1+IDEqY3VsdF83DQogIHdjdWx0XzggPX4gMSpjdWx0XzgNCiAgd2N1bHRfOSA9fiAxKmN1bHRfOQ0KICB3Y3VsdF8xMCA9fiAxKmN1bHRfMTANCiAgd2N1bHRfMTEgPX4gMSpjdWx0XzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3Y3VsdF8yICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF8xICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfMQ0KICB3Y3VsdF8zICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF8yICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfMg0KICB3Y3VsdF80ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF8zICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfMw0KICB3Y3VsdF81ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF80ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfNA0KICB3Y3VsdF82ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF81ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfNQ0KICB3Y3VsdF83ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF82ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfNg0KICB3Y3VsdF84ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF83ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfNw0KICB3Y3VsdF85ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF84ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfOA0KICB3Y3VsdF8xMCAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF85ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMSAgfiBjKGExLCBhMiwgYTMsIGE0KSp3Y3VsdF8xMCArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzEwDQogIA0KICANCiAgd0ZlZHVjX2FfMiAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3Y3VsdF8xICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfMQ0KICB3RmVkdWNfYV8zICB+IGMoYzEsIGMyLCBjMywgYzQpKndjdWx0XzIgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2N1bHRfMyArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNSAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3Y3VsdF80ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMoYzEsIGMyLCBjMywgYzQpKndjdWx0XzUgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2N1bHRfNiArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfOCAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3Y3VsdF83ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMoYzEsIGMyLCBjMywgYzQpKndjdWx0XzggKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMoYzEsIGMyLCBjMywgYzQpKndjdWx0XzkgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV85DQogIHdGZWR1Y19hXzExICB+IGMoYzEsIGMyLCBjMywgYzQpKndjdWx0XzEwICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3Y3VsdF8xIH5+IHdGZWR1Y19hXzEgIyBDb3ZhcmlhbmNlDQoNCiAgICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3Y3VsdF8yIH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfMg0KICB3Y3VsdF8zIH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfMw0KICB3Y3VsdF80IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNA0KICB3Y3VsdF81IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNQ0KICB3Y3VsdF82IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNg0KICB3Y3VsdF83IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNw0KICB3Y3VsdF84IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfOA0KICB3Y3VsdF85IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzEwDQogIHdjdWx0XzExIH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3Y3VsdF8xIH5+IHdjdWx0XzEgDQogIHdGZWR1Y19hXzEgfn4gd0ZlZHVjX2FfMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2N1bHRfMiB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2N1bHRfMiANCiAgd0ZlZHVjX2FfMiB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfMg0KICB3Y3VsdF8zIH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3Y3VsdF8zDQogIHdGZWR1Y19hXzMgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzMNCiAgd2N1bHRfNCB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2N1bHRfNCANCiAgd0ZlZHVjX2FfNCB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfNA0KICB3Y3VsdF81IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3Y3VsdF81DQogIHdGZWR1Y19hXzUgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzUNCiAgd2N1bHRfNiB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2N1bHRfNiANCiAgd0ZlZHVjX2FfNiB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfNg0KICB3Y3VsdF83IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3Y3VsdF83IA0KICB3RmVkdWNfYV83IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV83DQogIHdjdWx0Xzggfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndjdWx0XzggDQogIHdGZWR1Y19hXzggfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzgNCiAgd2N1bHRfOSB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2N1bHRfOSANCiAgd0ZlZHVjX2FfOSB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMCB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2N1bHRfMTAgDQogIHdGZWR1Y19hXzEwIH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV8xMA0KICB3Y3VsdF8xMSB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2N1bHRfMTEgDQogIHdGZWR1Y19hXzExIH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV8xMQ0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8xICsgMCp3Y3VsdF8xDQoNCicNCg0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImN1bHRfbW9kZWwxMV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KY3VsdF9tb2RlbDExX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQgPC0NCiAgbGF2YWFuKA0KICAgIGN1bHRfbW9kZWwxMV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcsDQogICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAiYXZlX3JlYyINCiAgKQ0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKGN1bHRfbW9kZWwxMV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZQ0KICAobG9hZChmaWxlID0gZmlsZW5hbWUpDQogICkNCg0KYGBgDQoNCmBgYHtyIGN1bHQgbTExIGNvbnN0cmFpbmVkIGdyb3VwcyBsYWd9DQoNCiNmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJjdWx0X21vZGVsMTFfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQpjdWx0X21vZGVsMTFfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQgPC0NCiAgbGF2YWFuKA0KICAgIG1haW5fbGF2YWFuX3Jlc3VsdHMkYExhdmFhbiBtb2RlbCBvYmplY3RzYFtbMl1dW1syXV0sDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAiYXZlX3JlYyINCiAgKQ0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKGN1bHRfbW9kZWwxMV9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Uge2xvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KDQpgYGANCg0KYGBge3IgY3VsdCBtMTEgbHJ0ZXN0fQ0KbGF2VGVzdExSVChjdWx0X21vZGVsMTFfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsIGN1bHRfbW9kZWwxMV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0KQ0KYGBgDQoNCiMjIyBpbmNvbWUgZGlmZmVyZW5jZXMNCg0KYGBge3IgaW5jX2RpZmYgbW9kZWwgMTEgdW5jb25zIGdyb3VwcyBhbmQgY29ucyBsYWdzfQ0KaW5jX2RpZmZfbW9kZWwxMV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcgPC0gJw0KDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSogRmVkdWNfYV8xICsgMSogRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+ICAxKmluY19kaWZmXzEgKyAxKmluY19kaWZmXzIgKyAxKmluY19kaWZmXzMgKyAxKmluY19kaWZmXzQgKyAxKmluY19kaWZmXzUgKyAxKmluY19kaWZmXzYgKyAxKmluY19kaWZmXzcgKyAxKmluY19kaWZmXzggKyAxKmluY19kaWZmXzkgKyAxKmluY19kaWZmXzEwICsgMSppbmNfZGlmZl8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQogIA0KICAjIFJlZ3Jlc3Npb24gb2YgcmFuZG9tIGludGVyY2VwdHMgb24gejENCiAgUkl4ICsgUkl5IH4gYmV0d2Vlbl9lZHVjICsgYmV0d2Vlbl9hZ2UgKyBiZXR3ZWVuX29yaWdpbiArIGJldHdlZW5fZmVtYWxlIyBDb25zdHJhaW5lZCBvdmVyIHRpbWUuDQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuDQogIEZlZHVjX2FfMSB+fiAwKkZlZHVjX2FfMQ0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQoNCiAgIyMjIyMjIyMjIyMjIyMjDQogICMgV0lUSElOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAgIyBDcmVhdGUgd2l0aGluLXBlcnNvbiBjZW50ZXJlZCB2YXJpYWJsZXMuIA0KICB3RmVkdWNfYV8xID1+IDEqRmVkdWNfYV8xDQogIHdGZWR1Y19hXzIgPX4gMSpGZWR1Y19hXzINCiAgd0ZlZHVjX2FfMyA9fiAxKkZlZHVjX2FfMw0KICB3RmVkdWNfYV80ID1+IDEqRmVkdWNfYV80DQogIHdGZWR1Y19hXzUgPX4gMSpGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNiA9fiAxKkZlZHVjX2FfNg0KICB3RmVkdWNfYV83ID1+IDEqRmVkdWNfYV83DQogIHdGZWR1Y19hXzggPX4gMSpGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfOSA9fiAxKkZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMCA9fiAxKkZlZHVjX2FfMTANCiAgd0ZlZHVjX2FfMTEgPX4gMSpGZWR1Y19hXzExDQogIHdpbmNfZGlmZl8xID1+IDEqaW5jX2RpZmZfMQ0KICB3aW5jX2RpZmZfMiA9fiAxKmluY19kaWZmXzINCiAgd2luY19kaWZmXzMgPX4gMSppbmNfZGlmZl8zDQogIHdpbmNfZGlmZl80ID1+IDEqaW5jX2RpZmZfNA0KICB3aW5jX2RpZmZfNSA9fiAxKmluY19kaWZmXzUNCiAgd2luY19kaWZmXzYgPX4gMSppbmNfZGlmZl82DQogIHdpbmNfZGlmZl83ID1+IDEqaW5jX2RpZmZfNw0KICB3aW5jX2RpZmZfOCA9fiAxKmluY19kaWZmXzgNCiAgd2luY19kaWZmXzkgPX4gMSppbmNfZGlmZl85DQogIHdpbmNfZGlmZl8xMCA9fiAxKmluY19kaWZmXzEwDQogIHdpbmNfZGlmZl8xMSA9fiAxKmluY19kaWZmXzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3aW5jX2RpZmZfMiAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2luY19kaWZmXzEgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV8xDQogIHdpbmNfZGlmZl8zICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3aW5jX2RpZmZfMiArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzINCiAgd2luY19kaWZmXzQgICB+IGMoYTEsIGEyLCBhMywgYTQpKndpbmNfZGlmZl8zICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNSAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2luY19kaWZmXzQgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV80DQogIHdpbmNfZGlmZl82ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3aW5jX2RpZmZfNSArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzcgICB+IGMoYTEsIGEyLCBhMywgYTQpKndpbmNfZGlmZl82ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfNg0KICB3aW5jX2RpZmZfOCAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2luY19kaWZmXzcgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV83DQogIHdpbmNfZGlmZl85ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3aW5jX2RpZmZfOCArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzEwICB+IGMoYTEsIGEyLCBhMywgYTQpKndpbmNfZGlmZl85ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfOQ0KICB3aW5jX2RpZmZfMTEgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2luY19kaWZmXzEwICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfMTANCiAgDQogIA0KICB3RmVkdWNfYV8yICB+IGMoYzEsIGMyLCBjMywgYzQpKndpbmNfZGlmZl8xICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfMQ0KICB3RmVkdWNfYV8zICB+IGMoYzEsIGMyLCBjMywgYzQpKndpbmNfZGlmZl8yICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfMg0KICB3RmVkdWNfYV80ICB+IGMoYzEsIGMyLCBjMywgYzQpKndpbmNfZGlmZl8zICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMoYzEsIGMyLCBjMywgYzQpKndpbmNfZGlmZl80ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMoYzEsIGMyLCBjMywgYzQpKndpbmNfZGlmZl81ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfNQ0KICB3RmVkdWNfYV83ICB+IGMoYzEsIGMyLCBjMywgYzQpKndpbmNfZGlmZl82ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMoYzEsIGMyLCBjMywgYzQpKndpbmNfZGlmZl83ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMoYzEsIGMyLCBjMywgYzQpKndpbmNfZGlmZl84ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfOA0KICB3RmVkdWNfYV8xMCAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3aW5jX2RpZmZfOSArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2luY19kaWZmXzEwICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3aW5jX2RpZmZfMSB+fiB3RmVkdWNfYV8xICMgQ292YXJpYW5jZQ0KDQogICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2luY19kaWZmXzIgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV8yDQogIHdpbmNfZGlmZl8zIH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzQNCiAgd2luY19kaWZmXzUgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV81DQogIHdpbmNfZGlmZl82IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNg0KICB3aW5jX2RpZmZfNyB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzcNCiAgd2luY19kaWZmXzggfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV84DQogIHdpbmNfZGlmZl85IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfOQ0KICB3aW5jX2RpZmZfMTAgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV8xMA0KICB3aW5jX2RpZmZfMTEgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV8xMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgDQogIHdpbmNfZGlmZl8xIH5+IHdpbmNfZGlmZl8xIA0KICB3RmVkdWNfYV8xIH5+IHdGZWR1Y19hXzENCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdpbmNfZGlmZl8yIH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3aW5jX2RpZmZfMiANCiAgd0ZlZHVjX2FfMiB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfMg0KICB3aW5jX2RpZmZfMyB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2luY19kaWZmXzMNCiAgd0ZlZHVjX2FfMyB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNCB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2luY19kaWZmXzQgDQogIHdGZWR1Y19hXzQgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzQNCiAgd2luY19kaWZmXzUgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndpbmNfZGlmZl81DQogIHdGZWR1Y19hXzUgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzYgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndpbmNfZGlmZl82IA0KICB3RmVkdWNfYV82IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl83IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3aW5jX2RpZmZfNyANCiAgd0ZlZHVjX2FfNyB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOCB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2luY19kaWZmXzggDQogIHdGZWR1Y19hXzggfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzkgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndpbmNfZGlmZl85IA0KICB3RmVkdWNfYV85IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMCB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2luY19kaWZmXzEwIA0KICB3RmVkdWNfYV8xMCB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfMTANCiAgd2luY19kaWZmXzExIH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3aW5jX2RpZmZfMTEgDQogIHdGZWR1Y19hXzExIH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV8xMQ0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8xICsgMCp3aW5jX2RpZmZfMQ0KDQonDQojZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiaW5jX2RpZmZfbW9kZWwxMV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KaW5jX2RpZmZfbW9kZWwxMV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0IDwtDQogIGxhdmFhbigNCiAgICBpbmNfZGlmZl9tb2RlbDExX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZywNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJhdmVfcmVjIg0KICApDQogICNzYXZlIG1vZGVsDQogIHNhdmUoaW5jX2RpZmZfbW9kZWwxMV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZSB7bG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQpgYGANCg0KYGBge3IgaW5jX2RpZmYgbTExIGNvbnN0cmFpbmVkIGdyb3VwcyBsYWd9DQojZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiaW5jX2RpZmZfbW9kZWwxMV9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCmluY19kaWZmX21vZGVsMTFfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQgPC0NCiAgbGF2YWFuKA0KICAgIG1haW5fbGF2YWFuX3Jlc3VsdHMkYExhdmFhbiBtb2RlbCBvYmplY3RzYFtbM11dW1syXV0sDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAiYXZlX3JlYyINCiAgKQ0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKGluY19kaWZmX21vZGVsMTFfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHtsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBpbmNfZGlmZiBtMTEgbHJ0ZXN0fQ0KDQpsYXZUZXN0TFJUKGluY19kaWZmX21vZGVsMTFfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsIGluY19kaWZmX21vZGVsMTFfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCkNCmBgYA0KDQoNCiMgQmV0d2VlbiBsZXZlbCB3aXRoIC0xc2QsIG1lYW4sIGFuZCArMXNkIGdyb3Vwcw0KDQojIyBDcmVhdGUgZ3JvdXBzIA0KYGBge3IgY3JlYXRlIGdyb3Vwc30NCiMgQ3JlYXRlIHogc2NvcmUgdmFyaWFibGVzDQpNeURhdGEgPC0gTXlEYXRhICU+JSANCiAgbXV0YXRlKA0KICAgIHNkX3BvbCA9IHNkKHBvbF9kaXMsIG5hLnJtID0gVCksDQogICAgel9wb2wgPSBhcy5udW1lcmljKChwb2xfZGlzIC0gbWVhbihwb2xfZGlzLCBuYS5ybSA9IFQpKS9zZF9wb2wpLA0KICAgIHNkX3JsID0gc2QocmxfbWVhbiwgbmEucm0gPSBUKSwNCiAgICB6X3JsID0gKHJsX21lYW4gLSBtZWFuKHJsX21lYW4sIG5hLnJtID0gVCkpL3NkX3JsLA0KICAgIHNkX2F2ZSA9IHNkKGF2ZV9tZWFuLCBuYS5ybSA9IFQpLA0KICAgIHpfYXZlID0gKGF2ZV9tZWFuIC0gbWVhbihhdmVfbWVhbiwgbmEucm0gPSBUKSkvc2RfYXZlDQogICAgKQ0KDQojY3JlYXRlIHRocmVlIGdyb3VwcyB2YXJpYWJsZXMgDQpNeURhdGEgPC0gTXlEYXRhICU+JSANCiAgbXV0YXRlKGFjcm9zcyguY29scyA9IGMoel9wb2wsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHpfcmwsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHpfYXZlKSwNCiAgICAgICAgICAgICAgICAuZm5zID0gfiBjYXNlX3doZW4oDQogICAgICAgICAgICAgICAgICAueCA8IC0xIH4gMSwNCiAgICAgICAgICAgICAgICAgIC54ID4gLTEgJiAueCA8IDEgfiAyLCANCiAgICAgICAgICAgICAgICAgIC54ID4gMSB+IDMpLA0KICAgICAgICAgICAgICAgIC5uYW1lcyA9ICJjYXRfey5jb2x9IikpDQoNCg0KYGBgDQoNCiMjIFBvbGl0aWNhbCBEaXNjdXNzaW9uDQoNCiMjIyBFVSBpbnRlZ3JhdGlvbg0KDQpgYGB7ciBFVSBtb2RlbCAxMiB1bmNvbnMgZ3JvdXBzIGFuZCBjb25zIGxhZ3N9DQpFVV9tb2RlbDEyX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZyA8LSANCicNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAxKiBGZWR1Y19hXzEgKyAxKiBGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqZXVfMSArIDEqZXVfMiArIDEqZXVfMyArIDEqZXVfNCArIDEqZXVfNSArIDEqZXVfNiArIDEqZXVfNyArIDEqZXVfOCArIDEqZXVfOSArIDEqZXVfMTAgKyAxKmV1XzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gIA0KICBGZWR1Y19hXzEgfn4gMCpGZWR1Y19hXzENCiAgRmVkdWNfYV8yIH5+IDAqRmVkdWNfYV8yDQogIEZlZHVjX2FfMyB+fiAwKkZlZHVjX2FfMw0KICBGZWR1Y19hXzQgfn4gMCpGZWR1Y19hXzQNCiAgRmVkdWNfYV81IH5+IDAqRmVkdWNfYV81DQogIEZlZHVjX2FfNiB+fiAwKkZlZHVjX2FfNg0KICBGZWR1Y19hXzcgfn4gMCpGZWR1Y19hXzcNCiAgRmVkdWNfYV84IH5+IDAqRmVkdWNfYV84DQogIEZlZHVjX2FfOSB+fiAwKkZlZHVjX2FfOQ0KICBGZWR1Y19hXzEwIH5+IDAqRmVkdWNfYV8xMA0KICBGZWR1Y19hXzExIH5+IDAqRmVkdWNfYV8xMQ0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMSA9fiAxKkZlZHVjX2FfMQ0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3ZXVfMSA9fiAxKmV1XzENCiAgd2V1XzIgPX4gMSpldV8yDQogIHdldV8zID1+IDEqZXVfMw0KICB3ZXVfNCA9fiAxKmV1XzQNCiAgd2V1XzUgPX4gMSpldV81DQogIHdldV82ID1+IDEqZXVfNg0KICB3ZXVfNyA9fiAxKmV1XzcNCiAgd2V1XzggPX4gMSpldV84DQogIHdldV85ID1+IDEqZXVfOQ0KICB3ZXVfMTAgPX4gMSpldV8xMA0KICB3ZXVfMTEgPX4gMSpldV8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2V1XzIgICB+IGMoYTEsIGEyLCBhMykqd2V1XzEgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzENCiAgd2V1XzMgICB+IGMoYTEsIGEyLCBhMykqd2V1XzIgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzINCiAgd2V1XzQgICB+IGMoYTEsIGEyLCBhMykqd2V1XzMgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzMNCiAgd2V1XzUgICB+IGMoYTEsIGEyLCBhMykqd2V1XzQgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzQNCiAgd2V1XzYgICB+IGMoYTEsIGEyLCBhMykqd2V1XzUgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzUNCiAgd2V1XzcgICB+IGMoYTEsIGEyLCBhMykqd2V1XzYgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzYNCiAgd2V1XzggICB+IGMoYTEsIGEyLCBhMykqd2V1XzcgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzcNCiAgd2V1XzkgICB+IGMoYTEsIGEyLCBhMykqd2V1XzggKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzgNCiAgd2V1XzEwICB+IGMoYTEsIGEyLCBhMykqd2V1XzkgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzkNCiAgd2V1XzExICB+IGMoYTEsIGEyLCBhMykqd2V1XzEwICsgYyhiMSwgYjIsIGIzKSp3RmVkdWNfYV8xMA0KICANCiAgDQogIHdGZWR1Y19hXzIgIH4gYyhjMSwgYzIsIGMzKSp3ZXVfMSArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfMQ0KICB3RmVkdWNfYV8zICB+IGMoYzEsIGMyLCBjMykqd2V1XzIgKyBjKGQxLCBkMiwgZDMpKndGZWR1Y19hXzINCiAgd0ZlZHVjX2FfNCAgfiBjKGMxLCBjMiwgYzMpKndldV8zICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gYyhjMSwgYzIsIGMzKSp3ZXVfNCArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMoYzEsIGMyLCBjMykqd2V1XzUgKyBjKGQxLCBkMiwgZDMpKndGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNyAgfiBjKGMxLCBjMiwgYzMpKndldV82ICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gYyhjMSwgYzIsIGMzKSp3ZXVfNyArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMoYzEsIGMyLCBjMykqd2V1XzggKyBjKGQxLCBkMiwgZDMpKndGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfMTAgIH4gYyhjMSwgYzIsIGMzKSp3ZXVfOSArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiBjKGMxLCBjMiwgYzMpKndldV8xMCArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3ZXVfMSB+fiB3RmVkdWNfYV8xICMgQ292YXJpYW5jZQ0KDQogICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2V1XzIgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV8yDQogIHdldV8zIH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfMw0KICB3ZXVfNCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMpKndGZWR1Y19hXzQNCiAgd2V1XzUgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV81DQogIHdldV82IH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfNg0KICB3ZXVfNyB+fiBjKGNvdjEsIGNvdjIsIGNvdjMpKndGZWR1Y19hXzcNCiAgd2V1Xzggfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV84DQogIHdldV85IH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfOQ0KICB3ZXVfMTAgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV8xMA0KICB3ZXVfMTEgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV8xMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgDQogIHdldV8xIH5+IHdldV8xIA0KICB3RmVkdWNfYV8xIH5+IHdGZWR1Y19hXzENCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdldV8yIH5+IGModnkxLCB2eTIsIHZ5Mykqd2V1XzIgDQogIHdGZWR1Y19hXzIgfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV8yDQogIHdldV8zIH5+IGModnkxLCB2eTIsIHZ5Mykqd2V1XzMNCiAgd0ZlZHVjX2FfMyB+fiBjKHZ4MSwgdngyLCB2eDMpKndGZWR1Y19hXzMNCiAgd2V1XzQgfn4gYyh2eTEsIHZ5MiwgdnkzKSp3ZXVfNCANCiAgd0ZlZHVjX2FfNCB+fiBjKHZ4MSwgdngyLCB2eDMpKndGZWR1Y19hXzQNCiAgd2V1XzUgfn4gYyh2eTEsIHZ5MiwgdnkzKSp3ZXVfNQ0KICB3RmVkdWNfYV81IH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfNQ0KICB3ZXVfNiB+fiBjKHZ5MSwgdnkyLCB2eTMpKndldV82IA0KICB3RmVkdWNfYV82IH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfNg0KICB3ZXVfNyB+fiBjKHZ5MSwgdnkyLCB2eTMpKndldV83IA0KICB3RmVkdWNfYV83IH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfNw0KICB3ZXVfOCB+fiBjKHZ5MSwgdnkyLCB2eTMpKndldV84IA0KICB3RmVkdWNfYV84IH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfOA0KICB3ZXVfOSB+fiBjKHZ5MSwgdnkyLCB2eTMpKndldV85IA0KICB3RmVkdWNfYV85IH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfOQ0KICB3ZXVfMTAgfn4gYyh2eTEsIHZ5MiwgdnkzKSp3ZXVfMTAgDQogIHdGZWR1Y19hXzEwIH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfMTANCiAgd2V1XzExIH5+IGModnkxLCB2eTIsIHZ5Mykqd2V1XzExIA0KICB3RmVkdWNfYV8xMSB+fiBjKHZ4MSwgdngyLCB2eDMpKndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzEgKyAwKndldV8xDQoNCicNCiNmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJFVV9tb2RlbDEyX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQpFVV9tb2RlbDEyX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQgPC0NCiAgbGF2YWFuKA0KICAgIEVVX21vZGVsMTJfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnLA0KICAgIGRhdGEgPSBNeURhdGEsDQogICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgbWlzc2luZyA9ICdNTCcsDQogICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgaW50Lm92LmZyZWUgPSBULA0KICAgIGdyb3VwID0gImNhdF96X3BvbCINCiAgKQ0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKEVVX21vZGVsMTJfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Uge2xvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KYGBgDQoNCmBgYHtyIGV1IG0xMiBjb25zdHJhaW5lZCBncm91cHMgbGFnfQ0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgIkVVX21vZGVsMTJfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQpFVV9tb2RlbDEyX2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0IDwtDQogIGxhdmFhbigNCiAgICBtYWluX2xhdmFhbl9yZXN1bHRzJGBMYXZhYW4gbW9kZWwgb2JqZWN0c2BbWzFdXVtbMl1dLA0KICAgIGRhdGEgPSBNeURhdGEsDQogICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgbWlzc2luZyA9ICdNTCcsDQogICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgaW50Lm92LmZyZWUgPSBULA0KICAgIGdyb3VwID0gImNhdF96X3BvbCINCiAgKQ0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKEVVX21vZGVsMTJfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHsNCiAgbG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQpgYGANCg0KYGBge3IgZXUgbTEyIGxydGVzdH0NCmxhdlRlc3RMUlQoRVVfbW9kZWwxMl9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwgRVVfbW9kZWwxMl91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0KQ0KDQpgYGANCg0KIyMjIEN1bHR1cmFsIGluY2x1c2lvbg0KDQoNCmBgYHtyIGN1bHQgbW9kZWwgMTIgdW5jb25zdCBncm91cHMgYW5kIGNvbnN0IGxhZ3N9DQpjdWx0X21vZGVsMTJfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnIDwtIA0KJw0KICAjIyMjIyMjIyMjIyMjIyMjDQogICMgQkVUV0VFTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgIyBDcmVhdGUgYmV0d2VlbiBjb21wb25lbnRzIChyYW5kb20gaW50ZXJjZXB0cykNCiAgUkl4ID1+IDEqIEZlZHVjX2FfMSArIDEqIEZlZHVjX2FfMiArIDEqRmVkdWNfYV8zICsgMSpGZWR1Y19hXzQgKyAxKkZlZHVjX2FfNSArIDEqRmVkdWNfYV82ICsgMSpGZWR1Y19hXzcgKyAxKkZlZHVjX2FfOCArIDEqRmVkdWNfYV85ICsgMSpGZWR1Y19hXzEwICsgMSpGZWR1Y19hXzExDQogIFJJeSA9fiAgMSpjdWx0XzEgKyAxKmN1bHRfMiArIDEqY3VsdF8zICsgMSpjdWx0XzQgKyAxKmN1bHRfNSArIDEqY3VsdF82ICsgMSpjdWx0XzcgKyAxKmN1bHRfOCArIDEqY3VsdF85ICsgMSpjdWx0XzEwICsgMSpjdWx0XzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gIA0KICBGZWR1Y19hXzEgfn4gMCpGZWR1Y19hXzENCiAgRmVkdWNfYV8yIH5+IDAqRmVkdWNfYV8yDQogIEZlZHVjX2FfMyB+fiAwKkZlZHVjX2FfMw0KICBGZWR1Y19hXzQgfn4gMCpGZWR1Y19hXzQNCiAgRmVkdWNfYV81IH5+IDAqRmVkdWNfYV81DQogIEZlZHVjX2FfNiB+fiAwKkZlZHVjX2FfNg0KICBGZWR1Y19hXzcgfn4gMCpGZWR1Y19hXzcNCiAgRmVkdWNfYV84IH5+IDAqRmVkdWNfYV84DQogIEZlZHVjX2FfOSB+fiAwKkZlZHVjX2FfOQ0KICBGZWR1Y19hXzEwIH5+IDAqRmVkdWNfYV8xMA0KICBGZWR1Y19hXzExIH5+IDAqRmVkdWNfYV8xMQ0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMSA9fiAxKkZlZHVjX2FfMQ0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3Y3VsdF8xID1+IDEqY3VsdF8xDQogIHdjdWx0XzIgPX4gMSpjdWx0XzINCiAgd2N1bHRfMyA9fiAxKmN1bHRfMw0KICB3Y3VsdF80ID1+IDEqY3VsdF80DQogIHdjdWx0XzUgPX4gMSpjdWx0XzUNCiAgd2N1bHRfNiA9fiAxKmN1bHRfNg0KICB3Y3VsdF83ID1+IDEqY3VsdF83DQogIHdjdWx0XzggPX4gMSpjdWx0XzgNCiAgd2N1bHRfOSA9fiAxKmN1bHRfOQ0KICB3Y3VsdF8xMCA9fiAxKmN1bHRfMTANCiAgd2N1bHRfMTEgPX4gMSpjdWx0XzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3Y3VsdF8yICAgfiBjKGExLCBhMiwgYTMpKndjdWx0XzEgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzENCiAgd2N1bHRfMyAgIH4gYyhhMSwgYTIsIGEzKSp3Y3VsdF8yICsgYyhiMSwgYjIsIGIzKSp3RmVkdWNfYV8yDQogIHdjdWx0XzQgICB+IGMoYTEsIGEyLCBhMykqd2N1bHRfMyArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfMw0KICB3Y3VsdF81ICAgfiBjKGExLCBhMiwgYTMpKndjdWx0XzQgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzQNCiAgd2N1bHRfNiAgIH4gYyhhMSwgYTIsIGEzKSp3Y3VsdF81ICsgYyhiMSwgYjIsIGIzKSp3RmVkdWNfYV81DQogIHdjdWx0XzcgICB+IGMoYTEsIGEyLCBhMykqd2N1bHRfNiArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfNg0KICB3Y3VsdF84ICAgfiBjKGExLCBhMiwgYTMpKndjdWx0XzcgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzcNCiAgd2N1bHRfOSAgIH4gYyhhMSwgYTIsIGEzKSp3Y3VsdF84ICsgYyhiMSwgYjIsIGIzKSp3RmVkdWNfYV84DQogIHdjdWx0XzEwICB+IGMoYTEsIGEyLCBhMykqd2N1bHRfOSArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMSAgfiBjKGExLCBhMiwgYTMpKndjdWx0XzEwICsgYyhiMSwgYjIsIGIzKSp3RmVkdWNfYV8xMA0KICANCiAgDQogIHdGZWR1Y19hXzIgIH4gYyhjMSwgYzIsIGMzKSp3Y3VsdF8xICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV8xDQogIHdGZWR1Y19hXzMgIH4gYyhjMSwgYzIsIGMzKSp3Y3VsdF8yICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyhjMSwgYzIsIGMzKSp3Y3VsdF8zICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gYyhjMSwgYzIsIGMzKSp3Y3VsdF80ICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyhjMSwgYzIsIGMzKSp3Y3VsdF81ICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyhjMSwgYzIsIGMzKSp3Y3VsdF82ICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gYyhjMSwgYzIsIGMzKSp3Y3VsdF83ICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyhjMSwgYzIsIGMzKSp3Y3VsdF84ICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMoYzEsIGMyLCBjMykqd2N1bHRfOSArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiBjKGMxLCBjMiwgYzMpKndjdWx0XzEwICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdjdWx0XzEgfn4gd0ZlZHVjX2FfMSAjIENvdmFyaWFuY2UNCg0KICAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZXMgYmV0d2VlbiB0aGUgcmVzaWR1YWxzDQogIHdjdWx0XzIgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV8yDQogIHdjdWx0XzMgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV8zDQogIHdjdWx0XzQgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV80DQogIHdjdWx0XzUgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV81DQogIHdjdWx0XzYgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV82DQogIHdjdWx0Xzcgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV83DQogIHdjdWx0Xzggfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV84DQogIHdjdWx0Xzkgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV85DQogIHdjdWx0XzEwIH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfMTANCiAgd2N1bHRfMTEgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV8xMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgDQogIHdjdWx0XzEgfn4gd2N1bHRfMSANCiAgd0ZlZHVjX2FfMSB+fiB3RmVkdWNfYV8xDQogIA0KICAjIEVzdGltYXRlIHRoZSByZXNpZHVhbCB2YXJpYW5jZQ0KICB3Y3VsdF8yIH5+IGModnkxLCB2eTIsIHZ5Mykqd2N1bHRfMiANCiAgd0ZlZHVjX2FfMiB+fiBjKHZ4MSwgdngyLCB2eDMpKndGZWR1Y19hXzINCiAgd2N1bHRfMyB+fiBjKHZ5MSwgdnkyLCB2eTMpKndjdWx0XzMNCiAgd0ZlZHVjX2FfMyB+fiBjKHZ4MSwgdngyLCB2eDMpKndGZWR1Y19hXzMNCiAgd2N1bHRfNCB+fiBjKHZ5MSwgdnkyLCB2eTMpKndjdWx0XzQgDQogIHdGZWR1Y19hXzQgfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV80DQogIHdjdWx0XzUgfn4gYyh2eTEsIHZ5MiwgdnkzKSp3Y3VsdF81DQogIHdGZWR1Y19hXzUgfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV81DQogIHdjdWx0XzYgfn4gYyh2eTEsIHZ5MiwgdnkzKSp3Y3VsdF82IA0KICB3RmVkdWNfYV82IH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfNg0KICB3Y3VsdF83IH5+IGModnkxLCB2eTIsIHZ5Mykqd2N1bHRfNyANCiAgd0ZlZHVjX2FfNyB+fiBjKHZ4MSwgdngyLCB2eDMpKndGZWR1Y19hXzcNCiAgd2N1bHRfOCB+fiBjKHZ5MSwgdnkyLCB2eTMpKndjdWx0XzggDQogIHdGZWR1Y19hXzggfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV84DQogIHdjdWx0Xzkgfn4gYyh2eTEsIHZ5MiwgdnkzKSp3Y3VsdF85IA0KICB3RmVkdWNfYV85IH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMCB+fiBjKHZ5MSwgdnkyLCB2eTMpKndjdWx0XzEwIA0KICB3RmVkdWNfYV8xMCB+fiBjKHZ4MSwgdngyLCB2eDMpKndGZWR1Y19hXzEwDQogIHdjdWx0XzExIH5+IGModnkxLCB2eTIsIHZ5Mykqd2N1bHRfMTEgDQogIHdGZWR1Y19hXzExIH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfMTENCiAgDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMgQURESVRJT05BTCBDT05TVFJBSU5UUyAjDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIFNldCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgYmV0d2Vlbi1mYWN0b3JzIChyYW5kb20gaW50ZXJjZXB0cykgYW5kIHdpdGhpbi0NCiAgIyBmYWN0b3JzIGF0IHdhdmUgMSBhdCAwLiANCiAgUkl4ICsgUkl5IH5+IDAqd0ZlZHVjX2FfMSArIDAqd2N1bHRfMQ0KDQonDQojZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiY3VsdF9tb2RlbDEyX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQpjdWx0X21vZGVsMTJfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgY3VsdF9tb2RlbDEyX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZywNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJjYXRfel9wb2wiDQogICkNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShjdWx0X21vZGVsMTJfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Uge2xvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KYGBgDQoNCmBgYHtyIGN1bHQgbTEyIGNvbnN0cmFpbmVkIGdyb3VwcyBsYWd9DQoNCiNmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJjdWx0X21vZGVsMTJfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQpjdWx0X21vZGVsMTJfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQgPC0NCiAgbGF2YWFuKA0KICAgIG1haW5fbGF2YWFuX3Jlc3VsdHMkYExhdmFhbiBtb2RlbCBvYmplY3RzYFtbMl1dW1syXV0sDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAiY2F0X3pfcG9sIg0KICApDQogICNzYXZlIG1vZGVsDQogIHNhdmUoY3VsdF9tb2RlbDEyX2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZSB7bG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQpgYGANCg0KYGBge3IgY3VsdCBtMTIgbHJ0ZXN0fQ0KbGF2VGVzdExSVChjdWx0X21vZGVsMTJfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsIGN1bHRfbW9kZWwxMl91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0KQ0KDQpgYGANCg0KIyMjIEluY29tZSBlcXVhbGl0eQ0KDQpgYGB7ciBpbmNfZGlmZiBtb2RlbCAxMiB1bmNvbnMgZ3JvdXBzIGFuZCBjb25zIGxhZ3N9DQppbmNfZGlmZl9tb2RlbDEyX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZyA8LSANCicNCg0KICAjIyMjIyMjIyMjIyMjIyMjDQogICMgQkVUV0VFTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgIyBDcmVhdGUgYmV0d2VlbiBjb21wb25lbnRzIChyYW5kb20gaW50ZXJjZXB0cykNCiAgUkl4ID1+IDEqIEZlZHVjX2FfMSArIDEqIEZlZHVjX2FfMiArIDEqRmVkdWNfYV8zICsgMSpGZWR1Y19hXzQgKyAxKkZlZHVjX2FfNSArIDEqRmVkdWNfYV82ICsgMSpGZWR1Y19hXzcgKyAxKkZlZHVjX2FfOCArIDEqRmVkdWNfYV85ICsgMSpGZWR1Y19hXzEwICsgMSpGZWR1Y19hXzExDQogIFJJeSA9fiAgMSppbmNfZGlmZl8xICsgMSppbmNfZGlmZl8yICsgMSppbmNfZGlmZl8zICsgMSppbmNfZGlmZl80ICsgMSppbmNfZGlmZl81ICsgMSppbmNfZGlmZl82ICsgMSppbmNfZGlmZl83ICsgMSppbmNfZGlmZl84ICsgMSppbmNfZGlmZl85ICsgMSppbmNfZGlmZl8xMCArIDEqaW5jX2RpZmZfMTENCg0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSBhbmQgY292YXJpYW5jZSBvZiB0aGUgcmFuZG9tIGludGVyY2VwdHMuIA0KICBSSXggfn4gUkl4DQogIFJJeSB+fiBSSXkNCiAgUkl4IH5+IFJJeQ0KICANCiAgIyBSZWdyZXNzaW9uIG9mIHJhbmRvbSBpbnRlcmNlcHRzIG9uIHoxDQogIFJJeCArIFJJeSB+IGJldHdlZW5fZWR1YyArIGJldHdlZW5fYWdlICsgYmV0d2Vlbl9vcmlnaW4gKyBiZXR3ZWVuX2ZlbWFsZSMgQ29uc3RyYWluZWQgb3ZlciB0aW1lLg0KDQogICMgU2V0IHRoZSByZXNpZHVhbCB2YXJpYW5jZXMgb2YgYWxsIEZYIHZhcmlhYmxlcyB0byAwLiAgDQogIEZlZHVjX2FfMSB+fiAwKkZlZHVjX2FfMQ0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQoNCiAgIyMjIyMjIyMjIyMjIyMjDQogICMgV0lUSElOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAgIyBDcmVhdGUgd2l0aGluLXBlcnNvbiBjZW50ZXJlZCB2YXJpYWJsZXMuIA0KICB3RmVkdWNfYV8xID1+IDEqRmVkdWNfYV8xDQogIHdGZWR1Y19hXzIgPX4gMSpGZWR1Y19hXzINCiAgd0ZlZHVjX2FfMyA9fiAxKkZlZHVjX2FfMw0KICB3RmVkdWNfYV80ID1+IDEqRmVkdWNfYV80DQogIHdGZWR1Y19hXzUgPX4gMSpGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNiA9fiAxKkZlZHVjX2FfNg0KICB3RmVkdWNfYV83ID1+IDEqRmVkdWNfYV83DQogIHdGZWR1Y19hXzggPX4gMSpGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfOSA9fiAxKkZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMCA9fiAxKkZlZHVjX2FfMTANCiAgd0ZlZHVjX2FfMTEgPX4gMSpGZWR1Y19hXzExDQogIHdpbmNfZGlmZl8xID1+IDEqaW5jX2RpZmZfMQ0KICB3aW5jX2RpZmZfMiA9fiAxKmluY19kaWZmXzINCiAgd2luY19kaWZmXzMgPX4gMSppbmNfZGlmZl8zDQogIHdpbmNfZGlmZl80ID1+IDEqaW5jX2RpZmZfNA0KICB3aW5jX2RpZmZfNSA9fiAxKmluY19kaWZmXzUNCiAgd2luY19kaWZmXzYgPX4gMSppbmNfZGlmZl82DQogIHdpbmNfZGlmZl83ID1+IDEqaW5jX2RpZmZfNw0KICB3aW5jX2RpZmZfOCA9fiAxKmluY19kaWZmXzgNCiAgd2luY19kaWZmXzkgPX4gMSppbmNfZGlmZl85DQogIHdpbmNfZGlmZl8xMCA9fiAxKmluY19kaWZmXzEwDQogIHdpbmNfZGlmZl8xMSA9fiAxKmluY19kaWZmXzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3aW5jX2RpZmZfMiAgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfMSArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfMQ0KICB3aW5jX2RpZmZfMyAgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfMiArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfMg0KICB3aW5jX2RpZmZfNCAgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfMyArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNSAgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfNCArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNiAgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfNSArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNyAgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfNiArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfNg0KICB3aW5jX2RpZmZfOCAgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfNyArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOSAgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfOCArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfMTAgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfOSArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfOQ0KICB3aW5jX2RpZmZfMTEgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfMTAgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzEwDQogIA0KICANCiAgd0ZlZHVjX2FfMiAgfiBjKGMxLCBjMiwgYzMpKndpbmNfZGlmZl8xICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV8xDQogIHdGZWR1Y19hXzMgIH4gYyhjMSwgYzIsIGMzKSp3aW5jX2RpZmZfMiArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfMg0KICB3RmVkdWNfYV80ICB+IGMoYzEsIGMyLCBjMykqd2luY19kaWZmXzMgKyBjKGQxLCBkMiwgZDMpKndGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNSAgfiBjKGMxLCBjMiwgYzMpKndpbmNfZGlmZl80ICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyhjMSwgYzIsIGMzKSp3aW5jX2RpZmZfNSArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfNQ0KICB3RmVkdWNfYV83ICB+IGMoYzEsIGMyLCBjMykqd2luY19kaWZmXzYgKyBjKGQxLCBkMiwgZDMpKndGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfOCAgfiBjKGMxLCBjMiwgYzMpKndpbmNfZGlmZl83ICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyhjMSwgYzIsIGMzKSp3aW5jX2RpZmZfOCArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfOA0KICB3RmVkdWNfYV8xMCAgfiBjKGMxLCBjMiwgYzMpKndpbmNfZGlmZl85ICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV85DQogIHdGZWR1Y19hXzExICB+IGMoYzEsIGMyLCBjMykqd2luY19kaWZmXzEwICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdpbmNfZGlmZl8xIH5+IHdGZWR1Y19hXzEgIyBDb3ZhcmlhbmNlDQoNCiAgICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3aW5jX2RpZmZfMiB+fiBjKGNvdjEsIGNvdjIsIGNvdjMpKndGZWR1Y19hXzINCiAgd2luY19kaWZmXzMgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl80IH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNSB+fiBjKGNvdjEsIGNvdjIsIGNvdjMpKndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzYgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl83IH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMpKndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzkgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMpKndGZWR1Y19hXzEwDQogIHdpbmNfZGlmZl8xMSB+fiBjKGNvdjEsIGNvdjIsIGNvdjMpKndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2luY19kaWZmXzEgfn4gd2luY19kaWZmXzEgDQogIHdGZWR1Y19hXzEgfn4gd0ZlZHVjX2FfMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2luY19kaWZmXzIgfn4gYyh2eTEsIHZ5MiwgdnkzKSp3aW5jX2RpZmZfMiANCiAgd0ZlZHVjX2FfMiB+fiBjKHZ4MSwgdngyLCB2eDMpKndGZWR1Y19hXzINCiAgd2luY19kaWZmXzMgfn4gYyh2eTEsIHZ5MiwgdnkzKSp3aW5jX2RpZmZfMw0KICB3RmVkdWNfYV8zIH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNCB+fiBjKHZ5MSwgdnkyLCB2eTMpKndpbmNfZGlmZl80IA0KICB3RmVkdWNfYV80IH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNSB+fiBjKHZ5MSwgdnkyLCB2eTMpKndpbmNfZGlmZl81DQogIHdGZWR1Y19hXzUgfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV81DQogIHdpbmNfZGlmZl82IH5+IGModnkxLCB2eTIsIHZ5Mykqd2luY19kaWZmXzYgDQogIHdGZWR1Y19hXzYgfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl83IH5+IGModnkxLCB2eTIsIHZ5Mykqd2luY19kaWZmXzcgDQogIHdGZWR1Y19hXzcgfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV83DQogIHdpbmNfZGlmZl84IH5+IGModnkxLCB2eTIsIHZ5Mykqd2luY19kaWZmXzggDQogIHdGZWR1Y19hXzggfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV84DQogIHdpbmNfZGlmZl85IH5+IGModnkxLCB2eTIsIHZ5Mykqd2luY19kaWZmXzkgDQogIHdGZWR1Y19hXzkgfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMCB+fiBjKHZ5MSwgdnkyLCB2eTMpKndpbmNfZGlmZl8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV8xMA0KICB3aW5jX2RpZmZfMTEgfn4gYyh2eTEsIHZ5MiwgdnkzKSp3aW5jX2RpZmZfMTEgDQogIHdGZWR1Y19hXzExIH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfMTENCiAgDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMgQURESVRJT05BTCBDT05TVFJBSU5UUyAjDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIFNldCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgYmV0d2Vlbi1mYWN0b3JzIChyYW5kb20gaW50ZXJjZXB0cykgYW5kIHdpdGhpbi0NCiAgIyBmYWN0b3JzIGF0IHdhdmUgMSBhdCAwLiANCiAgUkl4ICsgUkl5IH5+IDAqd0ZlZHVjX2FfMSArIDAqd2luY19kaWZmXzENCg0KJw0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImluY19kaWZmX21vZGVsMTJfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCmluY19kaWZmX21vZGVsMTJfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgaW5jX2RpZmZfbW9kZWwxMl91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcsDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAiY2F0X3pfcG9sIg0KICApDQoNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShpbmNfZGlmZl9tb2RlbDEyX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHtsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBpbmNfZGlmZiBtMTIgY29uc3RyYWluZWQgZ3JvdXBzIGxhZ30NCiNmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJpbmNfZGlmZl9tb2RlbDEyX2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KaW5jX2RpZmZfbW9kZWwxMl9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgbWFpbl9sYXZhYW5fcmVzdWx0cyRgTGF2YWFuIG1vZGVsIG9iamVjdHNgW1szXV1bWzJdXSwNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJjYXRfel9wb2wiDQogICkNCg0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKGluY19kaWZmX21vZGVsMTJfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHtsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBpbmNfZGlmZiBtMTIgbHJ0ZXN0fQ0KbGF2VGVzdExSVChpbmNfZGlmZl9tb2RlbDEyX2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LCBpbmNfZGlmZl9tb2RlbDEyX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQpDQoNCmBgYA0KDQojIyBOZXduZXNzDQoNCiMjIyBFVSBpbnRlZ3JhdGlvbg0KDQpgYGB7ciBFVSBtb2RlbCAxMyB1bmNvbnMgZ3JvdXBzIGFuZCBjb25zIGxhZ3N9DQpFVV9tb2RlbDEzX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZyA8LSANCicNCg0KICAjIyMjIyMjIyMjIyMjIyMjDQogICMgQkVUV0VFTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgIyBDcmVhdGUgYmV0d2VlbiBjb21wb25lbnRzIChyYW5kb20gaW50ZXJjZXB0cykNCiAgUkl4ID1+IDEqIEZlZHVjX2FfMiArIDEqRmVkdWNfYV8zICsgMSpGZWR1Y19hXzQgKyAxKkZlZHVjX2FfNSArIDEqRmVkdWNfYV82ICsgMSpGZWR1Y19hXzcgKyAxKkZlZHVjX2FfOCArIDEqRmVkdWNfYV85ICsgMSpGZWR1Y19hXzEwICsgMSpGZWR1Y19hXzExDQogIFJJeSA9fiAxKmV1XzIgKyAxKmV1XzMgKyAxKmV1XzQgKyAxKmV1XzUgKyAxKmV1XzYgKyAxKmV1XzcgKyAxKmV1XzggKyAxKmV1XzkgKyAxKmV1XzEwICsgMSpldV8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQogIA0KICAjIFJlZ3Jlc3Npb24gb2YgcmFuZG9tIGludGVyY2VwdHMgb24gejENCiAgUkl4ICsgUkl5IH4gYmV0d2Vlbl9lZHVjICsgYmV0d2Vlbl9hZ2UgKyBiZXR3ZWVuX29yaWdpbiArIGJldHdlZW5fZmVtYWxlIyBDb25zdHJhaW5lZCBvdmVyIHRpbWUuDQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4NCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgd2V1XzIgPX4gMSpldV8yDQogIHdldV8zID1+IDEqZXVfMw0KICB3ZXVfNCA9fiAxKmV1XzQNCiAgd2V1XzUgPX4gMSpldV81DQogIHdldV82ID1+IDEqZXVfNg0KICB3ZXVfNyA9fiAxKmV1XzcNCiAgd2V1XzggPX4gMSpldV84DQogIHdldV85ID1+IDEqZXVfOQ0KICB3ZXVfMTAgPX4gMSpldV8xMA0KICB3ZXVfMTEgPX4gMSpldV8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2V1XzMgICB+IGMoYTEsIGEyLCBhMykqd2V1XzIgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzINCiAgd2V1XzQgICB+IGMoYTEsIGEyLCBhMykqd2V1XzMgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzMNCiAgd2V1XzUgICB+IGMoYTEsIGEyLCBhMykqd2V1XzQgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzQNCiAgd2V1XzYgICB+IGMoYTEsIGEyLCBhMykqd2V1XzUgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzUNCiAgd2V1XzcgICB+IGMoYTEsIGEyLCBhMykqd2V1XzYgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzYNCiAgd2V1XzggICB+IGMoYTEsIGEyLCBhMykqd2V1XzcgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzcNCiAgd2V1XzkgICB+IGMoYTEsIGEyLCBhMykqd2V1XzggKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzgNCiAgd2V1XzEwICB+IGMoYTEsIGEyLCBhMykqd2V1XzkgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzkNCiAgd2V1XzExICB+IGMoYTEsIGEyLCBhMykqd2V1XzEwICsgYyhiMSwgYjIsIGIzKSp3RmVkdWNfYV8xMA0KICANCiAgd0ZlZHVjX2FfMyAgfiBjKGMxLCBjMiwgYzMpKndldV8yICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyhjMSwgYzIsIGMzKSp3ZXVfMyArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMoYzEsIGMyLCBjMykqd2V1XzQgKyBjKGQxLCBkMiwgZDMpKndGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNiAgfiBjKGMxLCBjMiwgYzMpKndldV81ICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyhjMSwgYzIsIGMzKSp3ZXVfNiArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMoYzEsIGMyLCBjMykqd2V1XzcgKyBjKGQxLCBkMiwgZDMpKndGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOSAgfiBjKGMxLCBjMiwgYzMpKndldV84ICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMoYzEsIGMyLCBjMykqd2V1XzkgKyBjKGQxLCBkMiwgZDMpKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyhjMSwgYzIsIGMzKSp3ZXVfMTAgKyBjKGQxLCBkMiwgZDMpKndGZWR1Y19hXzEwDQogIA0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlIGF0IHRoZSBmaXJzdCB3YXZlLiANCiAgd2V1XzIgfn4gd0ZlZHVjX2FfMiAjIENvdmFyaWFuY2UNCg0KICAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZXMgYmV0d2VlbiB0aGUgcmVzaWR1YWxzDQogIHdldV8zIH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfMw0KICB3ZXVfNCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMpKndGZWR1Y19hXzQNCiAgd2V1XzUgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV81DQogIHdldV82IH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfNg0KICB3ZXVfNyB+fiBjKGNvdjEsIGNvdjIsIGNvdjMpKndGZWR1Y19hXzcNCiAgd2V1Xzggfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV84DQogIHdldV85IH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfOQ0KICB3ZXVfMTAgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV8xMA0KICB3ZXVfMTEgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV8xMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgDQogIHdldV8yIH5+IHdldV8yIA0KICB3RmVkdWNfYV8yIH5+IHdGZWR1Y19hXzINCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdldV8zIH5+IGModnkxLCB2eTIsIHZ5Mykqd2V1XzMNCiAgd0ZlZHVjX2FfMyB+fiBjKHZ4MSwgdngyLCB2eDMpKndGZWR1Y19hXzMNCiAgd2V1XzQgfn4gYyh2eTEsIHZ5MiwgdnkzKSp3ZXVfNCANCiAgd0ZlZHVjX2FfNCB+fiBjKHZ4MSwgdngyLCB2eDMpKndGZWR1Y19hXzQNCiAgd2V1XzUgfn4gYyh2eTEsIHZ5MiwgdnkzKSp3ZXVfNQ0KICB3RmVkdWNfYV81IH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfNQ0KICB3ZXVfNiB+fiBjKHZ5MSwgdnkyLCB2eTMpKndldV82IA0KICB3RmVkdWNfYV82IH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfNg0KICB3ZXVfNyB+fiBjKHZ5MSwgdnkyLCB2eTMpKndldV83IA0KICB3RmVkdWNfYV83IH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfNw0KICB3ZXVfOCB+fiBjKHZ5MSwgdnkyLCB2eTMpKndldV84IA0KICB3RmVkdWNfYV84IH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfOA0KICB3ZXVfOSB+fiBjKHZ5MSwgdnkyLCB2eTMpKndldV85IA0KICB3RmVkdWNfYV85IH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfOQ0KICB3ZXVfMTAgfn4gYyh2eTEsIHZ5MiwgdnkzKSp3ZXVfMTAgDQogIHdGZWR1Y19hXzEwIH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfMTANCiAgd2V1XzExIH5+IGModnkxLCB2eTIsIHZ5Mykqd2V1XzExIA0KICB3RmVkdWNfYV8xMSB+fiBjKHZ4MSwgdngyLCB2eDMpKndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzIgKyAwKndldV8yDQoNCicNCg0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgIkVVX21vZGVsMTNfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCkVVX21vZGVsMTNfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgRVVfbW9kZWwxM191bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcsDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAiY2F0X3pfcmwiDQogICkNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShFVV9tb2RlbDEzX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHtsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBldSBtMTMgY29uc3RyYWluZWQgZ3JvdXBzIGxhZ30NCiNmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJFVV9tb2RlbDEzX2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KRVVfbW9kZWwxM19jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgRVVfbW9kZWw3X2NvbnN0cmFpbmVkX2xhZ19ncm91cHMsDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAiY2F0X3pfcmwiDQogICkNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShFVV9tb2RlbDEzX2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZSB7bG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQpgYGANCg0KYGBge3IgZXUgbTEzIGxydGVzdH0NCmxhdlRlc3RMUlQoRVVfbW9kZWwxM19jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwgRVVfbW9kZWwxM191bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0KQ0KYGBgDQoNCiMjIyBDdWx0dXJhbCBpbmNsdXNpb24NCg0KDQpgYGB7ciBjdWx0IG1vZGVsIDEzIHVuY29ucyBncm91cHMgYW5kIGNvbnMgbGFnc30NCmN1bHRfbW9kZWwxM191bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcgPC0gDQonDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSogRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+IDEqY3VsdF8yICsgMSpjdWx0XzMgKyAxKmN1bHRfNCArIDEqY3VsdF81ICsgMSpjdWx0XzYgKyAxKmN1bHRfNyArIDEqY3VsdF84ICsgMSpjdWx0XzkgKyAxKmN1bHRfMTAgKyAxKmN1bHRfMTENCg0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSBhbmQgY292YXJpYW5jZSBvZiB0aGUgcmFuZG9tIGludGVyY2VwdHMuIA0KICBSSXggfn4gUkl4DQogIFJJeSB+fiBSSXkNCiAgUkl4IH5+IFJJeQ0KICANCiAgIyBSZWdyZXNzaW9uIG9mIHJhbmRvbSBpbnRlcmNlcHRzIG9uIHoxDQogIFJJeCArIFJJeSB+IGJldHdlZW5fZWR1YyArIGJldHdlZW5fYWdlICsgYmV0d2Vlbl9vcmlnaW4gKyBiZXR3ZWVuX2ZlbWFsZSMgQ29uc3RyYWluZWQgb3ZlciB0aW1lLg0KDQogICMgU2V0IHRoZSByZXNpZHVhbCB2YXJpYW5jZXMgb2YgYWxsIEZYIHZhcmlhYmxlcyB0byAwLg0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQoNCiAgIyMjIyMjIyMjIyMjIyMjDQogICMgV0lUSElOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAgIyBDcmVhdGUgd2l0aGluLXBlcnNvbiBjZW50ZXJlZCB2YXJpYWJsZXMuDQogIHdGZWR1Y19hXzIgPX4gMSpGZWR1Y19hXzINCiAgd0ZlZHVjX2FfMyA9fiAxKkZlZHVjX2FfMw0KICB3RmVkdWNfYV80ID1+IDEqRmVkdWNfYV80DQogIHdGZWR1Y19hXzUgPX4gMSpGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNiA9fiAxKkZlZHVjX2FfNg0KICB3RmVkdWNfYV83ID1+IDEqRmVkdWNfYV83DQogIHdGZWR1Y19hXzggPX4gMSpGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfOSA9fiAxKkZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMCA9fiAxKkZlZHVjX2FfMTANCiAgd0ZlZHVjX2FfMTEgPX4gMSpGZWR1Y19hXzExDQogIHdjdWx0XzIgPX4gMSpjdWx0XzINCiAgd2N1bHRfMyA9fiAxKmN1bHRfMw0KICB3Y3VsdF80ID1+IDEqY3VsdF80DQogIHdjdWx0XzUgPX4gMSpjdWx0XzUNCiAgd2N1bHRfNiA9fiAxKmN1bHRfNg0KICB3Y3VsdF83ID1+IDEqY3VsdF83DQogIHdjdWx0XzggPX4gMSpjdWx0XzgNCiAgd2N1bHRfOSA9fiAxKmN1bHRfOQ0KICB3Y3VsdF8xMCA9fiAxKmN1bHRfMTANCiAgd2N1bHRfMTEgPX4gMSpjdWx0XzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3Y3VsdF8zICAgfiBjKGExLCBhMiwgYTMpKndjdWx0XzIgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzINCiAgd2N1bHRfNCAgIH4gYyhhMSwgYTIsIGEzKSp3Y3VsdF8zICsgYyhiMSwgYjIsIGIzKSp3RmVkdWNfYV8zDQogIHdjdWx0XzUgICB+IGMoYTEsIGEyLCBhMykqd2N1bHRfNCArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfNA0KICB3Y3VsdF82ICAgfiBjKGExLCBhMiwgYTMpKndjdWx0XzUgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzUNCiAgd2N1bHRfNyAgIH4gYyhhMSwgYTIsIGEzKSp3Y3VsdF82ICsgYyhiMSwgYjIsIGIzKSp3RmVkdWNfYV82DQogIHdjdWx0XzggICB+IGMoYTEsIGEyLCBhMykqd2N1bHRfNyArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfNw0KICB3Y3VsdF85ICAgfiBjKGExLCBhMiwgYTMpKndjdWx0XzggKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzgNCiAgd2N1bHRfMTAgIH4gYyhhMSwgYTIsIGEzKSp3Y3VsdF85ICsgYyhiMSwgYjIsIGIzKSp3RmVkdWNfYV85DQogIHdjdWx0XzExICB+IGMoYTEsIGEyLCBhMykqd2N1bHRfMTAgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzEwDQogIA0KICB3RmVkdWNfYV8zICB+IGMoYzEsIGMyLCBjMykqd2N1bHRfMiArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfMg0KICB3RmVkdWNfYV80ICB+IGMoYzEsIGMyLCBjMykqd2N1bHRfMyArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMoYzEsIGMyLCBjMykqd2N1bHRfNCArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMoYzEsIGMyLCBjMykqd2N1bHRfNSArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfNQ0KICB3RmVkdWNfYV83ICB+IGMoYzEsIGMyLCBjMykqd2N1bHRfNiArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMoYzEsIGMyLCBjMykqd2N1bHRfNyArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMoYzEsIGMyLCBjMykqd2N1bHRfOCArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfOA0KICB3RmVkdWNfYV8xMCAgfiBjKGMxLCBjMiwgYzMpKndjdWx0XzkgKyBjKGQxLCBkMiwgZDMpKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyhjMSwgYzIsIGMzKSp3Y3VsdF8xMCArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3Y3VsdF8yIH5+IHdGZWR1Y19hXzIgIyBDb3ZhcmlhbmNlDQoNCiAgICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3Y3VsdF8zIH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfMw0KICB3Y3VsdF80IH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfNA0KICB3Y3VsdF81IH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfNQ0KICB3Y3VsdF82IH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfNg0KICB3Y3VsdF83IH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfNw0KICB3Y3VsdF84IH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfOA0KICB3Y3VsdF85IH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMpKndGZWR1Y19hXzEwDQogIHdjdWx0XzExIH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3Y3VsdF8yIH5+IHdjdWx0XzIgDQogIHdGZWR1Y19hXzIgfn4gd0ZlZHVjX2FfMg0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2N1bHRfMyB+fiBjKHZ5MSwgdnkyLCB2eTMpKndjdWx0XzMNCiAgd0ZlZHVjX2FfMyB+fiBjKHZ4MSwgdngyLCB2eDMpKndGZWR1Y19hXzMNCiAgd2N1bHRfNCB+fiBjKHZ5MSwgdnkyLCB2eTMpKndjdWx0XzQgDQogIHdGZWR1Y19hXzQgfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV80DQogIHdjdWx0XzUgfn4gYyh2eTEsIHZ5MiwgdnkzKSp3Y3VsdF81DQogIHdGZWR1Y19hXzUgfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV81DQogIHdjdWx0XzYgfn4gYyh2eTEsIHZ5MiwgdnkzKSp3Y3VsdF82IA0KICB3RmVkdWNfYV82IH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfNg0KICB3Y3VsdF83IH5+IGModnkxLCB2eTIsIHZ5Mykqd2N1bHRfNyANCiAgd0ZlZHVjX2FfNyB+fiBjKHZ4MSwgdngyLCB2eDMpKndGZWR1Y19hXzcNCiAgd2N1bHRfOCB+fiBjKHZ5MSwgdnkyLCB2eTMpKndjdWx0XzggDQogIHdGZWR1Y19hXzggfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV84DQogIHdjdWx0Xzkgfn4gYyh2eTEsIHZ5MiwgdnkzKSp3Y3VsdF85IA0KICB3RmVkdWNfYV85IH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMCB+fiBjKHZ5MSwgdnkyLCB2eTMpKndjdWx0XzEwIA0KICB3RmVkdWNfYV8xMCB+fiBjKHZ4MSwgdngyLCB2eDMpKndGZWR1Y19hXzEwDQogIHdjdWx0XzExIH5+IGModnkxLCB2eTIsIHZ5Mykqd2N1bHRfMTEgDQogIHdGZWR1Y19hXzExIH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfMTENCiAgDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMgQURESVRJT05BTCBDT05TVFJBSU5UUyAjDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIFNldCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgYmV0d2Vlbi1mYWN0b3JzIChyYW5kb20gaW50ZXJjZXB0cykgYW5kIHdpdGhpbi0NCiAgIyBmYWN0b3JzIGF0IHdhdmUgMSBhdCAwLiANCiAgUkl4ICsgUkl5IH5+IDAqd0ZlZHVjX2FfMiArIDAqd2N1bHRfMg0KDQonDQojZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiY3VsdF9tb2RlbDEzX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQpjdWx0X21vZGVsMTNfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgY3VsdF9tb2RlbDEzX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZywNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJjYXRfel9ybCINCiAgKQ0KDQogICNzYXZlIG1vZGVsDQogIHNhdmUoY3VsdF9tb2RlbDEzX3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHtsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBjdWx0IG0xMyBjb25zdHJhaW5lZCBncm91cHMgbGFnfQ0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImN1bHRfbW9kZWwxM19jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCmN1bHRfbW9kZWwxM19jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgY3VsdF9tb2RlbDdfY29uc3RyYWluZWRfbGFnX2dyb3VwcywNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJjYXRfel9ybCINCiAgKQ0KDQogICNzYXZlIG1vZGVsDQogIHNhdmUoY3VsdF9tb2RlbDEzX2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZSB7bG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQpgYGANCg0KYGBge3IgY3VsdCBtMTMgbHJ0ZXN0fQ0KbGF2VGVzdExSVChjdWx0X21vZGVsMTNfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsIGN1bHRfbW9kZWwxM191bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0KQ0KDQoNCmBgYA0KDQojIyMgSW5jb21lIGVxdWFsaXR5DQoNCmBgYHtyIGluY19kaWZmIG1vZGVsIDEzIHVuY29ucyBncm91cHMgYW5kIGNvbnMgbGFnc30NCmluY19kaWZmX21vZGVsMTNfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnIDwtIA0KJw0KDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSogRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+IDEqaW5jX2RpZmZfMiArIDEqaW5jX2RpZmZfMyArIDEqaW5jX2RpZmZfNCArIDEqaW5jX2RpZmZfNSArIDEqaW5jX2RpZmZfNiArIDEqaW5jX2RpZmZfNyArIDEqaW5jX2RpZmZfOCArIDEqaW5jX2RpZmZfOSArIDEqaW5jX2RpZmZfMTAgKyAxKmluY19kaWZmXzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4NCiAgRmVkdWNfYV8yIH5+IDAqRmVkdWNfYV8yDQogIEZlZHVjX2FfMyB+fiAwKkZlZHVjX2FfMw0KICBGZWR1Y19hXzQgfn4gMCpGZWR1Y19hXzQNCiAgRmVkdWNfYV81IH5+IDAqRmVkdWNfYV81DQogIEZlZHVjX2FfNiB+fiAwKkZlZHVjX2FfNg0KICBGZWR1Y19hXzcgfn4gMCpGZWR1Y19hXzcNCiAgRmVkdWNfYV84IH5+IDAqRmVkdWNfYV84DQogIEZlZHVjX2FfOSB+fiAwKkZlZHVjX2FfOQ0KICBGZWR1Y19hXzEwIH5+IDAqRmVkdWNfYV8xMA0KICBGZWR1Y19hXzExIH5+IDAqRmVkdWNfYV8xMQ0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLg0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3aW5jX2RpZmZfMiA9fiAxKmluY19kaWZmXzINCiAgd2luY19kaWZmXzMgPX4gMSppbmNfZGlmZl8zDQogIHdpbmNfZGlmZl80ID1+IDEqaW5jX2RpZmZfNA0KICB3aW5jX2RpZmZfNSA9fiAxKmluY19kaWZmXzUNCiAgd2luY19kaWZmXzYgPX4gMSppbmNfZGlmZl82DQogIHdpbmNfZGlmZl83ID1+IDEqaW5jX2RpZmZfNw0KICB3aW5jX2RpZmZfOCA9fiAxKmluY19kaWZmXzgNCiAgd2luY19kaWZmXzkgPX4gMSppbmNfZGlmZl85DQogIHdpbmNfZGlmZl8xMCA9fiAxKmluY19kaWZmXzEwDQogIHdpbmNfZGlmZl8xMSA9fiAxKmluY19kaWZmXzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3aW5jX2RpZmZfMyAgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfMiArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfMg0KICB3aW5jX2RpZmZfNCAgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfMyArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNSAgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfNCArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNiAgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfNSArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNyAgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfNiArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfNg0KICB3aW5jX2RpZmZfOCAgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfNyArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOSAgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfOCArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfMTAgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfOSArIGMoYjEsIGIyLCBiMykqd0ZlZHVjX2FfOQ0KICB3aW5jX2RpZmZfMTEgIH4gYyhhMSwgYTIsIGEzKSp3aW5jX2RpZmZfMTAgKyBjKGIxLCBiMiwgYjMpKndGZWR1Y19hXzEwDQogIA0KICB3RmVkdWNfYV8zICB+IGMoYzEsIGMyLCBjMykqd2luY19kaWZmXzIgKyBjKGQxLCBkMiwgZDMpKndGZWR1Y19hXzINCiAgd0ZlZHVjX2FfNCAgfiBjKGMxLCBjMiwgYzMpKndpbmNfZGlmZl8zICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gYyhjMSwgYzIsIGMzKSp3aW5jX2RpZmZfNCArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMoYzEsIGMyLCBjMykqd2luY19kaWZmXzUgKyBjKGQxLCBkMiwgZDMpKndGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNyAgfiBjKGMxLCBjMiwgYzMpKndpbmNfZGlmZl82ICsgYyhkMSwgZDIsIGQzKSp3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gYyhjMSwgYzIsIGMzKSp3aW5jX2RpZmZfNyArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMoYzEsIGMyLCBjMykqd2luY19kaWZmXzggKyBjKGQxLCBkMiwgZDMpKndGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfMTAgIH4gYyhjMSwgYzIsIGMzKSp3aW5jX2RpZmZfOSArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiBjKGMxLCBjMiwgYzMpKndpbmNfZGlmZl8xMCArIGMoZDEsIGQyLCBkMykqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3aW5jX2RpZmZfMiB+fiB3RmVkdWNfYV8yICMgQ292YXJpYW5jZQ0KDQogICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2luY19kaWZmXzMgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl80IH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNSB+fiBjKGNvdjEsIGNvdjIsIGNvdjMpKndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzYgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl83IH5+IGMoY292MSwgY292MiwgY292Mykqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMpKndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzkgfn4gYyhjb3YxLCBjb3YyLCBjb3YzKSp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMpKndGZWR1Y19hXzEwDQogIHdpbmNfZGlmZl8xMSB+fiBjKGNvdjEsIGNvdjIsIGNvdjMpKndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2luY19kaWZmXzIgfn4gd2luY19kaWZmXzIgDQogIHdGZWR1Y19hXzIgfn4gd0ZlZHVjX2FfMg0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2luY19kaWZmXzMgfn4gYyh2eTEsIHZ5MiwgdnkzKSp3aW5jX2RpZmZfMw0KICB3RmVkdWNfYV8zIH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNCB+fiBjKHZ5MSwgdnkyLCB2eTMpKndpbmNfZGlmZl80IA0KICB3RmVkdWNfYV80IH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNSB+fiBjKHZ5MSwgdnkyLCB2eTMpKndpbmNfZGlmZl81DQogIHdGZWR1Y19hXzUgfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV81DQogIHdpbmNfZGlmZl82IH5+IGModnkxLCB2eTIsIHZ5Mykqd2luY19kaWZmXzYgDQogIHdGZWR1Y19hXzYgfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl83IH5+IGModnkxLCB2eTIsIHZ5Mykqd2luY19kaWZmXzcgDQogIHdGZWR1Y19hXzcgfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV83DQogIHdpbmNfZGlmZl84IH5+IGModnkxLCB2eTIsIHZ5Mykqd2luY19kaWZmXzggDQogIHdGZWR1Y19hXzggfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV84DQogIHdpbmNfZGlmZl85IH5+IGModnkxLCB2eTIsIHZ5Mykqd2luY19kaWZmXzkgDQogIHdGZWR1Y19hXzkgfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMCB+fiBjKHZ5MSwgdnkyLCB2eTMpKndpbmNfZGlmZl8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gYyh2eDEsIHZ4MiwgdngzKSp3RmVkdWNfYV8xMA0KICB3aW5jX2RpZmZfMTEgfn4gYyh2eTEsIHZ5MiwgdnkzKSp3aW5jX2RpZmZfMTEgDQogIHdGZWR1Y19hXzExIH5+IGModngxLCB2eDIsIHZ4Mykqd0ZlZHVjX2FfMTENCiAgDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMgQURESVRJT05BTCBDT05TVFJBSU5UUyAjDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIFNldCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgYmV0d2Vlbi1mYWN0b3JzIChyYW5kb20gaW50ZXJjZXB0cykgYW5kIHdpdGhpbi0NCiAgIyBmYWN0b3JzIGF0IHdhdmUgMSBhdCAwLiANCiAgUkl4ICsgUkl5IH5+IDAqd0ZlZHVjX2FfMiArIDAqd2luY19kaWZmXzINCg0KJw0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImluY19kaWZmX21vZGVsMTNfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCmluY19kaWZmX21vZGVsMTNfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgaW5jX2RpZmZfbW9kZWwxM191bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcsDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAiY2F0X3pfcmwiDQogICkNCg0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKGluY19kaWZmX21vZGVsMTNfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Uge2xvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KYGBgDQoNCmBgYHtyIGluY19kaWZmIG0xMyBjb25zdHJhaW5lZCBncm91cHMgbGFnfQ0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImluY19kaWZmX21vZGVsMTNfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQppbmNfZGlmZl9tb2RlbDEzX2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0IDwtDQogIGxhdmFhbigNCiAgICBjdWx0X21vZGVsN19jb25zdHJhaW5lZF9sYWdfZ3JvdXBzLA0KICAgIGRhdGEgPSBNeURhdGEsDQogICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgbWlzc2luZyA9ICdNTCcsDQogICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgaW50Lm92LmZyZWUgPSBULA0KICAgIGdyb3VwID0gImNhdF96X3JsIg0KICApDQoNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShpbmNfZGlmZl9tb2RlbDEzX2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZSB7bG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQpgYGANCg0KYGBge3IgaW5jX2RpZmYgbTEzIGxydGVzdH0NCmxhdlRlc3RMUlQoaW5jX2RpZmZfbW9kZWwxM19jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwgaW5jX2RpZmZfbW9kZWwxM191bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0KQ0KDQpgYGANCg0KIyMgQXZlIHNpbQ0KDQojIyMgRVUgaW50ZWdyYXRpb24NCg0KYGBge3IgRVUgbW9kZWwgMTQgdW5jb25zIGdyb3VwcyBhbmQgY29ucyBsYWdzfQ0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgIkVVX21vZGVsMTRfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCkVVX21vZGVsMTRfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgRVVfbW9kZWwxMl91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcsDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAiY2F0X3pfYXZlIg0KICApDQoNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShFVV9tb2RlbDE0X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHtsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBldSBtMTQgY29uc3RyYWluZWQgZ3JvdXBzIGxhZ30NCiNmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJFVV9tb2RlbDE0X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KRVVfbW9kZWwxNF9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgbWFpbl9sYXZhYW5fcmVzdWx0cyRgTGF2YWFuIG1vZGVsIG9iamVjdHNgW1sxXV1bWzJdXSwNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJjYXRfel9hdmUiDQogICkNCg0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKEVVX21vZGVsMTRfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHtsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBldSBtMTQgbHJ0ZXN0fQ0KbGF2VGVzdExSVChFVV9tb2RlbDE0X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LCBFVV9tb2RlbDE0X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQpDQoNCg0KYGBgDQoNCiMjIyBDdWx0dXJhbCBpbmNsdXNpb24NCg0KDQpgYGB7ciBjdWx0IG1vZGVsIDE0IHVuY29ucyBncm91cHMgYW5kIGNvbnMgbGFnc30NCiNmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJjdWx0X21vZGVsMTRfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCmN1bHRfbW9kZWwxNF91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0IDwtDQogIGxhdmFhbigNCiAgICBjdWx0X21vZGVsMTJfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnLA0KICAgIGRhdGEgPSBNeURhdGEsDQogICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgbWlzc2luZyA9ICdNTCcsDQogICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgaW50Lm92LmZyZWUgPSBULA0KICAgIGdyb3VwID0gImNhdF96X2F2ZSINCiAgKQ0KDQogICNzYXZlIG1vZGVsDQogIHNhdmUoY3VsdF9tb2RlbDE0X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHtsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBjdWx0IG0xNCBjb25zdHJhaW5lZCBncm91cHMgbGFnfQ0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImN1bHRfbW9kZWwxNF9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCmN1bHRfbW9kZWwxNF9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgbWFpbl9sYXZhYW5fcmVzdWx0cyRgTGF2YWFuIG1vZGVsIG9iamVjdHNgW1syXV1bWzJdXSwNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJjYXRfel9hdmUiDQogICkNCg0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKGN1bHRfbW9kZWwxNF9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Uge2xvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KYGBgDQoNCmBgYHtyIGN1bHQgbTE0IGxydGVzdH0NCmxhdlRlc3RMUlQoY3VsdF9tb2RlbDE0X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LCBjdWx0X21vZGVsMTRfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCkNCg0KDQpgYGANCg0KIyMjIEluY29tZSBlcXVhbGl0eQ0KDQpgYGB7ciBpbmNfZGlmZiBtb2RlbCAxNCB1bmNvbnN0ciBncm91cHMgYW5kIGNvbnN0ciBsYWdzfQ0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImluY19kaWZmX21vZGVsMTRfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCmluY19kaWZmX21vZGVsMTRfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgaW5jX2RpZmZfbW9kZWwxMl91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcsDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAiY2F0X3pfYXZlIg0KICApDQoNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShpbmNfZGlmZl9tb2RlbDE0X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHtsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBpbmNfZGlmZiBtMTQgY29uc3RyYWluZWQgZ3JvdXBzIGxhZ30NCiNmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJpbmNfZGlmZl9tb2RlbDE0X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KaW5jX2RpZmZfbW9kZWwxNF9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgbWFpbl9sYXZhYW5fcmVzdWx0cyRgTGF2YWFuIG1vZGVsIG9iamVjdHNgW1szXV1bWzJdXSwNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJjYXRfel9hdmUiDQogICkNCg0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKGluY19kaWZmX21vZGVsMTRfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHtsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBpbmNfZGlmZiBtMTQgbHJ0ZXN0fQ0KbGF2VGVzdExSVChpbmNfZGlmZl9tb2RlbDE0X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LCBpbmNfZGlmZl9tb2RlbDE0X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQpDQoNCmBgYA0KDQoNCiMjIE5ld25lc3MgKGxlbmd0aCBsaXNzKQ0KDQojIyBOZXduZXNzDQoNCmBgYHtyIGNyZWF0ZSBiZXR3ZWVuIHZhcmlhYmxlcyBuZXduZXNzIGxlbmd0aCBsaXNzfQ0KTXlEYXRhIDwtIE15RGF0YSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUobGVuZ3RoX21lYW4gPSBtZWFuKGNfYWNyb3NzKHN0YXJ0c193aXRoKCJGbGVuZ3RoIikpLCBuYS5ybSA9IFQpKSAlPiUNCiAgdW5ncm91cCgpDQoNCk15RGF0YSA8LSBNeURhdGEgJT4lDQogIG11dGF0ZShsZW5ndGhfcmVjID0gY3V0MihsZW5ndGhfbWVhbiwgZyA9IDQpLA0KICAgICAgICAgbGVuZ3RoXzIgPSBjdXQyKGxlbmd0aF9tZWFuLCBnID0gMikpDQoNCmBgYA0KDQojIyMgRVUgaW50ZWdyYXRpb24NCg0KDQpgYGB7ciBFVSBtb2RlbCAxNSB1bmNvbnN0IGdyb3VwcyBhbmQgY29uc3QgbGFnc30NCkVVX21vZGVsMTVfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnIDwtIA0KJw0KICAjIyMjIyMjIyMjIyMjIyMjDQogICMgQkVUV0VFTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgIyBDcmVhdGUgYmV0d2VlbiBjb21wb25lbnRzIChyYW5kb20gaW50ZXJjZXB0cykNCiAgUkl4ID1+IDEqRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+IDEqZXVfMiArIDEqZXVfMyArIDEqZXVfNCArIDEqZXVfNSArIDEqZXVfNiArIDEqZXVfNyArIDEqZXVfOCArIDEqZXVfOSArIDEqZXVfMTAgKyAxKmV1XzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4NCiAgRmVkdWNfYV8yIH5+IDAqRmVkdWNfYV8yDQogIEZlZHVjX2FfMyB+fiAwKkZlZHVjX2FfMw0KICBGZWR1Y19hXzQgfn4gMCpGZWR1Y19hXzQNCiAgRmVkdWNfYV81IH5+IDAqRmVkdWNfYV81DQogIEZlZHVjX2FfNiB+fiAwKkZlZHVjX2FfNg0KICBGZWR1Y19hXzcgfn4gMCpGZWR1Y19hXzcNCiAgRmVkdWNfYV84IH5+IDAqRmVkdWNfYV84DQogIEZlZHVjX2FfOSB+fiAwKkZlZHVjX2FfOQ0KICBGZWR1Y19hXzEwIH5+IDAqRmVkdWNfYV8xMA0KICBGZWR1Y19hXzExIH5+IDAqRmVkdWNfYV8xMQ0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgd2V1XzIgPX4gMSpldV8yDQogIHdldV8zID1+IDEqZXVfMw0KICB3ZXVfNCA9fiAxKmV1XzQNCiAgd2V1XzUgPX4gMSpldV81DQogIHdldV82ID1+IDEqZXVfNg0KICB3ZXVfNyA9fiAxKmV1XzcNCiAgd2V1XzggPX4gMSpldV84DQogIHdldV85ID1+IDEqZXVfOQ0KICB3ZXVfMTAgPX4gMSpldV8xMA0KICB3ZXVfMTEgPX4gMSpldV8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2V1XzMgICB+IGMoYTEsIGEyLCBhMywgYTQpKndldV8yICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfMg0KICB3ZXVfNCAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2V1XzMgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV8zDQogIHdldV81ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3ZXVfNCArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzQNCiAgd2V1XzYgICB+IGMoYTEsIGEyLCBhMywgYTQpKndldV81ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfNQ0KICB3ZXVfNyAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2V1XzYgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV82DQogIHdldV84ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3ZXVfNyArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzcNCiAgd2V1XzkgICB+IGMoYTEsIGEyLCBhMywgYTQpKndldV84ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfOA0KICB3ZXVfMTAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2V1XzkgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV85DQogIHdldV8xMSAgfiBjKGExLCBhMiwgYTMsIGE0KSp3ZXVfMTAgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV8xMA0KICANCiAgd0ZlZHVjX2FfMyAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3ZXVfMiArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzINCiAgd0ZlZHVjX2FfNCAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3ZXVfMyArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNSAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3ZXVfNCArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNiAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3ZXVfNSArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNyAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3ZXVfNiArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfOCAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3ZXVfNyArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOSAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3ZXVfOCArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfMTAgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2V1XzkgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV85DQogIHdGZWR1Y19hXzExICB+IGMoYzEsIGMyLCBjMywgYzQpKndldV8xMCArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzEwDQogIA0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlIGF0IHRoZSBmaXJzdCB3YXZlLiANCiAgd2V1XzIgfn4gd0ZlZHVjX2FfMiAjIENvdmFyaWFuY2UNCg0KICAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZXMgYmV0d2VlbiB0aGUgcmVzaWR1YWxzDQogIHdldV8zIH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfMw0KICB3ZXVfNCB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzQNCiAgd2V1XzUgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV81DQogIHdldV82IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNg0KICB3ZXVfNyB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzcNCiAgd2V1Xzggfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV84DQogIHdldV85IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfOQ0KICB3ZXVfMTAgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV8xMA0KICB3ZXVfMTEgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV8xMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgDQogIHdldV8yIH5+IHdldV8yIA0KICB3RmVkdWNfYV8yIH5+IHdGZWR1Y19hXzINCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdldV8zIH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3ZXVfMw0KICB3RmVkdWNfYV8zIH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV8zDQogIHdldV80IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3ZXVfNCANCiAgd0ZlZHVjX2FfNCB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfNA0KICB3ZXVfNSB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2V1XzUNCiAgd0ZlZHVjX2FfNSB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfNQ0KICB3ZXVfNiB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2V1XzYgDQogIHdGZWR1Y19hXzYgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzYNCiAgd2V1Xzcgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndldV83IA0KICB3RmVkdWNfYV83IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV83DQogIHdldV84IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3ZXVfOCANCiAgd0ZlZHVjX2FfOCB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfOA0KICB3ZXVfOSB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2V1XzkgDQogIHdGZWR1Y19hXzkgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzkNCiAgd2V1XzEwIH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3ZXVfMTAgDQogIHdGZWR1Y19hXzEwIH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV8xMA0KICB3ZXVfMTEgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndldV8xMSANCiAgd0ZlZHVjX2FfMTEgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzIgKyAwKndldV8yDQoNCicNCiNmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJFVV9tb2RlbDE1X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQpFVV9tb2RlbDE1X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQgPC0NCiAgbGF2YWFuKA0KICAgIEVVX21vZGVsMTVfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnLA0KICAgIGRhdGEgPSBNeURhdGEsDQogICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgbWlzc2luZyA9ICdNTCcsDQogICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgaW50Lm92LmZyZWUgPSBULA0KICAgIGdyb3VwID0gImxlbmd0aF9yZWMiDQogICkNCg0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKEVVX21vZGVsMTVfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Uge2xvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KYGBgDQoNCmBgYHtyIGV1IG0xNSBjb25zdHJhaW5lZCBncm91cHMgbGFnfQ0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgIkVVX21vZGVsMTVfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQpFVV9tb2RlbDE1X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0IDwtDQogIGxhdmFhbigNCiAgICBtYWluX2xhdmFhbl9yZXN1bHRzJGBMYXZhYW4gbW9kZWwgb2JqZWN0c2BbWzFdXVtbMl1dLA0KICAgIGRhdGEgPSBNeURhdGEsDQogICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgbWlzc2luZyA9ICdNTCcsDQogICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgaW50Lm92LmZyZWUgPSBULA0KICAgIGdyb3VwID0gImxlbmd0aF9yZWMiDQogICkNCg0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKEVVX21vZGVsMTVfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHtsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBldSBtMTUgbHJ0ZXN0fQ0KbGF2VGVzdExSVChFVV9tb2RlbDE1X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LCBFVV9tb2RlbDE1X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQpDQpgYGANCg0KIyMjIGN1bHR1cmFsIGluY2x1c2lvbg0KDQpgYGB7ciBjdWx0IG1vZGVsIDE1IHVuY29uc3QgZ3JvdXBzIGFuZCBjb25zdCBsYWdzfQ0KY3VsdF9tb2RlbDE1X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZyA8LSANCicNCg0KICAjIyMjIyMjIyMjIyMjIyMjDQogICMgQkVUV0VFTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgIyBDcmVhdGUgYmV0d2VlbiBjb21wb25lbnRzIChyYW5kb20gaW50ZXJjZXB0cykNCiAgUkl4ID1+ICAxKkZlZHVjX2FfMiArIDEqRmVkdWNfYV8zICsgMSpGZWR1Y19hXzQgKyAxKkZlZHVjX2FfNSArIDEqRmVkdWNfYV82ICsgMSpGZWR1Y19hXzcgKyAxKkZlZHVjX2FfOCArIDEqRmVkdWNfYV85ICsgMSpGZWR1Y19hXzEwICsgMSpGZWR1Y19hXzExDQogIFJJeSA9fiAgMSpjdWx0XzIgKyAxKmN1bHRfMyArIDEqY3VsdF80ICsgMSpjdWx0XzUgKyAxKmN1bHRfNiArIDEqY3VsdF83ICsgMSpjdWx0XzggKyAxKmN1bHRfOSArIDEqY3VsdF8xMCArIDEqY3VsdF8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQogIA0KICAjIFJlZ3Jlc3Npb24gb2YgcmFuZG9tIGludGVyY2VwdHMgb24gejENCiAgUkl4ICsgUkl5IH4gYmV0d2Vlbl9lZHVjICsgYmV0d2Vlbl9hZ2UgKyBiZXR3ZWVuX29yaWdpbiArIGJldHdlZW5fZmVtYWxlIyBDb25zdHJhaW5lZCBvdmVyIHRpbWUuDQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4NCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgd2N1bHRfMiA9fiAxKmN1bHRfMg0KICB3Y3VsdF8zID1+IDEqY3VsdF8zDQogIHdjdWx0XzQgPX4gMSpjdWx0XzQNCiAgd2N1bHRfNSA9fiAxKmN1bHRfNQ0KICB3Y3VsdF82ID1+IDEqY3VsdF82DQogIHdjdWx0XzcgPX4gMSpjdWx0XzcNCiAgd2N1bHRfOCA9fiAxKmN1bHRfOA0KICB3Y3VsdF85ID1+IDEqY3VsdF85DQogIHdjdWx0XzEwID1+IDEqY3VsdF8xMA0KICB3Y3VsdF8xMSA9fiAxKmN1bHRfMTEgDQogIA0KICAjIEVzdGltYXRlIHRoZSBsYWdnZWQgZWZmZWN0cyAoY29uc3RyYWluZWQpDQogIHdjdWx0XzMgICB+IGMoYTEsIGEyLCBhMywgYTQpKndjdWx0XzIgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV8yDQogIHdjdWx0XzQgICB+IGMoYTEsIGEyLCBhMywgYTQpKndjdWx0XzMgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV8zDQogIHdjdWx0XzUgICB+IGMoYTEsIGEyLCBhMywgYTQpKndjdWx0XzQgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV80DQogIHdjdWx0XzYgICB+IGMoYTEsIGEyLCBhMywgYTQpKndjdWx0XzUgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV81DQogIHdjdWx0XzcgICB+IGMoYTEsIGEyLCBhMywgYTQpKndjdWx0XzYgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV82DQogIHdjdWx0XzggICB+IGMoYTEsIGEyLCBhMywgYTQpKndjdWx0XzcgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV83DQogIHdjdWx0XzkgICB+IGMoYTEsIGEyLCBhMywgYTQpKndjdWx0XzggKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV84DQogIHdjdWx0XzEwICB+IGMoYTEsIGEyLCBhMywgYTQpKndjdWx0XzkgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV85DQogIHdjdWx0XzExICB+IGMoYTEsIGEyLCBhMywgYTQpKndjdWx0XzEwICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfMTANCiAgDQogIHdGZWR1Y19hXzMgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2N1bHRfMiArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzINCiAgd0ZlZHVjX2FfNCAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3Y3VsdF8zICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMoYzEsIGMyLCBjMywgYzQpKndjdWx0XzQgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2N1bHRfNSArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNyAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3Y3VsdF82ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMoYzEsIGMyLCBjMywgYzQpKndjdWx0XzcgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2N1bHRfOCArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfMTAgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2N1bHRfOSArIGMoZDEsIGQyLCBkMywgZDQpKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2N1bHRfMTAgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdjdWx0XzIgfn4gd0ZlZHVjX2FfMiAjIENvdmFyaWFuY2UNCg0KICAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZXMgYmV0d2VlbiB0aGUgcmVzaWR1YWxzDQogIHdjdWx0XzMgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV8zDQogIHdjdWx0XzQgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV80DQogIHdjdWx0XzUgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV81DQogIHdjdWx0XzYgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV82DQogIHdjdWx0Xzcgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV83DQogIHdjdWx0Xzggfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV84DQogIHdjdWx0Xzkgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV85DQogIHdjdWx0XzEwIH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfMTANCiAgd2N1bHRfMTEgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV8xMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgDQogIHdjdWx0XzIgfn4gd2N1bHRfMg0KICB3RmVkdWNfYV8yIH5+IHdGZWR1Y19hXzINCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdjdWx0XzMgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndjdWx0XzMNCiAgd0ZlZHVjX2FfMyB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfMw0KICB3Y3VsdF80IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3Y3VsdF80IA0KICB3RmVkdWNfYV80IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV80DQogIHdjdWx0XzUgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndjdWx0XzUNCiAgd0ZlZHVjX2FfNSB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfNQ0KICB3Y3VsdF82IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3Y3VsdF82IA0KICB3RmVkdWNfYV82IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV82DQogIHdjdWx0Xzcgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndjdWx0XzcgDQogIHdGZWR1Y19hXzcgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzcNCiAgd2N1bHRfOCB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2N1bHRfOCANCiAgd0ZlZHVjX2FfOCB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfOA0KICB3Y3VsdF85IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3Y3VsdF85IA0KICB3RmVkdWNfYV85IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV85DQogIHdjdWx0XzEwIH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3Y3VsdF8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzEwDQogIHdjdWx0XzExIH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3Y3VsdF8xMSANCiAgd0ZlZHVjX2FfMTEgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzIgKyAwKndjdWx0XzINCg0KJw0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImN1bHRfbW9kZWwxNV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0IikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KY3VsdF9tb2RlbDE1X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQgPC0NCiAgbGF2YWFuKA0KICAgIGN1bHRfbW9kZWwxNV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcsDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAibGVuZ3RoX3JlYyINCiAgKQ0KDQogICNzYXZlIG1vZGVsDQogIHNhdmUoY3VsdF9tb2RlbDE1X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHtsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBjdWx0IG0xNSBjb25zdHJhaW5lZCBncm91cHMgbGFnfQ0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImN1bHRfbW9kZWwxNV9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCmN1bHRfbW9kZWwxNV9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgbWFpbl9sYXZhYW5fcmVzdWx0cyRgTGF2YWFuIG1vZGVsIG9iamVjdHNgW1syXV1bWzJdXSwNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJsZW5ndGhfcmVjIg0KICApDQoNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShjdWx0X21vZGVsMTVfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHtsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBjdWx0IG0xNSBscnRlc3R9DQpsYXZUZXN0TFJUKGN1bHRfbW9kZWwxNV9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwgY3VsdF9tb2RlbDE1X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQpDQpgYGANCg0KIyMjIGluY29tZSBkaWZmZXJlbmNlcw0KDQpgYGB7ciBpbmNfZGlmZiBtb2RlbCAxNSB1bmNvbnN0IGdyb3VwcyBhbmQgY29uc3QgbGFnc30NCmluY19kaWZmX21vZGVsMTVfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnIDwtICcNCg0KICAjIyMjIyMjIyMjIyMjIyMjDQogICMgQkVUV0VFTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgIyBDcmVhdGUgYmV0d2VlbiBjb21wb25lbnRzIChyYW5kb20gaW50ZXJjZXB0cykNCiAgUkl4ID1+IDEqRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+ICAxKmluY19kaWZmXzIgKyAxKmluY19kaWZmXzMgKyAxKmluY19kaWZmXzQgKyAxKmluY19kaWZmXzUgKyAxKmluY19kaWZmXzYgKyAxKmluY19kaWZmXzcgKyAxKmluY19kaWZmXzggKyAxKmluY19kaWZmXzkgKyAxKmluY19kaWZmXzEwICsgMSppbmNfZGlmZl8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQogIA0KICAjIFJlZ3Jlc3Npb24gb2YgcmFuZG9tIGludGVyY2VwdHMgb24gejENCiAgUkl4ICsgUkl5IH4gYmV0d2Vlbl9lZHVjICsgYmV0d2Vlbl9hZ2UgKyBiZXR3ZWVuX29yaWdpbiArIGJldHdlZW5fZmVtYWxlIyBDb25zdHJhaW5lZCBvdmVyIHRpbWUuDQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4NCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgDQogIHdpbmNfZGlmZl8yID1+IDEqaW5jX2RpZmZfMg0KICB3aW5jX2RpZmZfMyA9fiAxKmluY19kaWZmXzMNCiAgd2luY19kaWZmXzQgPX4gMSppbmNfZGlmZl80DQogIHdpbmNfZGlmZl81ID1+IDEqaW5jX2RpZmZfNQ0KICB3aW5jX2RpZmZfNiA9fiAxKmluY19kaWZmXzYNCiAgd2luY19kaWZmXzcgPX4gMSppbmNfZGlmZl83DQogIHdpbmNfZGlmZl84ID1+IDEqaW5jX2RpZmZfOA0KICB3aW5jX2RpZmZfOSA9fiAxKmluY19kaWZmXzkNCiAgd2luY19kaWZmXzEwID1+IDEqaW5jX2RpZmZfMTANCiAgd2luY19kaWZmXzExID1+IDEqaW5jX2RpZmZfMTEgDQogIA0KICAjIEVzdGltYXRlIHRoZSBsYWdnZWQgZWZmZWN0cyAoY29uc3RyYWluZWQpDQogIHdpbmNfZGlmZl8zICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3aW5jX2RpZmZfMiArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzINCiAgd2luY19kaWZmXzQgICB+IGMoYTEsIGEyLCBhMywgYTQpKndpbmNfZGlmZl8zICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNSAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2luY19kaWZmXzQgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV80DQogIHdpbmNfZGlmZl82ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3aW5jX2RpZmZfNSArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzcgICB+IGMoYTEsIGEyLCBhMywgYTQpKndpbmNfZGlmZl82ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfNg0KICB3aW5jX2RpZmZfOCAgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2luY19kaWZmXzcgKyBjKGIxLCBiMiwgYjMsIGI0KSp3RmVkdWNfYV83DQogIHdpbmNfZGlmZl85ICAgfiBjKGExLCBhMiwgYTMsIGE0KSp3aW5jX2RpZmZfOCArIGMoYjEsIGIyLCBiMywgYjQpKndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzEwICB+IGMoYTEsIGEyLCBhMywgYTQpKndpbmNfZGlmZl85ICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfOQ0KICB3aW5jX2RpZmZfMTEgIH4gYyhhMSwgYTIsIGEzLCBhNCkqd2luY19kaWZmXzEwICsgYyhiMSwgYjIsIGIzLCBiNCkqd0ZlZHVjX2FfMTANCiAgDQogIHdGZWR1Y19hXzMgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2luY19kaWZmXzIgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2luY19kaWZmXzMgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2luY19kaWZmXzQgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2luY19kaWZmXzUgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2luY19kaWZmXzYgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2luY19kaWZmXzcgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyhjMSwgYzIsIGMzLCBjNCkqd2luY19kaWZmXzggKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMoYzEsIGMyLCBjMywgYzQpKndpbmNfZGlmZl85ICsgYyhkMSwgZDIsIGQzLCBkNCkqd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiBjKGMxLCBjMiwgYzMsIGM0KSp3aW5jX2RpZmZfMTAgKyBjKGQxLCBkMiwgZDMsIGQ0KSp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdpbmNfZGlmZl8yIH5+IHdGZWR1Y19hXzIgIyBDb3ZhcmlhbmNlDQoNCiAgICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3aW5jX2RpZmZfMyB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzMNCiAgd2luY19kaWZmXzQgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV80DQogIHdpbmNfZGlmZl81IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNiB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzYNCiAgd2luY19kaWZmXzcgfn4gYyhjb3YxLCBjb3YyLCBjb3YzLCBjb3Y0KSp3RmVkdWNfYV83DQogIHdpbmNfZGlmZl84IH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfOSB+fiBjKGNvdjEsIGNvdjIsIGNvdjMsIGNvdjQpKndGZWR1Y19hXzkNCiAgd2luY19kaWZmXzEwIH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfMTANCiAgd2luY19kaWZmXzExIH5+IGMoY292MSwgY292MiwgY292MywgY292NCkqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3aW5jX2RpZmZfMiB+fiB3aW5jX2RpZmZfMiANCiAgd0ZlZHVjX2FfMiB+fiB3RmVkdWNfYV8yDQogIA0KICAjIEVzdGltYXRlIHRoZSByZXNpZHVhbCB2YXJpYW5jZQ0KICB3aW5jX2RpZmZfMyB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2luY19kaWZmXzMNCiAgd0ZlZHVjX2FfMyB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNCB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2luY19kaWZmXzQgDQogIHdGZWR1Y19hXzQgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzQNCiAgd2luY19kaWZmXzUgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndpbmNfZGlmZl81DQogIHdGZWR1Y19hXzUgfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzYgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndpbmNfZGlmZl82IA0KICB3RmVkdWNfYV82IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl83IH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3aW5jX2RpZmZfNyANCiAgd0ZlZHVjX2FfNyB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOCB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2luY19kaWZmXzggDQogIHdGZWR1Y19hXzggfn4gYyh2eDEsIHZ4MiwgdngzLCB2eDQpKndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzkgfn4gYyh2eTEsIHZ5MiwgdnkzLCB2eTQpKndpbmNfZGlmZl85IA0KICB3RmVkdWNfYV85IH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMCB+fiBjKHZ5MSwgdnkyLCB2eTMsIHZ5NCkqd2luY19kaWZmXzEwIA0KICB3RmVkdWNfYV8xMCB+fiBjKHZ4MSwgdngyLCB2eDMsIHZ4NCkqd0ZlZHVjX2FfMTANCiAgd2luY19kaWZmXzExIH5+IGModnkxLCB2eTIsIHZ5Mywgdnk0KSp3aW5jX2RpZmZfMTEgDQogIHdGZWR1Y19hXzExIH5+IGModngxLCB2eDIsIHZ4Mywgdng0KSp3RmVkdWNfYV8xMQ0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8yICsgMCp3aW5jX2RpZmZfMg0KDQonDQojZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiaW5jX2RpZmZfbW9kZWwxNV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KaW5jX2RpZmZfbW9kZWwxNV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0IDwtDQogIGxhdmFhbigNCiAgICBpbmNfZGlmZl9tb2RlbDE1X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZywNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJsZW5ndGhfcmVjIg0KICApDQoNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShpbmNfZGlmZl9tb2RlbDE1X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHtsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBpbmNfZGlmZiBtMTUgY29uc3RyYWluZWQgZ3JvdXBzIGxhZ30NCiNmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJpbmNfZGlmZl9tb2RlbDE1X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KaW5jX2RpZmZfbW9kZWwxNV9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgbWFpbl9sYXZhYW5fcmVzdWx0cyRgTGF2YWFuIG1vZGVsIG9iamVjdHNgW1szXV1bWzJdXSwNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJsZW5ndGhfcmVjIg0KICApDQoNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShpbmNfZGlmZl9tb2RlbDE1X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZSB7bG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQpgYGANCg0KYGBge3IgaW5jX2RpZmYgbTE1IGxydGVzdH0NCmxhdlRlc3RMUlQoaW5jX2RpZmZfbW9kZWwxNV9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCwgaW5jX2RpZmZfbW9kZWwxNV91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0KQ0KYGBgDQoNCiMgTmV3bmVzcyByb2J1c3RuZXNzDQoNCiMjIFR3byBncm91cHMNCg0KIyMjIEVVIGludGVncmF0aW9uDQoNCmBgYHtyIGV1IG1vZGVsIDE2IGNvbnN0IGdyb3VwcyB1bmNvbnMgbGFnc30NCg0KRVVfbW9kZWwxNl9jb25zdHJhaW5lZF9ncm91cHMgPC0gJw0KDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSogRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+IDEqZXVfMiArIDEqZXVfMyArIDEqZXVfNCArIDEqZXVfNSArIDEqZXVfNiArIDEqZXVfNyArIDEqZXVfOCArIDEqZXVfOSArIDEqZXVfMTAgKyAxKmV1XzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gIA0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQoNCiAgIyMjIyMjIyMjIyMjIyMjDQogICMgV0lUSElOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAgIyBDcmVhdGUgd2l0aGluLXBlcnNvbiBjZW50ZXJlZCB2YXJpYWJsZXMuIA0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3ZXVfMiA9fiAxKmV1XzINCiAgd2V1XzMgPX4gMSpldV8zDQogIHdldV80ID1+IDEqZXVfNA0KICB3ZXVfNSA9fiAxKmV1XzUNCiAgd2V1XzYgPX4gMSpldV82DQogIHdldV83ID1+IDEqZXVfNw0KICB3ZXVfOCA9fiAxKmV1XzgNCiAgd2V1XzkgPX4gMSpldV85DQogIHdldV8xMCA9fiAxKmV1XzEwDQogIHdldV8xMSA9fiAxKmV1XzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3ZXVfMyAgIH4gYyhhMiwgYTIpKndldV8yICsgYyhiMiwgYjIpKndGZWR1Y19hXzINCiAgd2V1XzQgICB+IGMoYTMsIGEzKSp3ZXVfMyArIGMoYjMsIGIzKSp3RmVkdWNfYV8zDQogIHdldV81ICAgfiBjKGE0LCBhNCkqd2V1XzQgKyBjKGI0LCBiNCkqd0ZlZHVjX2FfNA0KICB3ZXVfNiAgIH4gYyhhNSwgYTUpKndldV81ICsgYyhiNSwgYjUpKndGZWR1Y19hXzUNCiAgd2V1XzcgICB+IGMoYTYsIGE2KSp3ZXVfNiArIGMoYjYsIGI2KSp3RmVkdWNfYV82DQogIHdldV84ICAgfiBjKGE3LCBhNykqd2V1XzcgKyBjKGI3LCBiNykqd0ZlZHVjX2FfNw0KICB3ZXVfOSAgIH4gYyhhOCwgYTgpKndldV84ICsgYyhiOCwgYjgpKndGZWR1Y19hXzgNCiAgd2V1XzEwICB+IGMoYTksIGE5KSp3ZXVfOSArIGMoYjksIGI5KSp3RmVkdWNfYV85DQogIHdldV8xMSAgfiBjKGExMCwgYTEwKSp3ZXVfMTAgKyBjKGIxMCwgYjEwKSp3RmVkdWNfYV8xMA0KICANCiAgDQogIHdGZWR1Y19hXzMgIH4gYyhjMiwgYzIpKndldV8yICsgYyhkMiwgZDIpKndGZWR1Y19hXzINCiAgd0ZlZHVjX2FfNCAgfiBjKGMzLCBjMykqd2V1XzMgKyBjKGQzLCBkMykqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMoYzQsIGM0KSp3ZXVfNCArIGMoZDQsIGQ0KSp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyhjNSwgYzUpKndldV81ICsgYyhkNSwgZDUpKndGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNyAgfiBjKGM2LCBjNikqd2V1XzYgKyBjKGQ2LCBkNikqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMoYzcsIGM3KSp3ZXVfNyArIGMoZDcsIGQ3KSp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyhjOCwgYzgpKndldV84ICsgYyhkOCwgZDgpKndGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfMTAgIH4gYyhjOSwgYzkpKndldV85ICsgYyhkOSwgZDkpKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyhjMTAsIGMxMCkqd2V1XzEwICsgYyhkMTAsIGQxMCkqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3ZXVfMiB+fiB3RmVkdWNfYV8yICMgQ292YXJpYW5jZQ0KDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3ZXVfMyB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzMNCiAgd2V1XzQgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV80DQogIHdldV81IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNQ0KICB3ZXVfNiB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzYNCiAgd2V1Xzcgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV83DQogIHdldV84IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfOA0KICB3ZXVfOSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzkNCiAgd2V1XzEwIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMTANCiAgd2V1XzExIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3ZXVfMiB+fiB3ZXVfMiANCiAgd0ZlZHVjX2FfMiB+fiB3RmVkdWNfYV8yDQogIA0KICAjIEVzdGltYXRlIHRoZSByZXNpZHVhbCB2YXJpYW5jZQ0KICB3ZXVfMyB+fiBjKHZ5MSwgdnkyKSp3ZXVfMw0KICB3RmVkdWNfYV8zIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzMNCiAgd2V1XzQgfn4gYyh2eTEsIHZ5Mikqd2V1XzQgDQogIHdGZWR1Y19hXzQgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNA0KICB3ZXVfNSB+fiBjKHZ5MSwgdnkyKSp3ZXVfNQ0KICB3RmVkdWNfYV81IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzUNCiAgd2V1XzYgfn4gYyh2eTEsIHZ5Mikqd2V1XzYgDQogIHdGZWR1Y19hXzYgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNg0KICB3ZXVfNyB+fiBjKHZ5MSwgdnkyKSp3ZXVfNyANCiAgd0ZlZHVjX2FfNyB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV83DQogIHdldV84IH5+IGModnkxLCB2eTIpKndldV84IA0KICB3RmVkdWNfYV84IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzgNCiAgd2V1Xzkgfn4gYyh2eTEsIHZ5Mikqd2V1XzkgDQogIHdGZWR1Y19hXzkgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfOQ0KICB3ZXVfMTAgfn4gYyh2eTEsIHZ5Mikqd2V1XzEwIA0KICB3RmVkdWNfYV8xMCB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8xMA0KICB3ZXVfMTEgfn4gYyh2eTEsIHZ5Mikqd2V1XzExIA0KICB3RmVkdWNfYV8xMSB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8xMQ0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8yICsgMCp3ZXVfMg0KDQonDQojZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiRVVfbW9kZWwxNl9jb25zdHJhaW5lZF9ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KRVVfbW9kZWwxNl9jb25zdHJhaW5lZF9ncm91cHNfZml0IDwtDQogIGxhdmFhbigNCiAgICBFVV9tb2RlbDE2X2NvbnN0cmFpbmVkX2dyb3VwcywNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJsZW5ndGhfMiINCiAgKQ0KDQogICNzYXZlIG1vZGVsDQogIHNhdmUoRVVfbW9kZWwxNl9jb25zdHJhaW5lZF9ncm91cHNfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZSB7bG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQpgYGANCg0KDQpgYGB7ciBFVSBtb2RlbCAxNiB1bmNvbnMgZ3JvdXBzIGFuZCBjb25zIGxhZ3N9DQpFVV9tb2RlbDE2X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZyA8LSAnDQoNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAxKiBGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqZXVfMiArIDEqZXVfMyArIDEqZXVfNCArIDEqZXVfNSArIDEqZXVfNiArIDEqZXVfNyArIDEqZXVfOCArIDEqZXVfOSArIDEqZXVfMTAgKyAxKmV1XzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4gDQogIHdGZWR1Y19hXzIgPX4gMSpGZWR1Y19hXzINCiAgd0ZlZHVjX2FfMyA9fiAxKkZlZHVjX2FfMw0KICB3RmVkdWNfYV80ID1+IDEqRmVkdWNfYV80DQogIHdGZWR1Y19hXzUgPX4gMSpGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNiA9fiAxKkZlZHVjX2FfNg0KICB3RmVkdWNfYV83ID1+IDEqRmVkdWNfYV83DQogIHdGZWR1Y19hXzggPX4gMSpGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfOSA9fiAxKkZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMCA9fiAxKkZlZHVjX2FfMTANCiAgd0ZlZHVjX2FfMTEgPX4gMSpGZWR1Y19hXzExDQogIA0KICB3ZXVfMiA9fiAxKmV1XzINCiAgd2V1XzMgPX4gMSpldV8zDQogIHdldV80ID1+IDEqZXVfNA0KICB3ZXVfNSA9fiAxKmV1XzUNCiAgd2V1XzYgPX4gMSpldV82DQogIHdldV83ID1+IDEqZXVfNw0KICB3ZXVfOCA9fiAxKmV1XzgNCiAgd2V1XzkgPX4gMSpldV85DQogIHdldV8xMCA9fiAxKmV1XzEwDQogIHdldV8xMSA9fiAxKmV1XzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3ZXVfMyAgIH4gYyhhMSwgYTIpKndldV8yICsgYyhiMSwgYjIpKndGZWR1Y19hXzINCiAgd2V1XzQgICB+IGMoYTEsIGEyKSp3ZXVfMyArIGMoYjEsIGIyKSp3RmVkdWNfYV8zDQogIHdldV81ICAgfiBjKGExLCBhMikqd2V1XzQgKyBjKGIxLCBiMikqd0ZlZHVjX2FfNA0KICB3ZXVfNiAgIH4gYyhhMSwgYTIpKndldV81ICsgYyhiMSwgYjIpKndGZWR1Y19hXzUNCiAgd2V1XzcgICB+IGMoYTEsIGEyKSp3ZXVfNiArIGMoYjEsIGIyKSp3RmVkdWNfYV82DQogIHdldV84ICAgfiBjKGExLCBhMikqd2V1XzcgKyBjKGIxLCBiMikqd0ZlZHVjX2FfNw0KICB3ZXVfOSAgIH4gYyhhMSwgYTIpKndldV84ICsgYyhiMSwgYjIpKndGZWR1Y19hXzgNCiAgd2V1XzEwICB+IGMoYTEsIGEyKSp3ZXVfOSArIGMoYjEsIGIyKSp3RmVkdWNfYV85DQogIHdldV8xMSAgfiBjKGExLCBhMikqd2V1XzEwICsgYyhiMSwgYjIpKndGZWR1Y19hXzEwDQogIA0KICB3RmVkdWNfYV8zICB+IGMoYzEsIGMyKSp3ZXVfMiArIGMoZDEsIGQyKSp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyhjMSwgYzIpKndldV8zICsgYyhkMSwgZDIpKndGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNSAgfiBjKGMxLCBjMikqd2V1XzQgKyBjKGQxLCBkMikqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMoYzEsIGMyKSp3ZXVfNSArIGMoZDEsIGQyKSp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyhjMSwgYzIpKndldV82ICsgYyhkMSwgZDIpKndGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfOCAgfiBjKGMxLCBjMikqd2V1XzcgKyBjKGQxLCBkMikqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMoYzEsIGMyKSp3ZXVfOCArIGMoZDEsIGQyKSp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMoYzEsIGMyKSp3ZXVfOSArIGMoZDEsIGQyKSp3RmVkdWNfYV85DQogIHdGZWR1Y19hXzExICB+IGMoYzEsIGMyKSp3ZXVfMTAgKyBjKGQxLCBkMikqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3ZXVfMiB+fiB3RmVkdWNfYV8yICMgQ292YXJpYW5jZQ0KDQogICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2V1XzMgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV8zDQogIHdldV80IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNA0KICB3ZXVfNSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzUNCiAgd2V1XzYgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV82DQogIHdldV83IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNw0KICB3ZXVfOCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzgNCiAgd2V1Xzkgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV85DQogIHdldV8xMCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzEwDQogIHdldV8xMSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2V1XzIgfn4gd2V1XzIgDQogIHdGZWR1Y19hXzIgfn4gd0ZlZHVjX2FfMg0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2V1XzMgfn4gYyh2eTEsIHZ5Mikqd2V1XzMNCiAgd0ZlZHVjX2FfMyB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8zDQogIHdldV80IH5+IGModnkxLCB2eTIpKndldV80IA0KICB3RmVkdWNfYV80IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzQNCiAgd2V1XzUgfn4gYyh2eTEsIHZ5Mikqd2V1XzUNCiAgd0ZlZHVjX2FfNSB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV81DQogIHdldV82IH5+IGModnkxLCB2eTIpKndldV82IA0KICB3RmVkdWNfYV82IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzYNCiAgd2V1Xzcgfn4gYyh2eTEsIHZ5Mikqd2V1XzcgDQogIHdGZWR1Y19hXzcgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNw0KICB3ZXVfOCB+fiBjKHZ5MSwgdnkyKSp3ZXVfOCANCiAgd0ZlZHVjX2FfOCB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV84DQogIHdldV85IH5+IGModnkxLCB2eTIpKndldV85IA0KICB3RmVkdWNfYV85IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzkNCiAgd2V1XzEwIH5+IGModnkxLCB2eTIpKndldV8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMTANCiAgd2V1XzExIH5+IGModnkxLCB2eTIpKndldV8xMSANCiAgd0ZlZHVjX2FfMTEgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMTENCiAgDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMgQURESVRJT05BTCBDT05TVFJBSU5UUyAjDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIFNldCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgYmV0d2Vlbi1mYWN0b3JzIChyYW5kb20gaW50ZXJjZXB0cykgYW5kIHdpdGhpbi0NCiAgIyBmYWN0b3JzIGF0IHdhdmUgMSBhdCAwLiANCiAgUkl4ICsgUkl5IH5+IDAqd0ZlZHVjX2FfMiArIDAqd2V1XzINCg0KJw0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgIkVVX21vZGVsMTZfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCkVVX21vZGVsMTZfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgRVVfbW9kZWwxNl91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWcsDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAibGVuZ3RoXzIiDQogICkNCg0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKEVVX21vZGVsMTZfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2UNCiAge2xvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KICB9DQoNCmBgYA0KDQpgYGB7ciBldSBtMTYgY29uc3RyYWluZWQgZ3JvdXBzIGxhZ30NCkVVX21vZGVsMTZfY29uc3RyYWluZWRfbGFnX2dyb3VwcyA8LSAnDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSogRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+IDEqZXVfMiArIDEqZXVfMyArIDEqZXVfNCArIDEqZXVfNSArIDEqZXVfNiArIDEqZXVfNyArIDEqZXVfOCArIDEqZXVfOSArIDEqZXVfMTAgKyAxKmV1XzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4NCiAgRmVkdWNfYV8yIH5+IDAqRmVkdWNfYV8yDQogIEZlZHVjX2FfMyB+fiAwKkZlZHVjX2FfMw0KICBGZWR1Y19hXzQgfn4gMCpGZWR1Y19hXzQNCiAgRmVkdWNfYV81IH5+IDAqRmVkdWNfYV81DQogIEZlZHVjX2FfNiB+fiAwKkZlZHVjX2FfNg0KICBGZWR1Y19hXzcgfn4gMCpGZWR1Y19hXzcNCiAgRmVkdWNfYV84IH5+IDAqRmVkdWNfYV84DQogIEZlZHVjX2FfOSB+fiAwKkZlZHVjX2FfOQ0KICBGZWR1Y19hXzEwIH5+IDAqRmVkdWNfYV8xMA0KICBGZWR1Y19hXzExIH5+IDAqRmVkdWNfYV8xMQ0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgd2V1XzIgPX4gMSpldV8yDQogIHdldV8zID1+IDEqZXVfMw0KICB3ZXVfNCA9fiAxKmV1XzQNCiAgd2V1XzUgPX4gMSpldV81DQogIHdldV82ID1+IDEqZXVfNg0KICB3ZXVfNyA9fiAxKmV1XzcNCiAgd2V1XzggPX4gMSpldV84DQogIHdldV85ID1+IDEqZXVfOQ0KICB3ZXVfMTAgPX4gMSpldV8xMA0KICB3ZXVfMTEgPX4gMSpldV8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2V1XzMgICB+IGEqd2V1XzIgKyBiKndGZWR1Y19hXzINCiAgd2V1XzQgICB+IGEqd2V1XzMgKyBiKndGZWR1Y19hXzMNCiAgd2V1XzUgICB+IGEqd2V1XzQgKyBiKndGZWR1Y19hXzQNCiAgd2V1XzYgICB+IGEqd2V1XzUgKyBiKndGZWR1Y19hXzUNCiAgd2V1XzcgICB+IGEqd2V1XzYgKyBiKndGZWR1Y19hXzYNCiAgd2V1XzggICB+IGEqd2V1XzcgKyBiKndGZWR1Y19hXzcNCiAgd2V1XzkgICB+IGEqd2V1XzggKyBiKndGZWR1Y19hXzgNCiAgd2V1XzEwICB+IGEqd2V1XzkgKyBiKndGZWR1Y19hXzkNCiAgd2V1XzExICB+IGEqd2V1XzEwICsgYip3RmVkdWNfYV8xMA0KICANCiAgd0ZlZHVjX2FfMyAgfiBjKndldV8yICsgZCp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyp3ZXVfMyArIGQqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMqd2V1XzQgKyBkKndGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNiAgfiBjKndldV81ICsgZCp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyp3ZXVfNiArIGQqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMqd2V1XzcgKyBkKndGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOSAgfiBjKndldV84ICsgZCp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMqd2V1XzkgKyBkKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyp3ZXVfMTAgKyBkKndGZWR1Y19hXzEwDQogIA0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlIGF0IHRoZSBmaXJzdCB3YXZlLiANCiAgd2V1XzIgfn4gd0ZlZHVjX2FfMiAjIENvdmFyaWFuY2UNCg0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2V1XzMgfn4gY292KndGZWR1Y19hXzMNCiAgd2V1XzQgfn4gY292KndGZWR1Y19hXzQNCiAgd2V1XzUgfn4gY292KndGZWR1Y19hXzUNCiAgd2V1XzYgfn4gY292KndGZWR1Y19hXzYNCiAgd2V1Xzcgfn4gY292KndGZWR1Y19hXzcNCiAgd2V1Xzggfn4gY292KndGZWR1Y19hXzgNCiAgd2V1Xzkgfn4gY292KndGZWR1Y19hXzkNCiAgd2V1XzEwIH5+IGNvdip3RmVkdWNfYV8xMA0KICB3ZXVfMTEgfn4gY292KndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2V1XzIgfn4gd2V1XzIgDQogIHdGZWR1Y19hXzIgfn4gd0ZlZHVjX2FfMg0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2V1XzMgfn4gdnkqd2V1XzMNCiAgd0ZlZHVjX2FfMyB+fiB2eCp3RmVkdWNfYV8zDQogIHdldV80IH5+IHZ5KndldV80IA0KICB3RmVkdWNfYV80IH5+IHZ4KndGZWR1Y19hXzQNCiAgd2V1XzUgfn4gdnkqd2V1XzUNCiAgd0ZlZHVjX2FfNSB+fiB2eCp3RmVkdWNfYV81DQogIHdldV82IH5+IHZ5KndldV82IA0KICB3RmVkdWNfYV82IH5+IHZ4KndGZWR1Y19hXzYNCiAgd2V1Xzcgfn4gdnkqd2V1XzcgDQogIHdGZWR1Y19hXzcgfn4gdngqd0ZlZHVjX2FfNw0KICB3ZXVfOCB+fiB2eSp3ZXVfOCANCiAgd0ZlZHVjX2FfOCB+fiB2eCp3RmVkdWNfYV84DQogIHdldV85IH5+IHZ5KndldV85IA0KICB3RmVkdWNfYV85IH5+IHZ4KndGZWR1Y19hXzkNCiAgd2V1XzEwIH5+IHZ5KndldV8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gdngqd0ZlZHVjX2FfMTANCiAgd2V1XzExIH5+IHZ5KndldV8xMSANCiAgd0ZlZHVjX2FfMTEgfn4gdngqd0ZlZHVjX2FfMTENCiAgDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMgQURESVRJT05BTCBDT05TVFJBSU5UUyAjDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIFNldCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgYmV0d2Vlbi1mYWN0b3JzIChyYW5kb20gaW50ZXJjZXB0cykgYW5kIHdpdGhpbi0NCiAgIyBmYWN0b3JzIGF0IHdhdmUgMSBhdCAwLiANCiAgUkl4ICsgUkl5IH5+IDAqd0ZlZHVjX2FfMiArIDAqd2V1XzINCg0KJw0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgIkVVX21vZGVsMTZfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQpFVV9tb2RlbDE2X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0IDwtDQogIGxhdmFhbigNCiAgICBFVV9tb2RlbDE2X2NvbnN0cmFpbmVkX2xhZ19ncm91cHMsDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAibGVuZ3RoXzIiDQogICkNCg0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKEVVX21vZGVsMTZfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHtsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBldSBtMTYgbHJNeURhdGF9DQpmaXRfbWF0cml4X0VVX20xNl9jb25zdHJhaW5lZF9ncm91cHMgPC0gbGF2SW5zcGVjdChFVV9tb2RlbDE2X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LCB3aGF0ID0gImZpdCIpDQpmaXRfbWF0cml4X0VVX20xNl91bmNvbnN0cmFpbmVkX2dyb3VwcyA8LSBsYXZJbnNwZWN0KEVVX21vZGVsMTZfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCwgd2hhdCA9ICJmaXQiKQ0KDQpmaXRfbWF0cml4X2V1X00xNiA8LSByYmluZChmaXRfbWF0cml4X0VVX20xNl9jb25zdHJhaW5lZF9ncm91cHMsIGZpdF9tYXRyaXhfRVVfbTE2X3VuY29uc3RyYWluZWRfZ3JvdXBzKQ0KDQpsYXZUZXN0TFJUKEVVX21vZGVsMTZfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsIEVVX21vZGVsMTZfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCkNCg0KDQpgYGANCg0KIyMjIGN1bHR1cmFsIGluY2x1c2lvbg0KDQoNCmBgYHtyIGN1bHQgbW9kZWwgMTYgY29uc3QgZ3JvdXBzIHVuY29ucyBsYWdzfQ0KDQpjdWx0X21vZGVsMTZfY29uc3RyYWluZWRfZ3JvdXBzIDwtICcNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAxKiBGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gMSpjdWx0XzIgKyAxKmN1bHRfMyArIDEqY3VsdF80ICsgMSpjdWx0XzUgKyAxKmN1bHRfNiArIDEqY3VsdF83ICsgMSpjdWx0XzggKyAxKmN1bHRfOSArIDEqY3VsdF8xMCArIDEqY3VsdF8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQogIA0KICAjIFJlZ3Jlc3Npb24gb2YgcmFuZG9tIGludGVyY2VwdHMgb24gejENCiAgUkl4ICsgUkl5IH4gYmV0d2Vlbl9lZHVjICsgYmV0d2Vlbl9hZ2UgKyBiZXR3ZWVuX29yaWdpbiArIGJldHdlZW5fZmVtYWxlIyBDb25zdHJhaW5lZCBvdmVyIHRpbWUuDQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuICANCiAgRmVkdWNfYV8yIH5+IDAqRmVkdWNfYV8yDQogIEZlZHVjX2FfMyB+fiAwKkZlZHVjX2FfMw0KICBGZWR1Y19hXzQgfn4gMCpGZWR1Y19hXzQNCiAgRmVkdWNfYV81IH5+IDAqRmVkdWNfYV81DQogIEZlZHVjX2FfNiB+fiAwKkZlZHVjX2FfNg0KICBGZWR1Y19hXzcgfn4gMCpGZWR1Y19hXzcNCiAgRmVkdWNfYV84IH5+IDAqRmVkdWNfYV84DQogIEZlZHVjX2FfOSB+fiAwKkZlZHVjX2FfOQ0KICBGZWR1Y19hXzEwIH5+IDAqRmVkdWNfYV8xMA0KICBGZWR1Y19hXzExIH5+IDAqRmVkdWNfYV8xMQ0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgd2N1bHRfMiA9fiAxKmN1bHRfMg0KICB3Y3VsdF8zID1+IDEqY3VsdF8zDQogIHdjdWx0XzQgPX4gMSpjdWx0XzQNCiAgd2N1bHRfNSA9fiAxKmN1bHRfNQ0KICB3Y3VsdF82ID1+IDEqY3VsdF82DQogIHdjdWx0XzcgPX4gMSpjdWx0XzcNCiAgd2N1bHRfOCA9fiAxKmN1bHRfOA0KICB3Y3VsdF85ID1+IDEqY3VsdF85DQogIHdjdWx0XzEwID1+IDEqY3VsdF8xMA0KICB3Y3VsdF8xMSA9fiAxKmN1bHRfMTEgDQogIA0KICAjIEVzdGltYXRlIHRoZSBsYWdnZWQgZWZmZWN0cyAoY29uc3RyYWluZWQpDQogIHdjdWx0XzMgICB+IGMoYTIsIGEyKSp3Y3VsdF8yICsgYyhiMiwgYjIpKndGZWR1Y19hXzINCiAgd2N1bHRfNCAgIH4gYyhhMywgYTMpKndjdWx0XzMgKyBjKGIzLCBiMykqd0ZlZHVjX2FfMw0KICB3Y3VsdF81ICAgfiBjKGE0LCBhNCkqd2N1bHRfNCArIGMoYjQsIGI0KSp3RmVkdWNfYV80DQogIHdjdWx0XzYgICB+IGMoYTUsIGE1KSp3Y3VsdF81ICsgYyhiNSwgYjUpKndGZWR1Y19hXzUNCiAgd2N1bHRfNyAgIH4gYyhhNiwgYTYpKndjdWx0XzYgKyBjKGI2LCBiNikqd0ZlZHVjX2FfNg0KICB3Y3VsdF84ICAgfiBjKGE3LCBhNykqd2N1bHRfNyArIGMoYjcsIGI3KSp3RmVkdWNfYV83DQogIHdjdWx0XzkgICB+IGMoYTgsIGE4KSp3Y3VsdF84ICsgYyhiOCwgYjgpKndGZWR1Y19hXzgNCiAgd2N1bHRfMTAgIH4gYyhhOSwgYTkpKndjdWx0XzkgKyBjKGI5LCBiOSkqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMSAgfiBjKGExMCwgYTEwKSp3Y3VsdF8xMCArIGMoYjEwLCBiMTApKndGZWR1Y19hXzEwDQogIA0KICANCiAgd0ZlZHVjX2FfMyAgfiBjKGMyLCBjMikqd2N1bHRfMiArIGMoZDIsIGQyKSp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyhjMywgYzMpKndjdWx0XzMgKyBjKGQzLCBkMykqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMoYzQsIGM0KSp3Y3VsdF80ICsgYyhkNCwgZDQpKndGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNiAgfiBjKGM1LCBjNSkqd2N1bHRfNSArIGMoZDUsIGQ1KSp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyhjNiwgYzYpKndjdWx0XzYgKyBjKGQ2LCBkNikqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMoYzcsIGM3KSp3Y3VsdF83ICsgYyhkNywgZDcpKndGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOSAgfiBjKGM4LCBjOCkqd2N1bHRfOCArIGMoZDgsIGQ4KSp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMoYzksIGM5KSp3Y3VsdF85ICsgYyhkOSwgZDkpKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyhjMTAsIGMxMCkqd2N1bHRfMTAgKyBjKGQxMCwgZDEwKSp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdjdWx0XzIgfn4gd0ZlZHVjX2FfMiAjIENvdmFyaWFuY2UNCg0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2N1bHRfMyB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzMNCiAgd2N1bHRfNCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzQNCiAgd2N1bHRfNSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzUNCiAgd2N1bHRfNiB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzYNCiAgd2N1bHRfNyB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzcNCiAgd2N1bHRfOCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzgNCiAgd2N1bHRfOSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzkNCiAgd2N1bHRfMTAgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV8xMA0KICB3Y3VsdF8xMSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2N1bHRfMiB+fiB3Y3VsdF8yIA0KICB3RmVkdWNfYV8yIH5+IHdGZWR1Y19hXzINCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdjdWx0XzMgfn4gYyh2eTEsIHZ5Mikqd2N1bHRfMw0KICB3RmVkdWNfYV8zIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzMNCiAgd2N1bHRfNCB+fiBjKHZ5MSwgdnkyKSp3Y3VsdF80IA0KICB3RmVkdWNfYV80IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzQNCiAgd2N1bHRfNSB+fiBjKHZ5MSwgdnkyKSp3Y3VsdF81DQogIHdGZWR1Y19hXzUgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNQ0KICB3Y3VsdF82IH5+IGModnkxLCB2eTIpKndjdWx0XzYgDQogIHdGZWR1Y19hXzYgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNg0KICB3Y3VsdF83IH5+IGModnkxLCB2eTIpKndjdWx0XzcgDQogIHdGZWR1Y19hXzcgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNw0KICB3Y3VsdF84IH5+IGModnkxLCB2eTIpKndjdWx0XzggDQogIHdGZWR1Y19hXzggfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfOA0KICB3Y3VsdF85IH5+IGModnkxLCB2eTIpKndjdWx0XzkgDQogIHdGZWR1Y19hXzkgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMCB+fiBjKHZ5MSwgdnkyKSp3Y3VsdF8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMTANCiAgd2N1bHRfMTEgfn4gYyh2eTEsIHZ5Mikqd2N1bHRfMTEgDQogIHdGZWR1Y19hXzExIH5+IGModngxLCB2eDIpKndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzIgKyAwKndjdWx0XzINCg0KJw0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImN1bHRfbW9kZWwxNl9jb25zdHJhaW5lZF9ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KY3VsdF9tb2RlbDE2X2NvbnN0cmFpbmVkX2dyb3Vwc19maXQgPC0NCiAgbGF2YWFuKA0KICAgIGN1bHRfbW9kZWwxNl9jb25zdHJhaW5lZF9ncm91cHMsDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAibGVuZ3RoXzIiDQogICkNCg0KDQogICNzYXZlIG1vZGVsDQogIHNhdmUoY3VsdF9tb2RlbDE2X2NvbnN0cmFpbmVkX2dyb3Vwc19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHsNCiAgbG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQoNCmBgYA0KDQoNCmBgYHtyIGN1bHQgbW9kZWwgMTYgdW5jb25zdCBncm91cHMgYW5kIGNvbnN0IGxhZ3N9DQpjdWx0X21vZGVsMTZfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnIDwtICcNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAxKiBGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqY3VsdF8yICsgMSpjdWx0XzMgKyAxKmN1bHRfNCArIDEqY3VsdF81ICsgMSpjdWx0XzYgKyAxKmN1bHRfNyArIDEqY3VsdF84ICsgMSpjdWx0XzkgKyAxKmN1bHRfMTAgKyAxKmN1bHRfMTENCg0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSBhbmQgY292YXJpYW5jZSBvZiB0aGUgcmFuZG9tIGludGVyY2VwdHMuIA0KICBSSXggfn4gUkl4DQogIFJJeSB+fiBSSXkNCiAgUkl4IH5+IFJJeQ0KICANCiAgIyBSZWdyZXNzaW9uIG9mIHJhbmRvbSBpbnRlcmNlcHRzIG9uIHoxDQogIFJJeCArIFJJeSB+IGJldHdlZW5fZWR1YyArIGJldHdlZW5fYWdlICsgYmV0d2Vlbl9vcmlnaW4gKyBiZXR3ZWVuX2ZlbWFsZSMgQ29uc3RyYWluZWQgb3ZlciB0aW1lLg0KDQogICMgU2V0IHRoZSByZXNpZHVhbCB2YXJpYW5jZXMgb2YgYWxsIEZYIHZhcmlhYmxlcyB0byAwLiANCiAgRmVkdWNfYV8yIH5+IDAqRmVkdWNfYV8yDQogIEZlZHVjX2FfMyB+fiAwKkZlZHVjX2FfMw0KICBGZWR1Y19hXzQgfn4gMCpGZWR1Y19hXzQNCiAgRmVkdWNfYV81IH5+IDAqRmVkdWNfYV81DQogIEZlZHVjX2FfNiB+fiAwKkZlZHVjX2FfNg0KICBGZWR1Y19hXzcgfn4gMCpGZWR1Y19hXzcNCiAgRmVkdWNfYV84IH5+IDAqRmVkdWNfYV84DQogIEZlZHVjX2FfOSB+fiAwKkZlZHVjX2FfOQ0KICBGZWR1Y19hXzEwIH5+IDAqRmVkdWNfYV8xMA0KICBGZWR1Y19hXzExIH5+IDAqRmVkdWNfYV8xMQ0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgDQogIHdjdWx0XzIgPX4gMSpjdWx0XzINCiAgd2N1bHRfMyA9fiAxKmN1bHRfMw0KICB3Y3VsdF80ID1+IDEqY3VsdF80DQogIHdjdWx0XzUgPX4gMSpjdWx0XzUNCiAgd2N1bHRfNiA9fiAxKmN1bHRfNg0KICB3Y3VsdF83ID1+IDEqY3VsdF83DQogIHdjdWx0XzggPX4gMSpjdWx0XzgNCiAgd2N1bHRfOSA9fiAxKmN1bHRfOQ0KICB3Y3VsdF8xMCA9fiAxKmN1bHRfMTANCiAgd2N1bHRfMTEgPX4gMSpjdWx0XzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3Y3VsdF8zICAgfiBjKGExLCBhMikqd2N1bHRfMiArIGMoYjEsIGIyKSp3RmVkdWNfYV8yDQogIHdjdWx0XzQgICB+IGMoYTEsIGEyKSp3Y3VsdF8zICsgYyhiMSwgYjIpKndGZWR1Y19hXzMNCiAgd2N1bHRfNSAgIH4gYyhhMSwgYTIpKndjdWx0XzQgKyBjKGIxLCBiMikqd0ZlZHVjX2FfNA0KICB3Y3VsdF82ICAgfiBjKGExLCBhMikqd2N1bHRfNSArIGMoYjEsIGIyKSp3RmVkdWNfYV81DQogIHdjdWx0XzcgICB+IGMoYTEsIGEyKSp3Y3VsdF82ICsgYyhiMSwgYjIpKndGZWR1Y19hXzYNCiAgd2N1bHRfOCAgIH4gYyhhMSwgYTIpKndjdWx0XzcgKyBjKGIxLCBiMikqd0ZlZHVjX2FfNw0KICB3Y3VsdF85ICAgfiBjKGExLCBhMikqd2N1bHRfOCArIGMoYjEsIGIyKSp3RmVkdWNfYV84DQogIHdjdWx0XzEwICB+IGMoYTEsIGEyKSp3Y3VsdF85ICsgYyhiMSwgYjIpKndGZWR1Y19hXzkNCiAgd2N1bHRfMTEgIH4gYyhhMSwgYTIpKndjdWx0XzEwICsgYyhiMSwgYjIpKndGZWR1Y19hXzEwDQogIA0KICB3RmVkdWNfYV8zICB+IGMoYzEsIGMyKSp3Y3VsdF8yICsgYyhkMSwgZDIpKndGZWR1Y19hXzINCiAgd0ZlZHVjX2FfNCAgfiBjKGMxLCBjMikqd2N1bHRfMyArIGMoZDEsIGQyKSp3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gYyhjMSwgYzIpKndjdWx0XzQgKyBjKGQxLCBkMikqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMoYzEsIGMyKSp3Y3VsdF81ICsgYyhkMSwgZDIpKndGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNyAgfiBjKGMxLCBjMikqd2N1bHRfNiArIGMoZDEsIGQyKSp3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gYyhjMSwgYzIpKndjdWx0XzcgKyBjKGQxLCBkMikqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMoYzEsIGMyKSp3Y3VsdF84ICsgYyhkMSwgZDIpKndGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfMTAgIH4gYyhjMSwgYzIpKndjdWx0XzkgKyBjKGQxLCBkMikqd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiBjKGMxLCBjMikqd2N1bHRfMTAgKyBjKGQxLCBkMikqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3Y3VsdF8yIH5+IHdGZWR1Y19hXzIgIyBDb3ZhcmlhbmNlDQoNCiAgICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3Y3VsdF8zIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMw0KICB3Y3VsdF80IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNA0KICB3Y3VsdF81IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNQ0KICB3Y3VsdF82IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNg0KICB3Y3VsdF83IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNw0KICB3Y3VsdF84IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfOA0KICB3Y3VsdF85IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzEwDQogIHdjdWx0XzExIH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3Y3VsdF8yIH5+IHdjdWx0XzIgDQogIHdGZWR1Y19hXzIgfn4gd0ZlZHVjX2FfMg0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2N1bHRfMyB+fiBjKHZ5MSwgdnkyKSp3Y3VsdF8zDQogIHdGZWR1Y19hXzMgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMw0KICB3Y3VsdF80IH5+IGModnkxLCB2eTIpKndjdWx0XzQgDQogIHdGZWR1Y19hXzQgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNA0KICB3Y3VsdF81IH5+IGModnkxLCB2eTIpKndjdWx0XzUNCiAgd0ZlZHVjX2FfNSB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV81DQogIHdjdWx0XzYgfn4gYyh2eTEsIHZ5Mikqd2N1bHRfNiANCiAgd0ZlZHVjX2FfNiB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV82DQogIHdjdWx0Xzcgfn4gYyh2eTEsIHZ5Mikqd2N1bHRfNyANCiAgd0ZlZHVjX2FfNyB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV83DQogIHdjdWx0Xzggfn4gYyh2eTEsIHZ5Mikqd2N1bHRfOCANCiAgd0ZlZHVjX2FfOCB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV84DQogIHdjdWx0Xzkgfn4gYyh2eTEsIHZ5Mikqd2N1bHRfOSANCiAgd0ZlZHVjX2FfOSB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV85DQogIHdjdWx0XzEwIH5+IGModnkxLCB2eTIpKndjdWx0XzEwIA0KICB3RmVkdWNfYV8xMCB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8xMA0KICB3Y3VsdF8xMSB+fiBjKHZ5MSwgdnkyKSp3Y3VsdF8xMSANCiAgd0ZlZHVjX2FfMTEgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMTENCiAgDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMgQURESVRJT05BTCBDT05TVFJBSU5UUyAjDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIFNldCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgYmV0d2Vlbi1mYWN0b3JzIChyYW5kb20gaW50ZXJjZXB0cykgYW5kIHdpdGhpbi0NCiAgIyBmYWN0b3JzIGF0IHdhdmUgMSBhdCAwLiANCiAgUkl4ICsgUkl5IH5+IDAqd0ZlZHVjX2FfMiArIDAqd2N1bHRfMg0KDQonDQojZmlsZW5hbWUNCmZpbGVuYW1lIDwtDQogIGZpbGUucGF0aChkaXIsDQogICAgICAgICAgICAiY3VsdF9tb2RlbDE2X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQpjdWx0X21vZGVsMTZfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgY3VsdF9tb2RlbDE2X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZywNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJsZW5ndGhfMiINCiAgKQ0KDQogICNzYXZlIG1vZGVsDQogIHNhdmUoY3VsdF9tb2RlbDE2X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHtsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCg0KYGBgDQoNCmBgYHtyIGN1bHQgbTE2IGNvbnN0cmFpbmVkIGdyb3VwcyBsYWd9DQpjdWx0X21vZGVsMTZfY29uc3RyYWluZWRfbGFnX2dyb3VwcyA8LSAnDQoNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAxKiBGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gMSpjdWx0XzIgKyAxKmN1bHRfMyArIDEqY3VsdF80ICsgMSpjdWx0XzUgKyAxKmN1bHRfNiArIDEqY3VsdF83ICsgMSpjdWx0XzggKyAxKmN1bHRfOSArIDEqY3VsdF8xMCArIDEqY3VsdF8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQogIA0KICAjIFJlZ3Jlc3Npb24gb2YgcmFuZG9tIGludGVyY2VwdHMgb24gejENCiAgUkl4ICsgUkl5IH4gYmV0d2Vlbl9lZHVjICsgYmV0d2Vlbl9hZ2UgKyBiZXR3ZWVuX29yaWdpbiArIGJldHdlZW5fZmVtYWxlIyBDb25zdHJhaW5lZCBvdmVyIHRpbWUuDQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4gDQogIHdGZWR1Y19hXzIgPX4gMSpGZWR1Y19hXzINCiAgd0ZlZHVjX2FfMyA9fiAxKkZlZHVjX2FfMw0KICB3RmVkdWNfYV80ID1+IDEqRmVkdWNfYV80DQogIHdGZWR1Y19hXzUgPX4gMSpGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNiA9fiAxKkZlZHVjX2FfNg0KICB3RmVkdWNfYV83ID1+IDEqRmVkdWNfYV83DQogIHdGZWR1Y19hXzggPX4gMSpGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfOSA9fiAxKkZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMCA9fiAxKkZlZHVjX2FfMTANCiAgd0ZlZHVjX2FfMTEgPX4gMSpGZWR1Y19hXzExDQogIHdjdWx0XzIgPX4gMSpjdWx0XzINCiAgd2N1bHRfMyA9fiAxKmN1bHRfMw0KICB3Y3VsdF80ID1+IDEqY3VsdF80DQogIHdjdWx0XzUgPX4gMSpjdWx0XzUNCiAgd2N1bHRfNiA9fiAxKmN1bHRfNg0KICB3Y3VsdF83ID1+IDEqY3VsdF83DQogIHdjdWx0XzggPX4gMSpjdWx0XzgNCiAgd2N1bHRfOSA9fiAxKmN1bHRfOQ0KICB3Y3VsdF8xMCA9fiAxKmN1bHRfMTANCiAgd2N1bHRfMTEgPX4gMSpjdWx0XzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3Y3VsdF8zICAgfiBhKndjdWx0XzIgKyBiKndGZWR1Y19hXzINCiAgd2N1bHRfNCAgIH4gYSp3Y3VsdF8zICsgYip3RmVkdWNfYV8zDQogIHdjdWx0XzUgICB+IGEqd2N1bHRfNCArIGIqd0ZlZHVjX2FfNA0KICB3Y3VsdF82ICAgfiBhKndjdWx0XzUgKyBiKndGZWR1Y19hXzUNCiAgd2N1bHRfNyAgIH4gYSp3Y3VsdF82ICsgYip3RmVkdWNfYV82DQogIHdjdWx0XzggICB+IGEqd2N1bHRfNyArIGIqd0ZlZHVjX2FfNw0KICB3Y3VsdF85ICAgfiBhKndjdWx0XzggKyBiKndGZWR1Y19hXzgNCiAgd2N1bHRfMTAgIH4gYSp3Y3VsdF85ICsgYip3RmVkdWNfYV85DQogIHdjdWx0XzExICB+IGEqd2N1bHRfMTAgKyBiKndGZWR1Y19hXzEwDQogIA0KICB3RmVkdWNfYV8zICB+IGMqd2N1bHRfMiArIGQqd0ZlZHVjX2FfMg0KICB3RmVkdWNfYV80ICB+IGMqd2N1bHRfMyArIGQqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMqd2N1bHRfNCArIGQqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMqd2N1bHRfNSArIGQqd0ZlZHVjX2FfNQ0KICB3RmVkdWNfYV83ICB+IGMqd2N1bHRfNiArIGQqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMqd2N1bHRfNyArIGQqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMqd2N1bHRfOCArIGQqd0ZlZHVjX2FfOA0KICB3RmVkdWNfYV8xMCAgfiBjKndjdWx0XzkgKyBkKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyp3Y3VsdF8xMCArIGQqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3Y3VsdF8yIH5+IHdGZWR1Y19hXzIgIyBDb3ZhcmlhbmNlDQoNCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZXMgYmV0d2VlbiB0aGUgcmVzaWR1YWxzDQogIHdjdWx0XzMgfn4gY292KndGZWR1Y19hXzMNCiAgd2N1bHRfNCB+fiBjb3Yqd0ZlZHVjX2FfNA0KICB3Y3VsdF81IH5+IGNvdip3RmVkdWNfYV81DQogIHdjdWx0XzYgfn4gY292KndGZWR1Y19hXzYNCiAgd2N1bHRfNyB+fiBjb3Yqd0ZlZHVjX2FfNw0KICB3Y3VsdF84IH5+IGNvdip3RmVkdWNfYV84DQogIHdjdWx0Xzkgfn4gY292KndGZWR1Y19hXzkNCiAgd2N1bHRfMTAgfn4gY292KndGZWR1Y19hXzEwDQogIHdjdWx0XzExIH5+IGNvdip3RmVkdWNfYV8xMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgDQogIHdjdWx0XzIgfn4gd2N1bHRfMiANCiAgd0ZlZHVjX2FfMiB+fiB3RmVkdWNfYV8yDQogIA0KICAjIEVzdGltYXRlIHRoZSByZXNpZHVhbCB2YXJpYW5jZQ0KICB3Y3VsdF8zIH5+IHZ5KndjdWx0XzMNCiAgd0ZlZHVjX2FfMyB+fiB2eCp3RmVkdWNfYV8zDQogIHdjdWx0XzQgfn4gdnkqd2N1bHRfNCANCiAgd0ZlZHVjX2FfNCB+fiB2eCp3RmVkdWNfYV80DQogIHdjdWx0XzUgfn4gdnkqd2N1bHRfNQ0KICB3RmVkdWNfYV81IH5+IHZ4KndGZWR1Y19hXzUNCiAgd2N1bHRfNiB+fiB2eSp3Y3VsdF82IA0KICB3RmVkdWNfYV82IH5+IHZ4KndGZWR1Y19hXzYNCiAgd2N1bHRfNyB+fiB2eSp3Y3VsdF83IA0KICB3RmVkdWNfYV83IH5+IHZ4KndGZWR1Y19hXzcNCiAgd2N1bHRfOCB+fiB2eSp3Y3VsdF84IA0KICB3RmVkdWNfYV84IH5+IHZ4KndGZWR1Y19hXzgNCiAgd2N1bHRfOSB+fiB2eSp3Y3VsdF85IA0KICB3RmVkdWNfYV85IH5+IHZ4KndGZWR1Y19hXzkNCiAgd2N1bHRfMTAgfn4gdnkqd2N1bHRfMTAgDQogIHdGZWR1Y19hXzEwIH5+IHZ4KndGZWR1Y19hXzEwDQogIHdjdWx0XzExIH5+IHZ5KndjdWx0XzExIA0KICB3RmVkdWNfYV8xMSB+fiB2eCp3RmVkdWNfYV8xMQ0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8yICsgMCp3Y3VsdF8yDQoNCicNCiNmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJjdWx0X21vZGVsMTZfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQuUmRhdGEiKQ0KDQojZXN0aW1hdGUgbW9kZWwNCmlmICghZmlsZS5leGlzdHMoZmlsZW5hbWUpKSB7DQpjdWx0X21vZGVsMTZfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQgPC0NCiAgbGF2YWFuKA0KICAgIGN1bHRfbW9kZWwxNl9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzLA0KICAgIGRhdGEgPSBNeURhdGEsDQogICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgbWlzc2luZyA9ICdNTCcsDQogICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgaW50Lm92LmZyZWUgPSBULA0KICAgIGdyb3VwID0gImxlbmd0aF8yIg0KICApDQoNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShjdWx0X21vZGVsMTZfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsDQogICAgICAgZmlsZSA9IGZpbGVuYW1lKQ0KfSBlbHNlIHtsb2FkKGZpbGUgPSBmaWxlbmFtZSkNCn0NCmBgYA0KDQpgYGB7ciBjdWx0IG0xNiBsck15RGF0YX0NCmZpdF9tYXRyaXhfY3VsdF9tMTZfY29uc3RyYWluZWRfZ3JvdXBzIDwtIGxhdkluc3BlY3QoY3VsdF9tb2RlbDE2X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LCB3aGF0ID0gImZpdCIpDQpmaXRfbWF0cml4X2N1bHRfbTE2X3VuY29uc3RyYWluZWRfZ3JvdXBzIDwtIGxhdkluc3BlY3QoY3VsdF9tb2RlbDE2X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZ19maXQsIHdoYXQgPSAiZml0IikNCg0KZml0X21hdHJpeF9jdWx0X00xNiA8LSByYmluZChmaXRfbWF0cml4X2N1bHRfbTE2X2NvbnN0cmFpbmVkX2dyb3VwcywgZml0X21hdHJpeF9jdWx0X20xNl91bmNvbnN0cmFpbmVkX2dyb3VwcykNCg0KbGF2VGVzdExSVChjdWx0X21vZGVsMTZfY29uc3RyYWluZWRfbGFnX2dyb3Vwc19maXQsIGN1bHRfbW9kZWwxNl91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0KQ0KYGBgDQoNCiMjIyBpbmNvbWUgZGlmZmVyZW5jZXMNCg0KYGBge3IgaW5jX2RpZmYgbW9kZWwgMTYgY29ucyBncm91cHMgdW5jb25zIGxhZ3N9DQoNCmluY19kaWZmX21vZGVsMTZfY29uc3RyYWluZWRfZ3JvdXBzIDwtICcNCg0KICAjIyMjIyMjIyMjIyMjIyMjDQogICMgQkVUV0VFTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgIyBDcmVhdGUgYmV0d2VlbiBjb21wb25lbnRzIChyYW5kb20gaW50ZXJjZXB0cykNCiAgUkl4ID1+IDEqIEZlZHVjX2FfMiArIDEqRmVkdWNfYV8zICsgMSpGZWR1Y19hXzQgKyAxKkZlZHVjX2FfNSArIDEqRmVkdWNfYV82ICsgMSpGZWR1Y19hXzcgKyAxKkZlZHVjX2FfOCArIDEqRmVkdWNfYV85ICsgMSpGZWR1Y19hXzEwICsgMSpGZWR1Y19hXzExDQogIFJJeSA9fiAxKmluY19kaWZmXzIgKyAxKmluY19kaWZmXzMgKyAxKmluY19kaWZmXzQgKyAxKmluY19kaWZmXzUgKyAxKmluY19kaWZmXzYgKyAxKmluY19kaWZmXzcgKyAxKmluY19kaWZmXzggKyAxKmluY19kaWZmXzkgKyAxKmluY19kaWZmXzEwICsgMSppbmNfZGlmZl8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQogIA0KICAjIFJlZ3Jlc3Npb24gb2YgcmFuZG9tIGludGVyY2VwdHMgb24gejENCiAgUkl4ICsgUkl5IH4gYmV0d2Vlbl9lZHVjICsgYmV0d2Vlbl9hZ2UgKyBiZXR3ZWVuX29yaWdpbiArIGJldHdlZW5fZmVtYWxlIyBDb25zdHJhaW5lZCBvdmVyIHRpbWUuDQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuICANCiAgRmVkdWNfYV8yIH5+IDAqRmVkdWNfYV8yDQogIEZlZHVjX2FfMyB+fiAwKkZlZHVjX2FfMw0KICBGZWR1Y19hXzQgfn4gMCpGZWR1Y19hXzQNCiAgRmVkdWNfYV81IH5+IDAqRmVkdWNfYV81DQogIEZlZHVjX2FfNiB+fiAwKkZlZHVjX2FfNg0KICBGZWR1Y19hXzcgfn4gMCpGZWR1Y19hXzcNCiAgRmVkdWNfYV84IH5+IDAqRmVkdWNfYV84DQogIEZlZHVjX2FfOSB+fiAwKkZlZHVjX2FfOQ0KICBGZWR1Y19hXzEwIH5+IDAqRmVkdWNfYV8xMA0KICBGZWR1Y19hXzExIH5+IDAqRmVkdWNfYV8xMQ0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgd2luY19kaWZmXzIgPX4gMSppbmNfZGlmZl8yDQogIHdpbmNfZGlmZl8zID1+IDEqaW5jX2RpZmZfMw0KICB3aW5jX2RpZmZfNCA9fiAxKmluY19kaWZmXzQNCiAgd2luY19kaWZmXzUgPX4gMSppbmNfZGlmZl81DQogIHdpbmNfZGlmZl82ID1+IDEqaW5jX2RpZmZfNg0KICB3aW5jX2RpZmZfNyA9fiAxKmluY19kaWZmXzcNCiAgd2luY19kaWZmXzggPX4gMSppbmNfZGlmZl84DQogIHdpbmNfZGlmZl85ID1+IDEqaW5jX2RpZmZfOQ0KICB3aW5jX2RpZmZfMTAgPX4gMSppbmNfZGlmZl8xMA0KICB3aW5jX2RpZmZfMTEgPX4gMSppbmNfZGlmZl8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2luY19kaWZmXzMgICB+IGMoYTIsIGEyKSp3aW5jX2RpZmZfMiArIGMoYjIsIGIyKSp3RmVkdWNfYV8yDQogIHdpbmNfZGlmZl80ICAgfiBjKGEzLCBhMykqd2luY19kaWZmXzMgKyBjKGIzLCBiMykqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNSAgIH4gYyhhNCwgYTQpKndpbmNfZGlmZl80ICsgYyhiNCwgYjQpKndGZWR1Y19hXzQNCiAgd2luY19kaWZmXzYgICB+IGMoYTUsIGE1KSp3aW5jX2RpZmZfNSArIGMoYjUsIGI1KSp3RmVkdWNfYV81DQogIHdpbmNfZGlmZl83ICAgfiBjKGE2LCBhNikqd2luY19kaWZmXzYgKyBjKGI2LCBiNikqd0ZlZHVjX2FfNg0KICB3aW5jX2RpZmZfOCAgIH4gYyhhNywgYTcpKndpbmNfZGlmZl83ICsgYyhiNywgYjcpKndGZWR1Y19hXzcNCiAgd2luY19kaWZmXzkgICB+IGMoYTgsIGE4KSp3aW5jX2RpZmZfOCArIGMoYjgsIGI4KSp3RmVkdWNfYV84DQogIHdpbmNfZGlmZl8xMCAgfiBjKGE5LCBhOSkqd2luY19kaWZmXzkgKyBjKGI5LCBiOSkqd0ZlZHVjX2FfOQ0KICB3aW5jX2RpZmZfMTEgIH4gYyhhMTAsIGExMCkqd2luY19kaWZmXzEwICsgYyhiMTAsIGIxMCkqd0ZlZHVjX2FfMTANCiAgDQogIA0KICB3RmVkdWNfYV8zICB+IGMoYzIsIGMyKSp3aW5jX2RpZmZfMiArIGMoZDIsIGQyKSp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyhjMywgYzMpKndpbmNfZGlmZl8zICsgYyhkMywgZDMpKndGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNSAgfiBjKGM0LCBjNCkqd2luY19kaWZmXzQgKyBjKGQ0LCBkNCkqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMoYzUsIGM1KSp3aW5jX2RpZmZfNSArIGMoZDUsIGQ1KSp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyhjNiwgYzYpKndpbmNfZGlmZl82ICsgYyhkNiwgZDYpKndGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfOCAgfiBjKGM3LCBjNykqd2luY19kaWZmXzcgKyBjKGQ3LCBkNykqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMoYzgsIGM4KSp3aW5jX2RpZmZfOCArIGMoZDgsIGQ4KSp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMoYzksIGM5KSp3aW5jX2RpZmZfOSArIGMoZDksIGQ5KSp3RmVkdWNfYV85DQogIHdGZWR1Y19hXzExICB+IGMoYzEwLCBjMTApKndpbmNfZGlmZl8xMCArIGMoZDEwLCBkMTApKndGZWR1Y19hXzEwDQogIA0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlIGF0IHRoZSBmaXJzdCB3YXZlLiANCiAgd2luY19kaWZmXzIgfn4gd0ZlZHVjX2FfMiAjIENvdmFyaWFuY2UNCg0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2luY19kaWZmXzMgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl80IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzYgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl83IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzkgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzEwDQogIHdpbmNfZGlmZl8xMSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2luY19kaWZmXzIgfn4gd2luY19kaWZmXzIgDQogIHdGZWR1Y19hXzIgfn4gd0ZlZHVjX2FfMg0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2luY19kaWZmXzMgfn4gYyh2eTEsIHZ5Mikqd2luY19kaWZmXzMNCiAgd0ZlZHVjX2FfMyB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl80IH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl80IA0KICB3RmVkdWNfYV80IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzQNCiAgd2luY19kaWZmXzUgfn4gYyh2eTEsIHZ5Mikqd2luY19kaWZmXzUNCiAgd0ZlZHVjX2FfNSB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV81DQogIHdpbmNfZGlmZl82IH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl82IA0KICB3RmVkdWNfYV82IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzYNCiAgd2luY19kaWZmXzcgfn4gYyh2eTEsIHZ5Mikqd2luY19kaWZmXzcgDQogIHdGZWR1Y19hXzcgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOCB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfOCANCiAgd0ZlZHVjX2FfOCB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV84DQogIHdpbmNfZGlmZl85IH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl85IA0KICB3RmVkdWNfYV85IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzkNCiAgd2luY19kaWZmXzEwIH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMTANCiAgd2luY19kaWZmXzExIH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl8xMSANCiAgd0ZlZHVjX2FfMTEgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMTENCiAgDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMgQURESVRJT05BTCBDT05TVFJBSU5UUyAjDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIFNldCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgYmV0d2Vlbi1mYWN0b3JzIChyYW5kb20gaW50ZXJjZXB0cykgYW5kIHdpdGhpbi0NCiAgIyBmYWN0b3JzIGF0IHdhdmUgMSBhdCAwLiANCiAgUkl4ICsgUkl5IH5+IDAqd0ZlZHVjX2FfMiArIDAqd2luY19kaWZmXzINCg0KJw0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImluY19kaWZmX21vZGVsMTZfY29uc3RyYWluZWRfZ3JvdXBzX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCmluY19kaWZmX21vZGVsMTZfY29uc3RyYWluZWRfZ3JvdXBzX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgaW5jX2RpZmZfbW9kZWwxNl9jb25zdHJhaW5lZF9ncm91cHMsDQogICAgZGF0YSA9IE15RGF0YSwNCiAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICBtaXNzaW5nID0gJ01MJywNCiAgICBtZWFuc3RydWN0dXJlID0gVCwNCiAgICBpbnQub3YuZnJlZSA9IFQsDQogICAgZ3JvdXAgPSAibGVuZ3RoXzIiDQogICkNCg0KICAjc2F2ZSBtb2RlbA0KICBzYXZlKGluY19kaWZmX21vZGVsMTZfY29uc3RyYWluZWRfZ3JvdXBzX2ZpdCwNCiAgICAgICBmaWxlID0gZmlsZW5hbWUpDQp9IGVsc2Uge2xvYWQoZmlsZSA9IGZpbGVuYW1lKQ0KfQ0KYGBgDQoNCg0KYGBge3IgaW5jX2RpZmYgbW9kZWwgMTYgdW5jb25zdCBncm91cHMgYW5kIGNvbnN0IGxhZ3N9DQppbmNfZGlmZl9tb2RlbDE2X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZyA8LSAgJw0KDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSpGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqaW5jX2RpZmZfMiArIDEqaW5jX2RpZmZfMyArIDEqaW5jX2RpZmZfNCArIDEqaW5jX2RpZmZfNSArIDEqaW5jX2RpZmZfNiArIDEqaW5jX2RpZmZfNyArIDEqaW5jX2RpZmZfOCArIDEqaW5jX2RpZmZfOSArIDEqaW5jX2RpZmZfMTAgKyAxKmluY19kaWZmXzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4gDQogIHdGZWR1Y19hXzIgPX4gMSpGZWR1Y19hXzINCiAgd0ZlZHVjX2FfMyA9fiAxKkZlZHVjX2FfMw0KICB3RmVkdWNfYV80ID1+IDEqRmVkdWNfYV80DQogIHdGZWR1Y19hXzUgPX4gMSpGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNiA9fiAxKkZlZHVjX2FfNg0KICB3RmVkdWNfYV83ID1+IDEqRmVkdWNfYV83DQogIHdGZWR1Y19hXzggPX4gMSpGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfOSA9fiAxKkZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMCA9fiAxKkZlZHVjX2FfMTANCiAgd0ZlZHVjX2FfMTEgPX4gMSpGZWR1Y19hXzExDQogIA0KICB3aW5jX2RpZmZfMiA9fiAxKmluY19kaWZmXzINCiAgd2luY19kaWZmXzMgPX4gMSppbmNfZGlmZl8zDQogIHdpbmNfZGlmZl80ID1+IDEqaW5jX2RpZmZfNA0KICB3aW5jX2RpZmZfNSA9fiAxKmluY19kaWZmXzUNCiAgd2luY19kaWZmXzYgPX4gMSppbmNfZGlmZl82DQogIHdpbmNfZGlmZl83ID1+IDEqaW5jX2RpZmZfNw0KICB3aW5jX2RpZmZfOCA9fiAxKmluY19kaWZmXzgNCiAgd2luY19kaWZmXzkgPX4gMSppbmNfZGlmZl85DQogIHdpbmNfZGlmZl8xMCA9fiAxKmluY19kaWZmXzEwDQogIHdpbmNfZGlmZl8xMSA9fiAxKmluY19kaWZmXzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3aW5jX2RpZmZfMyAgIH4gYyhhMSwgYTIpKndpbmNfZGlmZl8yICsgYyhiMSwgYjIpKndGZWR1Y19hXzINCiAgd2luY19kaWZmXzQgICB+IGMoYTEsIGEyKSp3aW5jX2RpZmZfMyArIGMoYjEsIGIyKSp3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl81ICAgfiBjKGExLCBhMikqd2luY19kaWZmXzQgKyBjKGIxLCBiMikqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNiAgIH4gYyhhMSwgYTIpKndpbmNfZGlmZl81ICsgYyhiMSwgYjIpKndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzcgICB+IGMoYTEsIGEyKSp3aW5jX2RpZmZfNiArIGMoYjEsIGIyKSp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl84ICAgfiBjKGExLCBhMikqd2luY19kaWZmXzcgKyBjKGIxLCBiMikqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOSAgIH4gYyhhMSwgYTIpKndpbmNfZGlmZl84ICsgYyhiMSwgYjIpKndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzEwICB+IGMoYTEsIGEyKSp3aW5jX2RpZmZfOSArIGMoYjEsIGIyKSp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMSAgfiBjKGExLCBhMikqd2luY19kaWZmXzEwICsgYyhiMSwgYjIpKndGZWR1Y19hXzEwDQogIA0KICB3RmVkdWNfYV8zICB+IGMoYzEsIGMyKSp3aW5jX2RpZmZfMiArIGMoZDEsIGQyKSp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyhjMSwgYzIpKndpbmNfZGlmZl8zICsgYyhkMSwgZDIpKndGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNSAgfiBjKGMxLCBjMikqd2luY19kaWZmXzQgKyBjKGQxLCBkMikqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMoYzEsIGMyKSp3aW5jX2RpZmZfNSArIGMoZDEsIGQyKSp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyhjMSwgYzIpKndpbmNfZGlmZl82ICsgYyhkMSwgZDIpKndGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfOCAgfiBjKGMxLCBjMikqd2luY19kaWZmXzcgKyBjKGQxLCBkMikqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMoYzEsIGMyKSp3aW5jX2RpZmZfOCArIGMoZDEsIGQyKSp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMoYzEsIGMyKSp3aW5jX2RpZmZfOSArIGMoZDEsIGQyKSp3RmVkdWNfYV85DQogIHdGZWR1Y19hXzExICB+IGMoYzEsIGMyKSp3aW5jX2RpZmZfMTAgKyBjKGQxLCBkMikqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3aW5jX2RpZmZfMiB+fiB3RmVkdWNfYV8yICMgQ292YXJpYW5jZQ0KDQogICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2luY19kaWZmXzMgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl80IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzYgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl83IH5+IGMoY292MSwgY292Mikqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzkgfn4gYyhjb3YxLCBjb3YyKSp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMCB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzEwDQogIHdpbmNfZGlmZl8xMSB+fiBjKGNvdjEsIGNvdjIpKndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2luY19kaWZmXzIgfn4gd2luY19kaWZmXzIgDQogIHdGZWR1Y19hXzIgfn4gd0ZlZHVjX2FfMg0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2luY19kaWZmXzMgfn4gYyh2eTEsIHZ5Mikqd2luY19kaWZmXzMNCiAgd0ZlZHVjX2FfMyB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl80IH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl80IA0KICB3RmVkdWNfYV80IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzQNCiAgd2luY19kaWZmXzUgfn4gYyh2eTEsIHZ5Mikqd2luY19kaWZmXzUNCiAgd0ZlZHVjX2FfNSB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV81DQogIHdpbmNfZGlmZl82IH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl82IA0KICB3RmVkdWNfYV82IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzYNCiAgd2luY19kaWZmXzcgfn4gYyh2eTEsIHZ5Mikqd2luY19kaWZmXzcgDQogIHdGZWR1Y19hXzcgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOCB+fiBjKHZ5MSwgdnkyKSp3aW5jX2RpZmZfOCANCiAgd0ZlZHVjX2FfOCB+fiBjKHZ4MSwgdngyKSp3RmVkdWNfYV84DQogIHdpbmNfZGlmZl85IH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl85IA0KICB3RmVkdWNfYV85IH5+IGModngxLCB2eDIpKndGZWR1Y19hXzkNCiAgd2luY19kaWZmXzEwIH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMTANCiAgd2luY19kaWZmXzExIH5+IGModnkxLCB2eTIpKndpbmNfZGlmZl8xMSANCiAgd0ZlZHVjX2FfMTEgfn4gYyh2eDEsIHZ4Mikqd0ZlZHVjX2FfMTENCiAgDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMgQURESVRJT05BTCBDT05TVFJBSU5UUyAjDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIFNldCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgYmV0d2Vlbi1mYWN0b3JzIChyYW5kb20gaW50ZXJjZXB0cykgYW5kIHdpdGhpbi0NCiAgIyBmYWN0b3JzIGF0IHdhdmUgMSBhdCAwLiANCiAgUkl4ICsgUkl5IH5+IDAqd0ZlZHVjX2FfMiArIDAqd2luY19kaWZmXzINCg0KJw0KI2ZpbGVuYW1lDQpmaWxlbmFtZSA8LQ0KICBmaWxlLnBhdGgoZGlyLA0KICAgICAgICAgICAgImluY19kaWZmX21vZGVsMTZfdW5jb25zdHJhaW5lZF9ncm91cHNfY29uc3RyYWluZWRfbGFnX2ZpdC5SZGF0YSIpDQoNCiNlc3RpbWF0ZSBtb2RlbA0KaWYgKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpIHsNCg0KaW5jX2RpZmZfbW9kZWwxNl91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0IDwtDQogIGxhdmFhbigNCiAgICBpbmNfZGlmZl9tb2RlbDE2X3VuY29uc3RyYWluZWRfZ3JvdXBzX2NvbnN0cmFpbmVkX2xhZywNCiAgICBkYXRhID0gTXlEYXRhLA0KICAgIGVzdGltYXRvciA9ICdNTFInLA0KICAgIG1pc3NpbmcgPSAnTUwnLA0KICAgIG1lYW5zdHJ1Y3R1cmUgPSBULA0KICAgIGludC5vdi5mcmVlID0gVCwNCiAgICBncm91cCA9ICJsZW5ndGhfMiINCiAgKQ0KDQogICNzYXZlIG1vZGVsDQogIHNhdmUoaW5jX2RpZmZfbW9kZWwxNl91bmNvbnN0cmFpbmVkX2dyb3Vwc19jb25zdHJhaW5lZF9sYWdfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZQ0KICAobG9hZChmaWxlID0gZmlsZW5hbWUpDQogICkNCmBgYA0KDQpgYGB7ciBpbmNfZGlmZiBtMTYgY29uc3RyYWluZWQgZ3JvdXBzIGxhZ30NCmluY19kaWZmX21vZGVsMTZfY29uc3RyYWluZWRfbGFnX2dyb3VwcyA8LSAnDQoNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAxKkZlZHVjX2FfMiArIDEqRmVkdWNfYV8zICsgMSpGZWR1Y19hXzQgKyAxKkZlZHVjX2FfNSArIDEqRmVkdWNfYV82ICsgMSpGZWR1Y19hXzcgKyAxKkZlZHVjX2FfOCArIDEqRmVkdWNfYV85ICsgMSpGZWR1Y19hXzEwICsgMSpGZWR1Y19hXzExDQogIFJJeSA9fiAxKmluY19kaWZmXzIgKyAxKmluY19kaWZmXzMgKyAxKmluY19kaWZmXzQgKyAxKmluY19kaWZmXzUgKyAxKmluY19kaWZmXzYgKyAxKmluY19kaWZmXzcgKyAxKmluY19kaWZmXzggKyAxKmluY19kaWZmXzkgKyAxKmluY19kaWZmXzEwICsgMSppbmNfZGlmZl8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQogIA0KICAjIFJlZ3Jlc3Npb24gb2YgcmFuZG9tIGludGVyY2VwdHMgb24gejENCiAgUkl4ICsgUkl5IH4gYmV0d2Vlbl9lZHVjICsgYmV0d2Vlbl9hZ2UgKyBiZXR3ZWVuX29yaWdpbiArIGJldHdlZW5fZmVtYWxlIyBDb25zdHJhaW5lZCBvdmVyIHRpbWUuDQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4gDQogIHdGZWR1Y19hXzIgPX4gMSpGZWR1Y19hXzINCiAgd0ZlZHVjX2FfMyA9fiAxKkZlZHVjX2FfMw0KICB3RmVkdWNfYV80ID1+IDEqRmVkdWNfYV80DQogIHdGZWR1Y19hXzUgPX4gMSpGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNiA9fiAxKkZlZHVjX2FfNg0KICB3RmVkdWNfYV83ID1+IDEqRmVkdWNfYV83DQogIHdGZWR1Y19hXzggPX4gMSpGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfOSA9fiAxKkZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMCA9fiAxKkZlZHVjX2FfMTANCiAgd0ZlZHVjX2FfMTEgPX4gMSpGZWR1Y19hXzExDQogIHdpbmNfZGlmZl8yID1+IDEqaW5jX2RpZmZfMg0KICB3aW5jX2RpZmZfMyA9fiAxKmluY19kaWZmXzMNCiAgd2luY19kaWZmXzQgPX4gMSppbmNfZGlmZl80DQogIHdpbmNfZGlmZl81ID1+IDEqaW5jX2RpZmZfNQ0KICB3aW5jX2RpZmZfNiA9fiAxKmluY19kaWZmXzYNCiAgd2luY19kaWZmXzcgPX4gMSppbmNfZGlmZl83DQogIHdpbmNfZGlmZl84ID1+IDEqaW5jX2RpZmZfOA0KICB3aW5jX2RpZmZfOSA9fiAxKmluY19kaWZmXzkNCiAgd2luY19kaWZmXzEwID1+IDEqaW5jX2RpZmZfMTANCiAgd2luY19kaWZmXzExID1+IDEqaW5jX2RpZmZfMTEgDQogIA0KICAjIEVzdGltYXRlIHRoZSBsYWdnZWQgZWZmZWN0cyAoY29uc3RyYWluZWQpDQogIHdpbmNfZGlmZl8zICAgfiBhKndpbmNfZGlmZl8yICsgYip3RmVkdWNfYV8yDQogIHdpbmNfZGlmZl80ICAgfiBhKndpbmNfZGlmZl8zICsgYip3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl81ICAgfiBhKndpbmNfZGlmZl80ICsgYip3RmVkdWNfYV80DQogIHdpbmNfZGlmZl82ICAgfiBhKndpbmNfZGlmZl81ICsgYip3RmVkdWNfYV81DQogIHdpbmNfZGlmZl83ICAgfiBhKndpbmNfZGlmZl82ICsgYip3RmVkdWNfYV82DQogIHdpbmNfZGlmZl84ICAgfiBhKndpbmNfZGlmZl83ICsgYip3RmVkdWNfYV83DQogIHdpbmNfZGlmZl85ICAgfiBhKndpbmNfZGlmZl84ICsgYip3RmVkdWNfYV84DQogIHdpbmNfZGlmZl8xMCAgfiBhKndpbmNfZGlmZl85ICsgYip3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMSAgfiBhKndpbmNfZGlmZl8xMCArIGIqd0ZlZHVjX2FfMTANCiAgDQogIHdGZWR1Y19hXzMgIH4gYyp3aW5jX2RpZmZfMiArIGQqd0ZlZHVjX2FfMg0KICB3RmVkdWNfYV80ICB+IGMqd2luY19kaWZmXzMgKyBkKndGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNSAgfiBjKndpbmNfZGlmZl80ICsgZCp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyp3aW5jX2RpZmZfNSArIGQqd0ZlZHVjX2FfNQ0KICB3RmVkdWNfYV83ICB+IGMqd2luY19kaWZmXzYgKyBkKndGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfOCAgfiBjKndpbmNfZGlmZl83ICsgZCp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyp3aW5jX2RpZmZfOCArIGQqd0ZlZHVjX2FfOA0KICB3RmVkdWNfYV8xMCAgfiBjKndpbmNfZGlmZl85ICsgZCp3RmVkdWNfYV85DQogIHdGZWR1Y19hXzExICB+IGMqd2luY19kaWZmXzEwICsgZCp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdpbmNfZGlmZl8yIH5+IHdGZWR1Y19hXzIgIyBDb3ZhcmlhbmNlDQoNCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZXMgYmV0d2VlbiB0aGUgcmVzaWR1YWxzDQogIHdpbmNfZGlmZl8zIH5+IGNvdip3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl80IH5+IGNvdip3RmVkdWNfYV80DQogIHdpbmNfZGlmZl81IH5+IGNvdip3RmVkdWNfYV81DQogIHdpbmNfZGlmZl82IH5+IGNvdip3RmVkdWNfYV82DQogIHdpbmNfZGlmZl83IH5+IGNvdip3RmVkdWNfYV83DQogIHdpbmNfZGlmZl84IH5+IGNvdip3RmVkdWNfYV84DQogIHdpbmNfZGlmZl85IH5+IGNvdip3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMCB+fiBjb3Yqd0ZlZHVjX2FfMTANCiAgd2luY19kaWZmXzExIH5+IGNvdip3RmVkdWNfYV8xMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgDQogIHdpbmNfZGlmZl8yIH5+IHdpbmNfZGlmZl8yIA0KICB3RmVkdWNfYV8yIH5+IHdGZWR1Y19hXzINCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdpbmNfZGlmZl8zIH5+IHZ5KndpbmNfZGlmZl8zDQogIHdGZWR1Y19hXzMgfn4gdngqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNCB+fiB2eSp3aW5jX2RpZmZfNCANCiAgd0ZlZHVjX2FfNCB+fiB2eCp3RmVkdWNfYV80DQogIHdpbmNfZGlmZl81IH5+IHZ5KndpbmNfZGlmZl81DQogIHdGZWR1Y19hXzUgfn4gdngqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNiB+fiB2eSp3aW5jX2RpZmZfNiANCiAgd0ZlZHVjX2FfNiB+fiB2eCp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl83IH5+IHZ5KndpbmNfZGlmZl83IA0KICB3RmVkdWNfYV83IH5+IHZ4KndGZWR1Y19hXzcNCiAgd2luY19kaWZmXzggfn4gdnkqd2luY19kaWZmXzggDQogIHdGZWR1Y19hXzggfn4gdngqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfOSB+fiB2eSp3aW5jX2RpZmZfOSANCiAgd0ZlZHVjX2FfOSB+fiB2eCp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMCB+fiB2eSp3aW5jX2RpZmZfMTAgDQogIHdGZWR1Y19hXzEwIH5+IHZ4KndGZWR1Y19hXzEwDQogIHdpbmNfZGlmZl8xMSB+fiB2eSp3aW5jX2RpZmZfMTEgDQogIHdGZWR1Y19hXzExIH5+IHZ4KndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzIgKyAwKndpbmNfZGlmZl8yDQoNCicNCiNmaWxlbmFtZQ0KZmlsZW5hbWUgPC0NCiAgZmlsZS5wYXRoKGRpciwNCiAgICAgICAgICAgICJpbmNfZGlmZl9tb2RlbDE2X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LlJkYXRhIikNCg0KI2VzdGltYXRlIG1vZGVsDQppZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgew0KaW5jX2RpZmZfbW9kZWwxNl9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzX2ZpdCA8LQ0KICBsYXZhYW4oDQogICAgaW5jX2RpZmZfbW9kZWwxNl9jb25zdHJhaW5lZF9sYWdfZ3JvdXBzLA0KICAgIGRhdGEgPSBNeURhdGEsDQogICAgZXN0aW1hdG9yID0gJ01MUicsDQogICAgbWlzc2luZyA9ICdNTCcsDQogICAgbWVhbnN0cnVjdHVyZSA9IFQsDQogICAgaW50Lm92LmZyZWUgPSBULA0KICAgIGdyb3VwID0gImxlbmd0aF8yIg0KICApDQoNCiAgI3NhdmUgbW9kZWwNCiAgc2F2ZShpbmNfZGlmZl9tb2RlbDE2X2NvbnN0cmFpbmVkX2xhZ19ncm91cHNfZml0LA0KICAgICAgIGZpbGUgPSBmaWxlbmFtZSkNCn0gZWxzZSB7bG9hZChmaWxlID0gZmlsZW5hbWUpDQp9DQoNCmBgYA0KDQoNCiMgRXhwb3J0IHJlc3VsdHMNCg0KYGBge3Igc2F2ZSByZXN1bHRzfQ0Kc2F2ZS5pbWFnZShmaWxlID0gInJlc3VsdHMvcmljbHBtLzI0LTA4LTIxX2xhdmFhbi1tb2RlcmF0aW9uLXJlc3VsdHMuUmRhdGEiKQ0KYGBgDQo=


Copyright © 2024 Jeroense Thijmen