Packages used: GGpmisc

attach(wheat)
wheat$fsoil <- as.factor(wheat$soil)
wheat$fsoil <- relevel(wheat$fsoil, ref = "sand")
leveneTest(yield ~ wheat$fsoil)
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2   0.249 0.7813
      27               
shapiro.test(yield)

    Shapiro-Wilk normality test

data:  yield
W = 0.97214, p-value = 0.5993
modelA <- aov(yield~ wheat$fsoil)
modelB <- lm(yield ~ wheat$fsoil)
summary(modelA)
            Df Sum Sq Mean Sq F value Pr(>F)  
wheat$fsoil  2   99.2   49.60   4.245  0.025 *
Residuals   27  315.5   11.69                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
summary(modelB)

Call:
lm(formula = yield ~ wheat$fsoil)

Residuals:
   Min     1Q Median     3Q    Max 
  -8.5   -1.8    0.3    1.7    7.1 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)        9.900      1.081   9.158 9.04e-10 ***
wheat$fsoilclay    1.600      1.529   1.047  0.30456    
wheat$fsoilloam    4.400      1.529   2.878  0.00773 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.418 on 27 degrees of freedom
Multiple R-squared:  0.2392,    Adjusted R-squared:  0.1829 
F-statistic: 4.245 on 2 and 27 DF,  p-value: 0.02495
posthoc1 <- TukeyHSD(x=modelA, ordered = FALSE, conf.level=0.95)
posthoc1
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = yield ~ wheat$fsoil)

$`wheat$fsoil`
          diff        lwr      upr     p adj
clay-sand  1.6 -2.1903777 5.390378 0.5546301
loam-sand  4.4  0.6096223 8.190378 0.0204414
loam-clay  2.8 -0.9903777 6.590378 0.1785489
WhatDoIDo <- wheat %>%
  group_by(fsoil) %>%
  summarise_all(funs(mean))
argument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NA
  1. [V2-V1]/V1; In this dataset we see that there is a significant difference between the different types of soil, but the difference is only significant between sand and loam, not between sand and clay or loam and clay. If you look at the data you can see that loam has an approx. 1.4 fold yield increase over sand.
attach(censur)
leveneTest(med_income ~ redblue)
Levene's Test for Homogeneity of Variance (center = median)
        Df F value    Pr(>F)    
group    2  25.198 1.391e-11 ***
      3140                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
leveneTest(poverty ~ redblue)
Levene's Test for Homogeneity of Variance (center = median)
        Df F value    Pr(>F)    
group    2  52.884 < 2.2e-16 ***
      3140                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
shapiro.test(poverty)

    Shapiro-Wilk normality test

data:  poverty
W = 0.94815, p-value < 2.2e-16
shapiro.test(med_income)

    Shapiro-Wilk normality test

data:  med_income
W = 0.91527, p-value < 2.2e-16
logmed <- log10(med_income)
shapiro.test(logmed)

    Shapiro-Wilk normality test

data:  logmed
W = 0.98768, p-value = 6.702e-16
leveneTest(logmed ~ redblue)
Levene's Test for Homogeneity of Variance (center = median)
        Df F value    Pr(>F)    
group    2  8.9905 0.0001278 ***
      3140                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
sqpov <- (sqrt(poverty))
shapiro.test(sqpov)

    Shapiro-Wilk normality test

data:  sqpov
W = 0.99203, p-value = 3.325e-12
leveneTest(sqpov ~ redblue)
Levene's Test for Homogeneity of Variance (center = median)
        Df F value    Pr(>F)    
group    2  27.057 2.236e-12 ***
      3140                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
hist(logmed, breaks=c(seq(4,6, .1)), prob = TRUE)
lines(density(logmed))

hist(sqpov, breaks=c(seq(0,8, .50)), prob = TRUE)
lines(density(sqpov))

modelS <-  lm(logmed ~ redblue) 
summary.lm(modelS)

Call:
lm(formula = logmed ~ redblue)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.32225 -0.06309 -0.00701  0.05672  0.39167 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 4.602888   0.002260 2036.53   <2e-16 ***
redblueb    0.080168   0.004061   19.74   <2e-16 ***
redblueu    0.068307   0.005615   12.16   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.09888 on 3140 degrees of freedom
Multiple R-squared:  0.126, Adjusted R-squared:  0.1255 
F-statistic: 226.4 on 2 and 3140 DF,  p-value: < 2.2e-16
boxplot(logmed ~ redblue)

modelT <-  lm(sqpov ~ redblue) 
summary.lm(modelS)

Call:
lm(formula = logmed ~ redblue)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.32225 -0.06309 -0.00701  0.05672  0.39167 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 4.602888   0.002260 2036.53   <2e-16 ***
redblueb    0.080168   0.004061   19.74   <2e-16 ***
redblueu    0.068307   0.005615   12.16   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.09888 on 3140 degrees of freedom
Multiple R-squared:  0.126, Adjusted R-squared:  0.1255 
F-statistic: 226.4 on 2 and 3140 DF,  p-value: < 2.2e-16
boxplot(sqpov ~ redblue)

ModelNS <- lm(logmed ~ 1)
ModelNT <- lm(sqpov ~ 1)
AICctab(modelS, modelT, ModelNT, ModelNS, weights = TRUE, delta = TRUE, base=TRUE, sort = TRUE)
        AICc    dAICc   df weight
modelS  -5620.4     0.0 4  1     
ModelNS -5200.9   419.4 2  <0.001
modelT   7157.7 12778.1 4  <0.001
ModelNT  7474.7 13095.1 2  <0.001
WhatDoIDid <- censur %>%
  group_by(redblue) %>%
  summarise_all(funs(mean))
argument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NA
  1. So the main issue here is that the population is too large to get the shapiro test to work, and no amount of transforming the data will really effectively change that. By doing different transformations I manged to fix the data so that the med_income data is pretty reasonable both when you look at a histogram of the data and when you look at the levenes test for the data (still a significant P value but MUCH closer to not rejecting the null hypothesis). There really wasn’t much I could do about poverty. Also, there’s an issue with the population sample sizes where theres significant differences in population sizes of the samples so that also might be a confounding problem with this dataset.

Now, ignoring all of that what we see is that ON AVERAGE republican counties have 34% more poverty than democratic counties, and salaraies in these republican countier are, on average, 20% less than their democratic counties. If you look at the R2 my models are only really accounting for ~ 13% of the variance in the dataset. That being said, since the dataset is so large I’m pretty confident that the modelS is at least somewhat reliable to use to answer the questions. Now we can’t fully determine if this is SIGNIFICANT because we could only use parametric tests [haven’t learned nonparametric tests yet] so we can’t rely completely on this data. Contrastingly, when we ran our AIC we see that the model that was chosen by the AIC was modelS (logmed ~ redblue) with the nullmodel following up and no other model came close to being as strong as modelS as determined by the AIC. I would hazard to say that yes, even though our data and analysis is a little shaky, the adage of economic differences seems to be true with republican counties haveing lower medium salaries. We can’t really determine much with higher povery rates because our AIC definitely didn’t choose that model so there was probably a LOT of variation within that dataset even if our R2 was .13.

attach(censur)
WhatDoIDid <- censur %>% 
  group_by(redblue) %>%
  summarise_all(funs(mean))
argument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NA
hist(pop2010, breaks=c(seq(0,3500, 100)), prob = TRUE)               

levene.test(pop2010 ~ redblue)
'levene.test' is deprecated.
Use 'leveneTest' instead.
See help("Deprecated") and help("car-deprecated").
Levene's Test for Homogeneity of Variance (center = median)
        Df F value Pr(>F)
group    2  0.1997  0.819
      3140               
hmm <- aov(pop2010 ~ redblue)
summary.aov(hmm)
              Df    Sum Sq  Mean Sq F value Pr(>F)    
redblue        2 1.958e+08 97904451   133.4 <2e-16 ***
Residuals   3140 2.305e+09   734158                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
posthoc1 <- TukeyHSD(x=hmm, ordered = FALSE, conf.level=0.95)
posthoc1
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = pop2010 ~ redblue)

$redblue
         diff       lwr       upr     p adj
b-r  546.3777  463.8669 628.88848 0.0000000
u-r  409.2954  295.1970 523.39382 0.0000000
u-b -137.0823 -262.0166 -12.14793 0.0273597
censur$pop2010 <- as.integer(censur$pop2010)
censur$redblue <- as.factor(censur$redblue)
censur$redblue <- relevel(censur$redblue, ref= "r")
leveneTest((1/(censur$pop2010)) ~ redblue)
Levene's Test for Homogeneity of Variance (center = median)
        Df F value  Pr(>F)  
