Install required packages and set working directory

require(foreign)
Warning messages:
1: In scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  :
  EOF within quoted string
2: In scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  :
  EOF within quoted string
require(FactoMineR)
require(sjmisc)
require(ade4)
require(factoextra)
require(soc.ca)
require(dplyr)
require(sjPlot)
require(car)
require(varhandle)
require(ggplot2)
require(plotluck)
require(beanplot)
require(seriation)
require(corrr)
require(paran)
require(tables)
require(xlsx)
require(corrplot)
require(ape)
require(grid)
require(matrixStats)
require(ggthemes)
require(data.table)
require(psych)
require(explor)
library(rworldmap)
library(CCA)
library(ggrepel)

Import WJS consolidated data file and country data from SPSS

setwd("/Users/janfredrikhovden/Dropbox/DBXPAGAANDEARBEID/Statistikk/Rworkdir/WJS")
wjs<-read.spss("WJS Consolidated Data V4-01 310117.sav", to.data.frame=TRUE)
country<-read.spss("country data 100217.sav", to.data.frame=TRUE)
countryorg<-country
# wjs<-read.spss("WJS Consolidated Data V2-03 140916.sav", to.data.frame=TRUE)
# wjs<-read.spss("WJS Consolidated Data V3-01 261016.sav", to.data.frame=TRUE, use.missings=FALSE) # If one want to include all missing values
## NOTE: IF THE NUMBER OR ORDER OF COUNTRIES ARE CHANGED, CHECK COUNTRY ROW NUMBER belows where #CHECKROWNUMBER are added
wjs$ID<-as.numeric(rownames(wjs)) # assign row number as ID
wjc<-dplyr::left_join(wjs,country, by="COUNTRY")

Filter additional countries and make subsamples if needed

Functions

scale_by_rank <- function(x) apply(x, 2, rank)
Mean <- function(x) base::mean(x, na.rm=TRUE) # Mean ignoring missing values
Sd<-function(x) base::sd(x, na.rm=TRUE) # SD ignoring missing values
delete.na <- function(DF, n=0) {
  DF[rowSums(is.na(DF)) <= n,]
} # drop rows with a treshold for NAs

Recoding

# fixing naming of United Arab Emirates (should NOT be United Arabic Emirates)
levels(country$COUNTRY)[match("UAE",levels(country$COUNTRY))] <- "United Arab Emirates"
levels(wjs$COUNTRY)[match("UAE",levels(wjs$COUNTRY))] <- "United Arab Emirates"
# import and selection of variables for analysis
indep<- dplyr::select(wjs, COUNTRY, C1, C2, C6, C7, C20, C14A:C14K, C22:C23, T5, T7.1:T9, AUTONOMY, ID)
#recoding where necessary
#C1 manager
indep$manager<-recode(indep$C1, "c('Reporter', 'News writer', 'Trainee', 'Other')='not.manager'; NA=NA; else='manager'")
indep$manager <- factor(indep$manager, levels=c("not.manager", "manager")) # changer order of levels
indep$T5<-factor(indep$T5, levels=c("Rank-and-file","\"Junior\" manager","Senior/executive manager"))
#C2 fulltime
indep$fulltime<-recode(indep$C2, "c('Full-time employment')='Fulltime'; NA=NA; else='not.Fulltime'")
#C6/7 newsbeat
indep$hardnews<-recode(indep$C7, "c('News/current affairs', 'Politics', 'Foreign politics', 'Domestic politics', 'Economy', 'Crime & law', NA)='hardnews or general'; else='softnews'")
#C20 education
indep$highedu<-recode(indep$C20, "c('Not completed high school', 'Completed high school', 'some university studies, but no degree')='no.highedu'; NA=NA; else='high.edu'")
indep$master<-recode(indep$C20, "c('Not completed high school', 'Completed high school', 'some university studies, but no degree', 'College/Bachelor\342\200\231s degree or equivalent')='no.master';NA=NA; else='master'")
indep$edu3<-recode(indep$C20, "c('Not completed high school', 'Completed high school')='edu.nohigh';c('some university studies, but no degree', 'College/Bachelor\342\200\231s degree or equivalent')='edu.mid'; NA=NA; else='edu.master'")
indep$edu3 <- factor(indep$edu3, levels=c("edu.nohigh", "edu.mid", "edu.master")) # changer order of levels
# T7 medium (how?)
indep$broadcast<-recode(indep$T7.4, "c('Yes')='Broadcasting'; NA=NA; else='not.broadcasting'")
indep$broadcast[indep$T7.5=="Yes"]<-"Broadcasting"
indep$broadcast<-factor(indep$broadcast, levels=c("not.broadcasting", "Broadcasting"))
# T8 national media
indep$national<-recode(indep$T8, "c('National')='National'; NA=NA; else='not.national'")
indep$national<-factor(indep$national, levels=c("not.national", "National"))
# T9 ownership
indep$owner<-recode(indep$T9, "c('Purely public ownership', 'Purely state ownership', 'Mixed ownership but mostly public', 'Mixed ownership but mostly state-owned')='public/state'; NA=NA; else='private'")

C13 ETHICS

## Subsetting dataset and renaming variables
BAT<-dplyr::select(wjs,COUNTRY, ID, C13A:C14K)
# BAT<-BAT %>% filter(complete.cases(.))  # note filter on only complete cases
BAT<-plyr::rename(BAT, c(C13A="Always.follow.codes", C13B="Depends.on.situation", C13C="Matter.of.personal.judgement", C13D="Can.be.set.aside",C14A="Paying.for.info", C14B="Using.conf.documents", C14C="False.identity", C14D="Pressure.informants",
C14E="Use.personal.doc", C14F="Undercover.empl", C14G="Hidden.miccam", C14H="Recreations", C14J="Publ.unverified", C14K="Accept.money"))
#C13
BATm <- apply(dplyr::select(BAT, Always.follow.codes:Can.be.set.aside), 2, function(x) {x <- recode(x,"'strongly disagree'=1; 'somewhat disagree'=2; 'undecided'=3; 'somewhat agree'=4; 'strongly agree'=5"); x})
### re-add country and add labels
BATm<-data.frame(BATm)
BATm$COUNTRY<-BAT$COUNTRY 
BATm$ID<-BAT$ID 
BATmC13<-BATm # make a copy of the dataset (orginal)
BATmCOMPLETE<-BATm %>% filter(complete.cases(.)) # note filter on only complete C13* cases
BATmORG<-BATm # make a copy of the dataset (orginal)
### convert to matrix of averages by country and add rownames and labels
BATm<-BATm %>%
  group_by(COUNTRY) %>%
  summarise_each(funs(Mean), Always.follow.codes:Can.be.set.aside)
`summarise_each()` is deprecated.
Use `summarise_all()`, `summarise_at()` or `summarise_if()` instead.
To map `funs` over a selection of variables, use `summarise_at()`
BATm<-data.frame(BATm)
rownames(BATm)<-BATm[,1]
BATmORGC13map<-BATm
BATm<-BATm[,2:5]
BATmORGC13<-BATm
#BATm<-BATm[c(-61),]# remove Tanzania 
BATm<-BATm[c(-10),]# remove Bulgaria, C13 has been wrongly translated
BATmORGC13<-BATmORGC13[c(-10),]# remove Bulgaria, C13 has been wrongly translated
### make table of mean and sd by question and country
DT <- data.table(BATmC13)
wide <- setnames(DT[, sapply(.SD, function(x) list(n=sum(complete.cases(x)), mean=round(mean(x, na.rm=TRUE), 2), sd=round(sd(x, na.rm=TRUE), 2))), by=COUNTRY], c("COUNTRY", sapply(names(DT)[-6], paste0, c(".n", ".men", ".SD"))))
table.meansdC13<-as.data.frame(wide[,1:13])

Maps C13

sPDF<-joinCountryData2Map(BATmORGC13map, joinCode = "NAME", nameJoinColumn = "COUNTRY")
67 codes from your data successfully matched countries in the map
0 codes from your data failed to match with a country code in the map
176 codes from the map weren't represented in your data
par(mai=c(0,0,0.2,0),xaxs="i",yaxs="i")
mapCountryData(sPDF, nameColumnToPlot = "Always.follow.codes", colourPalette  =c('black','grey90'))
2 colours specified and 7 required, using interpolation to calculate colours

mapCountryData(sPDF, nameColumnToPlot = "Depends.on.situation", colourPalette  =c('black','grey90'))
2 colours specified and 7 required, using interpolation to calculate colours

mapCountryData(sPDF, nameColumnToPlot = "Matter.of.personal.judgement", colourPalette  =c('black','grey90'))
2 colours specified and 7 required, using interpolation to calculate colours

mapCountryData(sPDF, nameColumnToPlot = "Can.be.set.aside", colourPalette  =c('black','grey90'))
2 colours specified and 7 required, using interpolation to calculate colours

Scatterplots C13

fcountry <- merge(BATmORGC13map,country,by="COUNTRY")
rownames(fcountry)<-fcountry[,1]
namn<-row.names(fcountry) 
fcountry<-fcountry[c(-10),] #removing Bulgaria because of C13 wrong translation
fcountry<-fcountry[c(-22),] #removing Ethiopia = outlier
fcountry<-fcountry[c(-53),] #removing Singapore = outlier
qplot(FHPFREES,EIUDEMOS, data = fcountry) + geom_text_repel(aes(label=row.names(fcountry))) +  theme_minimal()

qplot(FHPFREES,fcountry[,2], data = fcountry) + geom_text_repel(aes(label=row.names(fcountry))) +  theme_minimal() + labs(x = "Freedom House Press Freedom index", y="Always follow codes")

qplot(FHPFREES,fcountry[,3], data = fcountry) + geom_text_repel(aes(label=row.names(fcountry))) +  theme_minimal() + labs(x = "Freedom House Press Freedom index", y="Depends on situation")

qplot(FHPFREES,fcountry[,4], data = fcountry) + geom_text_repel(aes(label=row.names(fcountry))) +  theme_minimal() + labs(x = "Freedom House Press Freedom index", y="Matter of personal judgement")

qplot(FHPFREES,fcountry[,5], data = fcountry) + geom_text_repel(aes(label=row.names(fcountry))) +  theme_minimal() + labs(x = "Freedom House Press Freedom index", y="Can be set aside")

qplot(EIUDEMOS,fcountry[,2], data = fcountry) + geom_text_repel(aes(label=row.names(fcountry))) +  theme_minimal() + labs(x = "EIU Democracy Score", y="Always follow codes")

qplot(EIUDEMOS,fcountry[,3], data = fcountry) + geom_text_repel(aes(label=row.names(fcountry))) +  theme_minimal() + labs(x = "EIU Democracy Score", y="Depends on situation")

qplot(EIUDEMOS,fcountry[,4], data = fcountry) + geom_text_repel(aes(label=row.names(fcountry))) +  theme_minimal() + labs(x = "EIU Democracy Score", y="Matter of personal judgement")

qplot(EIUDEMOS,fcountry[,5], data = fcountry) + geom_text_repel(aes(label=row.names(fcountry))) +  theme_minimal() + labs(x = "EIU Democracy Score", y="Can be set aside")

Various descriptive statistics and figures C13

# sjp.setTheme(geom.outline.size = 0, geom.label.size = 3, title.size = 1.5)
#sjp.likert(BAT[,2:5], sort.frq = "pos.asc", show.prc.sign = TRUE, digits=0, show.n=FALSE, show.legend=FALSE, catcount=5,title="Agreement?     (C13, all countries)") # lickert plot
# Average mean and spread of roles (based on country averages), boxplot and beanplot
sortedBATm<-BATm[ , order(colMeans(BATm))] # sort by column mean
par(mar = c(4,15,2,2)) # set margins
boxplot(x = as.list(sortedBATm), horizontal = TRUE, las=1, main="Averages aggregated by country (C13)", log="")
par(mar = c(4,15,2,2)) # set margins

beanplot(x = as.list(sortedBATm), horizontal = TRUE, las=1, main="Averages aggregated by country (C13)", log="")

##Bertin plot (centered)
cBATm<-t(BATm)
cBATm<-scale(cBATm, scale=FALSE) #centering of means
cBATm<-t(cBATm)
cBATmC13<-cBATm
x <- scale_by_rank(as.matrix(scale(cBATm, scale=FALSE)))
order <- seriate(x, method="PCA")
bertinplot(x, order, options = list(panel=panel.squares, shading=TRUE, reverse=TRUE, mar = c(1,1,10,6), gp_labels=gpar(fontsize=8)))

order <- seriate(x, method="PCA_angle")
bertinplot(x, order, options = list(panel=panel.squares, shading=TRUE, reverse=TRUE, mar = c(1,1,10,6), gp_labels=gpar(fontsize=8)))

#uncentered C13 Bertin
x <- scale_by_rank(as.matrix(BATm))
order <- seriate(x, method="PCA")
bertinplot(x, order, options = list(panel=panel.squares, shading=TRUE, reverse=TRUE, mar = c(1,1,10,6), gp_labels=gpar(fontsize=8)))

heatmap(cBATm, margins=c(5,5)) # heatmap (centered)

# network plot of correlations
c<-correlate(BATm)
network_plot(c, min_cor=.2, colors=c("red", "green")) # not working for now

c<-cor(BATm)
corrplot(c, type = "upper", order = "FPC", tl.col = "black", tl.srt = 45, diag=FALSE, tl.cex=0.8,mar=c(1,0,0,1))

sjp.corr(c)
Computing correlation using pearson-method with listwise-deletion...

# distance matrix (correlations)
#res.dist <- get_dist(C13x, stand = TRUE, method = "pearson")
#fviz_dist(res.dist, gradient = list(low = "#00AFBB", mid = "white", high = "#FC4E07"))

PCA and biplot, mean centered

#BATm2<- BATm[-c(22,54), ] #Removal Ethiopia and Singapore as outliers
BATm2<- BATm
cBATm<-t(BATm2)
cBATm<-scale(cBATm, scale=FALSE) #centering of means
cBATm<-t(cBATm)
x<-t(cBATm)
x<-scale(x, scale=FALSE)
x<-t(x)
C13x<-x
# test for PCA factors = 2
paran(x)

Using eigendecomposition of correlation matrix.
Computing: 10%  20%  30%  40%  50%  60%  70%  80%  90%  100%


Results of Horn's Parallel Analysis for component retention
120 iterations, using the mean estimate

-------------------------------------------------- 
Component   Adjusted    Unadjusted    Estimated 
            Eigenvalue  Eigenvalue    Bias 
-------------------------------------------------- 
1           1.611300    1.903982      0.292681
2           1.151001    1.218220      0.067218
-------------------------------------------------- 

Adjusted eigenvalues > 1 indicate dimensions to retain.
(2 components retained)
res.pca<-PCA(x , scale.unit=FALSE, ncp=3, graph = TRUE) # suggests 2 axes only

#res.pca$var$coord
fviz_pca_var(res.pca, col.var = "black")+ labs(title = "C13 PCA, centered means")

#sjt.pca(x)
#fviz_pca_biplot(res.pca, geom = "text",  title="Ethics(C13)", axes =c(1,2), labelsize=2.5, repel=TRUE) + theme_minimal()
fviz_pca_biplot(res.pca, repel = TRUE)+ labs(title = "C13 PCA, centered means")

fviz_screeplot(res.pca, ncp=10)

fviz_contrib(res.pca, choice = "var", axes = 1)

