Does the religiosity of the region the interviewer is from affect the interviewer’s’ assessment of respondents’ understanding of survey questions?

Information about this replication project

  • Replication project based on paper [Zyczynska-Ciolek, D. and Kolczynska, M. (2021) ‘Does Interviewers’ Age Affect Their Assessment of Respondents’ Understanding of Survey Questions? Evidence From the European Social Survey’, International journal of public opinion research, 33(2), pp. 460–476. doi: 10.1093/ijpor/edaa015. https://academic.oup.com/ijpor/article/33/2/460/5912223?login=true ]
  • Replication method :
    • Used replication package available at [Zyczynska-Ciolek, D., & Kolczynska, M. (2022, March 25). Does interviewers’ age affect their assessment of respondents’ understanding of survey questions? Evidence from the European Social Survey. Retrieved from osf.io/7urxg https://osf.io/7urxg/]

Workspace setup

YAML settings

output:
  html_document:
   code_download: true
    toc: true
    toc_depth: 2
    toc_float:
     collapsed: false
     smooth_scroll: true

Global settings of R chunks

# Global options
opts_chunk$set(echo=TRUE,
                 cache=TRUE,
               comment=NA,
               message=FALSE,
               warning=FALSE)

Libraries

# All used libraries
library("rmarkdown")
library("knitr")
library("haven")
library("rio")
library("essurvey")
library("lme4")
library("emmeans")
library("stargazer")
library("tidyverse")
library("fastDummies")
library("dplyr")
library("readxl") 
library("sjPlot")

Versions of used packages

$rmarkdown
[1] '2.11'

$knitr
[1] '1.37'

My enviroment

[1] "R version 4.1.1 (2021-08-10)"

1. Introduction

Zyczynska-Clolek and Kolczynska (2021) claim that when controlling at the respondents’ level for ‘cognitive, physical, and psychological functioning’ (Zyczynska-Clolek and Kolczynska, 2021, p.466) and ‘undesirable response styles’ (Zyczynska-Clolek and Kolczynska, 2021, p.466) the younger the interviewer is the stronger the negative effect on the assessment of the respondents’ understanding of survey questions (Zyczynska-Clolek and Kolczynska). This variable is measured on 5-point scale with 5 meaning the interviewer assessed the respondent as understanding the survey questions ‘very often’ (Zyczynska-Clolek and Kolczynska, 2021, p.464) and 1 meaning the interviewer assessed the respondent as understanding the survey questions ‘never’ (Zyczynska-Clolek and Kolczynska, 2021, p.464). However, Zyczynska-Clolek and Kolczynska’s (2021) note that ‘the role of cultural differences’ (Zyczynska-Clolek and Kolczynska, 2021, p.473) still ‘remains to be explored’ (Zyczynska-Clolek and Kolczynska, 2021, p.473). Furthermore, previous research suggests there is a link between culture and its’ influence on the perceptions of older people (North and Fiske, 2018). For example, North and Fiske (2018), argued in their research that European cultures respect older people less so than Eastern cultures. This could mean that countries in the European Social Survey (European Social Survey, 2017), that are in West Asia (e.g., Israel (United Nations, 2023)) may have interviewers’ who rate older respondents understanding of survey questions more favourably than those from Europe – hence culture influencing their world view (Burnham, 2006) and therefore, influencing the way they assess respondents. Adding to this, Fernadez-Ballesteres (2020) reported that 90% (2.s.f.) of the European countries they analysed viewed older people as being friendly rather than being competent. They also reported that countries such as Russia and Romania viewed older people as being competent rather than being friendly (Fernadez-Ballesteres, 2020). This potentially suggests that Eastern European countries like Russia/Romina (United Nations, 2023) may also have cultural influences on perceptions of older people and hence may have interviewers’ who rate older respondents understanding of survey questions more favourably than those from the rest of the continent of Europe. Building on this, White, Muthukrishna, and Norenzayan (2021) found that irrespective of religious beliefs countries which are religious are more culturally similar than those who are not. This potentially suggests that religious countries may share a more similar world view (Burnham, 2006) than to those who are not, for example, White, Muthukrishna, and Norenzayn (2021) found that religious countries have greater ties to family than non-religious countries – this could potentially mean that these countries share a more similar perception of the older generation and hence interviewers’ from these countries may share similar biases when assessing respondents. Ewen, Nikzad-Terhune, and Dassel (2020) also found a link between religious beliefs being an indicator for cultural values around aging. They found that most religious societies are likely to have a positive viewpoint of aging with this being increased when the religiosity at both the induvial and societal level is amplified (Ewen, Nikzad-Terhune, and Dassel, 2020). They compared this to western cultures such as the North and West Europe where countries are more likely to be secular (Coutinho, 2016) and found that these countries are more likely to have a negative perception of aging (Ewen, Nikzad-Terhune, and Dassel, 2020). This potentially suggests that countries with similar levels of religiosity have more similar cultures and hence may have more similar world views when it comes to the perceptions of older people and assessing respondents’ ability to understand survey questions. In addition to this, Coutinho (2016) found that countries in West Asia (United Nations, 2023) such as Turkey have the highest levels of religiosity with some countries from the South of Europe also having very high levels of religiosity such as Kosovo. They found that other countries in South and East Europe (e.g., Greece and Romania), also have fairly high levels of religiosity and that the countries with the lowest levels of religiosity were concentrated in Northern Europe (e.g., Sweden) and Sahgal (2018) found that secularisation is also widespread in Western Europe. This therefore, potentially sets the premise for extending Zyczynska-Clolek and Kolczynska’s (2021) claim stated above as there is potentially an argument that cultural similarities measured via religiosity levels of different regions of the countries in the European Social Survey impacts interviewer’s’ world views around perceptions of aging/older people and hence their bias’s when assessing respondents’ ability to understand survey questions.

Therefore, this replication project aims to explore the role of cultural differences measured via religiosity at the regional level in affecting interviewers’ assessment of respondents’ understanding of survey questions. Note in order to divide the countries involved in the European Social Survey the United Nations geo-scheme was used – dividing the countries in the dataset into: Northern Europe, Southern Europe, Western Europe, Eastern Europe, and West Asia (United Nations, 2023). It will do this by assessing the following hypothesis: The lesser the religiosity of a country at the regional level, the stronger the negative effect on the variable which measures the interviewers’ assessment of how well a respondent understood the survey questions.

This replication project will therefore test the robustness of Zyczynska-Clolek and Kolczynska’s (2021) research paper as this replication project will use the same data used to produce the original results but will use a slightly different method (by adding a religiously variable and grouping countries to create a ‘region level’) to investigate a new hypothesis (Freese and Peterson, 2017).

This replication project expects to find (as pre-registered): The lesser the religiosity of a country at the regional level, the stronger the negative effect on the interviewers’ assessment of how well a respondent understood the survey questions.

2. Data and methods

2.1. Data

Zyczynska-Clolek and Kolczynska (2021) used the data from Wave 8 of the European Social Survey. This dataset was created in 2016 and includes 23 countries (i.e., ‘Austria, Belgium, Czechia, Estonia, Finland, France, Germany, Hungary, Iceland, Ireland, Israel, Italy, Lithuania, the Netherlands, Norway, Poland, Portugal, Russia, Slovenia, Spain, Sweden, Switzerland, and the United Kingdom’(Zyczynska-Clolek and Kolczynska, 2021, p.464.) about their attitudes towards welfare and climate change (European social survey, 2017). The same dataset was used in this replication project and can be found using the following citation: ESS Round 8: European Social Survey Round 8 Data (2016). Data file edition 2.2. Sikt - Norwegian Agency for Shared Services in Education and Research, Norway – Data Archive and distributor of ESS data for ESS ERIC. doi:10.21338/NSD-ESS8-2016.

ESS8e02_2 <- read_sav("~/University/Second Year/SMI/Intermediate Research Project in Quantitative Social Science (SMI205)/Assessment 2/Replication Project Data/ESS8e02_2.sav (1)/ESS8e02_2.sav")

ESS8INTe02 <- read_sav("~/University/Second Year/SMI/Intermediate Research Project in Quantitative Social Science (SMI205)/Assessment 2/Replication Project Data/ESS8INTe02.sav (1)/ESS8INTe02.sav")

The sample includes 3,067 interviewers (3,046 after data transformation for both original and this replication paper) and 44,387 respondents (42,724 after data transformation for the original paper and 42,190 for this replication paper) (European Social Survey, 2017; Zyczynska-Clolek and Kolczynska, 2021)).

This replication project uses the following variables:

  • resp_und: the variable which measures the interviewers’ assessment of respondents understanding of survey questions on a 5 point scale (with 5 being the respondent understands the most).
  • agea: the age of the respondents (years)
  • intagea: the age of the interviewers (years)
  • cntry: country
  • lnghom1: language spoken mostly at home by respondent
  • intlnga: language interview is conducted in
  • sclmeet: how often respondent meets with friends, family, or work colleagues socially
  • health: self-rated health score (with 1 being the best and 4 the worst)
  • intnum: interviewers’ identification number
  • eisced: highest level of education completed (with 7 being the most educated and 1 being the least)
  • rlgdgr: religiosity of the respondent

Steps undertaken in data transformation:

  1. Merged the integrated interviewer data file with the integrated file.
  2. Set all the missing responses to NAs.
  3. Create a dummy variable for the variable which measures the interviewers’ assessment of respondents understanding of survey questions and name it ‘resp_und’.
  4. Create age groups for both interviewers and respondents – these variables are named age_i_cat and age_r_cat.
  5. Create a dummy variable for if the interview was conducted in the respondents’ language spoken at home and name it ‘homelang’.
  6. Switching specific values with new values for the following variables: sclmeet (now measured 1-4 and named ‘meetfriends’), health (now measured 4-1 and named ‘srhealth’), eisced (now measured 1-3 and named educ3 (made a factor too) – also created ‘educ’ which measures variable ‘eisced’ 1 -7).
  7. Separated interviewers identification number from country to create variable ‘int_id’.
  8. Constructed measures of response styles: non-response (named ‘nonresp’), extreme responses (named ‘ext’), middle responses (named ‘mid’), and straightlining (named ‘straight’).
  9. Getting rid of NAs in data.
  10. Making the respondent level variable ‘rlgdgr’ a country level variable by aggerating it and naming it ‘religion_mean’.
  11. Categorising the countries into regions (North Europe: Estonia, Finland, UK, Ireland, Iceland, Lithuania, Norway, and Sweden; Eastern Europe: Russia, Poland, Hungary, and Czechia; Southern Europe: Spain, Italy, Portugal, and Slovenia; Western Europe: Netherlands, France, Germany, Switzerland, Belgium, and Austria; West Asia: Israel (United Nations, 2023)) and naming the variable ‘region’.
ess8 <- ess8 %>%
  zap_labels() %>%
  full_join(., interv, by = c("idno", "cntry"))
### Making the individual level variable 'How religious are you?' a country level variable by using the assregation method
religion <- aggregate(rlgdgr~cntry,data_omit2,mean)

names(religion)[names(religion) == "rlgdgr"] <- "religion_mean" #renaming variable

jointdataset <- merge(data_omit2, religion, by = 'cntry')
### Putting countries into regions ------
jointdataset$region <- recode(jointdataset$cntry, AT = "western", BE = "western", CH = "western", CZ = "eastern", DE = "western", EE = "northern", 
                               ES = "southern", FI = "northern", FR = "western", GB = "northern", HU = "eastern", IE = "northern", IS = "northern", 
                               IL = "w_aisa", IT = "southern", LT = "northern", NL = "western", NO = "northern", PL = "eastern", PT = "southern", 
                               RU = "eastern", SE = "northern", SI = "southern")

Boxplot 1.1: Northern, Eastern, Southern, and Western Europe all have the same means (around 5) and distributions (interquartile range of 1). This suggests there is little variance in respondents understanding survey questions score amongst Europe. This could be due to there only being 23 countries in the sample – maybe more variances would be seen if more countries were included. West Asia has the lowest mean respondents understanding score (4) and the highest interquartile range (2). This suggests that in West Asia interviewers on average score respondents understanding of survey questions to be lower than Europe. This goes against what was expected in the pre-registration form. However, this could be because this sample only included Israel in West Asia (hence this is not representative of West Asia) as no data was available for other countries in West Asia such as Turkey.

2.2. Methods

The original paper used a 3 level multi-level model (respondents nested in interviewers nested in countries) with random intercepts at the interviewer and country level (Zyczynska-Clolek and Kolczynska, 2021). This model described is model 5 in the paper:

  • The dependent variable in this model is interviewers’ assessment of respondents’ understanding of survey questions.
  • The main independent variables are the age of the interviewer and respondent.
  • They control for respondents’ level for ‘cognitive, physical, and psychological functioning’ (Zyczynska-Clolek and Kolczynska, 2021, p.466) and ‘undesirable response styles’ (Zyczynska-Clolek and Kolczynska, 2021, p.466).

This replication project will use the same method but change two aspects:

  • Will use a ‘region’ level rather than a country level to account for the fact that those from similar regions are more likely to be similar than those from other regions due to religious similarities (White, Muthukrisha, and Norenzayan, 2021).
  • Will add the region level variable ‘religiosity’ to account for the impact that religion plays in influencing different cultural values, which may influence the way interviewers interpret respondents understanding of survey questions (Ewen, Nikzad-Terhune, and Dassel, 2020).

3. Results

m6 <- lmer(resundq ~ 1 + age_r_cat + age_i_cat + factor(educ3) + 
             homelang + factor(meetfriends) + factor(srhealth) + 
             nonresp + ext + mid + straight + religion_mean + 
             (1 | int_id) + (1 | region),
           weights = pspwght, data = rep_final_data) 
 summary(m6)
  Interviewers’ assessment of respondents’ understanding of survey questions
Predictors Estimates CI p
Intercept 4.05 3.88 – 4.23 <0.001
Respondent’s aged 26 - 40 -0.03 -0.05 – -0.01 0.003
Respondent’s aged 41 - 55 -0.04 -0.06 – -0.02 <0.001
Respondent’s aged 56 - 70 -0.07 -0.09 – -0.05 <0.001
Respondent’s aged 71 - 100 -0.18 -0.20 – -0.16 <0.001
Interviewer’s aged 26 - 40 0.16 0.08 – 0.24 <0.001
Interviewer’s aged 41 - 55 0.19 0.11 – 0.27 <0.001
Interviewer’s aged 56 - 70 0.25 0.17 – 0.33 <0.001
Interviewer’s aged 71 - 89 0.37 0.27 – 0.47 <0.001
Completed up to Secondary and Post-secondary non-tertiary Education 0.19 0.18 – 0.21 <0.001
Completed up Tertiary Education 0.30 0.28 – 0.32 <0.001
Language match 0.19 0.17 – 0.22 <0.001
Meets friends once a month 0.05 0.03 – 0.08 <0.001
Meets friends several times a month 0.06 0.03 – 0.08 <0.001
Meets friends once a week 0.06 0.03 – 0.08 <0.001
Meets friends several times a week 0.07 0.05 – 0.10 <0.001
Meets friends every day 0.07 0.04 – 0.09 <0.001
Fair health 0.08 0.05 – 0.10 <0.001
Good Health 0.13 0.11 – 0.15 <0.001
Very good health 0.15 0.13 – 0.18 <0.001
Item non-response -0.03 -0.04 – -0.03 <0.001
Extreme Categories -0.00 -0.00 – -0.00 <0.001
Middle Categories -0.00 -0.01 – -0.00 <0.001
Straightlining 0.03 0.02 – 0.04 <0.001
Average faith of a country -0.01 -0.02 – 0.01 0.264
Random Effects
σ2 0.30
τ00 int_id 0.12
τ00 region 0.02
ICC 0.33
N int_id 3045
N region 5
Observations 42190
Marginal R2 / Conditional R2 0.134 / 0.417

Table 1.1 shows the results of the revised multi-level model described above.

The results of the multi-level model created for this replication project are mostly the same as the results found in the original paper written by Zyczynska-Clolek and Kolczynska (2021) have mostly the same coefficient estimates as this replicated model. However, it is important to note that all of the coefficient estimates for the predictor variable ‘age of the interviewer’ have slightly increased. For example, in the original paper the coefficient estimates for interviewers aged 26-40 years is 0.13 (2.s.f.) (Zyczynska-Clolek and Kolczynska, 2021, p.469.), whereas in the replicated model this has increased to 0.16. The same pattern can also be seen for the coefficient estimates for interviewers aged 71-89 years as in the original paper the coefficient estimate was 0.33 (2.s.f.) (Zyczynska-Clolek and Kolczynska, 2021, p.469.), whereas in the replicated model this has increased to 0.37. However, the general pattern is still the same as the interpretation of these coefficient estimates mean that for interviewers aged 26-40 years their assessment of respondents understanding of survey questions increases by 0.16 points for every yearly increase, whereas for interviewers aged 71-89 years this increases by 0.37 points for every yearly increase. This still proves Zyczynska-Clolek and Kolczynska’s (2021) claim that the younger the interviewer is the stronger the negative effect on the variable which measures the interviewers’ assessment of how well a respondent understood the survey questions. It is important to note that the coefficient estimates for other predictor variables such as response styles also changed from the original model but kept the same pattern. This likely due to the added variable of ‘religiosity’ in the replicated model.

In addition to this, when average religiosity of a country increases by one scale point the average decrease in interviewers’ assessment of respondents understanding of survey questions is 0.01 (when all other variables are held constant). This goes against the predicted results pre-registered, which predicted that religiosity would have a positive effect on the interviewers’ assessment of respondents understanding of survey questions. This could be because many of the countries mentioned to have high levels of religiosity in the literature e.g., Turkey, Kosovo, and Greece were not included in the sample of data used (Coutinho, 2016) and therefore different results may have been found if a more suitable dataset was used that included these samples. Furthermore, the coefficient estimate for religiosity found by this model is statistically insignificant as the p-value (0.264) is less than the significance level of 0.05. This suggests that religiosity of a country is not a statistically significant predictor variable of interviewers’ assessment of respondents understanding of survey questions.

Furthermore, as religiosity is not a statistically significant predictor variable of interviewers’ assessment of respondents understanding of survey questions it maybe better to remove it from the model as it may be causing the model to be over-fitted and hence less reliable.

When compared to the same model without it as a predictor the model was reported to be a better fit, hence suggesting it is better to leave religiosity out of a revised model.

### Fit of model 5 vs model 6 comparing region model to new model ------
anova(m5, m6, refit=FALSE)

4. Conclusions

In conclusion, the lesser the religiosity of a country at the regional level did not have a negative effect on interviewers’ assessment of respondents’ understanding of survey questions but rather a positive one. However, it is important to note that this positive effect is statistically insignificant and hence religiosity of a country at the regional level can not be used as a predictor of interviewers’ assessment of respondents’ understanding of survey questions. This might be because many of the countries mentioned to have high levels of religiosity in the literature e.g., Kosovo, were not included in the sample used (Coutinho, 2016) and therefore different results may have been found if a more suitable dataset was used. In addition to this, the statement that White, Muthukrishna, and Norenzayan (2021) made about religion creating cultural similarities may not be true for the countries grouped together in this replication project as it might be other cultural factors that make them similar rather than religion. Therefore, if this replication was to be done again it may be useful to use another variable instead of religiosity at the regional level to measure cultural differences such as differences when it comes to treating older generations.

References

Burnham, D. (2006) An introduction to Kant’s Critique of judgement. Edinburgh: Edinburgh University Press.

Coutinho, J. P. (2016) ‘Religiosity in Europe: an index, factors, and clusters of religiosity’, Sociologia (Lisbon, Portugal), 81(81), pp. 163–188. doi: 10.7458/SPP2016816251.

European Social Survey (ESS) (2017) ESS round 8 - 2016. Welfare attitudes, Attitudes to climate change. Available at: Search European Social Survey (nsd.no) (Accessed: 25th May 2023).

Ewen, H. H., Nikzad-Terhune, K. and Dassel, K. B. (2020) ‘Exploring beliefs about aging and faith: Development of the judeo-christian religious beliefs and aging scale’, Behavioral sciences, 10(9), p. 139. doi: 10.3390/BS10090139.

Fernández-Ballesteros, R. et al. (2020) ‘Cultural aging stereotypes in European Countries: Are they a risk to Active Aging?’, PloS one, 15(5), pp. e0232340–e0232340. doi: 10.1371/journal.pone.0232340.

Freese, J. and Peterson, D. (2017) ‘Replication in Social Science’, Annual review of sociology, 43(1), pp. 147–165. doi: 10.1146/annurev-soc-060116-053450.

North, M. S. and Fiske, S. T. (2015) ‘Modern Attitudes Toward Older Adults in the Aging World: A Cross-Cultural Meta-Analysis’, Psychological bulletin, 141(5), pp. 993–1021. doi: 10.1037/a0039469.

Sahgal, N. (2018) ‘Pew Research Center: Being Christian in Western Europe’, LSE Religion and Global Society Blog, 5th June. Available at: https://blogs.lse.ac.uk/religionglobalsociety/2018/06/pew-research-center-being-christian-in-western-europe/ (Accessed: 26th May 2023)

United Nations (2023) Methodology. Available at: UNSD — Methodology (Accessed: 25th May 2023)

White, C. J. M., Muthukrishna, M. and Norenzayan, A. (2021) ‘Cultural similarity among coreligionists within and between countries’, Proceedings of the National Academy of Sciences - PNAS, 118(37), p. 1. doi: 10.1073/pnas.2109650118.

Zyczynska-Ciolek, D. and Kolczynska, M. (2021) ‘Does Interviewers’ Age Affect Their Assessment of Respondents’ Understanding of Survey Questions? Evidence From the European Social Survey’, International journal of public opinion research, 33(2), pp. 460–476. doi: 10.1093/ijpor/edaa015.

Zyczynska-Ciolek, D., & Kolczynska, M. (2022, March 25). Does interviewers’ age affect their assessment of respondents’ understanding of survey questions? Evidence from the European Social Survey. Retrieved from osf.io/7urxg

Appendix

Appendix 1. My enviroment (full information)

# Detailed information about my environment
sessionInfo()
R version 4.1.1 (2021-08-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 22621)

Matrix products: default

locale:
[1] LC_COLLATE=English_United Kingdom.1252 
[2] LC_CTYPE=English_United Kingdom.1252   
[3] LC_MONETARY=English_United Kingdom.1252
[4] LC_NUMERIC=C                           
[5] LC_TIME=English_United Kingdom.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] knitr_1.37     rmarkdown_2.11

loaded via a namespace (and not attached):
 [1] codetools_0.2-18 digest_0.6.29    R6_2.5.1         lifecycle_1.0.3 
 [5] jsonlite_1.8.4   magrittr_2.0.3   evaluate_0.14    stringi_1.7.6   
 [9] cachem_1.0.6     rlang_1.1.0      cli_3.4.1        rstudioapi_0.14 
[13] jquerylib_0.1.4  bslib_0.4.1      vctrs_0.6.1      tools_4.1.1     
[17] stringr_1.5.0    glue_1.6.2       xfun_0.29        yaml_2.2.1      
[21] fastmap_1.1.0    compiler_4.1.1   htmltools_0.5.2  sass_0.4.2      

Appendix 2. Entire R code used in the project

# Opening key libraries first
library(rmarkdown)
library(knitr)
# Global options
opts_chunk$set(echo=TRUE,
                 cache=TRUE,
               comment=NA,
               message=FALSE,
               warning=FALSE)
# All used libraries
library("rmarkdown")
library("knitr")
library("haven")
library("rio")
library("essurvey")
library("lme4")
library("emmeans")
library("stargazer")
library("tidyverse")
library("fastDummies")
library("dplyr")
library("readxl") 
library("sjPlot")
# Versions of used packages
packages <- c("rmarkdown", "knitr")
names(packages) <- packages
lapply(packages, packageVersion)
# What is my R version?
version[['version.string']]
ESS8e02_2 <- read_sav("~/University/Second Year/SMI/Intermediate Research Project in Quantitative Social Science (SMI205)/Assessment 2/Replication Project Data/ESS8e02_2.sav (1)/ESS8e02_2.sav")

ESS8INTe02 <- read_sav("~/University/Second Year/SMI/Intermediate Research Project in Quantitative Social Science (SMI205)/Assessment 2/Replication Project Data/ESS8INTe02.sav (1)/ESS8INTe02.sav")
ess8 <- ESS8e02_2
interv <- ESS8INTe02 
ess8 <- ess8 %>%
  zap_labels() %>%
  full_join(., interv, by = c("idno", "cntry"))
ess_clean <- recode_missings(ess8) %>%
  mutate(resp_und = ifelse(resundq == 5, 1, 0),
         age_r_cat = cut(agea, c(15,26,41,56,71,101), right = FALSE),
         age_i_cat = cut(intagea, c(17,26,41,56,71,90), right = FALSE),
         homelang = ifelse((cntry == "CH" & lnghom1 == "GSW" & intlnga == "GER") |
                             intlnga == lnghom1, 1, 0),
         meetfriends = plyr::mapvalues(sclmeet, c(1,2,3,4,5,6,7,77,88,99),
                                       c(1,1,2,3,4,5,6,NA,NA,NA)),
         srhealth = plyr::mapvalues(health, c(1,2,3,4,5,7,8,9),
                                    c(4,3,2,1,1,NA,NA,NA)),
         int_id = paste0(cntry, intnum),
         educ3 = plyr::mapvalues(eisced,
                                 c(0, 1,2,3,4,5,6,7,55,NA),
                                 c(NA,1,1,2,2,2,3,3,NA,NA)),
         educ = plyr::mapvalues(eisced,
                                c(0, 1,2,3,4,5,6,7,55,NA),
                                c(NA,1,2,3,4,5,6,7,NA,NA)),
         female = gndr - 1,
         educ3 = factor(educ3)) %>%
  select(idno, int_id, cntry, pspwght, resundq, resclq, resrelq, resbab,
         resp_und, age_r_cat, age_i_cat, agea, intagea, homelang, female, educ3, educ,
         meetfriends, srhealth, rlgdgr) 

codebook <- read_excel("~/University/Second Year/SMI/Intermediate Research Project in Quantitative Social Science (SMI205)/Assessment 2/Replication Project Data/codebook.xlsx")

attitudes <- codebook %>%
  filter(!is.na(group)) %>%
  select(varname, group) 

scale11 <- codebook %>%
  filter(length == 11) %>%
  select(varname)

scale5 <- codebook %>%
  filter(length == 5) %>%
  select(varname) 

straight1 <- codebook %>% filter(straight == 1) %>% select(varname)
straight2 <- codebook %>% filter(straight == 2) %>% select(varname)
straight3 <- codebook %>% filter(straight == 3) %>% select(varname)

### non-response ------
ess_clean$nonresp <- ess8 %>%
  dplyr::select(unique(attitudes$varname)) %>%
  apply(., 1, function(x)mean(is.na(x))*100)

ess_clean$nonresp_sum <- ess8 %>%
  dplyr::select(unique(attitudes$varname)) %>%
  apply(., 1, function(x)mean(is.na(x)))

### Middle category -----
ess_clean$mid11 <- ess8 %>%
  dplyr::select(unique(scale11$varname)) %>%
  mutate_all(funs(as.numeric(ifelse(is.na(.), 99, .) == 5))) %>%
  apply(., 1, function(x) mean(x)*100)

ess_clean$mid5 <- ess8 %>%
  dplyr::select(unique(scale5$varname)) %>%
  mutate_all(funs(as.numeric(ifelse(is.na(.), 99, .) == 3))) %>%
  apply(., 1, function(x) mean(x)*100)

ess_clean$mid <- (ess_clean$mid11 * 38 + ess_clean$mid5 * 29)/67

### Extreme category ------
ess_clean$ext11 <- ess8 %>%
  dplyr::select(unique(scale11$varname)) %>%
  mutate_all(funs(as.numeric(ifelse(is.na(.), 99, .) %in% c(0, 10)))) %>%
  apply(., 1, function(x) mean(x)*100)

ess_clean$ext5 <- ess8 %>%
  dplyr::select(unique(scale5$varname)) %>%
  mutate_all(funs(as.numeric(ifelse(is.na(.), 99, .) %in% c(1, 5)))) %>%
  apply(., 1, function(x) mean(x)*100)

ess_clean$ext <- (ess_clean$ext11 * 38 + ess_clean$ext5 * 29) / 67

### straight lining -------
ess_clean$straight1 <- t(apply(ess8 %>%
                                 dplyr::select(straight1$varname), 1, diff)) %>%
  data.frame() %>%
  apply(., 1, function(x) mean(abs(x), na.rm = TRUE))

ess_clean$straight2 <- t(apply(ess8 %>%
                                 dplyr::select(straight2$varname), 1, diff)) %>%
  data.frame() %>%
  apply(., 1, function(x) mean(abs(x), na.rm = TRUE))

ess_clean$straight3 <- t(apply(ess8 %>%
                                 dplyr::select(straight3$varname), 1, diff)) %>%
  data.frame() %>%
  apply(., 1, function(x) mean(abs(x), na.rm = TRUE))

ess_clean$straight <- (ess_clean$straight1 + ess_clean$straight2 + ess_clean$straight3)/3
### Getting rid of NAs in ess_clean data
data_omit2 <- na.omit(ess_clean)
### Making the individual level variable 'How religious are you?' a country level variable by using the assregation method
religion <- aggregate(rlgdgr~cntry,data_omit2,mean)

names(religion)[names(religion) == "rlgdgr"] <- "religion_mean" #renaming variable

jointdataset <- merge(data_omit2, religion, by = 'cntry')
### Putting countries into regions ------
jointdataset$region <- recode(jointdataset$cntry, AT = "western", BE = "western", CH = "western", CZ = "eastern", DE = "western", EE = "northern", 
                               ES = "southern", FI = "northern", FR = "western", GB = "northern", HU = "eastern", IE = "northern", IS = "northern", 
                               IL = "w_aisa", IT = "southern", LT = "northern", NL = "western", NO = "northern", PL = "eastern", PT = "southern", 
                               RU = "eastern", SE = "northern", SI = "southern")
rep_final_data <- jointdataset

export(rep_final_data, "rep_final_data.csv") 
#### visualising understanding per region ------
box2 <- ggplot(rep_final_data, aes(x=factor(region), y=resundq))+
  geom_boxplot()+
  theme( legend.position = "none" ) + 
  ggtitle("Average respondnets' understanding score given by interviewers per region") +
  scale_x_discrete(labels = c("Eastern Europe", "Northern Europe", "Southern Europe", "West Aisa", "Western Europe"))

box2 + labs(x = "Region", y = "Average respondnets' understanding score given by interviewers")

### Multi-level models --------
m0 <- lmer(resundq ~ 1 +(1 | int_id) + (1 | region),
           weights = pspwght, data = rep_final_data) #model 0

summary(m0)

m1 <- lmer(resundq ~ 1 + age_r_cat + (1 | int_id) + (1 | region),
           weights = pspwght, data = rep_final_data) #mode 1 - adding age of respondnets

m2 <- lmer(resundq ~ 1 + age_r_cat + factor(educ3) + (1 | int_id) + (1 | region),
           weights = pspwght, data = rep_final_data) #model 2 adding education

m3 <- lmer(resundq ~ 1 + age_r_cat + factor(educ3)+ homelang + factor(meetfriends) + factor(srhealth) + (1 | int_id) + (1 | region),
           weights = pspwght, data = rep_final_data)

m4 <- lmer(resundq ~ 1 + age_r_cat + factor(educ3) + homelang + 
             factor(meetfriends) + factor(srhealth) + 
             nonresp + ext + mid + straight +
             (1 | int_id) + (1 | region),
           weights = pspwght, data = rep_final_data)

m5 <- lmer(resundq ~ 1 + age_r_cat + age_i_cat + factor(educ3) + 
             homelang + factor(meetfriends) + factor(srhealth) + 
             nonresp + ext + mid + straight + 
             (1 | int_id) + (1 | region),
           weights = pspwght, data = rep_final_data)

 m7 <- lmer(resundq ~ 1 + age_r_cat + age_i_cat + factor(educ3) + 
              homelang + factor(meetfriends) + factor(srhealth) + 
              nonresp + ext + mid + straight + 
              (1 | int_id) + (1 | cntry),
            weights = pspwght, data = rep_final_data) ## original model
m6 <- lmer(resundq ~ 1 + age_r_cat + age_i_cat + factor(educ3) + 
             homelang + factor(meetfriends) + factor(srhealth) + 
             nonresp + ext + mid + straight + religion_mean + 
             (1 | int_id) + (1 | region),
           weights = pspwght, data = rep_final_data) 
 summary(m6)

tab_model(m6,
          pred.labels = c("Intercept", "Respondent's aged 26 - 40", "Respondent's aged 41 - 55",
                          "Respondent's aged 56 - 70", "Respondent's aged 71 - 100", "Interviewer's aged 26 - 40", "Interviewer's aged 41 - 55", "Interviewer's aged 56 - 70", "Interviewer's aged 71 - 89", 
                          "Completed up to Secondary and Post-secondary non-tertiary Education", "Completed up Tertiary Education", "Language match", 
                          "Meets friends once a month", "Meets friends several times a month", "Meets friends once a week", "Meets friends several times a week", "Meets friends every day", 
                          "Fair health", "Good Health", "Very good health", "Item non-response", 
                          "Extreme Categories", "Middle Categories", "Straightlining", "Average faith of a country"),
          dv.labels = c("Interviewers' assessment of respondents' understanding of survey questions")) 

### Fit of model 5 vs model 6 comparing region model to new model ------
anova(m5, m6, refit=FALSE)
# Detailed information about my environment
sessionInfo()
LS0tDQp0aXRsZTogIlNNSTIwNSBSZXBsaWNhdGlvbiBQcm9qZWN0ICgyMDIzKSINCmF1dGhvcjogIjIwMDM4MjAzMCINCmRhdGU6ICIwMS8wNi8yMDIzIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMg0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlDQotLS0NCg0KYGBge3Igc3RhcnQsIGluY2x1ZGU9RkFMU0V9DQojIE9wZW5pbmcga2V5IGxpYnJhcmllcyBmaXJzdA0KbGlicmFyeShybWFya2Rvd24pDQpsaWJyYXJ5KGtuaXRyKQ0KYGBgDQoNCiMgRG9lcyB0aGUgcmVsaWdpb3NpdHkgb2YgdGhlIHJlZ2lvbiB0aGUgaW50ZXJ2aWV3ZXIgaXMgZnJvbSBhZmZlY3QgdGhlIGludGVydmlld2Vy4oCZc+KAmSBhc3Nlc3NtZW50IG9mIHJlc3BvbmRlbnRz4oCZIHVuZGVyc3RhbmRpbmcgb2Ygc3VydmV5IHF1ZXN0aW9ucz8NCg0KIyMjIFJwdWJzIGxpbms6IFtodHRwczovL3JwdWJzLmNvbS9kZ29yZG9uMTQvMTA0ODU4Nl0NCiMjIyBHaXRIdWIgUmVwb3NpdG9yeTogW2h0dHBzOi8vZ2l0aHViLmNvbS8yMDAzODIwMzAvU00xMjA1LUFzc2Vzc21lbnQtMi5naXRdDQojIyMgU3R1ZHkgUHJlcmVnaXN0cmF0aW9uIGZvcm06IFtodHRwczovL2dpdGh1Yi5jb20vMjAwMzgyMDMwL1NNMTIwNS1Bc3Nlc3NtZW50LTIuZ2l0XQ0KDQojIyBJbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJlcGxpY2F0aW9uIHByb2plY3QNCiogUmVwbGljYXRpb24gcHJvamVjdCBiYXNlZCBvbiBwYXBlciBbWnljenluc2thLUNpb2xlaywgRC4gYW5kIEtvbGN6eW5za2EsIE0uICgyMDIxKSDigJhEb2VzIEludGVydmlld2VycycgQWdlIEFmZmVjdCBUaGVpciBBc3Nlc3NtZW50IG9mIFJlc3BvbmRlbnRzJyBVbmRlcnN0YW5kaW5nIG9mIFN1cnZleSBRdWVzdGlvbnM/IEV2aWRlbmNlIEZyb20gdGhlIEV1cm9wZWFuIFNvY2lhbCBTdXJ2ZXnigJksIEludGVybmF0aW9uYWwgam91cm5hbCBvZiBwdWJsaWMgb3BpbmlvbiByZXNlYXJjaCwgMzMoMiksIHBwLiA0NjDigJM0NzYuIGRvaTogMTAuMTA5My9panBvci9lZGFhMDE1LiBodHRwczovL2FjYWRlbWljLm91cC5jb20vaWpwb3IvYXJ0aWNsZS8zMy8yLzQ2MC81OTEyMjIzP2xvZ2luPXRydWUgXQ0KKiBSZXBsaWNhdGlvbiBtZXRob2QgOg0KICArIFVzZWQgcmVwbGljYXRpb24gcGFja2FnZSBhdmFpbGFibGUgYXQgW1p5Y3p5bnNrYS1DaW9sZWssIEQuLCAmIEtvbGN6eW5za2EsIE0uICgyMDIyLCBNYXJjaCAyNSkuIERvZXMgaW50ZXJ2aWV3ZXJz4oCZIGFnZSBhZmZlY3QgdGhlaXIgYXNzZXNzbWVudCBvZiByZXNwb25kZW50c+KAmSB1bmRlcnN0YW5kaW5nIG9mIHN1cnZleSBxdWVzdGlvbnM/IEV2aWRlbmNlIGZyb20gdGhlIEV1cm9wZWFuIFNvY2lhbCBTdXJ2ZXkuIFJldHJpZXZlZCBmcm9tIG9zZi5pby83dXJ4ZyBodHRwczovL29zZi5pby83dXJ4Zy9dDQogIA0KIyMgV29ya3NwYWNlIHNldHVwIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCiMjIyBZQU1MIHNldHRpbmdzDQoNCiBvdXRwdXQ6IDwvYnI+DQogICZuYnNwOyBodG1sX2RvY3VtZW50OiA8L2JyPg0KICAgICZuYnNwOyZuYnNwOyBjb2RlX2Rvd25sb2FkOiB0cnVlIDwvYnI+DQogICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IHRvYzogdHJ1ZSA8L2JyPg0KICAgICZuYnNwOyZuYnNwOyZuYnNwOyB0b2NfZGVwdGg6IDIgPC9icj4NCiAgICAmbmJzcDsmbmJzcDsmbmJzcDsgdG9jX2Zsb2F0OiA8L2JyPg0KICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNvbGxhcHNlZDogZmFsc2UgPC9icj4NCiAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBzbW9vdGhfc2Nyb2xsOiB0cnVlIDwvYnI+DQoNCiMjIyBHbG9iYWwgc2V0dGluZ3Mgb2YgUiBjaHVua3MNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9VFJVRX0NCiMgR2xvYmFsIG9wdGlvbnMNCm9wdHNfY2h1bmskc2V0KGVjaG89VFJVRSwNCgkgICAgICAgICAgICAgY2FjaGU9VFJVRSwNCiAgICAgICAgICAgICAgIGNvbW1lbnQ9TkEsDQogICAgICAgICAgICAgICBtZXNzYWdlPUZBTFNFLA0KICAgICAgICAgICAgICAgd2FybmluZz1GQUxTRSkNCmBgYA0KDQojIyMgTGlicmFyaWVzDQoNCmBgYHtyIGxpYnJhcmllcywgaW5jbHVkZT1UUlVFfQ0KIyBBbGwgdXNlZCBsaWJyYXJpZXMNCmxpYnJhcnkoInJtYXJrZG93biIpDQpsaWJyYXJ5KCJrbml0ciIpDQpsaWJyYXJ5KCJoYXZlbiIpDQpsaWJyYXJ5KCJyaW8iKQ0KbGlicmFyeSgiZXNzdXJ2ZXkiKQ0KbGlicmFyeSgibG1lNCIpDQpsaWJyYXJ5KCJlbW1lYW5zIikNCmxpYnJhcnkoInN0YXJnYXplciIpDQpsaWJyYXJ5KCJ0aWR5dmVyc2UiKQ0KbGlicmFyeSgiZmFzdER1bW1pZXMiKQ0KbGlicmFyeSgiZHBseXIiKQ0KbGlicmFyeSgicmVhZHhsIikgDQpsaWJyYXJ5KCJzalBsb3QiKQ0KYGBgDQoNCg0KIyMjIFZlcnNpb25zIG9mIHVzZWQgcGFja2FnZXMNCg0KYGBge3IgdmVyc2lvbnMsIGVjaG89RkFMU0V9DQojIFZlcnNpb25zIG9mIHVzZWQgcGFja2FnZXMNCnBhY2thZ2VzIDwtIGMoInJtYXJrZG93biIsICJrbml0ciIpDQpuYW1lcyhwYWNrYWdlcykgPC0gcGFja2FnZXMNCmxhcHBseShwYWNrYWdlcywgcGFja2FnZVZlcnNpb24pDQpgYGANCg0KIyMjIE15IGVudmlyb21lbnQNCg0KYGBge3IgbXlSLCBlY2hvPUZBTFNFfQ0KIyBXaGF0IGlzIG15IFIgdmVyc2lvbj8NCnZlcnNpb25bWyd2ZXJzaW9uLnN0cmluZyddXQ0KYGBgDQoNCiMjIDEuIEludHJvZHVjdGlvbg0KDQoNClp5Y3p5bnNrYS1DbG9sZWsgYW5kIEtvbGN6eW5za2EgKDIwMjEpIGNsYWltIHRoYXQgd2hlbiBjb250cm9sbGluZyBhdCB0aGUgcmVzcG9uZGVudHPigJkgbGV2ZWwgZm9yIOKAmGNvZ25pdGl2ZSwgcGh5c2ljYWwsIGFuZCBwc3ljaG9sb2dpY2FsIGZ1bmN0aW9uaW5n4oCZIChaeWN6eW5za2EtQ2xvbGVrIGFuZCBLb2xjenluc2thLCAyMDIxLCBwLjQ2NikgYW5kIOKAmHVuZGVzaXJhYmxlIHJlc3BvbnNlIHN0eWxlc+KAmSAoWnljenluc2thLUNsb2xlayBhbmQgS29sY3p5bnNrYSwgMjAyMSwgcC40NjYpIHRoZSB5b3VuZ2VyIHRoZSBpbnRlcnZpZXdlciBpcyB0aGUgc3Ryb25nZXIgdGhlIG5lZ2F0aXZlIGVmZmVjdCBvbiB0aGUgYXNzZXNzbWVudCBvZiB0aGUgcmVzcG9uZGVudHPigJkgdW5kZXJzdGFuZGluZyBvZiBzdXJ2ZXkgcXVlc3Rpb25zIChaeWN6eW5za2EtQ2xvbGVrIGFuZCBLb2xjenluc2thKS4gVGhpcyB2YXJpYWJsZSBpcyBtZWFzdXJlZCBvbiA1LXBvaW50IHNjYWxlIHdpdGggNSBtZWFuaW5nIHRoZSBpbnRlcnZpZXdlciBhc3Nlc3NlZCB0aGUgcmVzcG9uZGVudCBhcyB1bmRlcnN0YW5kaW5nIHRoZSBzdXJ2ZXkgcXVlc3Rpb25zIOKAmHZlcnkgb2Z0ZW7igJkgKFp5Y3p5bnNrYS1DbG9sZWsgYW5kIEtvbGN6eW5za2EsIDIwMjEsIHAuNDY0KSBhbmQgMSBtZWFuaW5nIHRoZSBpbnRlcnZpZXdlciBhc3Nlc3NlZCB0aGUgcmVzcG9uZGVudCBhcyB1bmRlcnN0YW5kaW5nIHRoZSBzdXJ2ZXkgcXVlc3Rpb25zIOKAmG5ldmVy4oCZIChaeWN6eW5za2EtQ2xvbGVrIGFuZCBLb2xjenluc2thLCAyMDIxLCBwLjQ2NCkuIA0KSG93ZXZlciwgWnljenluc2thLUNsb2xlayBhbmQgS29sY3p5bnNrYeKAmXMgKDIwMjEpIG5vdGUgdGhhdCDigJh0aGUgcm9sZSBvZiBjdWx0dXJhbCBkaWZmZXJlbmNlc+KAmSAoWnljenluc2thLUNsb2xlayBhbmQgS29sY3p5bnNrYSwgMjAyMSwgcC40NzMpIHN0aWxsIOKAmHJlbWFpbnMgdG8gYmUgZXhwbG9yZWTigJkgKFp5Y3p5bnNrYS1DbG9sZWsgYW5kIEtvbGN6eW5za2EsIDIwMjEsIHAuNDczKS4gRnVydGhlcm1vcmUsIHByZXZpb3VzIHJlc2VhcmNoIHN1Z2dlc3RzIHRoZXJlIGlzIGEgbGluayBiZXR3ZWVuIGN1bHR1cmUgYW5kIGl0c+KAmSBpbmZsdWVuY2Ugb24gdGhlIHBlcmNlcHRpb25zIG9mIG9sZGVyIHBlb3BsZSAoTm9ydGggYW5kIEZpc2tlLCAyMDE4KS4gRm9yIGV4YW1wbGUsIE5vcnRoIGFuZCBGaXNrZSAoMjAxOCksIGFyZ3VlZCBpbiB0aGVpciByZXNlYXJjaCB0aGF0IEV1cm9wZWFuIGN1bHR1cmVzIHJlc3BlY3Qgb2xkZXIgcGVvcGxlIGxlc3Mgc28gdGhhbiBFYXN0ZXJuIGN1bHR1cmVzLiBUaGlzIGNvdWxkIG1lYW4gdGhhdCBjb3VudHJpZXMgaW4gdGhlIEV1cm9wZWFuIFNvY2lhbCBTdXJ2ZXkgKEV1cm9wZWFuIFNvY2lhbCBTdXJ2ZXksIDIwMTcpLCB0aGF0IGFyZSBpbiBXZXN0IEFzaWEgKGUuZy4sIElzcmFlbCAoVW5pdGVkIE5hdGlvbnMsIDIwMjMpKSBtYXkgaGF2ZSBpbnRlcnZpZXdlcnPigJkgd2hvIHJhdGUgb2xkZXIgcmVzcG9uZGVudHMgdW5kZXJzdGFuZGluZyBvZiBzdXJ2ZXkgcXVlc3Rpb25zIG1vcmUgZmF2b3VyYWJseSB0aGFuIHRob3NlIGZyb20gRXVyb3BlIOKAkyBoZW5jZSBjdWx0dXJlIGluZmx1ZW5jaW5nIHRoZWlyIHdvcmxkIHZpZXcgKEJ1cm5oYW0sIDIwMDYpIGFuZCB0aGVyZWZvcmUsIGluZmx1ZW5jaW5nIHRoZSB3YXkgdGhleSBhc3Nlc3MgcmVzcG9uZGVudHMuIEFkZGluZyB0byB0aGlzLCBGZXJuYWRlei1CYWxsZXN0ZXJlcyAoMjAyMCkgcmVwb3J0ZWQgdGhhdCA5MCUgKDIucy5mLikgb2YgdGhlIEV1cm9wZWFuIGNvdW50cmllcyB0aGV5IGFuYWx5c2VkIHZpZXdlZCBvbGRlciBwZW9wbGUgYXMgYmVpbmcgZnJpZW5kbHkgcmF0aGVyIHRoYW4gYmVpbmcgY29tcGV0ZW50LiBUaGV5IGFsc28gcmVwb3J0ZWQgdGhhdCBjb3VudHJpZXMgc3VjaCBhcyBSdXNzaWEgYW5kIFJvbWFuaWEgdmlld2VkIG9sZGVyIHBlb3BsZSBhcyBiZWluZyBjb21wZXRlbnQgcmF0aGVyIHRoYW4gYmVpbmcgZnJpZW5kbHkgKEZlcm5hZGV6LUJhbGxlc3RlcmVzLCAyMDIwKS4gVGhpcyBwb3RlbnRpYWxseSBzdWdnZXN0cyB0aGF0IEVhc3Rlcm4gRXVyb3BlYW4gY291bnRyaWVzIGxpa2UgUnVzc2lhL1JvbWluYSAoVW5pdGVkIE5hdGlvbnMsIDIwMjMpIG1heSBhbHNvIGhhdmUgY3VsdHVyYWwgaW5mbHVlbmNlcyBvbiBwZXJjZXB0aW9ucyBvZiBvbGRlciBwZW9wbGUgYW5kIGhlbmNlIG1heSBoYXZlIGludGVydmlld2Vyc+KAmSB3aG8gcmF0ZSBvbGRlciByZXNwb25kZW50cyB1bmRlcnN0YW5kaW5nIG9mIHN1cnZleSBxdWVzdGlvbnMgbW9yZSBmYXZvdXJhYmx5IHRoYW4gdGhvc2UgZnJvbSB0aGUgcmVzdCBvZiB0aGUgY29udGluZW50IG9mIEV1cm9wZS4gQnVpbGRpbmcgb24gdGhpcywgV2hpdGUsIE11dGh1a3Jpc2huYSwgYW5kIE5vcmVuemF5YW4gKDIwMjEpIGZvdW5kIHRoYXQgaXJyZXNwZWN0aXZlIG9mIHJlbGlnaW91cyBiZWxpZWZzIGNvdW50cmllcyB3aGljaCBhcmUgcmVsaWdpb3VzIGFyZSBtb3JlIGN1bHR1cmFsbHkgc2ltaWxhciB0aGFuIHRob3NlIHdobyBhcmUgbm90LiBUaGlzIHBvdGVudGlhbGx5IHN1Z2dlc3RzIHRoYXQgcmVsaWdpb3VzIGNvdW50cmllcyBtYXkgc2hhcmUgYSBtb3JlIHNpbWlsYXIgd29ybGQgdmlldyAoQnVybmhhbSwgMjAwNikgdGhhbiB0byB0aG9zZSB3aG8gYXJlIG5vdCwgZm9yIGV4YW1wbGUsIFdoaXRlLCBNdXRodWtyaXNobmEsIGFuZCBOb3JlbnpheW4gKDIwMjEpIGZvdW5kIHRoYXQgcmVsaWdpb3VzIGNvdW50cmllcyBoYXZlIGdyZWF0ZXIgdGllcyB0byBmYW1pbHkgdGhhbiBub24tcmVsaWdpb3VzIGNvdW50cmllcyDigJMgdGhpcyBjb3VsZCBwb3RlbnRpYWxseSBtZWFuIHRoYXQgdGhlc2UgY291bnRyaWVzIHNoYXJlIGEgbW9yZSBzaW1pbGFyIHBlcmNlcHRpb24gb2YgdGhlIG9sZGVyIGdlbmVyYXRpb24gYW5kIGhlbmNlIGludGVydmlld2Vyc+KAmSBmcm9tIHRoZXNlIGNvdW50cmllcyBtYXkgc2hhcmUgc2ltaWxhciBiaWFzZXMgd2hlbiBhc3Nlc3NpbmcgcmVzcG9uZGVudHMuIEV3ZW4sIE5pa3phZC1UZXJodW5lLCBhbmQgRGFzc2VsICgyMDIwKSBhbHNvIGZvdW5kIGEgbGluayBiZXR3ZWVuIHJlbGlnaW91cyBiZWxpZWZzIGJlaW5nIGFuIGluZGljYXRvciBmb3IgY3VsdHVyYWwgdmFsdWVzIGFyb3VuZCBhZ2luZy4gVGhleSBmb3VuZCB0aGF0IG1vc3QgcmVsaWdpb3VzIHNvY2lldGllcyBhcmUgbGlrZWx5IHRvIGhhdmUgYSBwb3NpdGl2ZSB2aWV3cG9pbnQgb2YgYWdpbmcgd2l0aCB0aGlzIGJlaW5nIGluY3JlYXNlZCB3aGVuIHRoZSByZWxpZ2lvc2l0eSBhdCBib3RoIHRoZSBpbmR1dmlhbCBhbmQgc29jaWV0YWwgbGV2ZWwgaXMgYW1wbGlmaWVkIChFd2VuLCBOaWt6YWQtVGVyaHVuZSwgYW5kIERhc3NlbCwgMjAyMCkuIFRoZXkgY29tcGFyZWQgdGhpcyB0byB3ZXN0ZXJuIGN1bHR1cmVzIHN1Y2ggYXMgdGhlIE5vcnRoIGFuZCBXZXN0IEV1cm9wZSB3aGVyZSBjb3VudHJpZXMgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIHNlY3VsYXIgKENvdXRpbmhvLCAyMDE2KSBhbmQgZm91bmQgdGhhdCB0aGVzZSBjb3VudHJpZXMgYXJlIG1vcmUgbGlrZWx5IHRvIGhhdmUgYSBuZWdhdGl2ZSBwZXJjZXB0aW9uIG9mIGFnaW5nIChFd2VuLCBOaWt6YWQtVGVyaHVuZSwgYW5kIERhc3NlbCwgMjAyMCkuIFRoaXMgcG90ZW50aWFsbHkgc3VnZ2VzdHMgdGhhdCBjb3VudHJpZXMgd2l0aCBzaW1pbGFyIGxldmVscyBvZiByZWxpZ2lvc2l0eSBoYXZlIG1vcmUgc2ltaWxhciBjdWx0dXJlcyBhbmQgaGVuY2UgbWF5IGhhdmUgbW9yZSBzaW1pbGFyIHdvcmxkIHZpZXdzIHdoZW4gaXQgY29tZXMgdG8gdGhlIHBlcmNlcHRpb25zIG9mIG9sZGVyIHBlb3BsZSBhbmQgYXNzZXNzaW5nIHJlc3BvbmRlbnRz4oCZIGFiaWxpdHkgdG8gdW5kZXJzdGFuZCBzdXJ2ZXkgcXVlc3Rpb25zLiBJbiBhZGRpdGlvbiB0byB0aGlzLCBDb3V0aW5obyAoMjAxNikgZm91bmQgdGhhdCBjb3VudHJpZXMgaW4gV2VzdCBBc2lhIChVbml0ZWQgTmF0aW9ucywgMjAyMykgc3VjaCBhcyBUdXJrZXkgaGF2ZSB0aGUgaGlnaGVzdCBsZXZlbHMgb2YgcmVsaWdpb3NpdHkgd2l0aCBzb21lIGNvdW50cmllcyBmcm9tIHRoZSBTb3V0aCBvZiBFdXJvcGUgYWxzbyBoYXZpbmcgdmVyeSBoaWdoIGxldmVscyBvZiByZWxpZ2lvc2l0eSBzdWNoIGFzIEtvc292by4gVGhleSBmb3VuZCB0aGF0IG90aGVyIGNvdW50cmllcyBpbiBTb3V0aCBhbmQgRWFzdCBFdXJvcGUgKGUuZy4sIEdyZWVjZSBhbmQgUm9tYW5pYSksIGFsc28gaGF2ZSBmYWlybHkgaGlnaCBsZXZlbHMgb2YgcmVsaWdpb3NpdHkgYW5kIHRoYXQgdGhlIGNvdW50cmllcyB3aXRoIHRoZSBsb3dlc3QgbGV2ZWxzIG9mIHJlbGlnaW9zaXR5IHdlcmUgY29uY2VudHJhdGVkIGluIE5vcnRoZXJuIEV1cm9wZSAoZS5nLiwgU3dlZGVuKSBhbmQgU2FoZ2FsICgyMDE4KSBmb3VuZCB0aGF0IHNlY3VsYXJpc2F0aW9uIGlzIGFsc28gd2lkZXNwcmVhZCBpbiBXZXN0ZXJuIEV1cm9wZS4gVGhpcyB0aGVyZWZvcmUsIHBvdGVudGlhbGx5IHNldHMgdGhlIHByZW1pc2UgZm9yIGV4dGVuZGluZyBaeWN6eW5za2EtQ2xvbGVrIGFuZCBLb2xjenluc2th4oCZcyAoMjAyMSkgY2xhaW0gc3RhdGVkIGFib3ZlIGFzIHRoZXJlIGlzIHBvdGVudGlhbGx5IGFuIGFyZ3VtZW50IHRoYXQgY3VsdHVyYWwgc2ltaWxhcml0aWVzIG1lYXN1cmVkIHZpYSByZWxpZ2lvc2l0eSBsZXZlbHMgb2YgZGlmZmVyZW50IHJlZ2lvbnMgb2YgdGhlIGNvdW50cmllcyBpbiB0aGUgRXVyb3BlYW4gU29jaWFsIFN1cnZleSBpbXBhY3RzIGludGVydmlld2Vy4oCZc+KAmSB3b3JsZCB2aWV3cyBhcm91bmQgcGVyY2VwdGlvbnMgb2YgYWdpbmcvb2xkZXIgcGVvcGxlIGFuZCBoZW5jZSB0aGVpciBiaWFz4oCZcyB3aGVuIGFzc2Vzc2luZyByZXNwb25kZW50c+KAmSBhYmlsaXR5IHRvIHVuZGVyc3RhbmQgc3VydmV5IHF1ZXN0aW9ucy4gDQoNClRoZXJlZm9yZSwgdGhpcyByZXBsaWNhdGlvbiBwcm9qZWN0IGFpbXMgdG8gZXhwbG9yZSB0aGUgcm9sZSBvZiBjdWx0dXJhbCBkaWZmZXJlbmNlcyBtZWFzdXJlZCB2aWEgcmVsaWdpb3NpdHkgYXQgdGhlIHJlZ2lvbmFsIGxldmVsIGluIGFmZmVjdGluZyBpbnRlcnZpZXdlcnPigJkgYXNzZXNzbWVudCBvZiByZXNwb25kZW50c+KAmSB1bmRlcnN0YW5kaW5nIG9mIHN1cnZleSBxdWVzdGlvbnMuIE5vdGUgaW4gb3JkZXIgdG8gZGl2aWRlIHRoZSBjb3VudHJpZXMgaW52b2x2ZWQgaW4gdGhlIEV1cm9wZWFuIFNvY2lhbCBTdXJ2ZXkgdGhlIFVuaXRlZCBOYXRpb25zIGdlby1zY2hlbWUgd2FzIHVzZWQg4oCTIGRpdmlkaW5nIHRoZSBjb3VudHJpZXMgaW4gdGhlIGRhdGFzZXQgaW50bzogTm9ydGhlcm4gRXVyb3BlLCBTb3V0aGVybiBFdXJvcGUsIFdlc3Rlcm4gRXVyb3BlLCBFYXN0ZXJuIEV1cm9wZSwgYW5kIFdlc3QgQXNpYSAoVW5pdGVkIE5hdGlvbnMsIDIwMjMpLiBJdCB3aWxsIGRvIHRoaXMgYnkgYXNzZXNzaW5nIHRoZSBmb2xsb3dpbmcgaHlwb3RoZXNpczogVGhlIGxlc3NlciB0aGUgcmVsaWdpb3NpdHkgb2YgYSBjb3VudHJ5IGF0IHRoZSByZWdpb25hbCBsZXZlbCwgdGhlIHN0cm9uZ2VyIHRoZSBuZWdhdGl2ZSBlZmZlY3Qgb24gdGhlIHZhcmlhYmxlIHdoaWNoIG1lYXN1cmVzIHRoZSBpbnRlcnZpZXdlcnPigJkgYXNzZXNzbWVudCBvZiBob3cgd2VsbCBhIHJlc3BvbmRlbnQgdW5kZXJzdG9vZCB0aGUgc3VydmV5IHF1ZXN0aW9ucy4gDQoNClRoaXMgcmVwbGljYXRpb24gcHJvamVjdCB3aWxsIHRoZXJlZm9yZSB0ZXN0IHRoZSByb2J1c3RuZXNzIG9mIFp5Y3p5bnNrYS1DbG9sZWsgYW5kIEtvbGN6eW5za2HigJlzICgyMDIxKSByZXNlYXJjaCBwYXBlciBhcyB0aGlzIHJlcGxpY2F0aW9uIHByb2plY3Qgd2lsbCB1c2UgdGhlIHNhbWUgZGF0YSB1c2VkIHRvIHByb2R1Y2UgdGhlIG9yaWdpbmFsIHJlc3VsdHMgYnV0IHdpbGwgdXNlIGEgc2xpZ2h0bHkgZGlmZmVyZW50IG1ldGhvZCAoYnkgYWRkaW5nIGEgcmVsaWdpb3VzbHkgdmFyaWFibGUgYW5kIGdyb3VwaW5nIGNvdW50cmllcyB0byBjcmVhdGUgYSDigJhyZWdpb24gbGV2ZWzigJkpIHRvIGludmVzdGlnYXRlIGEgbmV3IGh5cG90aGVzaXMgKEZyZWVzZSBhbmQgUGV0ZXJzb24sIDIwMTcpLiANCg0KVGhpcyByZXBsaWNhdGlvbiBwcm9qZWN0IGV4cGVjdHMgdG8gZmluZCAoYXMgcHJlLXJlZ2lzdGVyZWQpOiBUaGUgbGVzc2VyIHRoZSByZWxpZ2lvc2l0eSBvZiBhIGNvdW50cnkgYXQgdGhlIHJlZ2lvbmFsIGxldmVsLCB0aGUgc3Ryb25nZXIgdGhlIG5lZ2F0aXZlIGVmZmVjdCBvbiB0aGUgaW50ZXJ2aWV3ZXJz4oCZIGFzc2Vzc21lbnQgb2YgaG93IHdlbGwgYSByZXNwb25kZW50IHVuZGVyc3Rvb2QgdGhlIHN1cnZleSBxdWVzdGlvbnMuDQoNCg0KDQojIyAyLiBEYXRhIGFuZCBtZXRob2RzDQoNCiMjIyAyLjEuIERhdGENCg0KDQoNClp5Y3p5bnNrYS1DbG9sZWsgYW5kIEtvbGN6eW5za2EgKDIwMjEpIHVzZWQgdGhlIGRhdGEgZnJvbSBXYXZlIDggb2YgdGhlIEV1cm9wZWFuIFNvY2lhbCBTdXJ2ZXkuIFRoaXMgZGF0YXNldCB3YXMgY3JlYXRlZCBpbiAyMDE2IGFuZCBpbmNsdWRlcyAyMyBjb3VudHJpZXMgKGkuZS4sIOKAmEF1c3RyaWEsIEJlbGdpdW0sIEN6ZWNoaWEsIEVzdG9uaWEsIEZpbmxhbmQsIEZyYW5jZSwgR2VybWFueSwgSHVuZ2FyeSwgSWNlbGFuZCwgSXJlbGFuZCwgSXNyYWVsLCBJdGFseSwgTGl0aHVhbmlhLCB0aGUgTmV0aGVybGFuZHMsIE5vcndheSwgUG9sYW5kLCBQb3J0dWdhbCwgUnVzc2lhLCBTbG92ZW5pYSwgU3BhaW4sIFN3ZWRlbiwgU3dpdHplcmxhbmQsIGFuZCB0aGUgVW5pdGVkIEtpbmdkb23igJkoWnljenluc2thLUNsb2xlayBhbmQgS29sY3p5bnNrYSwgMjAyMSwgcC40NjQuKSBhYm91dCB0aGVpciBhdHRpdHVkZXMgdG93YXJkcyB3ZWxmYXJlIGFuZCBjbGltYXRlIGNoYW5nZSAoRXVyb3BlYW4gc29jaWFsIHN1cnZleSwgMjAxNykuIFRoZSBzYW1lIGRhdGFzZXQgd2FzIHVzZWQgaW4gdGhpcyByZXBsaWNhdGlvbiBwcm9qZWN0IGFuZCBjYW4gYmUgZm91bmQgdXNpbmcgdGhlIGZvbGxvd2luZyBjaXRhdGlvbjogRVNTIFJvdW5kIDg6IEV1cm9wZWFuIFNvY2lhbCBTdXJ2ZXkgUm91bmQgOCBEYXRhICgyMDE2KS4gRGF0YSBmaWxlIGVkaXRpb24gMi4yLiBTaWt0IC0gTm9yd2VnaWFuIEFnZW5jeSBmb3IgU2hhcmVkIFNlcnZpY2VzIGluIEVkdWNhdGlvbiBhbmQgUmVzZWFyY2gsIE5vcndheSDigJMgRGF0YSBBcmNoaXZlIGFuZCBkaXN0cmlidXRvciBvZiBFU1MgZGF0YSBmb3IgRVNTIEVSSUMuIGRvaToxMC4yMTMzOC9OU0QtRVNTOC0yMDE2LiANCg0KYGBge3IgbG9hZGluZy1kYXRhLCByZXN1bHRzPSdoaWRlJ30NCkVTUzhlMDJfMiA8LSByZWFkX3Nhdigifi9Vbml2ZXJzaXR5L1NlY29uZCBZZWFyL1NNSS9JbnRlcm1lZGlhdGUgUmVzZWFyY2ggUHJvamVjdCBpbiBRdWFudGl0YXRpdmUgU29jaWFsIFNjaWVuY2UgKFNNSTIwNSkvQXNzZXNzbWVudCAyL1JlcGxpY2F0aW9uIFByb2plY3QgRGF0YS9FU1M4ZTAyXzIuc2F2ICgxKS9FU1M4ZTAyXzIuc2F2IikNCg0KRVNTOElOVGUwMiA8LSByZWFkX3Nhdigifi9Vbml2ZXJzaXR5L1NlY29uZCBZZWFyL1NNSS9JbnRlcm1lZGlhdGUgUmVzZWFyY2ggUHJvamVjdCBpbiBRdWFudGl0YXRpdmUgU29jaWFsIFNjaWVuY2UgKFNNSTIwNSkvQXNzZXNzbWVudCAyL1JlcGxpY2F0aW9uIFByb2plY3QgRGF0YS9FU1M4SU5UZTAyLnNhdiAoMSkvRVNTOElOVGUwMi5zYXYiKQ0KYGBgDQoNCmBgYHtyIHJlbmFtaW5nLWRhdGEsIGluY2x1ZGU9RkFMU0V9DQplc3M4IDwtIEVTUzhlMDJfMg0KaW50ZXJ2IDwtIEVTUzhJTlRlMDIgDQpgYGANCg0KVGhlIHNhbXBsZSBpbmNsdWRlcyAzLDA2NyBpbnRlcnZpZXdlcnMgKDMsMDQ2IGFmdGVyIGRhdGEgdHJhbnNmb3JtYXRpb24gZm9yIGJvdGggb3JpZ2luYWwgYW5kIHRoaXMgcmVwbGljYXRpb24gcGFwZXIpIGFuZCA0NCwzODcgcmVzcG9uZGVudHMgKDQyLDcyNCBhZnRlciBkYXRhIHRyYW5zZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgcGFwZXIgYW5kIDQyLDE5MCBmb3IgdGhpcyByZXBsaWNhdGlvbiBwYXBlcikgKEV1cm9wZWFuIFNvY2lhbCBTdXJ2ZXksIDIwMTc7IFp5Y3p5bnNrYS1DbG9sZWsgYW5kIEtvbGN6eW5za2EsIDIwMjEpKS4gDQoNClRoaXMgcmVwbGljYXRpb24gcHJvamVjdCB1c2VzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOg0KDQorICAgcmVzcF91bmQ6IHRoZSB2YXJpYWJsZSB3aGljaCBtZWFzdXJlcyB0aGUgaW50ZXJ2aWV3ZXJz4oCZIGFzc2Vzc21lbnQgb2YgcmVzcG9uZGVudHMgdW5kZXJzdGFuZGluZyBvZiBzdXJ2ZXkgcXVlc3Rpb25zIG9uIGEgNSBwb2ludCBzY2FsZSAod2l0aCA1IGJlaW5nIHRoZSByZXNwb25kZW50IHVuZGVyc3RhbmRzIHRoZSBtb3N0KS4NCisgIGFnZWE6IHRoZSBhZ2Ugb2YgdGhlIHJlc3BvbmRlbnRzICh5ZWFycykNCisgIGludGFnZWE6IHRoZSBhZ2Ugb2YgdGhlIGludGVydmlld2VycyAoeWVhcnMpDQorICBjbnRyeTogY291bnRyeQ0KKyAgbG5naG9tMTogbGFuZ3VhZ2Ugc3Bva2VuIG1vc3RseSBhdCBob21lIGJ5IHJlc3BvbmRlbnQgDQorICBpbnRsbmdhOiBsYW5ndWFnZSBpbnRlcnZpZXcgaXMgY29uZHVjdGVkIGluDQorICBzY2xtZWV0OiBob3cgb2Z0ZW4gcmVzcG9uZGVudCBtZWV0cyB3aXRoIGZyaWVuZHMsIGZhbWlseSwgb3Igd29yayBjb2xsZWFndWVzIHNvY2lhbGx5IA0KKyAgaGVhbHRoOiBzZWxmLXJhdGVkIGhlYWx0aCBzY29yZSAod2l0aCAxIGJlaW5nIHRoZSBiZXN0IGFuZCA0IHRoZSB3b3JzdCkNCisgIGludG51bTogaW50ZXJ2aWV3ZXJz4oCZIGlkZW50aWZpY2F0aW9uIG51bWJlcg0KKyAgZWlzY2VkOiBoaWdoZXN0IGxldmVsIG9mIGVkdWNhdGlvbiBjb21wbGV0ZWQgKHdpdGggNyBiZWluZyB0aGUgbW9zdCBlZHVjYXRlZCBhbmQgMSBiZWluZyB0aGUgbGVhc3QpDQorICBybGdkZ3I6IHJlbGlnaW9zaXR5IG9mIHRoZSByZXNwb25kZW50IA0KDQpTdGVwcyB1bmRlcnRha2VuIGluIGRhdGEgdHJhbnNmb3JtYXRpb246DQoNCjEuCU1lcmdlZCB0aGUgaW50ZWdyYXRlZCBpbnRlcnZpZXdlciBkYXRhIGZpbGUgd2l0aCB0aGUgaW50ZWdyYXRlZCBmaWxlLg0KMi4JU2V0IGFsbCB0aGUgbWlzc2luZyByZXNwb25zZXMgdG8gTkFzLg0KMy4JQ3JlYXRlIGEgZHVtbXkgdmFyaWFibGUgZm9yIHRoZSB2YXJpYWJsZSB3aGljaCBtZWFzdXJlcyB0aGUgaW50ZXJ2aWV3ZXJz4oCZIGFzc2Vzc21lbnQgb2YgcmVzcG9uZGVudHMgdW5kZXJzdGFuZGluZyBvZiBzdXJ2ZXkgcXVlc3Rpb25zIGFuZCBuYW1lIGl0IOKAmHJlc3BfdW5k4oCZLg0KNC4JQ3JlYXRlIGFnZSBncm91cHMgZm9yIGJvdGggaW50ZXJ2aWV3ZXJzIGFuZCByZXNwb25kZW50cyDigJMgdGhlc2UgdmFyaWFibGVzIGFyZSBuYW1lZCBhZ2VfaV9jYXQgYW5kIGFnZV9yX2NhdC4gDQo1LglDcmVhdGUgYSBkdW1teSB2YXJpYWJsZSBmb3IgaWYgdGhlIGludGVydmlldyB3YXMgY29uZHVjdGVkIGluIHRoZSByZXNwb25kZW50c+KAmSBsYW5ndWFnZSBzcG9rZW4gYXQgaG9tZSBhbmQgbmFtZSBpdCDigJhob21lbGFuZ+KAmS4NCjYuCVN3aXRjaGluZyBzcGVjaWZpYyB2YWx1ZXMgd2l0aCBuZXcgdmFsdWVzIGZvciB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczogc2NsbWVldCAobm93IG1lYXN1cmVkIDEtNCBhbmQgbmFtZWQg4oCYbWVldGZyaWVuZHPigJkpLCBoZWFsdGggKG5vdyBtZWFzdXJlZCA0LTEgYW5kIG5hbWVkIOKAmHNyaGVhbHRo4oCZKSwgZWlzY2VkIChub3cgbWVhc3VyZWQgMS0zIGFuZCBuYW1lZCBlZHVjMyAobWFkZSBhIGZhY3RvciB0b28pIOKAkyBhbHNvIGNyZWF0ZWQg4oCYZWR1Y+KAmSB3aGljaCBtZWFzdXJlcyB2YXJpYWJsZSDigJhlaXNjZWTigJkgMSAtNykuDQo3LglTZXBhcmF0ZWQgaW50ZXJ2aWV3ZXJzIGlkZW50aWZpY2F0aW9uIG51bWJlciBmcm9tIGNvdW50cnkgdG8gY3JlYXRlIHZhcmlhYmxlIOKAmGludF9pZOKAmS4NCjguCUNvbnN0cnVjdGVkIG1lYXN1cmVzIG9mIHJlc3BvbnNlIHN0eWxlczogbm9uLXJlc3BvbnNlIChuYW1lZCDigJhub25yZXNw4oCZKSwgZXh0cmVtZSByZXNwb25zZXMgKG5hbWVkIOKAmGV4dOKAmSksIG1pZGRsZSByZXNwb25zZXMgKG5hbWVkICdtaWTigJkpLCBhbmQgc3RyYWlnaHRsaW5pbmcgKG5hbWVkICdzdHJhaWdodOKAmSkuDQo5LglHZXR0aW5nIHJpZCBvZiBOQXMgaW4gZGF0YS4NCjEwLglNYWtpbmcgdGhlIHJlc3BvbmRlbnQgbGV2ZWwgdmFyaWFibGUg4oCYcmxnZGdy4oCZIGEgY291bnRyeSBsZXZlbCB2YXJpYWJsZSBieSBhZ2dlcmF0aW5nIGl0IGFuZCBuYW1pbmcgaXQg4oCYcmVsaWdpb25fbWVhbuKAmS4NCjExLglDYXRlZ29yaXNpbmcgdGhlIGNvdW50cmllcyBpbnRvIHJlZ2lvbnMgKE5vcnRoIEV1cm9wZTogRXN0b25pYSwgRmlubGFuZCwgVUssIElyZWxhbmQsIEljZWxhbmQsIExpdGh1YW5pYSwgTm9yd2F5LCBhbmQgU3dlZGVuOyBFYXN0ZXJuIEV1cm9wZTogUnVzc2lhLCBQb2xhbmQsIEh1bmdhcnksIGFuZCBDemVjaGlhOyBTb3V0aGVybiBFdXJvcGU6IFNwYWluLCBJdGFseSwgUG9ydHVnYWwsIGFuZCBTbG92ZW5pYTsgV2VzdGVybiBFdXJvcGU6IE5ldGhlcmxhbmRzLCBGcmFuY2UsIEdlcm1hbnksIFN3aXR6ZXJsYW5kLCBCZWxnaXVtLCBhbmQgQXVzdHJpYTsgV2VzdCBBc2lhOiBJc3JhZWwgKFVuaXRlZCBOYXRpb25zLCAyMDIzKSkgYW5kIG5hbWluZyB0aGUgdmFyaWFibGUg4oCYcmVnaW9u4oCZLiANCg0KYGBge3IgZGF0YS10cmFuc2Zvcm1hdGlvbiwgcmVzdWx0cz0naGlkZSd9DQplc3M4IDwtIGVzczggJT4lDQogIHphcF9sYWJlbHMoKSAlPiUNCiAgZnVsbF9qb2luKC4sIGludGVydiwgYnkgPSBjKCJpZG5vIiwgImNudHJ5IikpDQpgYGANCg0KDQpgYGB7ciBkYXRhLXRyYW5zZm9ybWF0aW9uMiwgaW5jbHVkZT1GQUxTRX0NCmVzc19jbGVhbiA8LSByZWNvZGVfbWlzc2luZ3MoZXNzOCkgJT4lDQogIG11dGF0ZShyZXNwX3VuZCA9IGlmZWxzZShyZXN1bmRxID09IDUsIDEsIDApLA0KICAgICAgICAgYWdlX3JfY2F0ID0gY3V0KGFnZWEsIGMoMTUsMjYsNDEsNTYsNzEsMTAxKSwgcmlnaHQgPSBGQUxTRSksDQogICAgICAgICBhZ2VfaV9jYXQgPSBjdXQoaW50YWdlYSwgYygxNywyNiw0MSw1Niw3MSw5MCksIHJpZ2h0ID0gRkFMU0UpLA0KICAgICAgICAgaG9tZWxhbmcgPSBpZmVsc2UoKGNudHJ5ID09ICJDSCIgJiBsbmdob20xID09ICJHU1ciICYgaW50bG5nYSA9PSAiR0VSIikgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRsbmdhID09IGxuZ2hvbTEsIDEsIDApLA0KICAgICAgICAgbWVldGZyaWVuZHMgPSBwbHlyOjptYXB2YWx1ZXMoc2NsbWVldCwgYygxLDIsMyw0LDUsNiw3LDc3LDg4LDk5KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoMSwxLDIsMyw0LDUsNixOQSxOQSxOQSkpLA0KICAgICAgICAgc3JoZWFsdGggPSBwbHlyOjptYXB2YWx1ZXMoaGVhbHRoLCBjKDEsMiwzLDQsNSw3LDgsOSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKDQsMywyLDEsMSxOQSxOQSxOQSkpLA0KICAgICAgICAgaW50X2lkID0gcGFzdGUwKGNudHJ5LCBpbnRudW0pLA0KICAgICAgICAgZWR1YzMgPSBwbHlyOjptYXB2YWx1ZXMoZWlzY2VkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygwLCAxLDIsMyw0LDUsNiw3LDU1LE5BKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoTkEsMSwxLDIsMiwyLDMsMyxOQSxOQSkpLA0KICAgICAgICAgZWR1YyA9IHBseXI6Om1hcHZhbHVlcyhlaXNjZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoMCwgMSwyLDMsNCw1LDYsNyw1NSxOQSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoTkEsMSwyLDMsNCw1LDYsNyxOQSxOQSkpLA0KICAgICAgICAgZmVtYWxlID0gZ25kciAtIDEsDQogICAgICAgICBlZHVjMyA9IGZhY3RvcihlZHVjMykpICU+JQ0KICBzZWxlY3QoaWRubywgaW50X2lkLCBjbnRyeSwgcHNwd2dodCwgcmVzdW5kcSwgcmVzY2xxLCByZXNyZWxxLCByZXNiYWIsDQogICAgICAgICByZXNwX3VuZCwgYWdlX3JfY2F0LCBhZ2VfaV9jYXQsIGFnZWEsIGludGFnZWEsIGhvbWVsYW5nLCBmZW1hbGUsIGVkdWMzLCBlZHVjLA0KICAgICAgICAgbWVldGZyaWVuZHMsIHNyaGVhbHRoLCBybGdkZ3IpIA0KYGBgDQoNCmBgYHtyIGRhdGEtdHJhbnNmb3JtYXRpb24zLCBpbmNsdWRlPUZBTFNFfQ0KDQpjb2RlYm9vayA8LSByZWFkX2V4Y2VsKCJ+L1VuaXZlcnNpdHkvU2Vjb25kIFllYXIvU01JL0ludGVybWVkaWF0ZSBSZXNlYXJjaCBQcm9qZWN0IGluIFF1YW50aXRhdGl2ZSBTb2NpYWwgU2NpZW5jZSAoU01JMjA1KS9Bc3Nlc3NtZW50IDIvUmVwbGljYXRpb24gUHJvamVjdCBEYXRhL2NvZGVib29rLnhsc3giKQ0KDQphdHRpdHVkZXMgPC0gY29kZWJvb2sgJT4lDQogIGZpbHRlcighaXMubmEoZ3JvdXApKSAlPiUNCiAgc2VsZWN0KHZhcm5hbWUsIGdyb3VwKSANCg0Kc2NhbGUxMSA8LSBjb2RlYm9vayAlPiUNCiAgZmlsdGVyKGxlbmd0aCA9PSAxMSkgJT4lDQogIHNlbGVjdCh2YXJuYW1lKQ0KDQpzY2FsZTUgPC0gY29kZWJvb2sgJT4lDQogIGZpbHRlcihsZW5ndGggPT0gNSkgJT4lDQogIHNlbGVjdCh2YXJuYW1lKSANCg0Kc3RyYWlnaHQxIDwtIGNvZGVib29rICU+JSBmaWx0ZXIoc3RyYWlnaHQgPT0gMSkgJT4lIHNlbGVjdCh2YXJuYW1lKQ0Kc3RyYWlnaHQyIDwtIGNvZGVib29rICU+JSBmaWx0ZXIoc3RyYWlnaHQgPT0gMikgJT4lIHNlbGVjdCh2YXJuYW1lKQ0Kc3RyYWlnaHQzIDwtIGNvZGVib29rICU+JSBmaWx0ZXIoc3RyYWlnaHQgPT0gMykgJT4lIHNlbGVjdCh2YXJuYW1lKQ0KDQojIyMgbm9uLXJlc3BvbnNlIC0tLS0tLQ0KZXNzX2NsZWFuJG5vbnJlc3AgPC0gZXNzOCAlPiUNCiAgZHBseXI6OnNlbGVjdCh1bmlxdWUoYXR0aXR1ZGVzJHZhcm5hbWUpKSAlPiUNCiAgYXBwbHkoLiwgMSwgZnVuY3Rpb24oeCltZWFuKGlzLm5hKHgpKSoxMDApDQoNCmVzc19jbGVhbiRub25yZXNwX3N1bSA8LSBlc3M4ICU+JQ0KICBkcGx5cjo6c2VsZWN0KHVuaXF1ZShhdHRpdHVkZXMkdmFybmFtZSkpICU+JQ0KICBhcHBseSguLCAxLCBmdW5jdGlvbih4KW1lYW4oaXMubmEoeCkpKQ0KDQojIyMgTWlkZGxlIGNhdGVnb3J5IC0tLS0tDQplc3NfY2xlYW4kbWlkMTEgPC0gZXNzOCAlPiUNCiAgZHBseXI6OnNlbGVjdCh1bmlxdWUoc2NhbGUxMSR2YXJuYW1lKSkgJT4lDQogIG11dGF0ZV9hbGwoZnVucyhhcy5udW1lcmljKGlmZWxzZShpcy5uYSguKSwgOTksIC4pID09IDUpKSkgJT4lDQogIGFwcGx5KC4sIDEsIGZ1bmN0aW9uKHgpIG1lYW4oeCkqMTAwKQ0KDQplc3NfY2xlYW4kbWlkNSA8LSBlc3M4ICU+JQ0KICBkcGx5cjo6c2VsZWN0KHVuaXF1ZShzY2FsZTUkdmFybmFtZSkpICU+JQ0KICBtdXRhdGVfYWxsKGZ1bnMoYXMubnVtZXJpYyhpZmVsc2UoaXMubmEoLiksIDk5LCAuKSA9PSAzKSkpICU+JQ0KICBhcHBseSguLCAxLCBmdW5jdGlvbih4KSBtZWFuKHgpKjEwMCkNCg0KZXNzX2NsZWFuJG1pZCA8LSAoZXNzX2NsZWFuJG1pZDExICogMzggKyBlc3NfY2xlYW4kbWlkNSAqIDI5KS82Nw0KDQojIyMgRXh0cmVtZSBjYXRlZ29yeSAtLS0tLS0NCmVzc19jbGVhbiRleHQxMSA8LSBlc3M4ICU+JQ0KICBkcGx5cjo6c2VsZWN0KHVuaXF1ZShzY2FsZTExJHZhcm5hbWUpKSAlPiUNCiAgbXV0YXRlX2FsbChmdW5zKGFzLm51bWVyaWMoaWZlbHNlKGlzLm5hKC4pLCA5OSwgLikgJWluJSBjKDAsIDEwKSkpKSAlPiUNCiAgYXBwbHkoLiwgMSwgZnVuY3Rpb24oeCkgbWVhbih4KSoxMDApDQoNCmVzc19jbGVhbiRleHQ1IDwtIGVzczggJT4lDQogIGRwbHlyOjpzZWxlY3QodW5pcXVlKHNjYWxlNSR2YXJuYW1lKSkgJT4lDQogIG11dGF0ZV9hbGwoZnVucyhhcy5udW1lcmljKGlmZWxzZShpcy5uYSguKSwgOTksIC4pICVpbiUgYygxLCA1KSkpKSAlPiUNCiAgYXBwbHkoLiwgMSwgZnVuY3Rpb24oeCkgbWVhbih4KSoxMDApDQoNCmVzc19jbGVhbiRleHQgPC0gKGVzc19jbGVhbiRleHQxMSAqIDM4ICsgZXNzX2NsZWFuJGV4dDUgKiAyOSkgLyA2Nw0KDQojIyMgc3RyYWlnaHQgbGluaW5nIC0tLS0tLS0NCmVzc19jbGVhbiRzdHJhaWdodDEgPC0gdChhcHBseShlc3M4ICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChzdHJhaWdodDEkdmFybmFtZSksIDEsIGRpZmYpKSAlPiUNCiAgZGF0YS5mcmFtZSgpICU+JQ0KICBhcHBseSguLCAxLCBmdW5jdGlvbih4KSBtZWFuKGFicyh4KSwgbmEucm0gPSBUUlVFKSkNCg0KZXNzX2NsZWFuJHN0cmFpZ2h0MiA8LSB0KGFwcGx5KGVzczggJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KHN0cmFpZ2h0MiR2YXJuYW1lKSwgMSwgZGlmZikpICU+JQ0KICBkYXRhLmZyYW1lKCkgJT4lDQogIGFwcGx5KC4sIDEsIGZ1bmN0aW9uKHgpIG1lYW4oYWJzKHgpLCBuYS5ybSA9IFRSVUUpKQ0KDQplc3NfY2xlYW4kc3RyYWlnaHQzIDwtIHQoYXBwbHkoZXNzOCAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3Qoc3RyYWlnaHQzJHZhcm5hbWUpLCAxLCBkaWZmKSkgJT4lDQogIGRhdGEuZnJhbWUoKSAlPiUNCiAgYXBwbHkoLiwgMSwgZnVuY3Rpb24oeCkgbWVhbihhYnMoeCksIG5hLnJtID0gVFJVRSkpDQoNCmVzc19jbGVhbiRzdHJhaWdodCA8LSAoZXNzX2NsZWFuJHN0cmFpZ2h0MSArIGVzc19jbGVhbiRzdHJhaWdodDIgKyBlc3NfY2xlYW4kc3RyYWlnaHQzKS8zDQpgYGANCg0KYGBge3IgZGF0YS10cmFuc2Zvcm1hdGlvbjQsIGluY2x1ZGU9RkFMU0V9DQojIyMgR2V0dGluZyByaWQgb2YgTkFzIGluIGVzc19jbGVhbiBkYXRhDQpkYXRhX29taXQyIDwtIG5hLm9taXQoZXNzX2NsZWFuKQ0KYGBgDQoNCmBgYHtyIGRhdGEtdHJhbnNmb3JtYXRpb241LCByZXN1bHRzPSdoaWRlJ30NCiMjIyBNYWtpbmcgdGhlIGluZGl2aWR1YWwgbGV2ZWwgdmFyaWFibGUgJ0hvdyByZWxpZ2lvdXMgYXJlIHlvdT8nIGEgY291bnRyeSBsZXZlbCB2YXJpYWJsZSBieSB1c2luZyB0aGUgYXNzcmVnYXRpb24gbWV0aG9kDQpyZWxpZ2lvbiA8LSBhZ2dyZWdhdGUocmxnZGdyfmNudHJ5LGRhdGFfb21pdDIsbWVhbikNCg0KbmFtZXMocmVsaWdpb24pW25hbWVzKHJlbGlnaW9uKSA9PSAicmxnZGdyIl0gPC0gInJlbGlnaW9uX21lYW4iICNyZW5hbWluZyB2YXJpYWJsZQ0KDQpqb2ludGRhdGFzZXQgPC0gbWVyZ2UoZGF0YV9vbWl0MiwgcmVsaWdpb24sIGJ5ID0gJ2NudHJ5JykNCmBgYA0KDQpgYGB7ciBkYXRhLXRyYW5zZm9ybWF0aW9uNiwgcmVzdWx0cz0naGlkZSd9DQojIyMgUHV0dGluZyBjb3VudHJpZXMgaW50byByZWdpb25zIC0tLS0tLQ0Kam9pbnRkYXRhc2V0JHJlZ2lvbiA8LSByZWNvZGUoam9pbnRkYXRhc2V0JGNudHJ5LCBBVCA9ICJ3ZXN0ZXJuIiwgQkUgPSAid2VzdGVybiIsIENIID0gIndlc3Rlcm4iLCBDWiA9ICJlYXN0ZXJuIiwgREUgPSAid2VzdGVybiIsIEVFID0gIm5vcnRoZXJuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVMgPSAic291dGhlcm4iLCBGSSA9ICJub3J0aGVybiIsIEZSID0gIndlc3Rlcm4iLCBHQiA9ICJub3J0aGVybiIsIEhVID0gImVhc3Rlcm4iLCBJRSA9ICJub3J0aGVybiIsIElTID0gIm5vcnRoZXJuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUwgPSAid19haXNhIiwgSVQgPSAic291dGhlcm4iLCBMVCA9ICJub3J0aGVybiIsIE5MID0gIndlc3Rlcm4iLCBOTyA9ICJub3J0aGVybiIsIFBMID0gImVhc3Rlcm4iLCBQVCA9ICJzb3V0aGVybiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJVID0gImVhc3Rlcm4iLCBTRSA9ICJub3J0aGVybiIsIFNJID0gInNvdXRoZXJuIikNCmBgYA0KDQoNCmBgYHtyIGV4cG9ydGluZy1kYXRhLCBpbmNsdWRlPUZBTFNFfQ0KcmVwX2ZpbmFsX2RhdGEgPC0gam9pbnRkYXRhc2V0DQoNCmV4cG9ydChyZXBfZmluYWxfZGF0YSwgInJlcF9maW5hbF9kYXRhLmNzdiIpIA0KYGBgDQoNCg0KYGBge3IgU3VtbWFyeS1TdGF0aXN0aWNzLCBlY2hvPUZBTFNFfQ0KIyMjIyB2aXN1YWxpc2luZyB1bmRlcnN0YW5kaW5nIHBlciByZWdpb24gLS0tLS0tDQpib3gyIDwtIGdncGxvdChyZXBfZmluYWxfZGF0YSwgYWVzKHg9ZmFjdG9yKHJlZ2lvbiksIHk9cmVzdW5kcSkpKw0KICBnZW9tX2JveHBsb3QoKSsNCiAgdGhlbWUoIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiApICsgDQogIGdndGl0bGUoIkF2ZXJhZ2UgcmVzcG9uZG5ldHMnIHVuZGVyc3RhbmRpbmcgc2NvcmUgZ2l2ZW4gYnkgaW50ZXJ2aWV3ZXJzIHBlciByZWdpb24iKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygiRWFzdGVybiBFdXJvcGUiLCAiTm9ydGhlcm4gRXVyb3BlIiwgIlNvdXRoZXJuIEV1cm9wZSIsICJXZXN0IEFpc2EiLCAiV2VzdGVybiBFdXJvcGUiKSkNCg0KYm94MiArIGxhYnMoeCA9ICJSZWdpb24iLCB5ID0gIkF2ZXJhZ2UgcmVzcG9uZG5ldHMnIHVuZGVyc3RhbmRpbmcgc2NvcmUgZ2l2ZW4gYnkgaW50ZXJ2aWV3ZXJzIikNCg0KYGBgDQoNCg0KQm94cGxvdCAxLjE6IE5vcnRoZXJuLCBFYXN0ZXJuLCBTb3V0aGVybiwgYW5kIFdlc3Rlcm4gRXVyb3BlIGFsbCBoYXZlIHRoZSBzYW1lIG1lYW5zIChhcm91bmQgNSkgYW5kIGRpc3RyaWJ1dGlvbnMgKGludGVycXVhcnRpbGUgcmFuZ2Ugb2YgMSkuIFRoaXMgc3VnZ2VzdHMgdGhlcmUgaXMgbGl0dGxlIHZhcmlhbmNlIGluIHJlc3BvbmRlbnRzIHVuZGVyc3RhbmRpbmcgc3VydmV5IHF1ZXN0aW9ucyBzY29yZSBhbW9uZ3N0IEV1cm9wZS4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gdGhlcmUgb25seSBiZWluZyAyMyBjb3VudHJpZXMgaW4gdGhlIHNhbXBsZSDigJMgbWF5YmUgbW9yZSB2YXJpYW5jZXMgd291bGQgYmUgc2VlbiBpZiBtb3JlIGNvdW50cmllcyB3ZXJlIGluY2x1ZGVkLiBXZXN0IEFzaWEgaGFzIHRoZSBsb3dlc3QgbWVhbiByZXNwb25kZW50cyB1bmRlcnN0YW5kaW5nIHNjb3JlICg0KSBhbmQgdGhlIGhpZ2hlc3QgaW50ZXJxdWFydGlsZSByYW5nZSAoMikuIFRoaXMgc3VnZ2VzdHMgdGhhdCBpbiBXZXN0IEFzaWEgaW50ZXJ2aWV3ZXJzIG9uIGF2ZXJhZ2Ugc2NvcmUgcmVzcG9uZGVudHMgdW5kZXJzdGFuZGluZyBvZiBzdXJ2ZXkgcXVlc3Rpb25zIHRvIGJlIGxvd2VyIHRoYW4gRXVyb3BlLiBUaGlzIGdvZXMgYWdhaW5zdCB3aGF0IHdhcyBleHBlY3RlZCBpbiB0aGUgcHJlLXJlZ2lzdHJhdGlvbiBmb3JtLiBIb3dldmVyLCB0aGlzIGNvdWxkIGJlIGJlY2F1c2UgdGhpcyBzYW1wbGUgb25seSBpbmNsdWRlZCBJc3JhZWwgaW4gV2VzdCBBc2lhIChoZW5jZSB0aGlzIGlzIG5vdCByZXByZXNlbnRhdGl2ZSBvZiBXZXN0IEFzaWEpIGFzIG5vIGRhdGEgd2FzIGF2YWlsYWJsZSBmb3Igb3RoZXIgY291bnRyaWVzIGluIFdlc3QgQXNpYSBzdWNoIGFzIFR1cmtleS4gDQoNCg0KIyMjIDIuMi4gTWV0aG9kcw0KDQpUaGUgb3JpZ2luYWwgcGFwZXIgdXNlZCBhIDMgbGV2ZWwgbXVsdGktbGV2ZWwgbW9kZWwgKHJlc3BvbmRlbnRzIG5lc3RlZCBpbiBpbnRlcnZpZXdlcnMgbmVzdGVkIGluIGNvdW50cmllcykgd2l0aCByYW5kb20gaW50ZXJjZXB0cyBhdCB0aGUgaW50ZXJ2aWV3ZXIgYW5kIGNvdW50cnkgbGV2ZWwgKFp5Y3p5bnNrYS1DbG9sZWsgYW5kIEtvbGN6eW5za2EsIDIwMjEpLiBUaGlzIG1vZGVsIGRlc2NyaWJlZCBpcyBtb2RlbCA1IGluIHRoZSBwYXBlcjoNCg0KKyAgVGhlIGRlcGVuZGVudCB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIGludGVydmlld2Vyc+KAmSBhc3Nlc3NtZW50IG9mIHJlc3BvbmRlbnRz4oCZIHVuZGVyc3RhbmRpbmcgb2Ygc3VydmV5IHF1ZXN0aW9ucy4NCisgVGhlIG1haW4gaW5kZXBlbmRlbnQgdmFyaWFibGVzIGFyZSB0aGUgYWdlIG9mIHRoZSBpbnRlcnZpZXdlciBhbmQgcmVzcG9uZGVudC4NCisgIFRoZXkgY29udHJvbCBmb3IgcmVzcG9uZGVudHPigJkgbGV2ZWwgZm9yIOKAmGNvZ25pdGl2ZSwgcGh5c2ljYWwsIGFuZCBwc3ljaG9sb2dpY2FsIGZ1bmN0aW9uaW5n4oCZIChaeWN6eW5za2EtQ2xvbGVrIGFuZCBLb2xjenluc2thLCAyMDIxLCBwLjQ2NikgYW5kIOKAmHVuZGVzaXJhYmxlIHJlc3BvbnNlIHN0eWxlc+KAmSAoWnljenluc2thLUNsb2xlayBhbmQgS29sY3p5bnNrYSwgMjAyMSwgcC40NjYpLiANCg0KVGhpcyByZXBsaWNhdGlvbiBwcm9qZWN0IHdpbGwgdXNlIHRoZSBzYW1lIG1ldGhvZCBidXQgY2hhbmdlIHR3byBhc3BlY3RzOg0KDQorICBXaWxsIHVzZSBhIOKAmHJlZ2lvbuKAmSBsZXZlbCByYXRoZXIgdGhhbiBhIGNvdW50cnkgbGV2ZWwgdG8gYWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdCB0aG9zZSBmcm9tIHNpbWlsYXIgcmVnaW9ucyBhcmUgbW9yZSBsaWtlbHkgdG8gYmUgc2ltaWxhciB0aGFuIHRob3NlIGZyb20gb3RoZXIgcmVnaW9ucyBkdWUgdG8gcmVsaWdpb3VzIHNpbWlsYXJpdGllcyAoV2hpdGUsIE11dGh1a3Jpc2hhLCBhbmQgTm9yZW56YXlhbiwgMjAyMSkuIA0KKyAJV2lsbCBhZGQgdGhlIHJlZ2lvbiBsZXZlbCB2YXJpYWJsZSDigJhyZWxpZ2lvc2l0eeKAmSB0byBhY2NvdW50IGZvciB0aGUgaW1wYWN0IHRoYXQgcmVsaWdpb24gcGxheXMgaW4gaW5mbHVlbmNpbmcgZGlmZmVyZW50IGN1bHR1cmFsIHZhbHVlcywgd2hpY2ggbWF5IGluZmx1ZW5jZSB0aGUgd2F5IGludGVydmlld2VycyBpbnRlcnByZXQgcmVzcG9uZGVudHMgdW5kZXJzdGFuZGluZyBvZiBzdXJ2ZXkgcXVlc3Rpb25zIChFd2VuLCBOaWt6YWQtVGVyaHVuZSwgYW5kIERhc3NlbCwgMjAyMCkuIA0KDQoNCg0KIyMgMy4gUmVzdWx0cw0KDQpgYGB7ciBNdWx0aS1sZXZlbC1tb2RlbHMxLCBpbmNsdWRlPUZBTFNFfQ0KIyMjIE11bHRpLWxldmVsIG1vZGVscyAtLS0tLS0tLQ0KbTAgPC0gbG1lcihyZXN1bmRxIH4gMSArKDEgfCBpbnRfaWQpICsgKDEgfCByZWdpb24pLA0KICAgICAgICAgICB3ZWlnaHRzID0gcHNwd2dodCwgZGF0YSA9IHJlcF9maW5hbF9kYXRhKSAjbW9kZWwgMA0KDQpzdW1tYXJ5KG0wKQ0KDQptMSA8LSBsbWVyKHJlc3VuZHEgfiAxICsgYWdlX3JfY2F0ICsgKDEgfCBpbnRfaWQpICsgKDEgfCByZWdpb24pLA0KICAgICAgICAgICB3ZWlnaHRzID0gcHNwd2dodCwgZGF0YSA9IHJlcF9maW5hbF9kYXRhKSAjbW9kZSAxIC0gYWRkaW5nIGFnZSBvZiByZXNwb25kbmV0cw0KDQptMiA8LSBsbWVyKHJlc3VuZHEgfiAxICsgYWdlX3JfY2F0ICsgZmFjdG9yKGVkdWMzKSArICgxIHwgaW50X2lkKSArICgxIHwgcmVnaW9uKSwNCiAgICAgICAgICAgd2VpZ2h0cyA9IHBzcHdnaHQsIGRhdGEgPSByZXBfZmluYWxfZGF0YSkgI21vZGVsIDIgYWRkaW5nIGVkdWNhdGlvbg0KDQptMyA8LSBsbWVyKHJlc3VuZHEgfiAxICsgYWdlX3JfY2F0ICsgZmFjdG9yKGVkdWMzKSsgaG9tZWxhbmcgKyBmYWN0b3IobWVldGZyaWVuZHMpICsgZmFjdG9yKHNyaGVhbHRoKSArICgxIHwgaW50X2lkKSArICgxIHwgcmVnaW9uKSwNCiAgICAgICAgICAgd2VpZ2h0cyA9IHBzcHdnaHQsIGRhdGEgPSByZXBfZmluYWxfZGF0YSkNCg0KbTQgPC0gbG1lcihyZXN1bmRxIH4gMSArIGFnZV9yX2NhdCArIGZhY3RvcihlZHVjMykgKyBob21lbGFuZyArIA0KICAgICAgICAgICAgIGZhY3RvcihtZWV0ZnJpZW5kcykgKyBmYWN0b3Ioc3JoZWFsdGgpICsgDQogICAgICAgICAgICAgbm9ucmVzcCArIGV4dCArIG1pZCArIHN0cmFpZ2h0ICsNCiAgICAgICAgICAgICAoMSB8IGludF9pZCkgKyAoMSB8IHJlZ2lvbiksDQogICAgICAgICAgIHdlaWdodHMgPSBwc3B3Z2h0LCBkYXRhID0gcmVwX2ZpbmFsX2RhdGEpDQoNCm01IDwtIGxtZXIocmVzdW5kcSB+IDEgKyBhZ2Vfcl9jYXQgKyBhZ2VfaV9jYXQgKyBmYWN0b3IoZWR1YzMpICsgDQogICAgICAgICAgICAgaG9tZWxhbmcgKyBmYWN0b3IobWVldGZyaWVuZHMpICsgZmFjdG9yKHNyaGVhbHRoKSArIA0KICAgICAgICAgICAgIG5vbnJlc3AgKyBleHQgKyBtaWQgKyBzdHJhaWdodCArIA0KICAgICAgICAgICAgICgxIHwgaW50X2lkKSArICgxIHwgcmVnaW9uKSwNCiAgICAgICAgICAgd2VpZ2h0cyA9IHBzcHdnaHQsIGRhdGEgPSByZXBfZmluYWxfZGF0YSkNCg0KIG03IDwtIGxtZXIocmVzdW5kcSB+IDEgKyBhZ2Vfcl9jYXQgKyBhZ2VfaV9jYXQgKyBmYWN0b3IoZWR1YzMpICsgDQogICAgICAgICAgICAgIGhvbWVsYW5nICsgZmFjdG9yKG1lZXRmcmllbmRzKSArIGZhY3RvcihzcmhlYWx0aCkgKyANCiAgICAgICAgICAgICAgbm9ucmVzcCArIGV4dCArIG1pZCArIHN0cmFpZ2h0ICsgDQogICAgICAgICAgICAgICgxIHwgaW50X2lkKSArICgxIHwgY250cnkpLA0KICAgICAgICAgICAgd2VpZ2h0cyA9IHBzcHdnaHQsIGRhdGEgPSByZXBfZmluYWxfZGF0YSkgIyMgb3JpZ2luYWwgbW9kZWwNCmBgYA0KDQpgYGB7ciBtdWx0aS1sZXZlbC1tb2RlbDIsIHJlc3VsdHM9J2hpZGUnfQ0KbTYgPC0gbG1lcihyZXN1bmRxIH4gMSArIGFnZV9yX2NhdCArIGFnZV9pX2NhdCArIGZhY3RvcihlZHVjMykgKyANCiAgICAgICAgICAgICBob21lbGFuZyArIGZhY3RvcihtZWV0ZnJpZW5kcykgKyBmYWN0b3Ioc3JoZWFsdGgpICsgDQogICAgICAgICAgICAgbm9ucmVzcCArIGV4dCArIG1pZCArIHN0cmFpZ2h0ICsgcmVsaWdpb25fbWVhbiArIA0KICAgICAgICAgICAgICgxIHwgaW50X2lkKSArICgxIHwgcmVnaW9uKSwNCiAgICAgICAgICAgd2VpZ2h0cyA9IHBzcHdnaHQsIGRhdGEgPSByZXBfZmluYWxfZGF0YSkgDQogc3VtbWFyeShtNikNCmBgYA0KDQpgYGB7ciB0YWJsZSwgZWNobz1GQUxTRX0NCg0KdGFiX21vZGVsKG02LA0KICAgICAgICAgIHByZWQubGFiZWxzID0gYygiSW50ZXJjZXB0IiwgIlJlc3BvbmRlbnQncyBhZ2VkIDI2IC0gNDAiLCAiUmVzcG9uZGVudCdzIGFnZWQgNDEgLSA1NSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNwb25kZW50J3MgYWdlZCA1NiAtIDcwIiwgIlJlc3BvbmRlbnQncyBhZ2VkIDcxIC0gMTAwIiwgIkludGVydmlld2VyJ3MgYWdlZCAyNiAtIDQwIiwgIkludGVydmlld2VyJ3MgYWdlZCA0MSAtIDU1IiwgIkludGVydmlld2VyJ3MgYWdlZCA1NiAtIDcwIiwgIkludGVydmlld2VyJ3MgYWdlZCA3MSAtIDg5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICJDb21wbGV0ZWQgdXAgdG8gU2Vjb25kYXJ5IGFuZCBQb3N0LXNlY29uZGFyeSBub24tdGVydGlhcnkgRWR1Y2F0aW9uIiwgIkNvbXBsZXRlZCB1cCBUZXJ0aWFyeSBFZHVjYXRpb24iLCAiTGFuZ3VhZ2UgbWF0Y2giLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lZXRzIGZyaWVuZHMgb25jZSBhIG1vbnRoIiwgIk1lZXRzIGZyaWVuZHMgc2V2ZXJhbCB0aW1lcyBhIG1vbnRoIiwgIk1lZXRzIGZyaWVuZHMgb25jZSBhIHdlZWsiLCAiTWVldHMgZnJpZW5kcyBzZXZlcmFsIHRpbWVzIGEgd2VlayIsICJNZWV0cyBmcmllbmRzIGV2ZXJ5IGRheSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpciBoZWFsdGgiLCAiR29vZCBIZWFsdGgiLCAiVmVyeSBnb29kIGhlYWx0aCIsICJJdGVtIG5vbi1yZXNwb25zZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiRXh0cmVtZSBDYXRlZ29yaWVzIiwgIk1pZGRsZSBDYXRlZ29yaWVzIiwgIlN0cmFpZ2h0bGluaW5nIiwgIkF2ZXJhZ2UgZmFpdGggb2YgYSBjb3VudHJ5IiksDQogICAgICAgICAgZHYubGFiZWxzID0gYygiSW50ZXJ2aWV3ZXJzJyBhc3Nlc3NtZW50IG9mIHJlc3BvbmRlbnRzJyB1bmRlcnN0YW5kaW5nIG9mIHN1cnZleSBxdWVzdGlvbnMiKSkgDQoNCmBgYA0KDQpUYWJsZSAxLjEgc2hvd3MgdGhlIHJlc3VsdHMgb2YgdGhlIHJldmlzZWQgbXVsdGktbGV2ZWwgbW9kZWwgZGVzY3JpYmVkIGFib3ZlLg0KDQpUaGUgcmVzdWx0cyBvZiB0aGUgbXVsdGktbGV2ZWwgbW9kZWwgY3JlYXRlZCBmb3IgdGhpcyByZXBsaWNhdGlvbiBwcm9qZWN0IGFyZSBtb3N0bHkgdGhlIHNhbWUgYXMgdGhlIHJlc3VsdHMgZm91bmQgaW4gdGhlIG9yaWdpbmFsIHBhcGVyIHdyaXR0ZW4gYnkgWnljenluc2thLUNsb2xlayBhbmQgS29sY3p5bnNrYSAoMjAyMSkgaGF2ZSBtb3N0bHkgdGhlIHNhbWUgY29lZmZpY2llbnQgZXN0aW1hdGVzIGFzIHRoaXMgcmVwbGljYXRlZCBtb2RlbC4gSG93ZXZlciwgaXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBhbGwgb2YgdGhlIGNvZWZmaWNpZW50IGVzdGltYXRlcyBmb3IgdGhlIHByZWRpY3RvciB2YXJpYWJsZSDigJhhZ2Ugb2YgdGhlIGludGVydmlld2Vy4oCZIGhhdmUgc2xpZ2h0bHkgaW5jcmVhc2VkLiBGb3IgZXhhbXBsZSwgaW4gdGhlIG9yaWdpbmFsIHBhcGVyIHRoZSBjb2VmZmljaWVudCBlc3RpbWF0ZXMgZm9yIGludGVydmlld2VycyBhZ2VkIDI2LTQwIHllYXJzIGlzIDAuMTMgKDIucy5mLikgKFp5Y3p5bnNrYS1DbG9sZWsgYW5kIEtvbGN6eW5za2EsIDIwMjEsIHAuNDY5LiksIHdoZXJlYXMgaW4gdGhlIHJlcGxpY2F0ZWQgbW9kZWwgdGhpcyBoYXMgaW5jcmVhc2VkIHRvIDAuMTYuIFRoZSBzYW1lIHBhdHRlcm4gY2FuIGFsc28gYmUgc2VlbiBmb3IgdGhlIGNvZWZmaWNpZW50IGVzdGltYXRlcyBmb3IgaW50ZXJ2aWV3ZXJzIGFnZWQgNzEtODkgeWVhcnMgYXMgaW4gdGhlIG9yaWdpbmFsIHBhcGVyIHRoZSBjb2VmZmljaWVudCBlc3RpbWF0ZSB3YXMgMC4zMyAoMi5zLmYuKSAoWnljenluc2thLUNsb2xlayBhbmQgS29sY3p5bnNrYSwgMjAyMSwgcC40NjkuKSwgd2hlcmVhcyBpbiB0aGUgcmVwbGljYXRlZCBtb2RlbCB0aGlzIGhhcyBpbmNyZWFzZWQgdG8gMC4zNy4gSG93ZXZlciwgdGhlIGdlbmVyYWwgcGF0dGVybiBpcyBzdGlsbCB0aGUgc2FtZSBhcyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlc2UgY29lZmZpY2llbnQgZXN0aW1hdGVzIG1lYW4gdGhhdCBmb3IgaW50ZXJ2aWV3ZXJzIGFnZWQgMjYtNDAgeWVhcnMgdGhlaXIgYXNzZXNzbWVudCBvZiByZXNwb25kZW50cyB1bmRlcnN0YW5kaW5nIG9mIHN1cnZleSBxdWVzdGlvbnMgaW5jcmVhc2VzIGJ5IDAuMTYgcG9pbnRzIGZvciBldmVyeSB5ZWFybHkgaW5jcmVhc2UsIHdoZXJlYXMgZm9yIGludGVydmlld2VycyBhZ2VkIDcxLTg5IHllYXJzIHRoaXMgaW5jcmVhc2VzIGJ5IDAuMzcgcG9pbnRzIGZvciBldmVyeSB5ZWFybHkgaW5jcmVhc2UuIFRoaXMgc3RpbGwgcHJvdmVzIFp5Y3p5bnNrYS1DbG9sZWsgYW5kIEtvbGN6eW5za2HigJlzICgyMDIxKSBjbGFpbSB0aGF0IHRoZSB5b3VuZ2VyIHRoZSBpbnRlcnZpZXdlciBpcyB0aGUgc3Ryb25nZXIgdGhlIG5lZ2F0aXZlIGVmZmVjdCBvbiB0aGUgdmFyaWFibGUgd2hpY2ggbWVhc3VyZXMgdGhlIGludGVydmlld2Vyc+KAmSBhc3Nlc3NtZW50IG9mIGhvdyB3ZWxsIGEgcmVzcG9uZGVudCB1bmRlcnN0b29kIHRoZSBzdXJ2ZXkgcXVlc3Rpb25zLiBJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSBjb2VmZmljaWVudCBlc3RpbWF0ZXMgZm9yIG90aGVyIHByZWRpY3RvciB2YXJpYWJsZXMgc3VjaCBhcyByZXNwb25zZSBzdHlsZXMgYWxzbyBjaGFuZ2VkIGZyb20gdGhlIG9yaWdpbmFsIG1vZGVsIGJ1dCBrZXB0IHRoZSBzYW1lIHBhdHRlcm4uIFRoaXMgbGlrZWx5IGR1ZSB0byB0aGUgYWRkZWQgdmFyaWFibGUgb2Yg4oCYcmVsaWdpb3NpdHnigJkgaW4gdGhlIHJlcGxpY2F0ZWQgbW9kZWwuDQoNCkluIGFkZGl0aW9uIHRvIHRoaXMsIHdoZW4gYXZlcmFnZSByZWxpZ2lvc2l0eSBvZiBhIGNvdW50cnkgaW5jcmVhc2VzIGJ5IG9uZSBzY2FsZSBwb2ludCB0aGUgYXZlcmFnZSBkZWNyZWFzZSBpbiBpbnRlcnZpZXdlcnPigJkgYXNzZXNzbWVudCBvZiByZXNwb25kZW50cyB1bmRlcnN0YW5kaW5nIG9mIHN1cnZleSBxdWVzdGlvbnMgaXMgMC4wMSAod2hlbiBhbGwgb3RoZXIgdmFyaWFibGVzIGFyZSBoZWxkIGNvbnN0YW50KS4gVGhpcyBnb2VzIGFnYWluc3QgdGhlIHByZWRpY3RlZCByZXN1bHRzIHByZS1yZWdpc3RlcmVkLCB3aGljaCBwcmVkaWN0ZWQgdGhhdCByZWxpZ2lvc2l0eSB3b3VsZCBoYXZlIGEgcG9zaXRpdmUgZWZmZWN0IG9uIHRoZSBpbnRlcnZpZXdlcnPigJkgYXNzZXNzbWVudCBvZiByZXNwb25kZW50cyB1bmRlcnN0YW5kaW5nIG9mIHN1cnZleSBxdWVzdGlvbnMuIFRoaXMgY291bGQgYmUgYmVjYXVzZSBtYW55IG9mIHRoZSBjb3VudHJpZXMgbWVudGlvbmVkIHRvIGhhdmUgaGlnaCBsZXZlbHMgb2YgcmVsaWdpb3NpdHkgaW4gdGhlIGxpdGVyYXR1cmUgZS5nLiwgVHVya2V5LCBLb3Nvdm8sIGFuZCBHcmVlY2Ugd2VyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHNhbXBsZSBvZiBkYXRhIHVzZWQgKENvdXRpbmhvLCAyMDE2KSBhbmQgdGhlcmVmb3JlIGRpZmZlcmVudCByZXN1bHRzIG1heSBoYXZlIGJlZW4gZm91bmQgaWYgYSBtb3JlIHN1aXRhYmxlIGRhdGFzZXQgd2FzIHVzZWQgdGhhdCBpbmNsdWRlZCB0aGVzZSBzYW1wbGVzLiBGdXJ0aGVybW9yZSwgdGhlIGNvZWZmaWNpZW50IGVzdGltYXRlIGZvciByZWxpZ2lvc2l0eSBmb3VuZCBieSB0aGlzIG1vZGVsIGlzIHN0YXRpc3RpY2FsbHkgaW5zaWduaWZpY2FudCBhcyB0aGUgcC12YWx1ZSAoMC4yNjQpIGlzIGxlc3MgdGhhbiB0aGUgc2lnbmlmaWNhbmNlIGxldmVsIG9mIDAuMDUuIFRoaXMgc3VnZ2VzdHMgdGhhdCByZWxpZ2lvc2l0eSBvZiBhIGNvdW50cnkgaXMgbm90IGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBwcmVkaWN0b3IgdmFyaWFibGUgb2YgaW50ZXJ2aWV3ZXJz4oCZIGFzc2Vzc21lbnQgb2YgcmVzcG9uZGVudHMgdW5kZXJzdGFuZGluZyBvZiBzdXJ2ZXkgcXVlc3Rpb25zLiANCg0KRnVydGhlcm1vcmUsIGFzIHJlbGlnaW9zaXR5IGlzIG5vdCBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgcHJlZGljdG9yIHZhcmlhYmxlIG9mIGludGVydmlld2Vyc+KAmSBhc3Nlc3NtZW50IG9mIHJlc3BvbmRlbnRzIHVuZGVyc3RhbmRpbmcgb2Ygc3VydmV5IHF1ZXN0aW9ucyBpdCBtYXliZSBiZXR0ZXIgdG8gcmVtb3ZlIGl0IGZyb20gdGhlIG1vZGVsIGFzIGl0IG1heSBiZSBjYXVzaW5nIHRoZSBtb2RlbCB0byBiZSBvdmVyLWZpdHRlZCBhbmQgaGVuY2UgbGVzcyByZWxpYWJsZS4gDQoNCldoZW4gY29tcGFyZWQgdG8gdGhlIHNhbWUgbW9kZWwgd2l0aG91dCBpdCBhcyBhIHByZWRpY3RvciB0aGUgbW9kZWwgd2FzIHJlcG9ydGVkIHRvIGJlIGEgYmV0dGVyIGZpdCwgaGVuY2Ugc3VnZ2VzdGluZyBpdCBpcyBiZXR0ZXIgdG8gbGVhdmUgcmVsaWdpb3NpdHkgb3V0IG9mIGEgcmV2aXNlZCBtb2RlbC4gDQpgYGB7ciBjb21tcGFyaW5nLW1vZGVscywgcmVzdWx0cz0naGlkZSd9DQojIyMgRml0IG9mIG1vZGVsIDUgdnMgbW9kZWwgNiBjb21wYXJpbmcgcmVnaW9uIG1vZGVsIHRvIG5ldyBtb2RlbCAtLS0tLS0NCmFub3ZhKG01LCBtNiwgcmVmaXQ9RkFMU0UpDQpgYGANCg0KDQoNCg0KIyMgNC4gQ29uY2x1c2lvbnMNCg0KSW4gY29uY2x1c2lvbiwgdGhlIGxlc3NlciB0aGUgcmVsaWdpb3NpdHkgb2YgYSBjb3VudHJ5IGF0IHRoZSByZWdpb25hbCBsZXZlbCBkaWQgbm90IGhhdmUgYSBuZWdhdGl2ZSBlZmZlY3Qgb24gaW50ZXJ2aWV3ZXJz4oCZIGFzc2Vzc21lbnQgb2YgcmVzcG9uZGVudHPigJkgdW5kZXJzdGFuZGluZyBvZiBzdXJ2ZXkgcXVlc3Rpb25zIGJ1dCByYXRoZXIgYSBwb3NpdGl2ZSBvbmUuIEhvd2V2ZXIsIGl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhpcyBwb3NpdGl2ZSBlZmZlY3QgaXMgc3RhdGlzdGljYWxseSBpbnNpZ25pZmljYW50IGFuZCBoZW5jZSByZWxpZ2lvc2l0eSBvZiBhIGNvdW50cnkgYXQgdGhlIHJlZ2lvbmFsIGxldmVsIGNhbiBub3QgYmUgdXNlZCBhcyBhIHByZWRpY3RvciBvZiBpbnRlcnZpZXdlcnPigJkgYXNzZXNzbWVudCBvZiByZXNwb25kZW50c+KAmSB1bmRlcnN0YW5kaW5nIG9mIHN1cnZleSBxdWVzdGlvbnMuIFRoaXMgbWlnaHQgYmUgYmVjYXVzZSBtYW55IG9mIHRoZSBjb3VudHJpZXMgbWVudGlvbmVkIHRvIGhhdmUgaGlnaCBsZXZlbHMgb2YgcmVsaWdpb3NpdHkgaW4gdGhlIGxpdGVyYXR1cmUgZS5nLiwgS29zb3ZvLCB3ZXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgc2FtcGxlIHVzZWQgKENvdXRpbmhvLCAyMDE2KSBhbmQgdGhlcmVmb3JlIGRpZmZlcmVudCByZXN1bHRzIG1heSBoYXZlIGJlZW4gZm91bmQgaWYgYSBtb3JlIHN1aXRhYmxlIGRhdGFzZXQgd2FzIHVzZWQuIEluIGFkZGl0aW9uIHRvIHRoaXMsIHRoZSBzdGF0ZW1lbnQgdGhhdCBXaGl0ZSwgTXV0aHVrcmlzaG5hLCBhbmQgTm9yZW56YXlhbiAoMjAyMSkgbWFkZSBhYm91dCByZWxpZ2lvbiBjcmVhdGluZyBjdWx0dXJhbCBzaW1pbGFyaXRpZXMgbWF5IG5vdCBiZSB0cnVlIGZvciB0aGUgY291bnRyaWVzIGdyb3VwZWQgdG9nZXRoZXIgaW4gdGhpcyByZXBsaWNhdGlvbiBwcm9qZWN0IGFzIGl0IG1pZ2h0IGJlIG90aGVyIGN1bHR1cmFsIGZhY3RvcnMgdGhhdCBtYWtlIHRoZW0gc2ltaWxhciByYXRoZXIgdGhhbiByZWxpZ2lvbi4gVGhlcmVmb3JlLCBpZiB0aGlzIHJlcGxpY2F0aW9uIHdhcyB0byBiZSBkb25lIGFnYWluIGl0IG1heSBiZSB1c2VmdWwgdG8gdXNlIGFub3RoZXIgdmFyaWFibGUgaW5zdGVhZCBvZiByZWxpZ2lvc2l0eSBhdCB0aGUgcmVnaW9uYWwgbGV2ZWwgdG8gbWVhc3VyZSBjdWx0dXJhbCBkaWZmZXJlbmNlcyBzdWNoIGFzIGRpZmZlcmVuY2VzIHdoZW4gaXQgY29tZXMgdG8gdHJlYXRpbmcgb2xkZXIgZ2VuZXJhdGlvbnMuDQoNCg0KIyMgUmVmZXJlbmNlcw0KDQpCdXJuaGFtLCBELiAoMjAwNikgQW4gaW50cm9kdWN0aW9uIHRvIEthbnQncyBDcml0aXF1ZSBvZiBqdWRnZW1lbnQuIEVkaW5idXJnaDogRWRpbmJ1cmdoIFVuaXZlcnNpdHkgUHJlc3MuDQoNCkNvdXRpbmhvLCBKLiBQLiAoMjAxNikg4oCYUmVsaWdpb3NpdHkgaW4gRXVyb3BlOiBhbiBpbmRleCwgZmFjdG9ycywgYW5kIGNsdXN0ZXJzIG9mIHJlbGlnaW9zaXR54oCZLCBTb2Npb2xvZ2lhIChMaXNib24sIFBvcnR1Z2FsKSwgODEoODEpLCBwcC4gMTYz4oCTMTg4LiBkb2k6IDEwLjc0NTgvU1BQMjAxNjgxNjI1MS4NCg0KRXVyb3BlYW4gU29jaWFsIFN1cnZleSAoRVNTKSAoMjAxNykgRVNTIHJvdW5kIDggLSAyMDE2LiBXZWxmYXJlIGF0dGl0dWRlcywgQXR0aXR1ZGVzIHRvIGNsaW1hdGUgY2hhbmdlLiBBdmFpbGFibGUgYXQ6IFNlYXJjaCBFdXJvcGVhbiBTb2NpYWwgU3VydmV5IChuc2Qubm8pIChBY2Nlc3NlZDogMjV0aCBNYXkgMjAyMykuDQoNCkV3ZW4sIEguIEguLCBOaWt6YWQtVGVyaHVuZSwgSy4gYW5kIERhc3NlbCwgSy4gQi4gKDIwMjApIOKAmEV4cGxvcmluZyBiZWxpZWZzIGFib3V0IGFnaW5nIGFuZCBmYWl0aDogRGV2ZWxvcG1lbnQgb2YgdGhlIGp1ZGVvLWNocmlzdGlhbiByZWxpZ2lvdXMgYmVsaWVmcyBhbmQgYWdpbmcgc2NhbGXigJksIEJlaGF2aW9yYWwgc2NpZW5jZXMsIDEwKDkpLCBwLiAxMzkuIGRvaTogMTAuMzM5MC9CUzEwMDkwMTM5Lg0KDQpGZXJuw6FuZGV6LUJhbGxlc3Rlcm9zLCBSLiBldCBhbC4gKDIwMjApIOKAmEN1bHR1cmFsIGFnaW5nIHN0ZXJlb3R5cGVzIGluIEV1cm9wZWFuIENvdW50cmllczogQXJlIHRoZXkgYSByaXNrIHRvIEFjdGl2ZSBBZ2luZz/igJksIFBsb1Mgb25lLCAxNSg1KSwgcHAuIGUwMjMyMzQw4oCTZTAyMzIzNDAuIGRvaTogMTAuMTM3MS9qb3VybmFsLnBvbmUuMDIzMjM0MC4NCg0KRnJlZXNlLCBKLiBhbmQgUGV0ZXJzb24sIEQuICgyMDE3KSDigJhSZXBsaWNhdGlvbiBpbiBTb2NpYWwgU2NpZW5jZeKAmSwgQW5udWFsIHJldmlldyBvZiBzb2Npb2xvZ3ksIDQzKDEpLCBwcC4gMTQ34oCTMTY1LiBkb2k6IDEwLjExNDYvYW5udXJldi1zb2MtMDYwMTE2LTA1MzQ1MC4NCg0KTm9ydGgsIE0uIFMuIGFuZCBGaXNrZSwgUy4gVC4gKDIwMTUpIOKAmE1vZGVybiBBdHRpdHVkZXMgVG93YXJkIE9sZGVyIEFkdWx0cyBpbiB0aGUgQWdpbmcgV29ybGQ6IEEgQ3Jvc3MtQ3VsdHVyYWwgTWV0YS1BbmFseXNpc+KAmSwgUHN5Y2hvbG9naWNhbCBidWxsZXRpbiwgMTQxKDUpLCBwcC4gOTkz4oCTMTAyMS4gZG9pOiAxMC4xMDM3L2EwMDM5NDY5Lg0KDQpTYWhnYWwsIE4uICgyMDE4KSDigJhQZXcgUmVzZWFyY2ggQ2VudGVyOiBCZWluZyBDaHJpc3RpYW4gaW4gV2VzdGVybiBFdXJvcGXigJksIExTRSBSZWxpZ2lvbiBhbmQgR2xvYmFsIFNvY2lldHkgQmxvZywgNXRoIEp1bmUuIEF2YWlsYWJsZSBhdDogaHR0cHM6Ly9ibG9ncy5sc2UuYWMudWsvcmVsaWdpb25nbG9iYWxzb2NpZXR5LzIwMTgvMDYvcGV3LXJlc2VhcmNoLWNlbnRlci1iZWluZy1jaHJpc3RpYW4taW4td2VzdGVybi1ldXJvcGUvIChBY2Nlc3NlZDogMjZ0aCBNYXkgMjAyMykNCg0KVW5pdGVkIE5hdGlvbnMgKDIwMjMpIE1ldGhvZG9sb2d5LiBBdmFpbGFibGUgYXQ6IFVOU0Qg4oCUIE1ldGhvZG9sb2d5ICAoQWNjZXNzZWQ6IDI1dGggTWF5IDIwMjMpDQoNCldoaXRlLCBDLiBKLiBNLiwgTXV0aHVrcmlzaG5hLCBNLiBhbmQgTm9yZW56YXlhbiwgQS4gKDIwMjEpIOKAmEN1bHR1cmFsIHNpbWlsYXJpdHkgYW1vbmcgY29yZWxpZ2lvbmlzdHMgd2l0aGluIGFuZCBiZXR3ZWVuIGNvdW50cmllc+KAmSwgUHJvY2VlZGluZ3Mgb2YgdGhlIE5hdGlvbmFsIEFjYWRlbXkgb2YgU2NpZW5jZXMgLSBQTkFTLCAxMTgoMzcpLCBwLiAxLiBkb2k6IDEwLjEwNzMvcG5hcy4yMTA5NjUwMTE4Lg0KDQpaeWN6eW5za2EtQ2lvbGVrLCBELiBhbmQgS29sY3p5bnNrYSwgTS4gKDIwMjEpIOKAmERvZXMgSW50ZXJ2aWV3ZXJzJyBBZ2UgQWZmZWN0IFRoZWlyIEFzc2Vzc21lbnQgb2YgUmVzcG9uZGVudHMnIFVuZGVyc3RhbmRpbmcgb2YgU3VydmV5IFF1ZXN0aW9ucz8gRXZpZGVuY2UgRnJvbSB0aGUgRXVyb3BlYW4gU29jaWFsIFN1cnZleeKAmSwgSW50ZXJuYXRpb25hbCBqb3VybmFsIG9mIHB1YmxpYyBvcGluaW9uIHJlc2VhcmNoLCAzMygyKSwgcHAuIDQ2MOKAkzQ3Ni4gZG9pOiAxMC4xMDkzL2lqcG9yL2VkYWEwMTUuDQoNClp5Y3p5bnNrYS1DaW9sZWssIEQuLCAmIEtvbGN6eW5za2EsIE0uICgyMDIyLCBNYXJjaCAyNSkuIERvZXMgaW50ZXJ2aWV3ZXJz4oCZIGFnZSBhZmZlY3QgdGhlaXIgYXNzZXNzbWVudCBvZiByZXNwb25kZW50c+KAmSB1bmRlcnN0YW5kaW5nIG9mIHN1cnZleSBxdWVzdGlvbnM/IEV2aWRlbmNlIGZyb20gdGhlIEV1cm9wZWFuIFNvY2lhbCBTdXJ2ZXkuIFJldHJpZXZlZCBmcm9tIG9zZi5pby83dXJ4ZyANCg0KDQoNCiMjIEFwcGVuZGl4DQoNCiMjIyBBcHBlbmRpeCAxLiBNeSBlbnZpcm9tZW50IChmdWxsIGluZm9ybWF0aW9uKSANCg0KYGBge3Igc2Vzc2lvbn0NCiMgRGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgbXkgZW52aXJvbm1lbnQNCnNlc3Npb25JbmZvKCkNCmBgYA0KDQojIyMgQXBwZW5kaXggMi4gRW50aXJlIFIgY29kZSB1c2VkIGluIHRoZSBwcm9qZWN0DQoNCmBgYHtyIHJlZi5sYWJlbD1rbml0cjo6YWxsX2xhYmVscygpLCBlY2hvPVRSVUUsIGV2YWw9RkFMU0V9DQpgYGANCg==