group    2  2.6335 0.07199 .
      3140                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
shapiro.test((1/(censur$pop2010)))

    Shapiro-Wilk normality test

data:  (1/(censur$pop2010))
W = 0.060176, p-value < 2.2e-16
hm <- aov((1/(censur$pop2010) ~ redblue))
hmmm <- aov((1/(censur$pop2010)) ~ redblue)
summary.aov(hmmm)
              Df Sum Sq   Mean Sq F value Pr(>F)  
redblue        2 0.0031 0.0015271   2.961 0.0519 .
Residuals   3140 1.6195 0.0005158                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
posthoc3 <- TukeyHSD(x=hmmm, ordered = FALSE, conf.level=0.95)
posthoc3
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = (1/(censur$pop2010)) ~ redblue)

$redblue
             diff          lwr          upr     p adj
b-r -2.038490e-03 -0.004225469 0.0001484904 0.0737902
u-r -1.976389e-03 -0.005000611 0.0010478325 0.2758583
u-b  6.210029e-05 -0.003249332 0.0033735328 0.9989345
censur$redblue <- as.factor(censur$redblue)
censur$redblue <- relevel(censur$redblue, ref = "r")
huh <- lm((1/(censur$pop2010)) ~ redblue)
summary.lm(huh)

Call:
lm(formula = (1/(censur$pop2010)) ~ redblue)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.00326 -0.00293 -0.00127 -0.00094  0.99642 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.0035792  0.0005191   6.895 6.49e-12 ***
redblueb    -0.0020385  0.0009327  -2.186   0.0289 *  
redblueu    -0.0019764  0.0012897  -1.532   0.1255    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02271 on 3140 degrees of freedom
Multiple R-squared:  0.001882,  Adjusted R-squared:  0.001247 
F-statistic: 2.961 on 2 and 3140 DF,  p-value: 0.05192
huhum <- lm((1/(censur$pop2010)) ~ 1)
boxplot((1/(censur$pop2010) ~ censur$redblue))

AICctab(hm, huh, huhum, weights = TRUE, delta = TRUE, base=TRUE, sort = TRUE)
      AICc     dAICc    df weight
hm    -14867.6      0.0 4  0.42  
huh   -14867.6      0.0 4  0.42  
huhum -14865.7      1.9 2  0.16  
#Coding the graphs into names to put them into a singular table. This is also allowing up to find R2 values for EACH of the population data sets and see how they look against eachother and when they're all together
P1 <- ggplot(data=censur, aes((pop2010),(poverty), color = factor(redblue))) + geom_point(size = 1) + geom_smooth(method = "lm") +
  stat_poly_eq(formula = huh, 
                aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")), 
                parse = TRUE)
Blue <- censur %>%
  filter(redblue == "b") %>%
  na.omit(Blue)
he <- lm((1/(Blue$pop2010)) ~ Blue$poverty)
summary.lm(he)

Call:
lm(formula = (1/(Blue$pop2010)) ~ Blue$poverty)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.00302 -0.00151 -0.00090 -0.00019  0.49673 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)  
(Intercept)   0.0040909  0.0017673   2.315   0.0209 *
Blue$poverty -0.0002007  0.0001312  -1.530   0.1264  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01722 on 857 degrees of freedom
Multiple R-squared:  0.002724,  Adjusted R-squared:  0.001561 
F-statistic: 2.341 on 1 and 857 DF,  p-value: 0.1264
P2 <- ggplot(Blue, aes(pop2010,poverty)) + 
  geom_point(size = 1) +  
  geom_smooth(method = "lm") +
  stat_poly_eq(formula = he, 
                aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")), 
                parse = TRUE)  
  
Red <- censur %>%
  filter(redblue == "r") %>%
  na.omit(Red)
hee <- lm((1/(Red$pop2010)) ~ Red$poverty)
summary.lm(hee)

Call:
lm(formula = (1/(Red$pop2010)) ~ Red$poverty)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.00894 -0.00422 -0.00239  0.00001  0.98902 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  1.098e-02  1.647e-03   6.664 3.46e-11 ***
Red$poverty -4.336e-04  8.979e-05  -4.829 1.48e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02645 on 1912 degrees of freedom
Multiple R-squared:  0.01205,   Adjusted R-squared:  0.01153 
F-statistic: 23.32 on 1 and 1912 DF,  p-value: 1.484e-06
P3 <- ggplot(Red, aes(pop2010,poverty)) + 
  geom_point(size = 1) +  
  geom_smooth(method = "lm") +
  stat_poly_eq(formula = hee, 
                aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")), 
                parse = TRUE)   
Unknown <- censur %>%
  filter(redblue == "u") %>%
  na.omit(Unknown)
He <- lm((1/(Unknown$pop2010)) ~ Unknown$poverty)
summary.lm(He) 

Call:
lm(formula = (1/(Unknown$pop2010)) ~ Unknown$poverty)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.001963 -0.001329 -0.001007 -0.000393  0.060789 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)   
(Intercept)      2.500e-03  7.585e-04   3.295  0.00108 **
Unknown$poverty -6.465e-05  5.068e-05  -1.276  0.20293   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.005477 on 368 degrees of freedom
Multiple R-squared:  0.004402,  Adjusted R-squared:  0.001696 
F-statistic: 1.627 on 1 and 368 DF,  p-value: 0.2029
P4 <- ggplot(Unknown, aes(Unknown$pop2010,Unknown$poverty)) + 
  geom_point(size = 1) +  
  geom_smooth(method = "lm") +
  stat_poly_eq(formula = He, 
                aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")),
                parse = TRUE)
#This method ONLY works with cowplot BUT it makes multiplotting extremely manigable (sp). Moving forward we can probably really easily find a way to make this "sexier" and move the graphs about to be better looking but as it is this is AWESOME :D
plot_grid(P1) #Since we couldn't make all of them fit nicely, we can just have this one by itself so we can see the pretty colors and the lots of lines

plot_grid(P2,P3,P4, labels = c("A", "B", "C"), nrow = 2, ncol = 2, align = "h")

huhh <- lm((1/(pop2010)) ~ (log10(med_income)))
P5 <- ggplot(data=censur, aes((pop2010),(log10(med_income)), color = factor(redblue))) + geom_point(size = 1) + geom_smooth(method = "lm") +
  stat_poly_eq(formula = huhh, 
                aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")), 
                parse = TRUE)
Blue <- censur %>%
  filter(redblue == "b") %>%
  na.omit(Blue)
heee <- lm((1/(Blue$pop2010)) ~ (log10(Blue$med_income)))
summary.lm(heee)

Call:
lm(formula = (1/(Blue$pop2010)) ~ (log10(Blue$med_income)))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.00289 -0.00135 -0.00090 -0.00030  0.49793 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)
(Intercept)             0.041470   0.029041   1.428    0.154
log10(Blue$med_income) -0.008526   0.006200  -1.375    0.169

Residual standard error: 0.01723 on 857 degrees of freedom
Multiple R-squared:  0.002202,  Adjusted R-squared:  0.001038 
F-statistic: 1.891 on 1 and 857 DF,  p-value: 0.1694
P6 <- ggplot(Blue, aes(pop2010,med_income)) + 
  geom_point(size = 1) +  
  geom_smooth(method = "lm") +
  stat_poly_eq(formula = heee, 
                aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")), 
                parse = TRUE)  
  
Red <- censur %>%
  filter(redblue == "r") %>%
  na.omit(Red)
heeee <- lm((1/(Red$pop2010)) ~ (log10(Red$med_income)))
summary.lm(heeee)

Call:
lm(formula = (1/(Red$pop2010)) ~ (log10(Red$med_income)))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.01151 -0.00389 -0.00217 -0.00012  0.98862 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)    
(Intercept)           -0.108390   0.028563  -3.795 0.000152 ***
log10(Red$med_income)  0.024326   0.006204   3.921 9.13e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.0265 on 1912 degrees of freedom
Multiple R-squared:  0.007976,  Adjusted R-squared:  0.007457 
F-statistic: 15.37 on 1 and 1912 DF,  p-value: 9.133e-05
P7 <- ggplot(Red, aes(pop2010,med_income)) + 
  geom_point(size = 1) +  
  geom_smooth(method = "lm") +
  stat_poly_eq(formula = heeee, 
                aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")), 
                parse = TRUE)   
Unknown <- censur %>%
  filter(redblue == "u") %>%
  na.omit(Unknown)