fviz_contrib(res.pca, choice = "var", axes = 2)

fviz_contrib(res.pca, choice = "var", axes = 3) # not stable (PARAN)

indroles <- get_pca_ind(res.pca)
C13ind<-indroles$coord
# Quality of representation of the Countries
fviz_cos2(res.pca, choice="ind", axes = 1, top = 68 )

fviz_cos2(res.pca, choice="ind", axes = 2, top = 68 )

# K-menas clustering = just one cluser
set.seed(123)
fviz_nbclust(C13x, kmeans, method = "gap_stat") + labs(title = "C13 clusters (K-means)") # 1 cluster 
Clustering k = 1,2,..., K.max (= 10): .. done
Bootstrapping, b = 1,2,..., B (= 100)  [one "." per sample]:
.................................................. 50 
.................................................. 100 

# km.res <- kmeans((C13x), 4, nstart = 25)
#fviz_cluster(km.res, C13x, ellipse.type = "norm")
# HCPC Clustering
res.pca.hcpc<-HCPC(res.pca, nb.clust=-1) # 5 clusters

res.pca.hcpc$data.clust
fviz_cluster(res.pca.hcpc, data = x, ellipse.type = "convex", repel=TRUE)+ theme_tufte() + labs(title = "C13 clusters (after PCA), centered means") + ylab(" <--- 1: Absolutism") + xlab("2: <--- Subjectivism") + theme(axis.text=element_text(size=12), axis.title=element_text(size=14,face="bold"))

#fviz_cluster(res.pca.hcpc, data = x, axes=c(1,3), ellipse.type = "convex", repel=TRUE)+ theme_tufte() + labs(title = "C13 clusters (after PCA)") + ylab(" <--- 1: Absolutism") + xlab("2: <--- Situationism") + theme(axis.text=element_text(size=12), axis.title=element_text(size=14,face="bold"))
#fviz_cluster(res.pca.hcpc, data = x, axes=c(2,3), ellipse.type = "convex", repel=TRUE)+ theme_tufte() + labs(title = "C13 clusters (after PCA)") + ylab(" <--- 2: Subjectivism") + xlab("3: <--- Situationism") + theme(axis.text=element_text(size=12), axis.title=element_text(size=14,face="bold"))
fviz_dend(res.pca.hcpc, rect = TRUE, cex = 0.5, horiz=TRUE)

#res.pca.hcpc$desc.var
# Non-metric MDS
library(ggrepel)
d<-dist(C13x[,c(-2)]) # also removing Argentina #CHECKROWNUMBER
fit <- isoMDS(d, k=2)
initial  value 4.168022 
iter   5 value 3.861572
final  value 3.850813 
converged
fit
$points
                             [,1]         [,2]
Albania               0.254043740  0.013908584
Argentina            -0.190321897 -0.206896483
Australia            -0.391511646  0.192218283
Austria              -0.629906667 -0.181398664
Bangladesh           -0.211676875 -0.427445210
Belgium              -0.014701740  0.244288859
Bhutan                0.396023651 -0.027502323
Botswana             -0.356831124  0.387599788
Brazil               -0.273172084  0.060477270
Canada               -0.185745158  0.360944338
Chile                -0.265965777  0.028929172
China                -0.218128203  0.155833286
Colombia             -0.363921451 -0.517614539
Croatia              -0.508344660 -0.358308731
Cyprus               -0.262750459  0.434399371
Czech Republic        0.496559686  0.534575410
Denmark               0.536104967  0.350898749
Ecuador              -0.212861654 -0.350732579
Egypt                 0.072108277 -0.566981270
El Salvador          -0.227894360 -0.191658034
Estonia              -0.325734053  0.055164819
Ethiopia              1.501558558  0.440744278
Finland              -0.584368019 -0.278971484
France                0.142208639  0.299972366
Germany              -0.641366091  0.007237585
Greece               -0.143118737  0.287963860
Hong Kong             0.306621330 -0.172937977
Hungary               0.189998006  0.230587975
Iceland              -0.097081313 -0.009127974
India                 0.599173572 -0.033770224
Indonesia            -0.504458948  0.191826206
Ireland               0.118064473  0.049483701
Israel                0.061751627  0.247962909
Italy                -0.561181871  0.343091207
Japan                 0.378287542  0.045154544
Kenya                 0.054513631  0.150248968
Kosovo               -0.282838647  0.087509762
Latvia               -0.067263776 -0.157906085
Malawi               -0.091431050  0.296126245
Malaysia              0.422012457 -0.211374453
Mexico               -0.002635776 -0.093035264
Moldova              -0.154476411  0.102030449
Netherlands           0.461258492  0.006643104
New Zealand          -0.182913021 -0.012346573
Norway               -0.186477321 -0.227743120
Oman                  0.822149720 -0.491811532
Philippines           0.035349359 -0.191440793
Portugal             -0.477727144  0.315342435
Qatar                 0.373255946 -0.597499952
Romania              -0.298003863  0.092976317
Russia                0.459319604 -0.054645407
Serbia               -0.618596061 -0.312718765
Sierra Leone          0.326634824  0.444646596
Singapore             1.328001454  0.020847490
South Africa         -0.253609451  0.078238161
South Korea          -0.305120500 -0.145853967
Spain                -0.366342896  0.016166388
Sudan                 0.764508431 -0.637250072
Sweden                0.392414266  0.350079042
Switzerland          -0.343309475  0.156814509
Tanzania              0.631313795 -0.149594921
Thailand              0.728207570 -0.162978202
Turkey               -0.321923059 -0.169862138
United Arab Emirates -0.077517746 -0.330048269
UK                    0.012584327  0.005249021
USA                  -0.662798961  0.183273960

$stress
[1] 3.850813
fit.sh<-Shepard(d, fit$points)
plot(fit.sh, pch = ".")
lines(fit.sh$x, fit.sh$yf, type = "S")

x <- fit$points[,1]
y <- fit$points[,2]
plot(x, y, xlab="Coordinate 1", ylab="Coordinate 2",
main="NonMetric MDS",   type="n")
text(x, y, labels = row.names(BATm), cex=.7)

space<-as.data.frame(fit$points)
space$label<-C13x[,-1]
qplot(V1, V2, data=space) + geom_text_repel(aes(label=row.names(fit$points))) + ggtitle("Non-parametric MDS C13, centered means") + theme_minimal()

#res.mds.hcpc<-HCPC(space, nb.clust=-1) 
#fviz_cluster(res.mds.hcpc, data = x, frame.type = "convex", repel=TRUE, labelsize=3)+ theme_tufte() + labs(title = "C13 clusters (after MDS)") 
# res.mds.hcpc$desc.var

FA test C13

ethic<-BATmC13
#roles<-dplyr::filter(roles,COUNTRY!='Singapore_NON-REP' & COUNTRY !='Ethiopia') # remove Singapore and Ethiopia
# ethic<-ethic %>% filter(complete.cases(.))
x<-t(ethic[,c(-(5:6))])
x<-scale(x, scale=FALSE)
x<-t(x)
center_ethic<-as.data.frame(x)
center_ethic$COUNTRY<-ethic$COUNTRY
center_ethic$ID<-ethic$ID
ethics<-ethic[,-c(5:6)]
#ethics<-center_ethic[,-c(19:20)]
describe(ethics)
                                                                  25%           50%           75%                             
 1.079350e+05  3.209450e+00  1.464182e+00  1.000000e+00  2.000000e+00  4.000000e+00  4.000000e+00  5.000000e+00 -1.079310e+05 
KMO(ethics) # not really suitable, KMO MSA=0.67
Kaiser-Meyer-Olkin factor adequacy
Call: KMO(r = ethics)
Overall MSA =  0.67
MSA for each item = 
         Always.follow.codes         Depends.on.situation Matter.of.personal.judgement             Can.be.set.aside 
                        0.71                         0.65                         0.66                         0.70 
cortest.bartlett(ethics) # suggest 2 factors and 1 component
R was not square, finding R from data
$chisq
[1] 14166.94

$p.value
[1] 0

$df
[1] 6
fa.parallel(ethics)
Parallel analysis suggests that the number of factors =  2  and the number of components =  1 

scree(ethics)

#varimax, rotated
myfa<-fa(ethics, fm = "pa", nfactors = 2, rotate = "varimax", covar=FALSE) 
print(myfa, cut=.4, sort=TRUE)
Factor Analysis using method =  pa
Call: fa(r = ethics, nfactors = 2, rotate = "varimax", covar = FALSE, 
    fm = "pa")
Standardized loadings (pattern matrix) based upon correlation matrix
                             item   PA1   PA2   h2   u2 com
Matter.of.personal.judgement    3  0.67       0.45 0.55 1.0
Depends.on.situation            2  0.64       0.49 0.51 1.4
Can.be.set.aside                4  0.46  0.42 0.39 0.61 2.0
Always.follow.codes             1       -0.42 0.19 0.81 1.1

                       PA1  PA2
SS loadings           1.07 0.45
Proportion Var        0.27 0.11
Cumulative Var        0.27 0.38
Proportion Explained  0.71 0.29
Cumulative Proportion 0.71 1.00

Mean item complexity =  1.4
Test of the hypothesis that 2 factors are sufficient.

The degrees of freedom for the null model are  6  and the objective function was  0.51 with Chi Square of  14166.94
The degrees of freedom for the model are -1  and the objective function was  0 

The root mean square of the residuals (RMSR) is  0 
The df corrected root mean square of the residuals is  NA 

The harmonic number of observations is  26803 with the empirical chi square  0.44  with prob <  NA 
The total number of observations was  27567  with Likelihood Chi Square =  0.58  with prob <  NA 

Tucker Lewis Index of factoring reliability =  1.001
Fit based upon off diagonal values = 1
Measures of factor score adequacy             
                                                   PA1   PA2
Correlation of (regression) scores with factors   0.78  0.56
Multiple R square of scores with factors          0.61  0.31
Minimum correlation of possible factor scores     0.22 -0.38
plot(myfa, xlim = c(-1, 1), ylim = c(-1, 1))

fa.diagram(myfa, cut = .001, main="FA C13, PCA extraction, varimax")

# oblimin
myfa<-fa(ethics, fm = "pa", nfactors = 2, rotate = "oblimin", covar=FALSE) 
Loading required namespace: GPArotation
print(myfa, cut=.4, sort=TRUE)
Factor Analysis using method =  pa
Call: fa(r = ethics, nfactors = 2, rotate = "oblimin", covar = FALSE, 
    fm = "pa")
Standardized loadings (pattern matrix) based upon correlation matrix
                             item  PA1   PA2   h2   u2 com
Matter.of.personal.judgement    3 0.72       0.45 0.55 1.0
Depends.on.situation            2 0.64       0.49 0.51 1.1
Can.be.set.aside                4 0.41       0.39 0.61 1.9
Always.follow.codes             1       0.43 0.19 0.81 1.0

                       PA1  PA2
SS loadings           1.15 0.37
Proportion Var        0.29 0.09
Cumulative Var        0.29 0.38
Proportion Explained  0.75 0.25
Cumulative Proportion 0.75 1.00

 With factor correlations of 
      PA1   PA2
PA1  1.00 -0.47
PA2 -0.47  1.00

Mean item complexity =  1.3
Test of the hypothesis that 2 factors are sufficient.

The degrees of freedom for the null model are  6  and the objective function was  0.51 with Chi Square of  14166.94
The degrees of freedom for the model are -1  and the objective function was  0 

The root mean square of the residuals (RMSR) is  0 
The df corrected root mean square of the residuals is  NA 

The harmonic number of observations is  26803 with the empirical chi square  0.44  with prob <  NA 
The total number of observations was  27567  with Likelihood Chi Square =  0.58  with prob <  NA 

Tucker Lewis Index of factoring reliability =  1.001
Fit based upon off diagonal values = 1
Measures of factor score adequacy             
                                                   PA1   PA2
Correlation of (regression) scores with factors   0.83  0.64
Multiple R square of scores with factors          0.69  0.40
Minimum correlation of possible factor scores     0.38 -0.19
plot(myfa, xlim = c(-1, 1), ylim = c(-1, 1))

fa.diagram(myfa, cut = .001, main="FA C13, PCA extraction, oblimin")

# note: the test does not align exactly with SPSS procedures
#test for scaling
#colab<-dplyr::select(ethics, Pos.image.politicians, Sup.gov.policy)
#alpha(colab)

C14 ETHICS (PRACTICES)

#C14
BATm <- apply(dplyr::select(BAT, Paying.for.info:Accept.money), 2, function(x) {x <- recode(x,"'not approve under any circumstances'=1; 'justified on occasion'=2; 'always justified'=3"); x}) 
### re-add country and add labels
BATm<-data.frame(BATm)
BATm$COUNTRY<-BAT$COUNTRY 
BATm$ID<-BAT$ID 
BATmC14<-BATm
BATmCOMPLETE<-BATm %>% filter(complete.cases(.)) # note filter on only complete C14* cases
BATmORG<-BATm # make a copy of the dataset (orginal)
### convert to matrix of averages by country and add rownames and labels
BATm<-BATm %>%
  group_by(COUNTRY) %>%
  summarise_each(funs(Mean), Paying.for.info:Accept.money)
`summarise_each()` is deprecated.
Use `summarise_all()`, `summarise_at()` or `summarise_if()` instead.
To map `funs` over a selection of variables, use `summarise_at()`
BATm<-data.frame(BATm)
rownames(BATm)<-BATm[,1]
BATm<-BATm[,2:11]
BATm<-BATm[c(-36),] #removing Japan because of missing C14 question
BATm<-BATm[c(-59),] #removing Sweden because of missing C14 question
BATmORGC14<-BATm
### make table of mean and sd by question and country
DT <- data.table(BATmC14)
wide <- setnames(DT[, sapply(.SD, function(x) list(n=sum(complete.cases(x)), mean=round(mean(x, na.rm=TRUE), 2), sd=round(sd(x, na.rm=TRUE), 2))), by=COUNTRY], c("COUNTRY", sapply(names(DT)[-12], paste0, c(".n", ".men", ".SD"))))
table.meansdC14<-as.data.frame(wide[,1:31])

PCA and biplot, raw values C14

x<-BATm
paran(x) # 2 components

Using eigendecomposition of correlation matrix.
Computing: 10%  20%  30%  40%  50%  60%  70%  80%  90%  100%


Results of Horn's Parallel Analysis for component retention
300 iterations, using the mean estimate

-------------------------------------------------- 
Component   Adjusted    Unadjusted    Estimated 
            Eigenvalue  Eigenvalue    Bias 
-------------------------------------------------- 
1           3.590664    4.250436      0.659772
2           1.400674    1.839303      0.438628
-------------------------------------------------- 

Adjusted eigenvalues > 1 indicate dimensions to retain.
(2 components retained)
res.pca<-PCA(x , scale.unit=FALSE, ncp=2, graph = TRUE)

fviz_pca_biplot(res.pca, geom = "text",  title="Ethics(C14) Raw values", axes =c(1,2), labelsize=2.5, repel=TRUE) + theme_minimal()

fviz_pca_var(res.pca, col.var = "black")+ labs(title = "Ethics(C14) Raw values")

fviz_screeplot(res.pca, ncp=10)

fviz_contrib(res.pca, choice = "var", axes = 1)

fviz_contrib(res.pca, choice = "var", axes = 2)

indroles <- get_pca_ind(res.pca)
C14ind<-indroles$coord
# HCPC Clustering
res.pca.hcpc<-HCPC(res.pca, nb.clust=-1) # 3 clusters

fviz_cluster(res.pca.hcpc, data = x, frame.type = "convex", repel=TRUE)+ theme_tufte() + labs(title = "C14 clusters (after PCA)") + ylab("2: Accept money/publ. unverified --->") + xlab("1: Acceptance (general) --->") + theme(axis.text=element_text(size=12), axis.title=element_text(size=14,face="bold"))
argument frame is deprecated; please use ellipse instead.argument frame.type is deprecated; please use ellipse.type instead.

res.pca.hcpc$desc.var
$quanti.var
                          Eta2      P-value
False.identity       0.5054515 3.314947e-10
Undercover.empl      0.4514724 8.225306e-09
Hidden.miccam        0.4499298 8.973496e-09
Using.conf.documents 0.3914928 2.052281e-07
Publ.unverified      0.3874586 2.518830e-07
Recreations          0.3493974 1.632261e-06
Use.personal.doc     0.3323994 3.630936e-06
Pressure.informants  0.2894590 2.507629e-05
Paying.for.info      0.2814599 3.547986e-05
Accept.money         0.2220268 4.167763e-04

$quanti
$quanti$`1`
                        v.test Mean in category Overall mean sd in category Overall sd      p.value
Pressure.informants  -2.056833         1.433895     1.504220      0.1684411  0.1956503 3.970233e-02
Publ.unverified      -2.397120         1.151667     1.230313      0.1018828  0.1877376 1.652450e-02
Paying.for.info      -3.074533         1.369469     1.478706      0.1649810  0.2033088 2.108326e-03
Recreations          -3.464035         1.355207     1.530467      0.2603903  0.2895131 5.321373e-04
Use.personal.doc     -3.659470         1.301948     1.399896      0.1206191  0.1531598 2.527375e-04
Using.conf.documents -4.787314         1.557939     1.773167      0.2461223  0.2572608 1.690284e-06
False.identity       -5.181118         1.338812     1.544273      0.1427306  0.2269199 2.205596e-07
Undercover.empl      -5.206467         1.443252     1.633863      0.1490712  0.2094938 1.924699e-07
Hidden.miccam        -5.335515         1.542969     1.760803      0.2013912  0.2336225 9.527376e-08

$quanti$`2`
                        v.test Mean in category Overall mean sd in category Overall sd      p.value
Using.conf.documents  4.265682         1.921332     1.773167     0.16501165  0.2572608 1.992924e-05
Hidden.miccam         3.104298         1.858720     1.760803     0.14528254  0.2336225 1.907314e-03
Undercover.empl       2.446191         1.703053     1.633863     0.16151870  0.2094938 1.443746e-02
Accept.money         -2.798442         1.064234     1.141770     0.07363577  0.2052133 5.134973e-03

$quanti$`3`
                      v.test Mean in category Overall mean sd in category Overall sd      p.value
Publ.unverified     4.933383         1.461858     1.230313      0.2441595  0.1877376 8.081738e-07
Pressure.informants 4.266388         1.712900     1.504220      0.1839708  0.1956503 1.986635e-05
Recreations         4.244964         1.837710     1.530467      0.2274297  0.2895131 2.186288e-05
False.identity      4.044050         1.773692     1.544273      0.1255413  0.2269199 5.253563e-05
Use.personal.doc    3.930550         1.550396     1.399896      0.1768360  0.1531598 8.475184e-05
Paying.for.info     3.831924         1.673472     1.478706      0.2263899  0.2033088 1.271453e-04
Accept.money        3.534094         1.323081     1.141770      0.2173916  0.2052133 4.091754e-04
Undercover.empl     3.110394         1.796765     1.633863      0.1501910  0.2094938 1.868377e-03
Hidden.miccam       2.442858         1.903479     1.760803      0.1810163  0.2336225 1.457148e-02


attr(,"class")
[1] "catdes" "list " 
# K-means clustering
fviz_nbclust(x, kmeans, method = "gap_stat") # 1 cluster
Clustering k = 1,2,..., K.max (= 10): .. done
Bootstrapping, b = 1,2,..., B (= 100)  [one "." per sample]:
.................................................. 50 
.................................................. 100 

# Non-metric MDS
library(ggrepel)
d<-dist(BATm) # also removing Argentina #CHECKROWNUMBER
fit <- isoMDS(d, k=2)
initial  value 21.272747 
iter   5 value 15.737199
iter  10 value 15.148189
iter  15 value 14.944642
iter  15 value 14.934252
iter  15 value 14.934252
final  value 14.934252 
converged
fit
$points
                             [,1]         [,2]
Albania               0.032773678 -0.518224621
Argentina            -0.184649319 -0.013511940
Australia            -0.275344982  0.483536939
Austria              -0.002365233  0.168018257
Bangladesh           -0.540787403 -0.257746004
Belgium               0.201331779 -0.143793225
Bhutan                0.800739794  0.192704727
Botswana             -0.153520101 -0.055115182
Brazil               -0.103242458 -0.368165731
Bulgaria             -0.004116274 -0.264569501
Canada                0.368404062 -0.208664097
Chile                -0.005983910 -0.033920615
China                 0.489474848  0.835555187
Colombia             -0.711095082  0.191822488
Croatia               0.047797534  0.108327914
Cyprus               -0.246612834 -0.349204182
Czech Republic        0.280161229 -0.228679416
Denmark               0.521694586 -0.021940383
Ecuador              -0.322881918  0.345268862
Egypt                -0.299711681 -0.281387772
El Salvador          -0.455797055  0.110180560
Estonia               0.352799003  0.317314665
Ethiopia             -0.611387880  0.115513122
Finland               0.404591713  0.240081496
France                0.242004486 -0.594867767
Germany               0.152427374  0.357355884
Greece               -0.397536703 -0.190011799
Hong Kong             0.333219194  0.051526775
Hungary               0.258394886  0.170249628
Iceland              -0.155680513 -0.201158078
India                 0.078564284  0.089396777
Indonesia            -0.362256295 -0.405859676
Ireland               0.442862885 -0.000684754
Israel                1.370728591  0.002644432
Italy                 0.232798874 -0.030263571
Kenya                 0.111231202  0.065399486
Kosovo               -0.211302563 -0.189143077
Latvia                0.275051856 -0.200795797
Malawi               -0.004653981 -0.013352845
Malaysia             -0.250756105  0.212361309
Mexico               -0.179652724  0.010582882
Moldova               0.285879350 -0.401862620
Netherlands           0.222978382 -0.221224082
New Zealand          -0.083339715  0.126427159
Norway                0.219132742 -0.120947999
Oman                  1.116528311  0.782749910
Philippines          -0.340005426  0.126085042
Portugal              1.017167122  0.355618988
Qatar                -1.440800825 -0.032913338
Romania               0.327171867 -0.394275466
Russia                0.546988540 -0.181193406
Serbia               -0.231377697 -0.014675825
Sierra Leone          0.471922802  0.144307796
Singapore            -0.410216149  0.135892365
South Africa         -0.116228145 -0.036516379
South Korea           0.112004158 -0.302225828
Spain                -0.047865862 -0.147373888
Sudan                -0.447171933 -0.287793182
Switzerland          -0.031294811  0.171696122
Tanzania             -1.706010536  0.937779542
Thailand              0.161719293  0.416745065
Turkey               -0.018553723 -0.603575024
United Arab Emirates -0.881743218  0.019871498
UK                    0.155482949  0.087514680
USA                  -0.400084319 -0.056892489

$stress
[1] 14.93425
fit.sh<-Shepard(d, fit$points)
plot(fit.sh, pch = ".")
lines(fit.sh$x, fit.sh$yf, type = "S")

x <- fit$points[,1]
y <- fit$points[,2]
plot(x, y, xlab="Coordinate 1", ylab="Coordinate 2",
main="NonMetric MDS",   type="n")
text(x, y, labels = row.names(BATm), cex=.7)

space<-as.data.frame(fit$points)
#space$label<-C13x[,-1]
qplot(V1, V2, data=space) + geom_text_repel(aes(label=row.names(fit$points))) + ggtitle("Non-parametric MDS C14, centered means") + theme_minimal()

#res.mds.hcpc<-HCPC(space, nb.clust=-1) 
#fviz_cluster(res.mds.hcpc, data = x, frame.type = "convex", repel=TRUE, labelsize=3)+ theme_tufte() + labs(title = "C14 clusters (after MDS)") 
# res.mds.hcpc$desc.var

Various descriptive statistics and figures C14

# sjp.setTheme(geom.outline.size = 0, geom.label.size = 3, title.size = 1.5)
sjp.likert(BAT[,6:15], sort.frq = "pos.asc", show.prc.sign = TRUE, digits=0, show.n=FALSE, show.legend=FALSE, catcount=4,
           title="Agreement?     (C14, all countries)") # lickert plot
# Problem: Sweden is missing C14E (Personal documents) and Japan C14J (Publ. unverified)
## solution: The value is set to average for all other countries 
## colMeans(BATm, na.rm=TRUE)
# Japan
BATm[36,9]<-1.236357 #CHECKROWNUMBER 
# Sweden
BATm[60,5]<-1.401936 #CHECKROWNUMBER
# Average mean and spread of roles (based on country averages), boxplot and beanplot
sortedBATm<-BATm[ , order(colMeans(BATm))] # sort by column mean
par(mar = c(4,15,2,2)) # set margins

boxplot(x = as.list(sortedBATm), horizontal = TRUE, las=1, main="Averages aggregated by country (C14)", log="")
par(mar = c(4,15,2,2)) # set margins

beanplot(x = as.list(sortedBATm), horizontal = TRUE, las=1, main="Averages aggregated by country (C14)", log="")

##Bertin plot (uncentered)
x <- scale_by_rank(as.matrix(BATm))
order <- seriate(x, method="PCA")
bertinplot(x, order, options = list(panel=panel.squares, shading=TRUE, reverse=TRUE, mar = c(1,1,10,6), gp_labels=gpar(fontsize=8)))

order <- seriate(x, method="PCA_angle")
bertinplot(x, order, options = list(panel=panel.squares, shading=TRUE, reverse=TRUE, mar = c(1,1,10,6), gp_labels=gpar(fontsize=8)))

# network plot of correlations
c<-correlate(BATm)
network_plot(c, min_cor=.2, colors=c("red", "green"), legend=TRUE) 

c<-cor(BATm)
corrplot(c, type = "upper", order = "FPC", tl.col = "black", tl.srt = 45, diag=FALSE, tl.cex=0.8,mar=c(1,0,0,1))

FA test C14

prethic<-BATmC14
#prethic<-dplyr::filter(roles,COUNTRY!='Singapore_NON-REP' & COUNTRY !='Ethiopia') # remove Singapore and Ethiopia
x<-t(prethic[,c(-(11:12))])
x<-scale(x, scale=FALSE)
x<-t(x)
center_prethic<-as.data.frame(x)
center_prethic$COUNTRY<-ethic$COUNTRY
center_prethic$ID<-prethic$ID
prethics<-prethic[,-c(11:12)] #removing country and ID
prethics<-prethics[,-8] # removing recreations
#prethics<-center_prethic[,-c(11:12)]
#prethics<-prethics %>% filter(complete.cases(.))
describe(prethics)
                                                                  25%           50%           75%                             
 2.374840e+05  1.501116e+00  6.148928e-01  1.000000e+00  1.000000e+00  1.000000e+00  2.000000e+00  3.000000e+00 -2.374750e+05 
KMO(prethics) #  suitable, KMO MSA=0.83, .82 without recreations
Kaiser-Meyer-Olkin factor adequacy
Call: KMO(r = prethics)
Overall MSA =  0.82
MSA for each item = 
     Paying.for.info Using.conf.documents       False.identity  Pressure.informants     Use.personal.doc      Undercover.empl 
                0.87                 0.82                 0.86                 0.88                 0.85                 0.84 
       Hidden.miccam      Publ.unverified         Accept.money 
                0.83                 0.73                 0.68 
cortest.bartlett(prethics)
R was not square, finding R from data
$chisq
[1] 47616.4

$p.value
[1] 0

$df
[1] 36
fa.parallel(prethics)  # suggest 4 factors and 2 components (also without recr.)
Parallel analysis suggests that the number of factors =  4  and the number of components =  2 

#varimax, rotated
myfa<-fa(prethics, fm = "pa", nfactors = 4, rotate = "varimax", covar=FALSE, SMC=FALSE) 
print(myfa, cut=.4, sort=TRUE)
Factor Analysis using method =  pa
Call: fa(r = prethics, nfactors = 4, rotate = "varimax", SMC = FALSE, 
    covar = FALSE, fm = "pa")
Standardized loadings (pattern matrix) based upon correlation matrix
                     item  PA1  PA2  PA3   PA4   h2   u2 com
Hidden.miccam           7 0.62                 0.43 0.57 1.2
Undercover.empl         6 0.62                 0.45 0.55 1.4
False.identity          3 0.57                 0.40 0.60 1.5
Paying.for.info         1 0.41                 0.22 0.78 1.6
Accept.money            9      0.80            0.67 0.33 1.1
Publ.unverified         8      0.57            0.38 0.62 1.4
Pressure.informants     4           0.88       0.87 0.13 1.2
Using.conf.documents    2                 0.54 0.42 0.58 1.8
Use.personal.doc        5                 0.43 0.40 0.60 3.2

                       PA1  PA2  PA3  PA4
SS loadings           1.54 1.16 0.88 0.67
Proportion Var        0.17 0.13 0.10 0.07
Cumulative Var        0.17 0.30 0.40 0.47
Proportion Explained  0.36 0.27 0.21 0.16
Cumulative Proportion 0.36 0.63 0.84 1.00

Mean item complexity =  1.6
Test of the hypothesis that 4 factors are sufficient.

The degrees of freedom for the null model are  36  and the objective function was  1.73 with Chi Square of  47616.4
The degrees of freedom for the model are 6  and the objective function was  0.01 

The root mean square of the residuals (RMSR) is  0.01 
The df corrected root mean square of the residuals is  0.02 

The harmonic number of observations is  25883 with the empirical chi square  176.34  with prob <  2e-35 
The total number of observations was  27567  with Likelihood Chi Square =  239.84  with prob <  6.1e-49 

Tucker Lewis Index of factoring reliability =  0.971
RMSEA index =  0.038  and the 90 % confidence intervals are  0.034 0.042
BIC =  178.5
Fit based upon off diagonal values = 1
Measures of factor score adequacy             
                                                   PA1  PA2  PA3   PA4
Correlation of (regression) scores with factors   0.79 0.84 0.91  0.63
Multiple R square of scores with factors          0.62 0.70 0.82  0.40
Minimum correlation of possible factor scores     0.24 0.41 0.64 -0.20
plot(myfa, xlim = c(-1, 1), ylim = c(-1, 1))

fa.diagram(myfa, cut = .001, main="FA C14, PCA extraction, varimax")

# oblimin
myfa<-fa(prethics, fm = "pa", nfactors = 4, rotate = "oblimin", covar=FALSE,  SMC=FALSE) 
print(myfa, cut=.4, sort=TRUE)
Factor Analysis using method =  pa
Call: fa(r = prethics, nfactors = 4, rotate = "oblimin", SMC = FALSE, 
    covar = FALSE, fm = "pa")