Heeeee <- lm((1/(Unknown$pop2010)) ~ (log10(Unknown$med_income)))
summary.lm(Heeeee) 

Call:
lm(formula = (1/(Unknown$pop2010)) ~ (log10(Unknown$med_income)))

Residuals:
      Min        1Q    Median        3Q       Max 
-0.001329 -0.001181 -0.001037 -0.000660  0.060870 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)
(Intercept)                0.005886   0.011785   0.499    0.618
log10(Unknown$med_income) -0.000917   0.002522  -0.364    0.716

Residual standard error: 0.005488 on 368 degrees of freedom
Multiple R-squared:  0.0003591, Adjusted R-squared:  -0.002357 
F-statistic: 0.1322 on 1 and 368 DF,  p-value: 0.7164
P8 <- ggplot(Unknown, aes(Unknown$pop2010,Unknown$med_income)) + 
  geom_point(size = 1) +  
  geom_smooth(method = "lm") +
  stat_poly_eq(formula = Heeeee, 
                aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")),
                parse = TRUE)
plot_grid(P5)

plot_grid(P6,P7,P8, labels = c("A", "B", "C"), nrow = 2, ncol = 2)

plot_grid(P1,P5, nrow = 2)

plot_grid(P2, P3, P4, P6, P7, P8, nrow = 2, ncol =  3, align = "v")

#I keep trying to figure out how to adjust the spaces BETWEEN the graphs but I honestly have no freaking idea how to do it soooo I'm just gonna cry and let it be. 
B1 <- boxplot((1/(censur$pop2010)) ~ censur$redblue)

  1. So by doing the inverse function for this dataset I managed to get the levenes test to above .05 so we can accept that the data is better but it still fails the shapiro test. When you run an LM on the dataset you see that there’s a significant difference between republican and democratic counties but not between republican and unidentifiable counties. The standard error is used as a proxy for standard deviation in this case with a value of 0.02271 which is pretty concise especially when we think about how large this dataset is and the fact that our R2 in our models aren’t very high. I also did a boxplot to visualize the spread in the transformed data and what you can see is that numbers closest to 0 mean high populations while number closest to 1 are smaller populations. From that boxplot you can see that there’s a LOT more variation within the r (republicans) section that leads me to believe that, on average, the repiblican counties are smaller than democratic counties, and the unknown counties have a much smaller variation that r but more spread than b. Also, if you look at the WhadDoIDid dataframe you can see the averages of the population sizes, which tells us that on average democratic counties are larger than republican ones.
attach(cancer)
Cancs <- cancer %>% 
  group_by(treatment) %>%
  summarise_all(funs(mean))
cancer$death <- as.numeric(cancer$death)
cancer$treatment <- as.factor(cancer$treatment)
hist(cancer$death, breaks=c(seq(0,60, 1)), prob = TRUE)               

levene.test(death ~ treatment)
Levene's Test for Homogeneity of Variance (center = median)
       Df F value  Pr(>F)  
group   3  3.0257 0.03241 *
      116                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
levene.test(log10(cancer$death) ~ treatment)
Levene's Test for Homogeneity of Variance (center = median)
       Df F value Pr(>F)
group   3  0.9122 0.4374
      116               
levene.test(sqrt(cancer$death) ~ treatment)
Levene's Test for Homogeneity of Variance (center = median)
       Df F value  Pr(>F)  
group   3  2.3496 0.07608 .
      116                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
levene.test((1/(cancer$death)) ~ treatment)
Levene's Test for Homogeneity of Variance (center = median)
       Df F value Pr(>F)
group   3  0.0816 0.9699
      116               
shapiro.test(cancer$death)

    Shapiro-Wilk normality test

data:  cancer$death
W = 0.78535, p-value = 5.85e-12
shapiro.test(log10(cancer$death))

    Shapiro-Wilk normality test

data:  log10(cancer$death)
W = 0.96269, p-value = 0.002094
shapiro.test(sqrt(cancer$death))

    Shapiro-Wilk normality test

data:  sqrt(cancer$death)
W = 0.94351, p-value = 7.439e-05
shapiro.test((1/(cancer$death)))

    Shapiro-Wilk normality test

data:  (1/(cancer$death))
W = 0.71166, p-value = 4.843e-14
#so here what we see is that log10 best satisfies the data for shapiro and levene so it's likely to be best to use those, even though sqrt, log, AND the inverse all keep the null hypothesis when run through the levene test. 
ggplot(cancer, aes(log10(cancer$death)))+ geom_histogram(aes(y=..density..), binwidth = .1, color = "gray", fill = "black") +
  geom_density() 

#this isn't really a PERFECT bellcurve but honestly, it's pretty decent enough and I'd be pretty okay allowing myself to draw conclusions fromt his data.
ADvsT <- aov((log10(cancer$death)) ~ treatment)
summary.aov(ADvsT)
             Df Sum Sq Mean Sq F value Pr(>F)
treatment     3  0.443  0.1478   1.017  0.388
Residuals   116 16.861  0.1454               
posthocADvsT <- TukeyHSD(x=ADvsT, ordered = FALSE, conf.level=0.95)
posthocADvsT
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = (log10(cancer$death)) ~ treatment)

$treatment
                     diff        lwr       upr     p adj
DrugA-placebo  0.10291792 -0.1536795 0.3595153 0.7230782
DrugB-placebo  0.11823973 -0.1383577 0.3748371 0.6273618
DrugC-placebo -0.01946226 -0.2760597 0.2371351 0.9972479
DrugB-DrugA    0.01532181 -0.2412756 0.2719192 0.9986495
DrugC-DrugA   -0.12238019 -0.3789776 0.1342172 0.6007856
DrugC-DrugB   -0.13770200 -0.3942994 0.1188954 0.5026287
plot(posthocADvsT)

cancer$treatment <- as.factor(cancer$treatment)
cancer$treatment <- relevel(cancer$treatment, ref = "placebo")
LDvsT <- lm((log10(cancer$death)) ~ cancer$treatment)
summary.lm(LDvsT)

Call:
lm(formula = (log10(cancer$death)) ~ cancer$treatment)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.79503 -0.19297  0.03191  0.25413  0.90153 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)    
(Intercept)            0.67679    0.06961   9.723   <2e-16 ***
cancer$treatmentDrugA  0.10292    0.09844   1.045    0.298    
cancer$treatmentDrugB  0.11824    0.09844   1.201    0.232    
cancer$treatmentDrugC -0.01946    0.09844  -0.198    0.844    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3813 on 116 degrees of freedom
Multiple R-squared:  0.02563,   Adjusted R-squared:  0.0004263 
F-statistic: 1.017 on 3 and 116 DF,  p-value: 0.3879
NullA <- aov(log10(cancer$death) ~ 1)
NullL <- lm(log10(cancer$death) ~ 1)
AICctab(ADvsT, NullA, LDvsT, NullL, weights = TRUE, delta = TRUE, base=TRUE, sort = TRUE)
      AICc  dAICc df weight
NullA 112.3   0.0 2  0.42  
NullL 112.3   0.0 2  0.42  
ADvsT 115.6   3.3 5  0.08  
LDvsT 115.6   3.3 5  0.08  
#Here I'm literally SCROUNGING to figure out why I'm not seeing any interactions between my data sets and what the hell is going on. 
boxplot((log10(cancer$death)) ~ cancer$treatment)

interaction.plot(cancer$treatment, trace.factor=cancer$treatment, response=cancer$death, 
fun=mean, type="b")

ggplot(cancer, aes((log10(cancer$death)),cancer$treatment)) + 
  geom_point(size = 1) 