Standardized loadings (pattern matrix) based upon correlation matrix
                     item   PA1   PA2   PA3   PA4   h2   u2 com
Hidden.miccam           7  0.66                   0.43 0.57 1.0
Undercover.empl         6  0.64                   0.45 0.55 1.0
False.identity          3  0.57                   0.40 0.60 1.1
Paying.for.info         1  0.43                   0.22 0.78 1.3
Accept.money            9        0.82             0.67 0.33 1.0
Publ.unverified         8        0.55             0.38 0.62 1.4
Pressure.informants     4              0.93       0.87 0.13 1.0
Using.conf.documents    2                    0.53 0.42 0.58 1.3
Use.personal.doc        5                    0.42 0.40 0.60 1.8

                       PA1  PA2  PA3  PA4
SS loadings           1.53 1.11 0.95 0.66
Proportion Var        0.17 0.12 0.11 0.07
Cumulative Var        0.17 0.29 0.40 0.47
Proportion Explained  0.36 0.26 0.22 0.15
Cumulative Proportion 0.36 0.62 0.85 1.00

 With factor correlations of 
     PA1  PA2  PA3  PA4
PA1 1.00 0.29 0.42 0.61
PA2 0.29 1.00 0.29 0.19
PA3 0.42 0.29 1.00 0.37
PA4 0.61 0.19 0.37 1.00

Mean item complexity =  1.2
Test of the hypothesis that 4 factors are sufficient.

The degrees of freedom for the null model are  36  and the objective function was  1.73 with Chi Square of  47616.4
The degrees of freedom for the model are 6  and the objective function was  0.01 

The root mean square of the residuals (RMSR) is  0.01 
The df corrected root mean square of the residuals is  0.02 

The harmonic number of observations is  25883 with the empirical chi square  176.34  with prob <  2e-35 
The total number of observations was  27567  with Likelihood Chi Square =  239.84  with prob <  6.1e-49 

Tucker Lewis Index of factoring reliability =  0.971
RMSEA index =  0.038  and the 90 % confidence intervals are  0.034 0.042
BIC =  178.5
Fit based upon off diagonal values = 1
Measures of factor score adequacy             
                                                   PA1  PA2  PA3  PA4
Correlation of (regression) scores with factors   0.86 0.86 0.93 0.77
Multiple R square of scores with factors          0.75 0.74 0.87 0.59
Minimum correlation of possible factor scores     0.49 0.47 0.74 0.17
plot(myfa, xlim = c(-1, 1), ylim = c(-1, 1))

fa.diagram(myfa, cut = .001, main="FA C14, PCA extraction, oblimin")

#test for scaling # none are above 0.70, which is problematic
# but Nunnally (1978): When there are a small number of items in the scale (fewer than 10), Cronbach alpha values can be quite small. In this situation it may be better to calculate and report the mean inter-item correlation for the items. Optimal mean inter-item correlation values range from .2 to .4 (as recommended by Briggs & Cheek 1986). 
covert<-dplyr::select(prethics, Undercover.empl, Hidden.miccam, False.identity,Paying.for.info )
alpha(covert) #0.69, average inter-item correlation = average_r=.33 OK

Reliability analysis   
Call: alpha(x = covert)

  raw_alpha std.alpha G6(smc) average_r S/N    ase mean   sd
      0.69      0.69    0.63      0.36 2.2 0.0031  1.6 0.44

 lower alpha upper     95% confidence boundaries
0.68 0.69 0.69 

 Reliability if an item is dropped:
                raw_alpha std.alpha G6(smc) average_r S/N alpha se
Undercover.empl      0.59      0.59    0.50      0.33 1.5   0.0042
Hidden.miccam        0.61      0.61    0.51      0.34 1.5   0.0041
False.identity       0.60      0.60    0.51      0.33 1.5   0.0042
Paying.for.info      0.69      0.69    0.59      0.42 2.2   0.0033

 Item statistics 
                    n raw.r std.r r.cor r.drop mean   sd
Undercover.empl 26361  0.76  0.75  0.63   0.52  1.7 0.62
Hidden.miccam   26655  0.73  0.74  0.61   0.50  1.8 0.59
False.identity  26634  0.74  0.74  0.61   0.51  1.5 0.60
Paying.for.info 26210  0.65  0.65  0.44   0.37  1.5 0.60

Non missing response frequency for each item
                   1    2    3 miss
Undercover.empl 0.43 0.49 0.08 0.04
Hidden.miccam   0.31 0.60 0.09 0.03
False.identity  0.51 0.43 0.06 0.03
Paying.for.info 0.58 0.36 0.05 0.05
personal<-dplyr::select(prethics, Using.conf.documents, Pressure.informants, Use.personal.doc)
alpha(personal) #0.59, average_r=.33

Reliability analysis   
Call: alpha(x = personal)

  raw_alpha std.alpha G6(smc) average_r S/N    ase mean   sd
      0.58      0.59    0.49      0.32 1.4 0.0044  1.6 0.45

 lower alpha upper     95% confidence boundaries
0.57 0.58 0.59 

 Reliability if an item is dropped:
                     raw_alpha std.alpha G6(smc) average_r  S/N alpha se
Using.conf.documents      0.52      0.53    0.36      0.36 1.11   0.0057
Pressure.informants       0.53      0.53    0.36      0.36 1.13   0.0056
Use.personal.doc          0.39      0.39    0.24      0.24 0.64   0.0073

 Item statistics 
                         n raw.r std.r r.cor r.drop mean   sd
Using.conf.documents 26532  0.74  0.72  0.48   0.36  1.8 0.64
Pressure.informants  26441  0.73  0.72  0.48   0.36  1.5 0.62
Use.personal.doc     26013  0.75  0.77  0.60   0.46  1.4 0.56

Non missing response frequency for each item
                        1    2    3 miss
Using.conf.documents 0.32 0.55 0.13 0.04
Pressure.informants  0.57 0.37 0.06 0.04
Use.personal.doc     0.64 0.32 0.04 0.06
personal2<-dplyr::select(prethics, Using.conf.documents, Pressure.informants)
alpha(personal2) #0.4

Reliability analysis   
Call: alpha(x = personal2)

  raw_alpha std.alpha G6(smc) average_r  S/N    ase mean  sd
      0.39      0.39    0.24      0.24 0.64 0.0073  1.7 0.5

 lower alpha upper     95% confidence boundaries
0.38 0.39 0.4 

 Reliability if an item is dropped:
                     raw_alpha std.alpha G6(smc) average_r S/N alpha se
Using.conf.documents      0.24      0.24   0.059      0.24  NA       NA
Pressure.informants       0.24      0.24   0.059      0.24  NA       NA

 Item statistics 
                         n raw.r std.r r.cor r.drop mean   sd
Using.conf.documents 26532  0.80  0.79  0.39   0.24  1.8 0.64
Pressure.informants  26441  0.78  0.79  0.39   0.24  1.5 0.62

Non missing response frequency for each item
                        1    2    3 miss
Using.conf.documents 0.32 0.55 0.13 0.04
Pressure.informants  0.57 0.37 0.06 0.04
moneyunver<-dplyr::select(prethics, Publ.unverified, Accept.money)
alpha(moneyunver) #0.64, average_r=.48

Reliability analysis   
Call: alpha(x = moneyunver)

  raw_alpha std.alpha G6(smc) average_r S/N    ase mean   sd
      0.63      0.64    0.47      0.47 1.8 0.0043  1.2 0.39

 lower alpha upper     95% confidence boundaries
0.62 0.63 0.64 

 Reliability if an item is dropped:
                raw_alpha std.alpha G6(smc) average_r S/N alpha se
Publ.unverified      0.47      0.47    0.22      0.47  NA       NA
Accept.money         0.47      0.47    0.22      0.47  NA       NA

 Item statistics 
                    n raw.r std.r r.cor r.drop mean   sd
Publ.unverified 25920  0.89  0.86  0.59   0.47  1.2 0.50
Accept.money    26718  0.83  0.86  0.59   0.47  1.1 0.41

Non missing response frequency for each item
                   1    2    3 miss
Publ.unverified 0.79 0.18 0.03 0.06
Accept.money    0.92 0.05 0.03 0.03
LS0tCnRpdGxlOiAiV0pTIEV0aGljcyBwciBkZWMxOCwgSkZIIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIEluc3RhbGwgcmVxdWlyZWQgcGFja2FnZXMgYW5kIHNldCB3b3JraW5nIGRpcmVjdG9yeQpgYGB7ciwgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpyZXF1aXJlKGZvcmVpZ24pCnJlcXVpcmUoRmFjdG9NaW5lUikKcmVxdWlyZShzam1pc2MpCnJlcXVpcmUoYWRlNCkKcmVxdWlyZShmYWN0b2V4dHJhKQpyZXF1aXJlKHNvYy5jYSkKcmVxdWlyZShkcGx5cikKcmVxdWlyZShzalBsb3QpCnJlcXVpcmUoY2FyKQpyZXF1aXJlKHZhcmhhbmRsZSkKcmVxdWlyZShnZ3Bsb3QyKQpyZXF1aXJlKHBsb3RsdWNrKQpyZXF1aXJlKGJlYW5wbG90KQpyZXF1aXJlKHNlcmlhdGlvbikKcmVxdWlyZShjb3JycikKcmVxdWlyZShwYXJhbikKcmVxdWlyZSh0YWJsZXMpCnJlcXVpcmUoeGxzeCkKcmVxdWlyZShjb3JycGxvdCkKcmVxdWlyZShhcGUpCnJlcXVpcmUoZ3JpZCkKcmVxdWlyZShtYXRyaXhTdGF0cykKcmVxdWlyZShnZ3RoZW1lcykKcmVxdWlyZShkYXRhLnRhYmxlKQpyZXF1aXJlKHBzeWNoKQpyZXF1aXJlKGV4cGxvcikKbGlicmFyeShyd29ybGRtYXApCmxpYnJhcnkoQ0NBKQpsaWJyYXJ5KGdncmVwZWwpCmBgYAoKIyBJbXBvcnQgV0pTIGNvbnNvbGlkYXRlZCBkYXRhIGZpbGUgYW5kIGNvdW50cnkgZGF0YSBmcm9tIFNQU1MKYGBge3IsIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc2V0d2QoIi9Vc2Vycy9qYW5mcmVkcmlraG92ZGVuL0Ryb3Bib3gvREJYUEFHQUFOREVBUkJFSUQvU3RhdGlzdGlray9Sd29ya2Rpci9XSlMiKQp3anM8LXJlYWQuc3BzcygiV0pTIENvbnNvbGlkYXRlZCBEYXRhIFY0LTAxIDMxMDExNy5zYXYiLCB0by5kYXRhLmZyYW1lPVRSVUUpCmNvdW50cnk8LXJlYWQuc3BzcygiY291bnRyeSBkYXRhIDEwMDIxNy5zYXYiLCB0by5kYXRhLmZyYW1lPVRSVUUpCmNvdW50cnlvcmc8LWNvdW50cnkKIyB3anM8LXJlYWQuc3BzcygiV0pTIENvbnNvbGlkYXRlZCBEYXRhIFYyLTAzIDE0MDkxNi5zYXYiLCB0by5kYXRhLmZyYW1lPVRSVUUpCiMgd2pzPC1yZWFkLnNwc3MoIldKUyBDb25zb2xpZGF0ZWQgRGF0YSBWMy0wMSAyNjEwMTYuc2F2IiwgdG8uZGF0YS5mcmFtZT1UUlVFLCB1c2UubWlzc2luZ3M9RkFMU0UpICMgSWYgb25lIHdhbnQgdG8gaW5jbHVkZSBhbGwgbWlzc2luZyB2YWx1ZXMKIyMgTk9URTogSUYgVEhFIE5VTUJFUiBPUiBPUkRFUiBPRiBDT1VOVFJJRVMgQVJFIENIQU5HRUQsIENIRUNLIENPVU5UUlkgUk9XIE5VTUJFUiBiZWxvd3Mgd2hlcmUgI0NIRUNLUk9XTlVNQkVSIGFyZSBhZGRlZAp3anMkSUQ8LWFzLm51bWVyaWMocm93bmFtZXMod2pzKSkgIyBhc3NpZ24gcm93IG51bWJlciBhcyBJRAp3amM8LWRwbHlyOjpsZWZ0X2pvaW4od2pzLGNvdW50cnksIGJ5PSJDT1VOVFJZIikKYGBgCgojIyBGaWx0ZXIgYWRkaXRpb25hbCBjb3VudHJpZXMgYW5kIG1ha2Ugc3Vic2FtcGxlcyBpZiBuZWVkZWQKYGBge3IgQWRkaXRpb25hbCBzdWJzZXR0aW5nIGlmIG5lZWRlZCwgaW5jbHVkZT1GQUxTRX0KIyMocmVtb3ZlICMjIHRvIHVzZSkKIyMjd2pzPC1kcGx5cjo6ZmlsdGVyKHdqcyxDNz09J0N1bHR1cmUnKSAjIEN1bHR1cmUgam91cm5hbGlzdHMKIyMjd2pzPC1maWx0ZXIod2pzLCBDT1VOVFJZID09J05vcndheScgfCBDT1VOVFJZID09J0Rlbm1hcmsnIHwgQ09VTlRSWSA9PSdTd2VkZW4nIHwgQ09VTlRSWSA9PSdJY2VsYW5kJyB8IENPVU5UUlkgPT0nRmlubGFuZCcpICMgTm9yZGljIGNvdW50cmllcwojIyNub3J3YXk8LWRwbHlyOjpmaWx0ZXIod2pzLENPVU5UUlk9PSdOb3J3YXknKSAKYGBgCgojIyBGdW5jdGlvbnMKYGBge3IgRnVuY3Rpb25zLCBlY2hvPVRSVUV9CnNjYWxlX2J5X3JhbmsgPC0gZnVuY3Rpb24oeCkgYXBwbHkoeCwgMiwgcmFuaykKTWVhbiA8LSBmdW5jdGlvbih4KSBiYXNlOjptZWFuKHgsIG5hLnJtPVRSVUUpICMgTWVhbiBpZ25vcmluZyBtaXNzaW5nIHZhbHVlcwpTZDwtZnVuY3Rpb24oeCkgYmFzZTo6c2QoeCwgbmEucm09VFJVRSkgIyBTRCBpZ25vcmluZyBtaXNzaW5nIHZhbHVlcwpkZWxldGUubmEgPC0gZnVuY3Rpb24oREYsIG49MCkgewogIERGW3Jvd1N1bXMoaXMubmEoREYpKSA8PSBuLF0KfSAjIGRyb3Agcm93cyB3aXRoIGEgdHJlc2hvbGQgZm9yIE5BcwpgYGAKCiMjIFJlY29kaW5nCmBgYHtyfQojIGZpeGluZyBuYW1pbmcgb2YgVW5pdGVkIEFyYWIgRW1pcmF0ZXMgKHNob3VsZCBOT1QgYmUgVW5pdGVkIEFyYWJpYyBFbWlyYXRlcykKbGV2ZWxzKGNvdW50cnkkQ09VTlRSWSlbbWF0Y2goIlVBRSIsbGV2ZWxzKGNvdW50cnkkQ09VTlRSWSkpXSA8LSAiVW5pdGVkIEFyYWIgRW1pcmF0ZXMiCmxldmVscyh3anMkQ09VTlRSWSlbbWF0Y2goIlVBRSIsbGV2ZWxzKHdqcyRDT1VOVFJZKSldIDwtICJVbml0ZWQgQXJhYiBFbWlyYXRlcyIKCiMgaW1wb3J0IGFuZCBzZWxlY3Rpb24gb2YgdmFyaWFibGVzIGZvciBhbmFseXNpcwppbmRlcDwtIGRwbHlyOjpzZWxlY3Qod2pzLCBDT1VOVFJZLCBDMSwgQzIsIEM2LCBDNywgQzIwLCBDMTRBOkMxNEssIEMyMjpDMjMsIFQ1LCBUNy4xOlQ5LCBBVVRPTk9NWSwgSUQpCgojcmVjb2Rpbmcgd2hlcmUgbmVjZXNzYXJ5CiNDMSBtYW5hZ2VyCmluZGVwJG1hbmFnZXI8LXJlY29kZShpbmRlcCRDMSwgImMoJ1JlcG9ydGVyJywgJ05ld3Mgd3JpdGVyJywgJ1RyYWluZWUnLCAnT3RoZXInKT0nbm90Lm1hbmFnZXInOyBOQT1OQTsgZWxzZT0nbWFuYWdlciciKQppbmRlcCRtYW5hZ2VyIDwtIGZhY3RvcihpbmRlcCRtYW5hZ2VyLCBsZXZlbHM9Yygibm90Lm1hbmFnZXIiLCAibWFuYWdlciIpKSAjIGNoYW5nZXIgb3JkZXIgb2YgbGV2ZWxzCmluZGVwJFQ1PC1mYWN0b3IoaW5kZXAkVDUsIGxldmVscz1jKCJSYW5rLWFuZC1maWxlIiwiXCJKdW5pb3JcIiBtYW5hZ2VyIiwiU2VuaW9yL2V4ZWN1dGl2ZSBtYW5hZ2VyIikpCiNDMiBmdWxsdGltZQppbmRlcCRmdWxsdGltZTwtcmVjb2RlKGluZGVwJEMyLCAiYygnRnVsbC10aW1lIGVtcGxveW1lbnQnKT0nRnVsbHRpbWUnOyBOQT1OQTsgZWxzZT0nbm90LkZ1bGx0aW1lJyIpCiNDNi83IG5ld3NiZWF0CmluZGVwJGhhcmRuZXdzPC1yZWNvZGUoaW5kZXAkQzcsICJjKCdOZXdzL2N1cnJlbnQgYWZmYWlycycsICdQb2xpdGljcycsICdGb3JlaWduIHBvbGl0aWNzJywgJ0RvbWVzdGljIHBvbGl0aWNzJywgJ0Vjb25vbXknLCAnQ3JpbWUgJiBsYXcnLCBOQSk9J2hhcmRuZXdzIG9yIGdlbmVyYWwnOyBlbHNlPSdzb2Z0bmV3cyciKQojQzIwIGVkdWNhdGlvbgppbmRlcCRoaWdoZWR1PC1yZWNvZGUoaW5kZXAkQzIwLCAiYygnTm90IGNvbXBsZXRlZCBoaWdoIHNjaG9vbCcsICdDb21wbGV0ZWQgaGlnaCBzY2hvb2wnLCAnc29tZSB1bml2ZXJzaXR5IHN0dWRpZXMsIGJ1dCBubyBkZWdyZWUnKT0nbm8uaGlnaGVkdSc7IE5BPU5BOyBlbHNlPSdoaWdoLmVkdSciKQppbmRlcCRtYXN0ZXI8LXJlY29kZShpbmRlcCRDMjAsICJjKCdOb3QgY29tcGxldGVkIGhpZ2ggc2Nob29sJywgJ0NvbXBsZXRlZCBoaWdoIHNjaG9vbCcsICdzb21lIHVuaXZlcnNpdHkgc3R1ZGllcywgYnV0IG5vIGRlZ3JlZScsICdDb2xsZWdlL0JhY2hlbG9yXDM0MlwyMDBcMjMxcyBkZWdyZWUgb3IgZXF1aXZhbGVudCcpPSduby5tYXN0ZXInO05BPU5BOyBlbHNlPSdtYXN0ZXInIikKaW5kZXAkZWR1MzwtcmVjb2RlKGluZGVwJEMyMCwgImMoJ05vdCBjb21wbGV0ZWQgaGlnaCBzY2hvb2wnLCAnQ29tcGxldGVkIGhpZ2ggc2Nob29sJyk9J2VkdS5ub2hpZ2gnO2MoJ3NvbWUgdW5pdmVyc2l0eSBzdHVkaWVzLCBidXQgbm8gZGVncmVlJywgJ0NvbGxlZ2UvQmFjaGVsb3JcMzQyXDIwMFwyMzFzIGRlZ3JlZSBvciBlcXVpdmFsZW50Jyk9J2VkdS5taWQnOyBOQT1OQTsgZWxzZT0nZWR1Lm1hc3RlciciKQppbmRlcCRlZHUzIDwtIGZhY3RvcihpbmRlcCRlZHUzLCBsZXZlbHM9YygiZWR1Lm5vaGlnaCIsICJlZHUubWlkIiwgImVkdS5tYXN0ZXIiKSkgIyBjaGFuZ2VyIG9yZGVyIG9mIGxldmVscwojIFQ3IG1lZGl1bSAoaG93PykKaW5kZXAkYnJvYWRjYXN0PC1yZWNvZGUoaW5kZXAkVDcuNCwgImMoJ1llcycpPSdCcm9hZGNhc3RpbmcnOyBOQT1OQTsgZWxzZT0nbm90LmJyb2FkY2FzdGluZyciKQppbmRlcCRicm9hZGNhc3RbaW5kZXAkVDcuNT09IlllcyJdPC0iQnJvYWRjYXN0aW5nIgppbmRlcCRicm9hZGNhc3Q8LWZhY3RvcihpbmRlcCRicm9hZGNhc3QsIGxldmVscz1jKCJub3QuYnJvYWRjYXN0aW5nIiwgIkJyb2FkY2FzdGluZyIpKQojIFQ4IG5hdGlvbmFsIG1lZGlhCmluZGVwJG5hdGlvbmFsPC1yZWNvZGUoaW5kZXAkVDgsICJjKCdOYXRpb25hbCcpPSdOYXRpb25hbCc7IE5BPU5BOyBlbHNlPSdub3QubmF0aW9uYWwnIikKaW5kZXAkbmF0aW9uYWw8LWZhY3RvcihpbmRlcCRuYXRpb25hbCwgbGV2ZWxzPWMoIm5vdC5uYXRpb25hbCIsICJOYXRpb25hbCIpKQojIFQ5IG93bmVyc2hpcAppbmRlcCRvd25lcjwtcmVjb2RlKGluZGVwJFQ5LCAiYygnUHVyZWx5IHB1YmxpYyBvd25lcnNoaXAnLCAnUHVyZWx5IHN0YXRlIG93bmVyc2hpcCcsICdNaXhlZCBvd25lcnNoaXAgYnV0IG1vc3RseSBwdWJsaWMnLCAnTWl4ZWQgb3duZXJzaGlwIGJ1dCBtb3N0bHkgc3RhdGUtb3duZWQnKT0ncHVibGljL3N0YXRlJzsgTkE9TkE7IGVsc2U9J3ByaXZhdGUnIikKYGBgCgojIEMxMyBFVEhJQ1MKYGBge3IgRXRoaWNzLCBlY2hvPVRSVUV9CiMjIFN1YnNldHRpbmcgZGF0YXNldCBhbmQgcmVuYW1pbmcgdmFyaWFibGVzCkJBVDwtZHBseXI6OnNlbGVjdCh3anMsQ09VTlRSWSwgSUQsIEMxM0E6QzE0SykKIyBCQVQ8LUJBVCAlPiUgZmlsdGVyKGNvbXBsZXRlLmNhc2VzKC4pKSAgIyBub3RlIGZpbHRlciBvbiBvbmx5IGNvbXBsZXRlIGNhc2VzCkJBVDwtcGx5cjo6cmVuYW1lKEJBVCwgYyhDMTNBPSJBbHdheXMuZm9sbG93LmNvZGVzIiwgQzEzQj0iRGVwZW5kcy5vbi5zaXR1YXRpb24iLCBDMTNDPSJNYXR0ZXIub2YucGVyc29uYWwuanVkZ2VtZW50IiwgQzEzRD0iQ2FuLmJlLnNldC5hc2lkZSIsQzE0QT0iUGF5aW5nLmZvci5pbmZvIiwgQzE0Qj0iVXNpbmcuY29uZi5kb2N1bWVudHMiLCBDMTRDPSJGYWxzZS5pZGVudGl0eSIsIEMxNEQ9IlByZXNzdXJlLmluZm9ybWFudHMiLApDMTRFPSJVc2UucGVyc29uYWwuZG9jIiwgQzE0Rj0iVW5kZXJjb3Zlci5lbXBsIiwgQzE0Rz0iSGlkZGVuLm1pY2NhbSIsIEMxNEg9IlJlY3JlYXRpb25zIiwgQzE0Sj0iUHVibC51bnZlcmlmaWVkIiwgQzE0Sz0iQWNjZXB0Lm1vbmV5IikpCmBgYAoKYGBge3Igd2FybmluZz1GQUxTRX0KI0MxMwpCQVRtIDwtIGFwcGx5KGRwbHlyOjpzZWxlY3QoQkFULCBBbHdheXMuZm9sbG93LmNvZGVzOkNhbi5iZS5zZXQuYXNpZGUpLCAyLCBmdW5jdGlvbih4KSB7eCA8LSByZWNvZGUoeCwiJ3N0cm9uZ2x5IGRpc2FncmVlJz0xOyAnc29tZXdoYXQgZGlzYWdyZWUnPTI7ICd1bmRlY2lkZWQnPTM7ICdzb21ld2hhdCBhZ3JlZSc9NDsgJ3N0cm9uZ2x5IGFncmVlJz01Iik7IHh9KQoKIyMjIHJlLWFkZCBjb3VudHJ5IGFuZCBhZGQgbGFiZWxzCkJBVG08LWRhdGEuZnJhbWUoQkFUbSkKQkFUbSRDT1VOVFJZPC1CQVQkQ09VTlRSWSAKQkFUbSRJRDwtQkFUJElEIApCQVRtQzEzPC1CQVRtICMgbWFrZSBhIGNvcHkgb2YgdGhlIGRhdGFzZXQgKG9yZ2luYWwpCkJBVG1DT01QTEVURTwtQkFUbSAlPiUgZmlsdGVyKGNvbXBsZXRlLmNhc2VzKC4pKSAjIG5vdGUgZmlsdGVyIG9uIG9ubHkgY29tcGxldGUgQzEzKiBjYXNlcwpCQVRtT1JHPC1CQVRtICMgbWFrZSBhIGNvcHkgb2YgdGhlIGRhdGFzZXQgKG9yZ2luYWwpCgojIyMgY29udmVydCB0byBtYXRyaXggb2YgYXZlcmFnZXMgYnkgY291bnRyeSBhbmQgYWRkIHJvd25hbWVzIGFuZCBsYWJlbHMKQkFUbTwtQkFUbSAlPiUKICBncm91cF9ieShDT1VOVFJZKSAlPiUKICBzdW1tYXJpc2VfZWFjaChmdW5zKE1lYW4pLCBBbHdheXMuZm9sbG93LmNvZGVzOkNhbi5iZS5zZXQuYXNpZGUpCkJBVG08LWRhdGEuZnJhbWUoQkFUbSkKcm93bmFtZXMoQkFUbSk8LUJBVG1bLDFdCkJBVG1PUkdDMTNtYXA8LUJBVG0KQkFUbTwtQkFUbVssMjo1XQpCQVRtT1JHQzEzPC1CQVRtCiNCQVRtPC1CQVRtW2MoLTYxKSxdIyByZW1vdmUgVGFuemFuaWEgCgpCQVRtPC1CQVRtW2MoLTEwKSxdIyByZW1vdmUgQnVsZ2FyaWEsIEMxMyBoYXMgYmVlbiB3cm9uZ2x5IHRyYW5zbGF0ZWQKQkFUbU9SR0MxMzwtQkFUbU9SR0MxM1tjKC0xMCksXSMgcmVtb3ZlIEJ1bGdhcmlhLCBDMTMgaGFzIGJlZW4gd3JvbmdseSB0cmFuc2xhdGVkCgojIyMgbWFrZSB0YWJsZSBvZiBtZWFuIGFuZCBzZCBieSBxdWVzdGlvbiBhbmQgY291bnRyeQpEVCA8LSBkYXRhLnRhYmxlKEJBVG1DMTMpCndpZGUgPC0gc2V0bmFtZXMoRFRbLCBzYXBwbHkoLlNELCBmdW5jdGlvbih4KSBsaXN0KG49c3VtKGNvbXBsZXRlLmNhc2VzKHgpKSwgbWVhbj1yb3VuZChtZWFuKHgsIG5hLnJtPVRSVUUpLCAyKSwgc2Q9cm91bmQoc2QoeCwgbmEucm09VFJVRSksIDIpKSksIGJ5PUNPVU5UUlldLCBjKCJDT1VOVFJZIiwgc2FwcGx5KG5hbWVzKERUKVstNl0sIHBhc3RlMCwgYygiLm4iLCAiLm1lbiIsICIuU0QiKSkpKQp0YWJsZS5tZWFuc2RDMTM8LWFzLmRhdGEuZnJhbWUod2lkZVssMToxM10pCmBgYCAgICAgICAgICAgICAgCgojIyBNYXBzIEMxMwpgYGB7cn0Kc1BERjwtam9pbkNvdW50cnlEYXRhMk1hcChCQVRtT1JHQzEzbWFwLCBqb2luQ29kZSA9ICJOQU1FIiwgbmFtZUpvaW5Db2x1bW4gPSAiQ09VTlRSWSIpCnBhcihtYWk9YygwLDAsMC4yLDApLHhheHM9ImkiLHlheHM9ImkiKQptYXBDb3VudHJ5RGF0YShzUERGLCBuYW1lQ29sdW1uVG9QbG90ID0gIkFsd2F5cy5mb2xsb3cuY29kZXMiLCBjb2xvdXJQYWxldHRlICA9YygnYmxhY2snLCdncmV5OTAnKSkKbWFwQ291bnRyeURhdGEoc1BERiwgbmFtZUNvbHVtblRvUGxvdCA9ICJEZXBlbmRzLm9uLnNpdHVhdGlvbiIsIGNvbG91clBhbGV0dGUgID1jKCdibGFjaycsJ2dyZXk5MCcpKQptYXBDb3VudHJ5RGF0YShzUERGLCBuYW1lQ29sdW1uVG9QbG90ID0gIk1hdHRlci5vZi5wZXJzb25hbC5qdWRnZW1lbnQiLCBjb2xvdXJQYWxldHRlICA9YygnYmxhY2snLCdncmV5OTAnKSkKbWFwQ291bnRyeURhdGEoc1BERiwgbmFtZUNvbHVtblRvUGxvdCA9ICJDYW4uYmUuc2V0LmFzaWRlIiwgY29sb3VyUGFsZXR0ZSAgPWMoJ2JsYWNrJywnZ3JleTkwJykpCmBgYAoKIyBTY2F0dGVycGxvdHMgQzEzCmBgYHtyfQpmY291bnRyeSA8LSBtZXJnZShCQVRtT1JHQzEzbWFwLGNvdW50cnksYnk9IkNPVU5UUlkiKQpyb3duYW1lcyhmY291bnRyeSk8LWZjb3VudHJ5WywxXQpuYW1uPC1yb3cubmFtZXMoZmNvdW50cnkpIApmY291bnRyeTwtZmNvdW50cnlbYygtMTApLF0gI3JlbW92aW5nIEJ1bGdhcmlhIGJlY2F1c2Ugb2YgQzEzIHdyb25nIHRyYW5zbGF0aW9uCmZjb3VudHJ5PC1mY291bnRyeVtjKC0yMiksXSAjcmVtb3ZpbmcgRXRoaW9waWEgPSBvdXRsaWVyCmZjb3VudHJ5PC1mY291bnRyeVtjKC01MyksXSAjcmVtb3ZpbmcgU2luZ2Fwb3JlID0gb3V0bGllcgoKcXBsb3QoRkhQRlJFRVMsRUlVREVNT1MsIGRhdGEgPSBmY291bnRyeSkgKyBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsPXJvdy5uYW1lcyhmY291bnRyeSkpKSArICB0aGVtZV9taW5pbWFsKCkKCnFwbG90KEZIUEZSRUVTLGZjb3VudHJ5WywyXSwgZGF0YSA9IGZjb3VudHJ5KSArIGdlb21fdGV4dF9yZXBlbChhZXMobGFiZWw9cm93Lm5hbWVzKGZjb3VudHJ5KSkpICsgIHRoZW1lX21pbmltYWwoKSArIGxhYnMoeCA9ICJGcmVlZG9tIEhvdXNlIFByZXNzIEZyZWVkb20gaW5kZXgiLCB5PSJBbHdheXMgZm9sbG93IGNvZGVzIikKcXBsb3QoRkhQRlJFRVMsZmNvdW50cnlbLDNdLCBkYXRhID0gZmNvdW50cnkpICsgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbD1yb3cubmFtZXMoZmNvdW50cnkpKSkgKyAgdGhlbWVfbWluaW1hbCgpICsgbGFicyh4ID0gIkZyZWVkb20gSG91c2UgUHJlc3MgRnJlZWRvbSBpbmRleCIsIHk9IkRlcGVuZHMgb24gc2l0dWF0aW9uIikKcXBsb3QoRkhQRlJFRVMsZmNvdW50cnlbLDRdLCBkYXRhID0gZmNvdW50cnkpICsgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbD1yb3cubmFtZXMoZmNvdW50cnkpKSkgKyAgdGhlbWVfbWluaW1hbCgpICsgbGFicyh4ID0gIkZyZWVkb20gSG91c2UgUHJlc3MgRnJlZWRvbSBpbmRleCIsIHk9Ik1hdHRlciBvZiBwZXJzb25hbCBqdWRnZW1lbnQiKQpxcGxvdChGSFBGUkVFUyxmY291bnRyeVssNV0sIGRhdGEgPSBmY291bnRyeSkgKyBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsPXJvdy5uYW1lcyhmY291bnRyeSkpKSArICB0aGVtZV9taW5pbWFsKCkgKyBsYWJzKHggPSAiRnJlZWRvbSBIb3VzZSBQcmVzcyBGcmVlZG9tIGluZGV4IiwgeT0iQ2FuIGJlIHNldCBhc2lkZSIpCgpxcGxvdChFSVVERU1PUyxmY291bnRyeVssMl0sIGRhdGEgPSBmY291bnRyeSkgKyBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsPXJvdy5uYW1lcyhmY291bnRyeSkpKSArICB0aGVtZV9taW5pbWFsKCkgKyBsYWJzKHggPSAiRUlVIERlbW9jcmFjeSBTY29yZSIsIHk9IkFsd2F5cyBmb2xsb3cgY29kZXMiKQpxcGxvdChFSVVERU1PUyxmY291bnRyeVssM10sIGRhdGEgPSBmY291bnRyeSkgKyBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsPXJvdy5uYW1lcyhmY291bnRyeSkpKSArICB0aGVtZV9taW5pbWFsKCkgKyBsYWJzKHggPSAiRUlVIERlbW9jcmFjeSBTY29yZSIsIHk9IkRlcGVuZHMgb24gc2l0dWF0aW9uIikKcXBsb3QoRUlVREVNT1MsZmNvdW50cnlbLDRdLCBkYXRhID0gZmNvdW50cnkpICsgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbD1yb3cubmFtZXMoZmNvdW50cnkpKSkgKyAgdGhlbWVfbWluaW1hbCgpICsgbGFicyh4ID0gIkVJVSBEZW1vY3JhY3kgU2NvcmUiLCB5PSJNYXR0ZXIgb2YgcGVyc29uYWwganVkZ2VtZW50IikKcXBsb3QoRUlVREVNT1MsZmNvdW50cnlbLDVdLCBkYXRhID0gZmNvdW50cnkpICsgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbD1yb3cubmFtZXMoZmNvdW50cnkpKSkgKyAgdGhlbWVfbWluaW1hbCgpICsgbGFicyh4ID0gIkVJVSBEZW1vY3JhY3kgU2NvcmUiLCB5PSJDYW4gYmUgc2V0IGFzaWRlIikKYGBgCgoKIyMgVmFyaW91cyBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIGFuZCBmaWd1cmVzIEMxMwpgYGB7ciBEZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIGFuZCBmaWd1cmVzIEMxMywgZmlnLmhlaWdodD05LCBmaWcud2lkdGg9Nn0KIyBzanAuc2V0VGhlbWUoZ2VvbS5vdXRsaW5lLnNpemUgPSAwLCBnZW9tLmxhYmVsLnNpemUgPSAzLCB0aXRsZS5zaXplID0gMS41KQojc2pwLmxpa2VydChCQVRbLDI6NV0sIHNvcnQuZnJxID0gInBvcy5hc2MiLCBzaG93LnByYy5zaWduID0gVFJVRSwgZGlnaXRzPTAsIHNob3cubj1GQUxTRSwgc2hvdy5sZWdlbmQ9RkFMU0UsIGNhdGNvdW50PTUsdGl0bGU9IkFncmVlbWVudD8gICAgIChDMTMsIGFsbCBjb3VudHJpZXMpIikgIyBsaWNrZXJ0IHBsb3QKCiMgQXZlcmFnZSBtZWFuIGFuZCBzcHJlYWQgb2Ygcm9sZXMgKGJhc2VkIG9uIGNvdW50cnkgYXZlcmFnZXMpLCBib3hwbG90IGFuZCBiZWFucGxvdApzb3J0ZWRCQVRtPC1CQVRtWyAsIG9yZGVyKGNvbE1lYW5zKEJBVG0pKV0gIyBzb3J0IGJ5IGNvbHVtbiBtZWFuCnBhcihtYXIgPSBjKDQsMTUsMiwyKSkgIyBzZXQgbWFyZ2lucwpib3hwbG90KHggPSBhcy5saXN0KHNvcnRlZEJBVG0pLCBob3Jpem9udGFsID0gVFJVRSwgbGFzPTEsIG1haW49IkF2ZXJhZ2VzIGFnZ3JlZ2F0ZWQgYnkgY291bnRyeSAoQzEzKSIsIGxvZz0iIikKCnBhcihtYXIgPSBjKDQsMTUsMiwyKSkgIyBzZXQgbWFyZ2lucwpiZWFucGxvdCh4ID0gYXMubGlzdChzb3J0ZWRCQVRtKSwgaG9yaXpvbnRhbCA9IFRSVUUsIGxhcz0xLCBtYWluPSJBdmVyYWdlcyBhZ2dyZWdhdGVkIGJ5IGNvdW50cnkgKEMxMykiLCBsb2c9IiIpCgojI0JlcnRpbiBwbG90IChjZW50ZXJlZCkKY0JBVG08LXQoQkFUbSkKY0JBVG08LXNjYWxlKGNCQVRtLCBzY2FsZT1GQUxTRSkgI2NlbnRlcmluZyBvZiBtZWFucwpjQkFUbTwtdChjQkFUbSkKY0JBVG1DMTM8LWNCQVRtCnggPC0gc2NhbGVfYnlfcmFuayhhcy5tYXRyaXgoc2NhbGUoY0JBVG0sIHNjYWxlPUZBTFNFKSkpCm9yZGVyIDwtIHNlcmlhdGUoeCwgbWV0aG9kPSJQQ0EiKQpiZXJ0aW5wbG90KHgsIG9yZGVyLCBvcHRpb25zID0gbGlzdChwYW5lbD1wYW5lbC5zcXVhcmVzLCBzaGFkaW5nPVRSVUUsIHJldmVyc2U9VFJVRSwgbWFyID0gYygxLDEsMTAsNiksIGdwX2xhYmVscz1ncGFyKGZvbnRzaXplPTgpKSkKb3JkZXIgPC0gc2VyaWF0ZSh4LCBtZXRob2Q9IlBDQV9hbmdsZSIpCmJlcnRpbnBsb3QoeCwgb3JkZXIsIG9wdGlvbnMgPSBsaXN0KHBhbmVsPXBhbmVsLnNxdWFyZXMsIHNoYWRpbmc9VFJVRSwgcmV2ZXJzZT1UUlVFLCBtYXIgPSBjKDEsMSwxMCw2KSwgZ3BfbGFiZWxzPWdwYXIoZm9udHNpemU9OCkpKQojdW5jZW50ZXJlZCBDMTMgQmVydGluCnggPC0gc2NhbGVfYnlfcmFuayhhcy5tYXRyaXgoQkFUbSkpCm9yZGVyIDwtIHNlcmlhdGUoeCwgbWV0aG9kPSJQQ0EiKQpiZXJ0aW5wbG90KHgsIG9yZGVyLCBvcHRpb25zID0gbGlzdChwYW5lbD1wYW5lbC5zcXVhcmVzLCBzaGFkaW5nPVRSVUUsIHJldmVyc2U9VFJVRSwgbWFyID0gYygxLDEsMTAsNiksIGdwX2xhYmVscz1ncGFyKGZvbnRzaXplPTgpKSkKCmhlYXRtYXAoY0JBVG0sIG1hcmdpbnM9Yyg1LDUpKSAjIGhlYXRtYXAgKGNlbnRlcmVkKQoKIyBuZXR3b3JrIHBsb3Qgb2YgY29ycmVsYXRpb25zCmM8LWNvcnJlbGF0ZShCQVRtKQpuZXR3b3JrX3Bsb3QoYywgbWluX2Nvcj0uMiwgY29sb3JzPWMoInJlZCIsICJncmVlbiIpKSAjIG5vdCB3b3JraW5nIGZvciBub3cKYzwtY29yKEJBVG0pCmNvcnJwbG90KGMsIHR5cGUgPSAidXBwZXIiLCBvcmRlciA9ICJGUEMiLCB0bC5jb2wgPSAiYmxhY2siLCB0bC5zcnQgPSA0NSwgZGlhZz1GQUxTRSwgdGwuY2V4PTAuOCxtYXI9YygxLDAsMCwxKSkKc2pwLmNvcnIoYykKCiMgZGlzdGFuY2UgbWF0cml4IChjb3JyZWxhdGlvbnMpCiNyZXMuZGlzdCA8LSBnZXRfZGlzdChDMTN4LCBzdGFuZCA9IFRSVUUsIG1ldGhvZCA9ICJwZWFyc29uIikKI2Z2aXpfZGlzdChyZXMuZGlzdCwgZ3JhZGllbnQgPSBsaXN0KGxvdyA9ICIjMDBBRkJCIiwgbWlkID0gIndoaXRlIiwgaGlnaCA9ICIjRkM0RTA3IikpCgpgYGAKCiMjIFBDQSBhbmQgYmlwbG90LCBtZWFuIGNlbnRlcmVkCmBgYHtyIHdhcm5pbmc9RkFMU0V9CiNCQVRtMjwtIEJBVG1bLWMoMjIsNTQpLCBdICNSZW1vdmFsIEV0aGlvcGlhIGFuZCBTaW5nYXBvcmUgYXMgb3V0bGllcnMKQkFUbTI8LSBCQVRtCmNCQVRtPC10KEJBVG0yKQpjQkFUbTwtc2NhbGUoY0JBVG0sIHNjYWxlPUZBTFNFKSAjY2VudGVyaW5nIG9mIG1lYW5zCmNCQVRtPC10KGNCQVRtKQp4PC10KGNCQVRtKQp4PC1zY2FsZSh4LCBzY2FsZT1GQUxTRSkKeDwtdCh4KQpDMTN4PC14CgojIHRlc3QgZm9yIFBDQSBmYWN0b3JzID0gMgpwYXJhbih4KQpyZXMucGNhPC1QQ0EoeCAsIHNjYWxlLnVuaXQ9RkFMU0UsIG5jcD0zLCBncmFwaCA9IFRSVUUpICMgc3VnZ2VzdHMgMiBheGVzIG9ubHkKI3Jlcy5wY2EkdmFyJGNvb3JkCmZ2aXpfcGNhX3ZhcihyZXMucGNhLCBjb2wudmFyID0gImJsYWNrIikrIGxhYnModGl0bGUgPSAiQzEzIFBDQSwgY2VudGVyZWQgbWVhbnMiKQoKI3NqdC5wY2EoeCkKI2Z2aXpfcGNhX2JpcGxvdChyZXMucGNhLCBnZW9tID0gInRleHQiLCAgdGl0bGU9IkV0aGljcyhDMTMpIiwgYXhlcyA9YygxLDIpLCBsYWJlbHNpemU9Mi41LCByZXBlbD1UUlVFKSArIHRoZW1lX21pbmltYWwoKQpmdml6X3BjYV9iaXBsb3QocmVzLnBjYSwgcmVwZWwgPSBUUlVFKSsgbGFicyh0aXRsZSA9ICJDMTMgUENBLCBjZW50ZXJlZCBtZWFucyIpCgpmdml6X3NjcmVlcGxvdChyZXMucGNhLCBuY3A9MTApCmZ2aXpfY29udHJpYihyZXMucGNhLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDEpCmZ2aXpfY29udHJpYihyZXMucGNhLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDIpCmZ2aXpfY29udHJpYihyZXMucGNhLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDMpICMgbm90IHN0YWJsZSAoUEFSQU4pCmluZHJvbGVzIDwtIGdldF9wY2FfaW5kKHJlcy5wY2EpCkMxM2luZDwtaW5kcm9sZXMkY29vcmQKCiMgUXVhbGl0eSBvZiByZXByZXNlbnRhdGlvbiBvZiB0aGUgQ291bnRyaWVzCmZ2aXpfY29zMihyZXMucGNhLCBjaG9pY2U9ImluZCIsIGF4ZXMgPSAxLCB0b3AgPSA2OCApCmZ2aXpfY29zMihyZXMucGNhLCBjaG9pY2U9ImluZCIsIGF4ZXMgPSAyLCB0b3AgPSA2OCApCgojIEstbWVuYXMgY2x1c3RlcmluZyA9IGp1c3Qgb25lIGNsdXNlcgpzZXQuc2VlZCgxMjMpCmZ2aXpfbmJjbHVzdChDMTN4LCBrbWVhbnMsIG1ldGhvZCA9ICJnYXBfc3RhdCIpICsgbGFicyh0aXRsZSA9ICJDMTMgY2x1c3RlcnMgKEstbWVhbnMpIikgIyAxIGNsdXN0ZXIgCiMga20ucmVzIDwtIGttZWFucygoQzEzeCksIDQsIG5zdGFydCA9IDI1KQojZnZpel9jbHVzdGVyKGttLnJlcywgQzEzeCwgZWxsaXBzZS50eXBlID0gIm5vcm0iKQoKIyBIQ1BDIENsdXN0ZXJpbmcKcmVzLnBjYS5oY3BjPC1IQ1BDKHJlcy5wY2EsIG5iLmNsdXN0PS0xKSAjIDUgY2x1c3RlcnMKcmVzLnBjYS5oY3BjJGRhdGEuY2x1c3QKCmZ2aXpfY2x1c3RlcihyZXMucGNhLmhjcGMsIGRhdGEgPSB4LCBlbGxpcHNlLnR5cGUgPSAiY29udmV4IiwgcmVwZWw9VFJVRSkrIHRoZW1lX3R1ZnRlKCkgKyBsYWJzKHRpdGxlID0gIkMxMyBjbHVzdGVycyAoYWZ0ZXIgUENBKSwgY2VudGVyZWQgbWVhbnMiKSArIHlsYWIoIiA8LS0tIDE6IEFic29sdXRpc20iKSArIHhsYWIoIjI6IDwtLS0gU3ViamVjdGl2aXNtIikgKyB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpLCBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE0LGZhY2U9ImJvbGQiKSkKI2Z2aXpfY2x1c3RlcihyZXMucGNhLmhjcGMsIGRhdGEgPSB4LCBheGVzPWMoMSwzKSwgZWxsaXBzZS50eXBlID0gImNvbnZleCIsIHJlcGVsPVRSVUUpKyB0aGVtZV90dWZ0ZSgpICsgbGFicyh0aXRsZSA9ICJDMTMgY2x1c3RlcnMgKGFmdGVyIFBDQSkiKSArIHlsYWIoIiA8LS0tIDE6IEFic29sdXRpc20iKSArIHhsYWIoIjI6IDwtLS0gU2l0dWF0aW9uaXNtIikgKyB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpLCBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE0LGZhY2U9ImJvbGQiKSkKI2Z2aXpfY2x1c3RlcihyZXMucGNhLmhjcGMsIGRhdGEgPSB4LCBheGVzPWMoMiwzKSwgZWxsaXBzZS50eXBlID0gImNvbnZleCIsIHJlcGVsPVRSVUUpKyB0aGVtZV90dWZ0ZSgpICsgbGFicyh0aXRsZSA9ICJDMTMgY2x1c3RlcnMgKGFmdGVyIFBDQSkiKSArIHlsYWIoIiA8LS0tIDI6IFN1YmplY3RpdmlzbSIpICsgeGxhYigiMzogPC0tLSBTaXR1YXRpb25pc20iKSArIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMiksIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTQsZmFjZT0iYm9sZCIpKQoKZnZpel9kZW5kKHJlcy5wY2EuaGNwYywgcmVjdCA9IFRSVUUsIGNleCA9IDAuNSwgaG9yaXo9VFJVRSkKCiNyZXMucGNhLmhjcGMkZGVzYy52YXIKCiMgTm9uLW1ldHJpYyBNRFMKbGlicmFyeShnZ3JlcGVsKQpkPC1kaXN0KEMxM3hbLGMoLTIpXSkgIyBhbHNvIHJlbW92aW5nIEFyZ2VudGluYSAjQ0hFQ0tST1dOVU1CRVIKZml0IDwtIGlzb01EUyhkLCBrPTIpCmZpdApmaXQuc2g8LVNoZXBhcmQoZCwgZml0JHBvaW50cykKcGxvdChmaXQuc2gsIHBjaCA9ICIuIikKbGluZXMoZml0LnNoJHgsIGZpdC5zaCR5ZiwgdHlwZSA9ICJTIikKeCA8LSBmaXQkcG9pbnRzWywxXQp5IDwtIGZpdCRwb2ludHNbLDJdCnBsb3QoeCwgeSwgeGxhYj0iQ29vcmRpbmF0ZSAxIiwgeWxhYj0iQ29vcmRpbmF0ZSAyIiwKbWFpbj0iTm9uTWV0cmljCU1EUyIsCXR5cGU9Im4iKQp0ZXh0KHgsIHksIGxhYmVscyA9IHJvdy5uYW1lcyhCQVRtKSwgY2V4PS43KQpzcGFjZTwtYXMuZGF0YS5mcmFtZShmaXQkcG9pbnRzKQpzcGFjZSRsYWJlbDwtQzEzeFssLTFdCnFwbG90KFYxLCBWMiwgZGF0YT1zcGFjZSkgKyBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsPXJvdy5uYW1lcyhmaXQkcG9pbnRzKSkpICsgZ2d0aXRsZSgiTm9uLXBhcmFtZXRyaWMgTURTIEMxMywgY2VudGVyZWQgbWVhbnMiKSArIHRoZW1lX21pbmltYWwoKQoKI3Jlcy5tZHMuaGNwYzwtSENQQyhzcGFjZSwgbmIuY2x1c3Q9LTEpIAojZnZpel9jbHVzdGVyKHJlcy5tZHMuaGNwYywgZGF0YSA9IHgsIGZyYW1lLnR5cGUgPSAiY29udmV4IiwgcmVwZWw9VFJVRSwgbGFiZWxzaXplPTMpKyB0aGVtZV90dWZ0ZSgpICsgbGFicyh0aXRsZSA9ICJDMTMgY2x1c3RlcnMgKGFmdGVyIE1EUykiKSAKIyByZXMubWRzLmhjcGMkZGVzYy52YXIKYGBgCgoKIyMgRkEgdGVzdCBDMTMKYGBge3J9CmV0aGljPC1CQVRtQzEzCiNyb2xlczwtZHBseXI6OmZpbHRlcihyb2xlcyxDT1VOVFJZIT0nU2luZ2Fwb3JlX05PTi1SRVAnICYgQ09VTlRSWSAhPSdFdGhpb3BpYScpICMgcmVtb3ZlIFNpbmdhcG9yZSBhbmQgRXRoaW9waWEKIyBldGhpYzwtZXRoaWMgJT4lIGZpbHRlcihjb21wbGV0ZS5jYXNlcyguKSkKeDwtdChldGhpY1ssYygtKDU6NikpXSkKeDwtc2NhbGUoeCwgc2NhbGU9RkFMU0UpCng8LXQoeCkKY2VudGVyX2V0aGljPC1hcy5kYXRhLmZyYW1lKHgpCmNlbnRlcl9ldGhpYyRDT1VOVFJZPC1ldGhpYyRDT1VOVFJZCmNlbnRlcl9ldGhpYyRJRDwtZXRoaWMkSUQKCmV0aGljczwtZXRoaWNbLC1jKDU6NildCiNldGhpY3M8LWNlbnRlcl9ldGhpY1ssLWMoMTk6MjApXQoKZGVzY3JpYmUoZXRoaWNzKQpLTU8oZXRoaWNzKSAjIG5vdCByZWFsbHkgc3VpdGFibGUsIEtNTyBNU0E9MC42Nwpjb3J0ZXN0LmJhcnRsZXR0KGV0aGljcykgIyBzdWdnZXN0IDIgZmFjdG9ycyBhbmQgMSBjb21wb25lbnQKZmEucGFyYWxsZWwoZXRoaWNzKQpzY3JlZShldGhpY3MpCiN2YXJpbWF4LCByb3RhdGVkCm15ZmE8LWZhKGV0aGljcywgZm0gPSAicGEiLCBuZmFjdG9ycyA9IDIsIHJvdGF0ZSA9ICJ2YXJpbWF4IiwgY292YXI9RkFMU0UpIApwcmludChteWZhLCBjdXQ9LjQsIHNvcnQ9VFJVRSkKcGxvdChteWZhLCB4bGltID0gYygtMSwgMSksIHlsaW0gPSBjKC0xLCAxKSkKZmEuZGlhZ3JhbShteWZhLCBjdXQgPSAuMDAxLCBtYWluPSJGQSBDMTMsIFBDQSBleHRyYWN0aW9uLCB2YXJpbWF4IikKIyBvYmxpbWluCm15ZmE8LWZhKGV0aGljcywgZm0gPSAicGEiLCBuZmFjdG9ycyA9IDIsIHJvdGF0ZSA9ICJvYmxpbWluIiwgY292YXI9RkFMU0UpIApwcmludChteWZhLCBjdXQ9LjQsIHNvcnQ9VFJVRSkKcGxvdChteWZhLCB4bGltID0gYygtMSwgMSksIHlsaW0gPSBjKC0xLCAxKSkKZmEuZGlhZ3JhbShteWZhLCBjdXQgPSAuMDAxLCBtYWluPSJGQSBDMTMsIFBDQSBleHRyYWN0aW9uLCBvYmxpbWluIikKCiMgbm90ZTogdGhlIHRlc3QgZG9lcyBub3QgYWxpZ24gZXhhY3RseSB3aXRoIFNQU1MgcHJvY2VkdXJlcwojdGVzdCBmb3Igc2NhbGluZwojY29sYWI8LWRwbHlyOjpzZWxlY3QoZXRoaWNzLCBQb3MuaW1hZ2UucG9saXRpY2lhbnMsIFN1cC5nb3YucG9saWN5KQojYWxwaGEoY29sYWIpCgpgYGAKCiMgQzE0IEVUSElDUyAoUFJBQ1RJQ0VTKQpgYGB7cn0KI0MxNApCQVRtIDwtIGFwcGx5KGRwbHlyOjpzZWxlY3QoQkFULCBQYXlpbmcuZm9yLmluZm86QWNjZXB0Lm1vbmV5KSwgMiwgZnVuY3Rpb24oeCkge3ggPC0gcmVjb2RlKHgsIidub3QgYXBwcm92ZSB1bmRlciBhbnkgY2lyY3Vtc3RhbmNlcyc9MTsgJ2p1c3RpZmllZCBvbiBvY2Nhc2lvbic9MjsgJ2Fsd2F5cyBqdXN0aWZpZWQnPTMiKTsgeH0pIAoKIyMjIHJlLWFkZCBjb3VudHJ5IGFuZCBhZGQgbGFiZWxzCkJBVG08LWRhdGEuZnJhbWUoQkFUbSkKQkFUbSRDT1VOVFJZPC1CQVQkQ09VTlRSWSAKQkFUbSRJRDwtQkFUJElEIAoKQkFUbUMxNDwtQkFUbQpCQVRtQ09NUExFVEU8LUJBVG0gJT4lIGZpbHRlcihjb21wbGV0ZS5jYXNlcyguKSkgIyBub3RlIGZpbHRlciBvbiBvbmx5IGNvbXBsZXRlIEMxNCogY2FzZXMKQkFUbU9SRzwtQkFUbSAjIG1ha2UgYSBjb3B5IG9mIHRoZSBkYXRhc2V0IChvcmdpbmFsKQoKIyMjIGNvbnZlcnQgdG8gbWF0cml4IG9mIGF2ZXJhZ2VzIGJ5IGNvdW50cnkgYW5kIGFkZCByb3duYW1lcyBhbmQgbGFiZWxzCkJBVG08LUJBVG0gJT4lCiAgZ3JvdXBfYnkoQ09VTlRSWSkgJT4lCiAgc3VtbWFyaXNlX2VhY2goZnVucyhNZWFuKSwgUGF5aW5nLmZvci5pbmZvOkFjY2VwdC5tb25leSkKQkFUbTwtZGF0YS5mcmFtZShCQVRtKQpyb3duYW1lcyhCQVRtKTwtQkFUbVssMV0KQkFUbTwtQkFUbVssMjoxMV0KQkFUbTwtQkFUbVtjKC0zNiksXSAjcmVtb3ZpbmcgSmFwYW4gYmVjYXVzZSBvZiBtaXNzaW5nIEMxNCBxdWVzdGlvbgpCQVRtPC1CQVRtW2MoLTU5KSxdICNyZW1vdmluZyBTd2VkZW4gYmVjYXVzZSBvZiBtaXNzaW5nIEMxNCBxdWVzdGlvbgpCQVRtT1JHQzE0PC1CQVRtCgojIyMgbWFrZSB0YWJsZSBvZiBtZWFuIGFuZCBzZCBieSBxdWVzdGlvbiBhbmQgY291bnRyeQpEVCA8LSBkYXRhLnRhYmxlKEJBVG1DMTQpCndpZGUgPC0gc2V0bmFtZXMoRFRbLCBzYXBwbHkoLlNELCBmdW5jdGlvbih4KSBsaXN0KG49c3VtKGNvbXBsZXRlLmNhc2VzKHgpKSwgbWVhbj1yb3VuZChtZWFuKHgsIG5hLnJtPVRSVUUpLCAyKSwgc2Q9cm91bmQoc2QoeCwgbmEucm09VFJVRSksIDIpKSksIGJ5PUNPVU5UUlldLCBjKCJDT1VOVFJZIiwgc2FwcGx5KG5hbWVzKERUKVstMTJdLCBwYXN0ZTAsIGMoIi5uIiwgIi5tZW4iLCAiLlNEIikpKSkKdGFibGUubWVhbnNkQzE0PC1hcy5kYXRhLmZyYW1lKHdpZGVbLDE6MzFdKQoKYGBgICAgICAKCiMjIFBDQSBhbmQgYmlwbG90LCByYXcgdmFsdWVzIEMxNApgYGB7ciwgZmlnLmhlaWdodD05LCBmaWcud2lkdGg9Nn0KeDwtQkFUbQpwYXJhbih4KSAjIDIgY29tcG9uZW50cwpyZXMucGNhPC1QQ0EoeCAsIHNjYWxlLnVuaXQ9RkFMU0UsIG5jcD0yLCBncmFwaCA9IFRSVUUpCmZ2aXpfcGNhX2JpcGxvdChyZXMucGNhLCBnZW9tID0gInRleHQiLCAgdGl0bGU9IkV0aGljcyhDMTQpIFJhdyB2YWx1ZXMiLCBheGVzID1jKDEsMiksIGxhYmVsc2l6ZT0yLjUsIHJlcGVsPVRSVUUpICsgdGhlbWVfbWluaW1hbCgpCgpmdml6X3BjYV92YXIocmVzLnBjYSwgY29sLnZhciA9ICJibGFjayIpKyBsYWJzKHRpdGxlID0gIkV0aGljcyhDMTQpIFJhdyB2YWx1ZXMiKQpmdml6X3NjcmVlcGxvdChyZXMucGNhLCBuY3A9MTApCmZ2aXpfY29udHJpYihyZXMucGNhLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDEpCmZ2aXpfY29udHJpYihyZXMucGNhLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDIpCgppbmRyb2xlcyA8LSBnZXRfcGNhX2luZChyZXMucGNhKQpDMTRpbmQ8LWluZHJvbGVzJGNvb3JkCgojIEhDUEMgQ2x1c3RlcmluZwpyZXMucGNhLmhjcGM8LUhDUEMocmVzLnBjYSwgbmIuY2x1c3Q9LTEpICMgMyBjbHVzdGVycwoKZnZpel9jbHVzdGVyKHJlcy5wY2EuaGNwYywgZGF0YSA9IHgsIGZyYW1lLnR5cGUgPSAiY29udmV4IiwgcmVwZWw9VFJVRSkrIHRoZW1lX3R1ZnRlKCkgKyBsYWJzKHRpdGxlID0gIkMxNCBjbHVzdGVycyAoYWZ0ZXIgUENBKSIpICsgeWxhYigiMjogQWNjZXB0IG1vbmV5L3B1YmwuIHVudmVyaWZpZWQgLS0tPiIpICsgeGxhYigiMTogQWNjZXB0YW5jZSAoZ2VuZXJhbCkgLS0tPiIpICsgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyKSwgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNCxmYWNlPSJib2xkIikpCnJlcy5wY2EuaGNwYyRkZXNjLnZhcgoKIyBLLW1lYW5zIGNsdXN0ZXJpbmcKZnZpel9uYmNsdXN0KHgsIGttZWFucywgbWV0aG9kID0gImdhcF9zdGF0IikgIyAxIGNsdXN0ZXIKCiMgTm9uLW1ldHJpYyBNRFMKbGlicmFyeShnZ3JlcGVsKQpkPC1kaXN0KEJBVG0pICMgYWxzbyByZW1vdmluZyBBcmdlbnRpbmEgI0NIRUNLUk9XTlVNQkVSCmZpdCA8LSBpc29NRFMoZCwgaz0yKQpmaXQKZml0LnNoPC1TaGVwYXJkKGQsIGZpdCRwb2ludHMpCnBsb3QoZml0LnNoLCBwY2ggPSAiLiIpCmxpbmVzKGZpdC5zaCR4LCBmaXQuc2gkeWYsIHR5cGUgPSAiUyIpCnggPC0gZml0JHBvaW50c1ssMV0KeSA8LSBmaXQkcG9pbnRzWywyXQpwbG90KHgsIHksIHhsYWI9IkNvb3JkaW5hdGUgMSIsIHlsYWI9IkNvb3JkaW5hdGUgMiIsCm1haW49Ik5vbk1ldHJpYwlNRFMiLAl0eXBlPSJuIikKdGV4dCh4LCB5LCBsYWJlbHMgPSByb3cubmFtZXMoQkFUbSksIGNleD0uNykKc3BhY2U8LWFzLmRhdGEuZnJhbWUoZml0JHBvaW50cykKI3NwYWNlJGxhYmVsPC1DMTN4WywtMV0KcXBsb3QoVjEsIFYyLCBkYXRhPXNwYWNlKSArIGdlb21fdGV4dF9yZXBlbChhZXMobGFiZWw9cm93Lm5hbWVzKGZpdCRwb2ludHMpKSkgKyBnZ3RpdGxlKCJOb24tcGFyYW1ldHJpYyBNRFMgQzE0LCBjZW50ZXJlZCBtZWFucyIpICsgdGhlbWVfbWluaW1hbCgpCgojcmVzLm1kcy5oY3BjPC1IQ1BDKHNwYWNlLCBuYi5jbHVzdD0tMSkgCiNmdml6X2NsdXN0ZXIocmVzLm1kcy5oY3BjLCBkYXRhID0geCwgZnJhbWUudHlwZSA9ICJjb252ZXgiLCByZXBlbD1UUlVFLCBsYWJlbHNpemU9MykrIHRoZW1lX3R1ZnRlKCkgKyBsYWJzKHRpdGxlID0gIkMxNCBjbHVzdGVycyAoYWZ0ZXIgTURTKSIpIAojIHJlcy5tZHMuaGNwYyRkZXNjLnZhcgoKYGBgCgojIyBWYXJpb3VzIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgYW5kIGZpZ3VyZXMgQzE0CmBgYHtyIERlc2NyaXB0aXZlIHN0YXRpc3RpY3MgYW5kIGZpZ3VyZXMgQzE0LCBmaWcuaGVpZ2h0PTksIGZpZy53aWR0aD02fQojIHNqcC5zZXRUaGVtZShnZW9tLm91dGxpbmUuc2l6ZSA9IDAsIGdlb20ubGFiZWwuc2l6ZSA9IDMsIHRpdGxlLnNpemUgPSAxLjUpCnNqcC5saWtlcnQoQkFUWyw2OjE1XSwgc29ydC5mcnEgPSAicG9zLmFzYyIsIHNob3cucHJjLnNpZ24gPSBUUlVFLCBkaWdpdHM9MCwgc2hvdy5uPUZBTFNFLCBzaG93LmxlZ2VuZD1GQUxTRSwgY2F0Y291bnQ9NCwKICAgICAgICAgICB0aXRsZT0iQWdyZWVtZW50PyAgICAgKEMxNCwgYWxsIGNvdW50cmllcykiKSAjIGxpY2tlcnQgcGxvdAoKIyBQcm9ibGVtOiBTd2VkZW4gaXMgbWlzc2luZyBDMTRFIChQZXJzb25hbCBkb2N1bWVudHMpIGFuZCBKYXBhbiBDMTRKIChQdWJsLiB1bnZlcmlmaWVkKQojIyBzb2x1dGlvbjogVGhlIHZhbHVlIGlzIHNldCB0byBhdmVyYWdlIGZvciBhbGwgb3RoZXIgY291bnRyaWVzIAojIyBjb2xNZWFucyhCQVRtLCBuYS5ybT1UUlVFKQojIEphcGFuCkJBVG1bMzYsOV08LTEuMjM2MzU3ICNDSEVDS1JPV05VTUJFUiAKIyBTd2VkZW4KQkFUbVs2MCw1XTwtMS40MDE5MzYgI0NIRUNLUk9XTlVNQkVSCgojIEF2ZXJhZ2UgbWVhbiBhbmQgc3ByZWFkIG9mIHJvbGVzIChiYXNlZCBvbiBjb3VudHJ5IGF2ZXJhZ2VzKSwgYm94cGxvdCBhbmQgYmVhbnBsb3QKc29ydGVkQkFUbTwtQkFUbVsgLCBvcmRlcihjb2xNZWFucyhCQVRtKSldICMgc29ydCBieSBjb2x1bW4gbWVhbgpwYXIobWFyID0gYyg0LDE1LDIsMikpICMgc2V0IG1hcmdpbnMKYm94cGxvdCh4ID0gYXMubGlzdChzb3J0ZWRCQVRtKSwgaG9yaXpvbnRhbCA9IFRSVUUsIGxhcz0xLCBtYWluPSJBdmVyYWdlcyBhZ2dyZWdhdGVkIGJ5IGNvdW50cnkgKEMxNCkiLCBsb2c9IiIpCgpwYXIobWFyID0gYyg0LDE1LDIsMikpICMgc2V0IG1hcmdpbnMKYmVhbnBsb3QoeCA9IGFzLmxpc3Qoc29ydGVkQkFUbSksIGhvcml6b250YWwgPSBUUlVFLCBsYXM9MSwgbWFpbj0iQXZlcmFnZXMgYWdncmVnYXRlZCBieSBjb3VudHJ5IChDMTQpIiwgbG9nPSIiKQoKIyNCZXJ0aW4gcGxvdCAodW5jZW50ZXJlZCkKeCA8LSBzY2FsZV9ieV9yYW5rKGFzLm1hdHJpeChCQVRtKSkKb3JkZXIgPC0gc2VyaWF0ZSh4LCBtZXRob2Q9IlBDQSIpCmJlcnRpbnBsb3QoeCwgb3JkZXIsIG9wdGlvbnMgPSBsaXN0KHBhbmVsPXBhbmVsLnNxdWFyZXMsIHNoYWRpbmc9VFJVRSwgcmV2ZXJzZT1UUlVFLCBtYXIgPSBjKDEsMSwxMCw2KSwgZ3BfbGFiZWxzPWdwYXIoZm9udHNpemU9OCkpKQpvcmRlciA8LSBzZXJpYXRlKHgsIG1ldGhvZD0iUENBX2FuZ2xlIikKYmVydGlucGxvdCh4LCBvcmRlciwgb3B0aW9ucyA9IGxpc3QocGFuZWw9cGFuZWwuc3F1YXJlcywgc2hhZGluZz1UUlVFLCByZXZlcnNlPVRSVUUsIG1hciA9IGMoMSwxLDEwLDYpLCBncF9sYWJlbHM9Z3Bhcihmb250c2l6ZT04KSkpCgoKIyBuZXR3b3JrIHBsb3Qgb2YgY29ycmVsYXRpb25zCmM8LWNvcnJlbGF0ZShCQVRtKQpuZXR3b3JrX3Bsb3QoYywgbWluX2Nvcj0uMiwgY29sb3JzPWMoInJlZCIsICJncmVlbiIpLCBsZWdlbmQ9VFJVRSkgCmM8LWNvcihCQVRtKQpjb3JycGxvdChjLCB0eXBlID0gInVwcGVyIiwgb3JkZXIgPSAiRlBDIiwgdGwuY29sID0gImJsYWNrIiwgdGwuc3J0ID0gNDUsIGRpYWc9RkFMU0UsIHRsLmNleD0wLjgsbWFyPWMoMSwwLDAsMSkpCmBgYAoKCgojIyBGQSB0ZXN0IEMxNApgYGB7cn0KcHJldGhpYzwtQkFUbUMxNAoKI3ByZXRoaWM8LWRwbHlyOjpmaWx0ZXIocm9sZXMsQ09VTlRSWSE9J1NpbmdhcG9yZV9OT04tUkVQJyAmIENPVU5UUlkgIT0nRXRoaW9waWEnKSAjIHJlbW92ZSBTaW5nYXBvcmUgYW5kIEV0aGlvcGlhCng8LXQocHJldGhpY1ssYygtKDExOjEyKSldKQp4PC1zY2FsZSh4LCBzY2FsZT1GQUxTRSkKeDwtdCh4KQpjZW50ZXJfcHJldGhpYzwtYXMuZGF0YS5mcmFtZSh4KQpjZW50ZXJfcHJldGhpYyRDT1VOVFJZPC1ldGhpYyRDT1VOVFJZCmNlbnRlcl9wcmV0aGljJElEPC1wcmV0aGljJElECgpwcmV0aGljczwtcHJldGhpY1ssLWMoMTE6MTIpXSAjcmVtb3ZpbmcgY291bnRyeSBhbmQgSUQKcHJldGhpY3M8LXByZXRoaWNzWywtOF0gIyByZW1vdmluZyByZWNyZWF0aW9ucwojcHJldGhpY3M8LWNlbnRlcl9wcmV0aGljWywtYygxMToxMildCiNwcmV0aGljczwtcHJldGhpY3MgJT4lIGZpbHRlcihjb21wbGV0ZS5jYXNlcyguKSkKCgpkZXNjcmliZShwcmV0aGljcykKS01PKHByZXRoaWNzKSAjICBzdWl0YWJsZSwgS01PIE1TQT0wLjgzLCAuODIgd2l0aG91dCByZWNyZWF0aW9ucwpjb3J0ZXN0LmJhcnRsZXR0KHByZXRoaWNzKQpmYS5wYXJhbGxlbChwcmV0aGljcykgICMgc3VnZ2VzdCA0IGZhY3RvcnMgYW5kIDIgY29tcG9uZW50cyAoYWxzbyB3aXRob3V0IHJlY3IuKQojdmFyaW1heCwgcm90YXRlZApteWZhPC1mYShwcmV0aGljcywgZm0gPSAicGEiLCBuZmFjdG9ycyA9IDQsIHJvdGF0ZSA9ICJ2YXJpbWF4IiwgY292YXI9RkFMU0UsIFNNQz1GQUxTRSkgCnByaW50KG15ZmEsIGN1dD0uNCwgc29ydD1UUlVFKQpwbG90KG15ZmEsIHhsaW0gPSBjKC0xLCAxKSwgeWxpbSA9IGMoLTEsIDEpKQpmYS5kaWFncmFtKG15ZmEsIGN1dCA9IC4wMDEsIG1haW49IkZBIEMxNCwgUENBIGV4dHJhY3Rpb24sIHZhcmltYXgiKQojIG9ibGltaW4KbXlmYTwtZmEocHJldGhpY3MsIGZtID0gInBhIiwgbmZhY3RvcnMgPSA0LCByb3RhdGUgPSAib2JsaW1pbiIsIGNvdmFyPUZBTFNFLCAgU01DPUZBTFNFKSAKcHJpbnQobXlmYSwgY3V0PS40LCBzb3J0PVRSVUUpCnBsb3QobXlmYSwgeGxpbSA9IGMoLTEsIDEpLCB5bGltID0gYygtMSwgMSkpCmZhLmRpYWdyYW0obXlmYSwgY3V0ID0gLjAwMSwgbWFpbj0iRkEgQzE0LCBQQ0EgZXh0cmFjdGlvbiwgb2JsaW1pbiIpCgojdGVzdCBmb3Igc2NhbGluZyAjIG5vbmUgYXJlIGFib3ZlIDAuNzAsIHdoaWNoIGlzIHByb2JsZW1hdGljCgojIGJ1dCBOdW5uYWxseSAoMTk3OCk6IFdoZW4gdGhlcmUgYXJlIGEgc21hbGwgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBzY2FsZSAoZmV3ZXIgdGhhbiAxMCksIENyb25iYWNoIGFscGhhIHZhbHVlcyBjYW4gYmUgcXVpdGUgc21hbGwuIEluIHRoaXMgc2l0dWF0aW9uIGl0IG1heSBiZSBiZXR0ZXIgdG8gY2FsY3VsYXRlIGFuZCByZXBvcnQgdGhlIG1lYW4gaW50ZXItaXRlbSBjb3JyZWxhdGlvbiBmb3IgdGhlIGl0ZW1zLiBPcHRpbWFsIG1lYW4gaW50ZXItaXRlbSBjb3JyZWxhdGlvbiB2YWx1ZXMgcmFuZ2UgZnJvbSAuMiB0byAuNCAoYXMgcmVjb21tZW5kZWQgYnkgQnJpZ2dzICYgQ2hlZWsgMTk4NikuIAoKY292ZXJ0PC1kcGx5cjo6c2VsZWN0KHByZXRoaWNzLCBVbmRlcmNvdmVyLmVtcGwsIEhpZGRlbi5taWNjYW0sIEZhbHNlLmlkZW50aXR5LFBheWluZy5mb3IuaW5mbyApCmFscGhhKGNvdmVydCkgIzAuNjksIGF2ZXJhZ2UgaW50ZXItaXRlbSBjb3JyZWxhdGlvbiA9IGF2ZXJhZ2Vfcj0uMzMgT0sKCnBlcnNvbmFsPC1kcGx5cjo6c2VsZWN0KHByZXRoaWNzLCBVc2luZy5jb25mLmRvY3VtZW50cywgUHJlc3N1cmUuaW5mb3JtYW50cywgVXNlLnBlcnNvbmFsLmRvYykKYWxwaGEocGVyc29uYWwpICMwLjU5LCBhdmVyYWdlX3I9LjMzCgpwZXJzb25hbDI8LWRwbHlyOjpzZWxlY3QocHJldGhpY3MsIFVzaW5nLmNvbmYuZG9jdW1lbnRzLCBQcmVzc3VyZS5pbmZvcm1hbnRzKQphbHBoYShwZXJzb25hbDIpICMwLjQKCm1vbmV5dW52ZXI8LWRwbHlyOjpzZWxlY3QocHJldGhpY3MsIFB1YmwudW52ZXJpZmllZCwgQWNjZXB0Lm1vbmV5KQphbHBoYShtb25leXVudmVyKSAjMC42NCwgYXZlcmFnZV9yPS40OAoKYGBgCgoK