NA
  1. So ultimately what my data is telling me is that there’s no significant difference between the drugs and the placebo, so effectively it doesn’t seem like the drugs are having any effect on the amount that patients are dying in these trials. Now I have to say that I’m somewhat sold on this data because my levenes test is definitely satisfied, my shapiro test is almost satisfied, and when I looked at the histogram for my log transformed data it looked relatively normal (bell shaped)- not perfect but reasonable enough that I wouldn’t expect it to blow my ANOVA’s ability to perform out of the water. When you look at the model summaries for my LM and my ANOVA they both show there’s no significance between the datasets (ANOVA w/ Tukey). This is further backed up with the boxplot I made of the data because there’s HUGE overlap between the boxplot’s error bars telling me that there’s quite a bit of variation amongst the different drug trials. I then did a interaction plot of the Tukey posthoc and you can clearly see that there’s way too much overlap within the datasets for any of the models we created to be able to see any difference as significant. This assumption is also backed up by the AIC I ran, which picked the null models rather than the lm or ANOVA models I created, basically that means the models I created really didn’t explain much of the variation and were quite awful. The last piece of evidence that I have that supports my ideas is the ggplot that I created to see the variation among the different trials per drug, and basically it says the same story as the boxplot and the Tukey posthoc plot- there’s too much overlap between the datasets for the drugs to be significantly affecting the trials/amount of deaths. I do wanna say that there seems to be an observable trend if you’re just looking at the data and I feel that if there had more than 120 individuals in the drug trial it would be a lot more likely that there would’ve been a significant difference.
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpQYWNrYWdlcyB1c2VkOiAKR0dwbWlzYwoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQphdHRhY2god2hlYXQpCndoZWF0JGZzb2lsIDwtIGFzLmZhY3Rvcih3aGVhdCRzb2lsKQp3aGVhdCRmc29pbCA8LSByZWxldmVsKHdoZWF0JGZzb2lsLCByZWYgPSAic2FuZCIpCmxldmVuZVRlc3QoeWllbGQgfiB3aGVhdCRmc29pbCkKc2hhcGlyby50ZXN0KHlpZWxkKQptb2RlbEEgPC0gYW92KHlpZWxkfiB3aGVhdCRmc29pbCkKbW9kZWxCIDwtIGxtKHlpZWxkIH4gd2hlYXQkZnNvaWwpCnN1bW1hcnkobW9kZWxBKQpzdW1tYXJ5KG1vZGVsQikKcG9zdGhvYzEgPC0gVHVrZXlIU0QoeD1tb2RlbEEsIG9yZGVyZWQgPSBGQUxTRSwgY29uZi5sZXZlbD0wLjk1KQpwb3N0aG9jMQpXaGF0RG9JRG8gPC0gd2hlYXQgJT4lCiAgZ3JvdXBfYnkoZnNvaWwpICU+JQogIHN1bW1hcmlzZV9hbGwoZnVucyhtZWFuKSkKYGBgCgoxKSBbVjItVjFdL1YxOyBJbiB0aGlzIGRhdGFzZXQgd2Ugc2VlIHRoYXQgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBzb2lsLCBidXQgdGhlIGRpZmZlcmVuY2UgaXMgb25seSBzaWduaWZpY2FudCBiZXR3ZWVuIHNhbmQgYW5kIGxvYW0sIG5vdCBiZXR3ZWVuIHNhbmQgYW5kIGNsYXkgb3IgbG9hbSBhbmQgY2xheS4gSWYgeW91IGxvb2sgYXQgdGhlIGRhdGEgeW91IGNhbiBzZWUgdGhhdCBsb2FtIGhhcyBhbiBhcHByb3guIDEuNCBmb2xkIHlpZWxkIGluY3JlYXNlIG92ZXIgc2FuZC4gCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0V9CmF0dGFjaChjZW5zdXIpCmxldmVuZVRlc3QobWVkX2luY29tZSB+IHJlZGJsdWUpCmxldmVuZVRlc3QocG92ZXJ0eSB+IHJlZGJsdWUpCnNoYXBpcm8udGVzdChwb3ZlcnR5KQpzaGFwaXJvLnRlc3QobWVkX2luY29tZSkKCmxvZ21lZCA8LSBsb2cxMChtZWRfaW5jb21lKQpzaGFwaXJvLnRlc3QobG9nbWVkKQpsZXZlbmVUZXN0KGxvZ21lZCB+IHJlZGJsdWUpCnNxcG92IDwtIChzcXJ0KHBvdmVydHkpKQpzaGFwaXJvLnRlc3Qoc3Fwb3YpCmxldmVuZVRlc3Qoc3Fwb3YgfiByZWRibHVlKQoKaGlzdChsb2dtZWQsIGJyZWFrcz1jKHNlcSg0LDYsIC4xKSksIHByb2IgPSBUUlVFKQpsaW5lcyhkZW5zaXR5KGxvZ21lZCkpCmhpc3Qoc3Fwb3YsIGJyZWFrcz1jKHNlcSgwLDgsIC41MCkpLCBwcm9iID0gVFJVRSkKbGluZXMoZGVuc2l0eShzcXBvdikpCgptb2RlbFMgPC0gIGxtKGxvZ21lZCB+IHJlZGJsdWUpIApzdW1tYXJ5LmxtKG1vZGVsUykKYm94cGxvdChsb2dtZWQgfiByZWRibHVlKQoKbW9kZWxUIDwtICBsbShzcXBvdiB+IHJlZGJsdWUpIApzdW1tYXJ5LmxtKG1vZGVsUykKYm94cGxvdChzcXBvdiB+IHJlZGJsdWUpCgpNb2RlbE5TIDwtIGxtKGxvZ21lZCB+IDEpCk1vZGVsTlQgPC0gbG0oc3Fwb3YgfiAxKQpBSUNjdGFiKG1vZGVsUywgbW9kZWxULCBNb2RlbE5ULCBNb2RlbE5TLCB3ZWlnaHRzID0gVFJVRSwgZGVsdGEgPSBUUlVFLCBiYXNlPVRSVUUsIHNvcnQgPSBUUlVFKQoKV2hhdERvSURpZCA8LSBjZW5zdXIgJT4lCiAgZ3JvdXBfYnkocmVkYmx1ZSkgJT4lCiAgc3VtbWFyaXNlX2FsbChmdW5zKG1lYW4pKQpgYGAKMikgU28gdGhlIG1haW4gaXNzdWUgaGVyZSBpcyB0aGF0IHRoZSBwb3B1bGF0aW9uIGlzIHRvbyBsYXJnZSB0byBnZXQgdGhlIHNoYXBpcm8gdGVzdCB0byB3b3JrLCBhbmQgbm8gYW1vdW50IG9mIHRyYW5zZm9ybWluZyB0aGUgZGF0YSB3aWxsIHJlYWxseSBlZmZlY3RpdmVseSBjaGFuZ2UgdGhhdC4gQnkgZG9pbmcgZGlmZmVyZW50IHRyYW5zZm9ybWF0aW9ucyBJIG1hbmdlZCB0byBmaXggdGhlIGRhdGEgc28gdGhhdCB0aGUgbWVkX2luY29tZSBkYXRhIGlzIHByZXR0eSByZWFzb25hYmxlIGJvdGggd2hlbiB5b3UgbG9vayBhdCBhIGhpc3RvZ3JhbSBvZiB0aGUgZGF0YSBhbmQgd2hlbiB5b3UgbG9vayBhdCB0aGUgbGV2ZW5lcyB0ZXN0IGZvciB0aGUgZGF0YSAoc3RpbGwgYSBzaWduaWZpY2FudCBQIHZhbHVlIGJ1dCBNVUNIIGNsb3NlciB0byBub3QgcmVqZWN0aW5nIHRoZSBudWxsIGh5cG90aGVzaXMpLiBUaGVyZSByZWFsbHkgd2Fzbid0IG11Y2ggSSBjb3VsZCBkbyBhYm91dCBwb3ZlcnR5LiBBbHNvLCB0aGVyZSdzIGFuIGlzc3VlIHdpdGggdGhlIHBvcHVsYXRpb24gc2FtcGxlIHNpemVzIHdoZXJlIHRoZXJlcyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBpbiBwb3B1bGF0aW9uIHNpemVzIG9mIHRoZSBzYW1wbGVzIHNvIHRoYXQgYWxzbyBtaWdodCBiZSBhIGNvbmZvdW5kaW5nIHByb2JsZW0gd2l0aCB0aGlzIGRhdGFzZXQuIAoKTm93LCBpZ25vcmluZyBhbGwgb2YgdGhhdCB3aGF0IHdlIHNlZSBpcyB0aGF0IE9OIEFWRVJBR0UgcmVwdWJsaWNhbiBjb3VudGllcyBoYXZlIDM0JSBtb3JlIHBvdmVydHkgdGhhbiBkZW1vY3JhdGljIGNvdW50aWVzLCBhbmQgc2FsYXJhaWVzIGluIHRoZXNlIHJlcHVibGljYW4gY291bnRpZXIgYXJlLCBvbiBhdmVyYWdlLCAyMCUgbGVzcyB0aGFuIHRoZWlyIGRlbW9jcmF0aWMgY291bnRpZXMuIElmIHlvdSBsb29rIGF0IHRoZSBSMiBteSBtb2RlbHMgYXJlIG9ubHkgcmVhbGx5IGFjY291bnRpbmcgZm9yIH4gMTMlIG9mIHRoZSB2YXJpYW5jZSBpbiB0aGUgZGF0YXNldC4gVGhhdCBiZWluZyBzYWlkLCBzaW5jZSB0aGUgZGF0YXNldCBpcyBzbyBsYXJnZSBJJ20gcHJldHR5IGNvbmZpZGVudCB0aGF0IHRoZSBtb2RlbFMgaXMgYXQgbGVhc3Qgc29tZXdoYXQgcmVsaWFibGUgdG8gdXNlIHRvIGFuc3dlciB0aGUgcXVlc3Rpb25zLiBOb3cgd2UgY2FuJ3QgZnVsbHkgZGV0ZXJtaW5lIGlmIHRoaXMgaXMgU0lHTklGSUNBTlQgYmVjYXVzZSB3ZSBjb3VsZCBvbmx5IHVzZSBwYXJhbWV0cmljIHRlc3RzIFtoYXZlbid0IGxlYXJuZWQgbm9ucGFyYW1ldHJpYyB0ZXN0cyB5ZXRdIHNvIHdlIGNhbid0IHJlbHkgY29tcGxldGVseSBvbiB0aGlzIGRhdGEuIENvbnRyYXN0aW5nbHksIHdoZW4gd2UgcmFuIG91ciBBSUMgd2Ugc2VlIHRoYXQgdGhlIG1vZGVsIHRoYXQgd2FzIGNob3NlbiBieSB0aGUgQUlDIHdhcyBtb2RlbFMgKGxvZ21lZCB+IHJlZGJsdWUpIHdpdGggdGhlIG51bGxtb2RlbCBmb2xsb3dpbmcgdXAgYW5kIG5vIG90aGVyIG1vZGVsIGNhbWUgY2xvc2UgdG8gYmVpbmcgYXMgc3Ryb25nIGFzIG1vZGVsUyBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBBSUMuIEkgd291bGQgaGF6YXJkIHRvIHNheSB0aGF0IHllcywgZXZlbiB0aG91Z2ggb3VyIGRhdGEgYW5kIGFuYWx5c2lzIGlzIGEgbGl0dGxlIHNoYWt5LCB0aGUgYWRhZ2Ugb2YgZWNvbm9taWMgZGlmZmVyZW5jZXMgc2VlbXMgdG8gYmUgdHJ1ZSB3aXRoIHJlcHVibGljYW4gY291bnRpZXMgaGF2ZWluZyBsb3dlciBtZWRpdW0gc2FsYXJpZXMuIFdlIGNhbid0IHJlYWxseSBkZXRlcm1pbmUgbXVjaCB3aXRoIGhpZ2hlciBwb3ZlcnkgcmF0ZXMgYmVjYXVzZSBvdXIgQUlDIGRlZmluaXRlbHkgZGlkbid0IGNob29zZSB0aGF0IG1vZGVsIHNvIHRoZXJlIHdhcyBwcm9iYWJseSBhIExPVCBvZiB2YXJpYXRpb24gd2l0aGluIHRoYXQgZGF0YXNldCBldmVuIGlmIG91ciBSMiB3YXMgLjEzLiAKCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQphdHRhY2goY2Vuc3VyKQpXaGF0RG9JRGlkIDwtIGNlbnN1ciAlPiUgCiAgZ3JvdXBfYnkocmVkYmx1ZSkgJT4lCiAgc3VtbWFyaXNlX2FsbChmdW5zKG1lYW4pKQoKaGlzdChwb3AyMDEwLCBicmVha3M9YyhzZXEoMCwzNTAwLCAxMDApKSwgcHJvYiA9IFRSVUUpICAgICAgICAgICAgICAgCmxldmVuZS50ZXN0KHBvcDIwMTAgfiByZWRibHVlKQpobW0gPC0gYW92KHBvcDIwMTAgfiByZWRibHVlKQpzdW1tYXJ5LmFvdihobW0pCnBvc3Rob2MxIDwtIFR1a2V5SFNEKHg9aG1tLCBvcmRlcmVkID0gRkFMU0UsIGNvbmYubGV2ZWw9MC45NSkKcG9zdGhvYzEKCgpjZW5zdXIkcG9wMjAxMCA8LSBhcy5pbnRlZ2VyKGNlbnN1ciRwb3AyMDEwKQpjZW5zdXIkcmVkYmx1ZSA8LSBhcy5mYWN0b3IoY2Vuc3VyJHJlZGJsdWUpCmNlbnN1ciRyZWRibHVlIDwtIHJlbGV2ZWwoY2Vuc3VyJHJlZGJsdWUsIHJlZj0gInIiKQpsZXZlbmVUZXN0KCgxLyhjZW5zdXIkcG9wMjAxMCkpIH4gcmVkYmx1ZSkKc2hhcGlyby50ZXN0KCgxLyhjZW5zdXIkcG9wMjAxMCkpKQpobSA8LSBhb3YoKDEvKGNlbnN1ciRwb3AyMDEwKSB+IHJlZGJsdWUpKQoKaG1tbSA8LSBhb3YoKDEvKGNlbnN1ciRwb3AyMDEwKSkgfiByZWRibHVlKQpzdW1tYXJ5LmFvdihobW1tKQpwb3N0aG9jMyA8LSBUdWtleUhTRCh4PWhtbW0sIG9yZGVyZWQgPSBGQUxTRSwgY29uZi5sZXZlbD0wLjk1KQpwb3N0aG9jMwoKY2Vuc3VyJHJlZGJsdWUgPC0gYXMuZmFjdG9yKGNlbnN1ciRyZWRibHVlKQpjZW5zdXIkcmVkYmx1ZSA8LSByZWxldmVsKGNlbnN1ciRyZWRibHVlLCByZWYgPSAiciIpCmh1aCA8LSBsbSgoMS8oY2Vuc3VyJHBvcDIwMTApKSB+IHJlZGJsdWUpCnN1bW1hcnkubG0oaHVoKQoKaHVodW0gPC0gbG0oKDEvKGNlbnN1ciRwb3AyMDEwKSkgfiAxKQoKYm94cGxvdCgoMS8oY2Vuc3VyJHBvcDIwMTApIH4gY2Vuc3VyJHJlZGJsdWUpKQoKCkFJQ2N0YWIoaG0sIGh1aCwgaHVodW0sIHdlaWdodHMgPSBUUlVFLCBkZWx0YSA9IFRSVUUsIGJhc2U9VFJVRSwgc29ydCA9IFRSVUUpCgojQ29kaW5nIHRoZSBncmFwaHMgaW50byBuYW1lcyB0byBwdXQgdGhlbSBpbnRvIGEgc2luZ3VsYXIgdGFibGUuIFRoaXMgaXMgYWxzbyBhbGxvd2luZyB1cCB0byBmaW5kIFIyIHZhbHVlcyBmb3IgRUFDSCBvZiB0aGUgcG9wdWxhdGlvbiBkYXRhIHNldHMgYW5kIHNlZSBob3cgdGhleSBsb29rIGFnYWluc3QgZWFjaG90aGVyIGFuZCB3aGVuIHRoZXkncmUgYWxsIHRvZ2V0aGVyCgpQMSA8LSBnZ3Bsb3QoZGF0YT1jZW5zdXIsIGFlcygocG9wMjAxMCksKHBvdmVydHkpLCBjb2xvciA9IGZhY3RvcihyZWRibHVlKSkpICsgZ2VvbV9wb2ludChzaXplID0gMSkgKyBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgc3RhdF9wb2x5X2VxKGZvcm11bGEgPSBodWgsIAogICAgICAgICAgICAgICAgYWVzKGxhYmVsID0gcGFzdGUoLi5lcS5sYWJlbC4uLCAuLnJyLmxhYmVsLi4sIHNlcCA9ICJ+fn4iKSksIAogICAgICAgICAgICAgICAgcGFyc2UgPSBUUlVFKQoKQmx1ZSA8LSBjZW5zdXIgJT4lCiAgZmlsdGVyKHJlZGJsdWUgPT0gImIiKSAlPiUKICBuYS5vbWl0KEJsdWUpCmhlIDwtIGxtKCgxLyhCbHVlJHBvcDIwMTApKSB+IEJsdWUkcG92ZXJ0eSkKc3VtbWFyeS5sbShoZSkKUDIgPC0gZ2dwbG90KEJsdWUsIGFlcyhwb3AyMDEwLHBvdmVydHkpKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDEpICsgIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzdGF0X3BvbHlfZXEoZm9ybXVsYSA9IGhlLCAKICAgICAgICAgICAgICAgIGFlcyhsYWJlbCA9IHBhc3RlKC4uZXEubGFiZWwuLiwgLi5yci5sYWJlbC4uLCBzZXAgPSAifn5+IikpLCAKICAgICAgICAgICAgICAgIHBhcnNlID0gVFJVRSkgIAogIApSZWQgPC0gY2Vuc3VyICU+JQogIGZpbHRlcihyZWRibHVlID09ICJyIikgJT4lCiAgbmEub21pdChSZWQpCmhlZSA8LSBsbSgoMS8oUmVkJHBvcDIwMTApKSB+IFJlZCRwb3ZlcnR5KQpzdW1tYXJ5LmxtKGhlZSkKUDMgPC0gZ2dwbG90KFJlZCwgYWVzKHBvcDIwMTAscG92ZXJ0eSkpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMSkgKyAgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIHN0YXRfcG9seV9lcShmb3JtdWxhID0gaGVlLCAKICAgICAgICAgICAgICAgIGFlcyhsYWJlbCA9IHBhc3RlKC4uZXEubGFiZWwuLiwgLi5yci5sYWJlbC4uLCBzZXAgPSAifn5+IikpLCAKICAgICAgICAgICAgICAgIHBhcnNlID0gVFJVRSkgICAKClVua25vd24gPC0gY2Vuc3VyICU+JQogIGZpbHRlcihyZWRibHVlID09ICJ1IikgJT4lCiAgbmEub21pdChVbmtub3duKQpIZSA8LSBsbSgoMS8oVW5rbm93biRwb3AyMDEwKSkgfiBVbmtub3duJHBvdmVydHkpCnN1bW1hcnkubG0oSGUpIApQNCA8LSBnZ3Bsb3QoVW5rbm93biwgYWVzKFVua25vd24kcG9wMjAxMCxVbmtub3duJHBvdmVydHkpKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDEpICsgIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzdGF0X3BvbHlfZXEoZm9ybXVsYSA9IEhlLCAKICAgICAgICAgICAgICAgIGFlcyhsYWJlbCA9IHBhc3RlKC4uZXEubGFiZWwuLiwgLi5yci5sYWJlbC4uLCBzZXAgPSAifn5+IikpLAogICAgICAgICAgICAgICAgcGFyc2UgPSBUUlVFKQoKI1RoaXMgbWV0aG9kIE9OTFkgd29ya3Mgd2l0aCBjb3dwbG90IEJVVCBpdCBtYWtlcyBtdWx0aXBsb3R0aW5nIGV4dHJlbWVseSBtYW5pZ2FibGUgKHNwKS4gTW92aW5nIGZvcndhcmQgd2UgY2FuIHByb2JhYmx5IHJlYWxseSBlYXNpbHkgZmluZCBhIHdheSB0byBtYWtlIHRoaXMgInNleGllciIgYW5kIG1vdmUgdGhlIGdyYXBocyBhYm91dCB0byBiZSBiZXR0ZXIgbG9va2luZyBidXQgYXMgaXQgaXMgdGhpcyBpcyBBV0VTT01FIDpECnBsb3RfZ3JpZChQMSkgI1NpbmNlIHdlIGNvdWxkbid0IG1ha2UgYWxsIG9mIHRoZW0gZml0IG5pY2VseSwgd2UgY2FuIGp1c3QgaGF2ZSB0aGlzIG9uZSBieSBpdHNlbGYgc28gd2UgY2FuIHNlZSB0aGUgcHJldHR5IGNvbG9ycyBhbmQgdGhlIGxvdHMgb2YgbGluZXMKcGxvdF9ncmlkKFAyLFAzLFA0LCBsYWJlbHMgPSBjKCJBIiwgIkIiLCAiQyIpLCBucm93ID0gMiwgbmNvbCA9IDIsIGFsaWduID0gImgiKQoKaHVoaCA8LSBsbSgoMS8ocG9wMjAxMCkpIH4gKGxvZzEwKG1lZF9pbmNvbWUpKSkKUDUgPC0gZ2dwbG90KGRhdGE9Y2Vuc3VyLCBhZXMoKHBvcDIwMTApLChsb2cxMChtZWRfaW5jb21lKSksIGNvbG9yID0gZmFjdG9yKHJlZGJsdWUpKSkgKyBnZW9tX3BvaW50KHNpemUgPSAxKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzdGF0X3BvbHlfZXEoZm9ybXVsYSA9IGh1aGgsIAogICAgICAgICAgICAgICAgYWVzKGxhYmVsID0gcGFzdGUoLi5lcS5sYWJlbC4uLCAuLnJyLmxhYmVsLi4sIHNlcCA9ICJ+fn4iKSksIAogICAgICAgICAgICAgICAgcGFyc2UgPSBUUlVFKQoKQmx1ZSA8LSBjZW5zdXIgJT4lCiAgZmlsdGVyKHJlZGJsdWUgPT0gImIiKSAlPiUKICBuYS5vbWl0KEJsdWUpCmhlZWUgPC0gbG0oKDEvKEJsdWUkcG9wMjAxMCkpIH4gKGxvZzEwKEJsdWUkbWVkX2luY29tZSkpKQpzdW1tYXJ5LmxtKGhlZWUpClA2IDwtIGdncGxvdChCbHVlLCBhZXMocG9wMjAxMCxtZWRfaW5jb21lKSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSAxKSArICAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgc3RhdF9wb2x5X2VxKGZvcm11bGEgPSBoZWVlLCAKICAgICAgICAgICAgICAgIGFlcyhsYWJlbCA9IHBhc3RlKC4uZXEubGFiZWwuLiwgLi5yci5sYWJlbC4uLCBzZXAgPSAifn5+IikpLCAKICAgICAgICAgICAgICAgIHBhcnNlID0gVFJVRSkgIAogIApSZWQgPC0gY2Vuc3VyICU+JQogIGZpbHRlcihyZWRibHVlID09ICJyIikgJT4lCiAgbmEub21pdChSZWQpCmhlZWVlIDwtIGxtKCgxLyhSZWQkcG9wMjAxMCkpIH4gKGxvZzEwKFJlZCRtZWRfaW5jb21lKSkpCnN1bW1hcnkubG0oaGVlZWUpClA3IDwtIGdncGxvdChSZWQsIGFlcyhwb3AyMDEwLG1lZF9pbmNvbWUpKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDEpICsgIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzdGF0X3BvbHlfZXEoZm9ybXVsYSA9IGhlZWVlLCAKICAgICAgICAgICAgICAgIGFlcyhsYWJlbCA9IHBhc3RlKC4uZXEubGFiZWwuLiwgLi5yci5sYWJlbC4uLCBzZXAgPSAifn5+IikpLCAKICAgICAgICAgICAgICAgIHBhcnNlID0gVFJVRSkgICAKClVua25vd24gPC0gY2Vuc3VyICU+JQogIGZpbHRlcihyZWRibHVlID09ICJ1IikgJT4lCiAgbmEub21pdChVbmtub3duKQpIZWVlZWUgPC0gbG0oKDEvKFVua25vd24kcG9wMjAxMCkpIH4gKGxvZzEwKFVua25vd24kbWVkX2luY29tZSkpKQpzdW1tYXJ5LmxtKEhlZWVlZSkgClA4IDwtIGdncGxvdChVbmtub3duLCBhZXMoVW5rbm93biRwb3AyMDEwLFVua25vd24kbWVkX2luY29tZSkpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMSkgKyAgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIHN0YXRfcG9seV9lcShmb3JtdWxhID0gSGVlZWVlLCAKICAgICAgICAgICAgICAgIGFlcyhsYWJlbCA9IHBhc3RlKC4uZXEubGFiZWwuLiwgLi5yci5sYWJlbC4uLCBzZXAgPSAifn5+IikpLAogICAgICAgICAgICAgICAgcGFyc2UgPSBUUlVFKQoKcGxvdF9ncmlkKFA1KQpwbG90X2dyaWQoUDYsUDcsUDgsIGxhYmVscyA9IGMoIkEiLCAiQiIsICJDIiksIG5yb3cgPSAyLCBuY29sID0gMikKcGxvdF9ncmlkKFAxLFA1LCBucm93ID0gMikKcGxvdF9ncmlkKFAyLCBQMywgUDQsIFA2LCBQNywgUDgsIG5yb3cgPSAyLCBuY29sID0gIDMsIGFsaWduID0gInYiKQojSSBrZWVwIHRyeWluZyB0byBmaWd1cmUgb3V0IGhvdyB0byBhZGp1c3QgdGhlIHNwYWNlcyBCRVRXRUVOIHRoZSBncmFwaHMgYnV0IEkgaG9uZXN0bHkgaGF2ZSBubyBmcmVha2luZyBpZGVhIGhvdyB0byBkbyBpdCBzb29vbyBJJ20ganVzdCBnb25uYSBjcnkgYW5kIGxldCBpdCBiZS4gCgpCMSA8LSBib3hwbG90KCgxLyhjZW5zdXIkcG9wMjAxMCkpIH4gY2Vuc3VyJHJlZGJsdWUpCgoKYGBgCgozKSBTbyBieSBkb2luZyB0aGUgaW52ZXJzZSBmdW5jdGlvbiBmb3IgdGhpcyBkYXRhc2V0IEkgbWFuYWdlZCB0byBnZXQgdGhlIGxldmVuZXMgdGVzdCB0byBhYm92ZSAuMDUgc28gd2UgY2FuIGFjY2VwdCB0aGF0IHRoZSBkYXRhIGlzIGJldHRlciBidXQgaXQgc3RpbGwgZmFpbHMgdGhlIHNoYXBpcm8gdGVzdC4gV2hlbiB5b3UgcnVuIGFuIExNIG9uIHRoZSBkYXRhc2V0IHlvdSBzZWUgdGhhdCB0aGVyZSdzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHJlcHVibGljYW4gYW5kIGRlbW9jcmF0aWMgY291bnRpZXMgYnV0IG5vdCBiZXR3ZWVuIHJlcHVibGljYW4gYW5kIHVuaWRlbnRpZmlhYmxlIGNvdW50aWVzLiBUaGUgc3RhbmRhcmQgZXJyb3IgaXMgdXNlZCBhcyBhIHByb3h5IGZvciBzdGFuZGFyZCBkZXZpYXRpb24gaW4gdGhpcyBjYXNlIHdpdGggYSB2YWx1ZSBvZiAwLjAyMjcxIHdoaWNoIGlzIHByZXR0eSBjb25jaXNlIGVzcGVjaWFsbHkgd2hlbiB3ZSB0aGluayBhYm91dCBob3cgbGFyZ2UgdGhpcyBkYXRhc2V0IGlzIGFuZCB0aGUgZmFjdCB0aGF0IG91ciBSMiBpbiBvdXIgbW9kZWxzIGFyZW4ndCB2ZXJ5IGhpZ2guIEkgYWxzbyBkaWQgYSBib3hwbG90IHRvIHZpc3VhbGl6ZSB0aGUgc3ByZWFkIGluIHRoZSB0cmFuc2Zvcm1lZCBkYXRhIGFuZCB3aGF0IHlvdSBjYW4gc2VlIGlzIHRoYXQgbnVtYmVycyBjbG9zZXN0IHRvIDAgbWVhbiBoaWdoIHBvcHVsYXRpb25zIHdoaWxlIG51bWJlciBjbG9zZXN0IHRvIDEgYXJlIHNtYWxsZXIgcG9wdWxhdGlvbnMuIEZyb20gdGhhdCBib3hwbG90IHlvdSBjYW4gc2VlIHRoYXQgdGhlcmUncyBhIExPVCBtb3JlIHZhcmlhdGlvbiB3aXRoaW4gdGhlIHIgKHJlcHVibGljYW5zKSBzZWN0aW9uIHRoYXQgbGVhZHMgbWUgdG8gYmVsaWV2ZSB0aGF0LCBvbiBhdmVyYWdlLCB0aGUgcmVwaWJsaWNhbiBjb3VudGllcyBhcmUgc21hbGxlciB0aGFuIGRlbW9jcmF0aWMgY291bnRpZXMsIGFuZCB0aGUgdW5rbm93biBjb3VudGllcyBoYXZlIGEgbXVjaCBzbWFsbGVyIHZhcmlhdGlvbiB0aGF0IHIgYnV0IG1vcmUgc3ByZWFkIHRoYW4gYi4gQWxzbywgaWYgeW91IGxvb2sgYXQgdGhlIFdoYWREb0lEaWQgZGF0YWZyYW1lIHlvdSBjYW4gc2VlIHRoZSBhdmVyYWdlcyBvZiB0aGUgcG9wdWxhdGlvbiBzaXplcywgd2hpY2ggdGVsbHMgdXMgdGhhdCBvbiBhdmVyYWdlIGRlbW9jcmF0aWMgY291bnRpZXMgYXJlIGxhcmdlciB0aGFuIHJlcHVibGljYW4gb25lcy4gCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KYXR0YWNoKGNhbmNlcikKQ2FuY3MgPC0gY2FuY2VyICU+JSAKICBncm91cF9ieSh0cmVhdG1lbnQpICU+JQogIHN1bW1hcmlzZV9hbGwoZnVucyhtZWFuKSkKY2FuY2VyJGRlYXRoIDwtIGFzLm51bWVyaWMoY2FuY2VyJGRlYXRoKQpjYW5jZXIkdHJlYXRtZW50IDwtIGFzLmZhY3RvcihjYW5jZXIkdHJlYXRtZW50KQoKaGlzdChjYW5jZXIkZGVhdGgsIGJyZWFrcz1jKHNlcSgwLDYwLCAxKSksIHByb2IgPSBUUlVFKSAgICAgICAgICAgICAgIAoKbGV2ZW5lLnRlc3QoZGVhdGggfiB0cmVhdG1lbnQpCmxldmVuZS50ZXN0KGxvZzEwKGNhbmNlciRkZWF0aCkgfiB0cmVhdG1lbnQpCmxldmVuZS50ZXN0KHNxcnQoY2FuY2VyJGRlYXRoKSB+IHRyZWF0bWVudCkKbGV2ZW5lLnRlc3QoKDEvKGNhbmNlciRkZWF0aCkpIH4gdHJlYXRtZW50KQoKc2hhcGlyby50ZXN0KGNhbmNlciRkZWF0aCkKc2hhcGlyby50ZXN0KGxvZzEwKGNhbmNlciRkZWF0aCkpCnNoYXBpcm8udGVzdChzcXJ0KGNhbmNlciRkZWF0aCkpCnNoYXBpcm8udGVzdCgoMS8oY2FuY2VyJGRlYXRoKSkpCiNzbyBoZXJlIHdoYXQgd2Ugc2VlIGlzIHRoYXQgbG9nMTAgYmVzdCBzYXRpc2ZpZXMgdGhlIGRhdGEgZm9yIHNoYXBpcm8gYW5kIGxldmVuZSBzbyBpdCdzIGxpa2VseSB0byBiZSBiZXN0IHRvIHVzZSB0aG9zZSwgZXZlbiB0aG91Z2ggc3FydCwgbG9nLCBBTkQgdGhlIGludmVyc2UgYWxsIGtlZXAgdGhlIG51bGwgaHlwb3RoZXNpcyB3aGVuIHJ1biB0aHJvdWdoIHRoZSBsZXZlbmUgdGVzdC4gCgpnZ3Bsb3QoY2FuY2VyLCBhZXMobG9nMTAoY2FuY2VyJGRlYXRoKSkpKyBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksIGJpbndpZHRoID0gLjEsIGNvbG9yID0gImdyYXkiLCBmaWxsID0gImJsYWNrIikgKwogIGdlb21fZGVuc2l0eSgpIAojdGhpcyBpc24ndCByZWFsbHkgYSBQRVJGRUNUIGJlbGxjdXJ2ZSBidXQgaG9uZXN0bHksIGl0J3MgcHJldHR5IGRlY2VudCBlbm91Z2ggYW5kIEknZCBiZSBwcmV0dHkgb2theSBhbGxvd2luZyBteXNlbGYgdG8gZHJhdyBjb25jbHVzaW9ucyBmcm9tdCBoaXMgZGF0YS4KCkFEdnNUIDwtIGFvdigobG9nMTAoY2FuY2VyJGRlYXRoKSkgfiB0cmVhdG1lbnQpCnN1bW1hcnkuYW92KEFEdnNUKQpwb3N0aG9jQUR2c1QgPC0gVHVrZXlIU0QoeD1BRHZzVCwgb3JkZXJlZCA9IEZBTFNFLCBjb25mLmxldmVsPTAuOTUpCnBvc3Rob2NBRHZzVApwbG90KHBvc3Rob2NBRHZzVCkKCmNhbmNlciR0cmVhdG1lbnQgPC0gYXMuZmFjdG9yKGNhbmNlciR0cmVhdG1lbnQpCmNhbmNlciR0cmVhdG1lbnQgPC0gcmVsZXZlbChjYW5jZXIkdHJlYXRtZW50LCByZWYgPSAicGxhY2VibyIpCkxEdnNUIDwtIGxtKChsb2cxMChjYW5jZXIkZGVhdGgpKSB+IGNhbmNlciR0cmVhdG1lbnQpCnN1bW1hcnkubG0oTER2c1QpCgpOdWxsQSA8LSBhb3YobG9nMTAoY2FuY2VyJGRlYXRoKSB+IDEpCk51bGxMIDwtIGxtKGxvZzEwKGNhbmNlciRkZWF0aCkgfiAxKQoKQUlDY3RhYihBRHZzVCwgTnVsbEEsIExEdnNULCBOdWxsTCwgd2VpZ2h0cyA9IFRSVUUsIGRlbHRhID0gVFJVRSwgYmFzZT1UUlVFLCBzb3J0ID0gVFJVRSkKCiNIZXJlIEknbSBsaXRlcmFsbHkgU0NST1VOR0lORyB0byBmaWd1cmUgb3V0IHdoeSBJJ20gbm90IHNlZWluZyBhbnkgaW50ZXJhY3Rpb25zIGJldHdlZW4gbXkgZGF0YSBzZXRzIGFuZCB3aGF0IHRoZSBoZWxsIGlzIGdvaW5nIG9uLiAKYm94cGxvdCgobG9nMTAoY2FuY2VyJGRlYXRoKSkgfiBjYW5jZXIkdHJlYXRtZW50KQppbnRlcmFjdGlvbi5wbG90KGNhbmNlciR0cmVhdG1lbnQsIHRyYWNlLmZhY3Rvcj1jYW5jZXIkdHJlYXRtZW50LCByZXNwb25zZT1jYW5jZXIkZGVhdGgsIApmdW49bWVhbiwgdHlwZT0iYiIpCmdncGxvdChjYW5jZXIsIGFlcygobG9nMTAoY2FuY2VyJGRlYXRoKSksY2FuY2VyJHRyZWF0bWVudCkpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMSkgCiAKYGBgCjQpIFNvIHVsdGltYXRlbHkgd2hhdCBteSBkYXRhIGlzIHRlbGxpbmcgbWUgaXMgdGhhdCB0aGVyZSdzIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZHJ1Z3MgYW5kIHRoZSBwbGFjZWJvLCBzbyBlZmZlY3RpdmVseSBpdCBkb2Vzbid0IHNlZW0gbGlrZSB0aGUgZHJ1Z3MgYXJlIGhhdmluZyBhbnkgZWZmZWN0IG9uIHRoZSBhbW91bnQgdGhhdCBwYXRpZW50cyBhcmUgZHlpbmcgaW4gdGhlc2UgdHJpYWxzLiBOb3cgSSBoYXZlIHRvIHNheSB0aGF0IEknbSBzb21ld2hhdCBzb2xkIG9uIHRoaXMgZGF0YSBiZWNhdXNlIG15IGxldmVuZXMgdGVzdCBpcyBkZWZpbml0ZWx5IHNhdGlzZmllZCwgbXkgc2hhcGlybyB0ZXN0IGlzIGFsbW9zdCBzYXRpc2ZpZWQsIGFuZCB3aGVuIEkgbG9va2VkIGF0IHRoZSBoaXN0b2dyYW0gZm9yIG15IGxvZyB0cmFuc2Zvcm1lZCBkYXRhIGl0IGxvb2tlZCByZWxhdGl2ZWx5IG5vcm1hbCAoYmVsbCBzaGFwZWQpLSBub3QgcGVyZmVjdCBidXQgcmVhc29uYWJsZSBlbm91Z2ggdGhhdCBJIHdvdWxkbid0IGV4cGVjdCBpdCB0byBibG93IG15IEFOT1ZBJ3MgYWJpbGl0eSB0byBwZXJmb3JtIG91dCBvZiB0aGUgd2F0ZXIuIFdoZW4geW91IGxvb2sgYXQgdGhlIG1vZGVsIHN1bW1hcmllcyBmb3IgbXkgTE0gYW5kIG15IEFOT1ZBIHRoZXkgYm90aCBzaG93IHRoZXJlJ3Mgbm8gc2lnbmlmaWNhbmNlIGJldHdlZW4gdGhlIGRhdGFzZXRzIChBTk9WQSB3LyBUdWtleSkuIFRoaXMgaXMgZnVydGhlciBiYWNrZWQgdXAgd2l0aCB0aGUgYm94cGxvdCBJIG1hZGUgb2YgdGhlIGRhdGEgYmVjYXVzZSB0aGVyZSdzIEhVR0Ugb3ZlcmxhcCBiZXR3ZWVuIHRoZSBib3hwbG90J3MgZXJyb3IgYmFycyB0ZWxsaW5nIG1lIHRoYXQgdGhlcmUncyBxdWl0ZSBhIGJpdCBvZiB2YXJpYXRpb24gYW1vbmdzdCB0aGUgZGlmZmVyZW50IGRydWcgdHJpYWxzLiBJIHRoZW4gZGlkIGEgaW50ZXJhY3Rpb24gcGxvdCBvZiB0aGUgVHVrZXkgcG9zdGhvYyBhbmQgeW91IGNhbiBjbGVhcmx5IHNlZSB0aGF0IHRoZXJlJ3Mgd2F5IHRvbyBtdWNoIG92ZXJsYXAgd2l0aGluIHRoZSBkYXRhc2V0cyBmb3IgYW55IG9mIHRoZSBtb2RlbHMgd2UgY3JlYXRlZCB0byBiZSBhYmxlIHRvIHNlZSBhbnkgZGlmZmVyZW5jZSBhcyBzaWduaWZpY2FudC4gVGhpcyBhc3N1bXB0aW9uIGlzIGFsc28gYmFja2VkIHVwIGJ5IHRoZSBBSUMgSSByYW4sIHdoaWNoIHBpY2tlZCB0aGUgbnVsbCBtb2RlbHMgcmF0aGVyIHRoYW4gdGhlIGxtIG9yIEFOT1ZBIG1vZGVscyBJIGNyZWF0ZWQsIGJhc2ljYWxseSB0aGF0IG1lYW5zIHRoZSBtb2RlbHMgSSBjcmVhdGVkIHJlYWxseSBkaWRuJ3QgZXhwbGFpbiBtdWNoIG9mIHRoZSB2YXJpYXRpb24gYW5kIHdlcmUgcXVpdGUgYXdmdWwuIFRoZSBsYXN0IHBpZWNlIG9mIGV2aWRlbmNlIHRoYXQgSSBoYXZlIHRoYXQgc3VwcG9ydHMgbXkgaWRlYXMgaXMgdGhlIGdncGxvdCB0aGF0IEkgY3JlYXRlZCB0byBzZWUgdGhlIHZhcmlhdGlvbiBhbW9uZyB0aGUgZGlmZmVyZW50IHRyaWFscyBwZXIgZHJ1ZywgYW5kIGJhc2ljYWxseSBpdCBzYXlzIHRoZSBzYW1lIHN0b3J5IGFzIHRoZSBib3hwbG90IGFuZCB0aGUgVHVrZXkgcG9zdGhvYyBwbG90LSB0aGVyZSdzIHRvbyBtdWNoIG92ZXJsYXAgYmV0d2VlbiB0aGUgZGF0YXNldHMgZm9yIHRoZSBkcnVncyB0byBiZSBzaWduaWZpY2FudGx5IGFmZmVjdGluZyB0aGUgdHJpYWxzL2Ftb3VudCBvZiBkZWF0aHMuIEkgZG8gd2FubmEgc2F5IHRoYXQgdGhlcmUgc2VlbXMgdG8gYmUgYW4gb2JzZXJ2YWJsZSB0cmVuZCBpZiB5b3UncmUganVzdCBsb29raW5nIGF0IHRoZSBkYXRhIGFuZCBJIGZlZWwgdGhhdCBpZiB0aGVyZSBoYWQgbW9yZSB0aGFuIDEyMCBpbmRpdmlkdWFscyBpbiB0aGUgZHJ1ZyB0cmlhbCBpdCB3b3VsZCBiZSBhIGxvdCBtb3JlIGxpa2VseSB0aGF0IHRoZXJlIHdvdWxkJ3ZlIGJlZW4gYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlLiAKCgo=