Conceptual points








Exercises in R

setwd('/Users/davidhamad/Documents/Cand.Scient.Pol/2. Semester/Statistical models beyond linear regression - applied statistics for political scientists/3) Linear regression')

load("MEP2014.rda")

df <- MEP2014

mod2 <- lm(LocalAssistants ~ OpenList + LaborCost, df)

mod2.party <- lm(LocalAssistants ~ OpenList + LaborCost + SeatsNatPal.prop, df)

stargazer(mod2, mod2.party, type = "text")

===================================================================
                                  Dependent variable:              
                    -----------------------------------------------
                                    LocalAssistants                
                              (1)                     (2)          
-------------------------------------------------------------------
OpenList                   0.829***                0.937***        
                            (0.228)                 (0.227)        
                                                                   
LaborCost                  -0.070***               -0.068***       
                            (0.010)                 (0.010)        
                                                                   
SeatsNatPal.prop                                    -0.184         
                                                    (0.625)        
                                                                   
Constant                   4.127***                4.057***        
                            (0.286)                 (0.352)        
                                                                   
-------------------------------------------------------------------
Observations                  739                     722          
R2                           0.081                   0.085         
Adjusted R2                  0.079                   0.081         
Residual Std. Error    3.083 (df = 736)        3.009 (df = 718)    
F Statistic         32.612*** (df = 2; 736) 22.200*** (df = 3; 718)
===================================================================
Note:                                   *p<0.1; **p<0.05; ***p<0.01


summary(df$SeatsNatPal.prop)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
0.00000 0.08769 0.29738 0.26110 0.40426 0.66834      17 
eff <- ggpredict(mod2.party, terms = "SeatsNatPal.prop [0.09, 0.40]")

eff_full <- ggpredict(mod2.party, terms = "SeatsNatPal.prop")
eff_full %>%
  plot +
  ylab("Predicted local staff size") +
  xlab("Party size in national parliament (proportion)") +
  ggtitle("Effect of national party size on MEP local staff",
          subtitle = "Controlling for OpenList and LaborCost")


Fundamental variation

mod1 <- lm(LocalAssistants ~ OpenList, df)
mod2 <- lm(LocalAssistants ~ OpenList + LaborCost, df)

df$resid_mod1 <- residuals(mod1)
df$resid_mod2 <- residuals(mod2)

ggplot(data.frame(r = residuals(mod1)), aes(r)) +
  geom_histogram(bins = 30) +
  ggtitle("Residuals: Model 1 (OpenList only)")


ggplot(data.frame(r = residuals(mod2)), aes(r)) +
  geom_histogram(bins = 30) +
  ggtitle("Residuals: Model 2 (OpenList + LaborCost)")


mean(residuals(mod1))
[1] 4.254603e-16
sd(residuals(mod1))
[1] 3.176834
mean(residuals(mod2))
[1] 5.910172e-16
sd(residuals(mod2))    
[1] 3.078466


vcov(mod2)
             (Intercept)      OpenList     LaborCost
(Intercept)  0.081867230 -0.0284615942 -0.0024363118
OpenList    -0.028461594  0.0519105737  0.0001759822
LaborCost   -0.002436312  0.0001759822  0.0001031140

sqrt(diag(vcov(mod2)))
(Intercept)    OpenList   LaborCost 
 0.28612450  0.22783892  0.01015451 

cov2cor(vcov(mod2))
            (Intercept)    OpenList   LaborCost
(Intercept)   1.0000000 -0.43659249 -0.83853084
OpenList     -0.4365925  1.00000000  0.07606449
LaborCost    -0.8385308  0.07606449  1.00000000

LS0tCnRpdGxlOiAiUHJvYmxlbSBzZXQiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHs9aHRtbH0KPHN0eWxlPgpib2R5IHsKICB0ZXh0LWFsaWduOiBqdXN0aWZ5OwogIGZvbnQtc2l6ZTogMTRweDsKICBsaW5lLWhlaWdodDogMS42OwogIG1heC13aWR0aDogODAwcHg7CiAgbWFyZ2luOiBhdXRvOwp9CgpoMS50aXRsZSB7CiAgZm9udC1zaXplOiAyOHB4OwogIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjMzMzOwogIHBhZGRpbmctYm90dG9tOiAxMHB4OwogIG1hcmdpbi1ib3R0b206IDMwcHg7Cn0KCmgxIHsKICBmb250LXNpemU6IDIycHg7CiAgbWFyZ2luLXRvcDogNDBweDsKICBjb2xvcjogIzJjM2U1MDsKfQoKbGkgewogIG1hcmdpbi1ib3R0b206IDEwcHg7Cn0KPC9zdHlsZT4KYGBgCgojIENvbmNlcHR1YWwgcG9pbnRzCgotICAgKipRMToqKiBDYW4geW91IGV4cHJlc3MgaW4gbGF5bWFu4oCZcyB0ZXJtcyB3aGF0IGEg4oCcc3RhbmRhcmQgZGV2aWF0aW9u4oCdIG9mIGEgdmFyaWFibGUgaXM/Ci0gICAqKkExOioqIEEgc3RhbmRhcmQgZGV2aWF0aW9uIHRlbGxzIHlvdSBob3cgc3ByZWFkIG91dCB0aGUgdmFsdWVzIG9mIGEgdmFyaWFibGUgYXJlIGFyb3VuZCB0aGUgYXZlcmFnZS4gSWYgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBpcyBzbWFsbCwgbW9zdCB2YWx1ZXMgYXJlIGNsb3NlIHRvIHRoZSBhdmVyYWdlLiBJZiBpdCdzIGxhcmdlLCB2YWx1ZXMgYXJlIHNjYXR0ZXJlZCBmYXIgZnJvbSB0aGUgYXZlcmFnZS4gVGhpbmsgb2YgaXQgbGlrZSB0aGlzOiBpZiB0aGUgYXZlcmFnZSBpbmNvbWUgaXMgXCQ1MCwwMDAsIGEgc21hbGwgc3RhbmRhcmQgZGV2aWF0aW9uIG1lYW5zIG1vc3QgcGVvcGxlIGVhcm4gY2xvc2UgdG8gXCQ1MCwwMDAsIHdoaWxlIGEgbGFyZ2Ugb25lIG1lYW5zIHNvbWUgZWFybiBcJDIwLDAwMCBhbmQgb3RoZXJzIFwkODAsMDAwLiBJdCdzIGJhc2ljYWxseSBhIG1lYXN1cmUgb2YgImhvdyBtdWNoIGRvIHZhbHVlcyB0eXBpY2FsbHkgZGlmZmVyIGZyb20gdGhlIG1lYW4/IgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotICAgKipRMjoqKiBXaGF0IGFyZSB0aGUg4oCccmVzaWR1YWxz4oCdIG9mIHRoZSByZWdyZXNzaW9uPyBIb3cgYXJlIHRoZXkgY2FsY3VsYXRlZD8KLSAgICoqQTI6KiogUmVzaWR1YWxzIGFyZSB0aGUgbWlzdGFrZXMgeW91ciBtb2RlbCBtYWtlcyDigJMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB3aGF0IGFjdHVhbGx5IGhhcHBlbmVkICh0aGUgb2JzZXJ2ZWQgWSkgYW5kIHdoYXQgeW91ciBtb2RlbCBwcmVkaWN0ZWQgd291bGQgaGFwcGVuICh0aGUgZXN0aW1hdGVkIFkpLiBUaGV5IGFyZSBjYWxjdWxhdGVkIGFzOiBSZXNpZHVhbCA9IE9ic2VydmVkIFkg4oCTIFByZWRpY3RlZCBZLiBJZiBzb21lb25lIGFjdHVhbGx5IGVhcm5zIFwkNjAsMDAwIGJ1dCB5b3VyIG1vZGVsIHByZWRpY3RlZCBcJDU1LDAwMCwgdGhlIHJlc2lkdWFsIGlzIFwkNSwwMDAuIFJlc2lkdWFscyByZXByZXNlbnQgdGhlICJmdW5kYW1lbnRhbCB1bmNlcnRhaW50eSIgS2luZyBldCBhbC4gZGlzY3VzcyDigJMgYWxsIHRoZSByYW5kb20gc3R1ZmYgKHdlYXRoZXIsIGlsbG5lc3MsIGx1Y2spIHRoYXQgYWZmZWN0cyBZIGJ1dCBpc24ndCBjYXB0dXJlZCBieSB5b3VyIGV4cGxhbmF0b3J5IHZhcmlhYmxlcyBYLiBJbiB0aGVpciBmcmFtZXdvcmssIHRoaXMgaXMgdGhlIHN0b2NoYXN0aWMgY29tcG9uZW50IGYozrgsIM6xKSBmcm9tIEVxdWF0aW9uIDEuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0gICAqKlEzOioqIFdoYXQgaXMgYSB2YXJpYW5jZS1jb3ZhcmlhbmNlIG1hdHJpeD8KLSAgICoqQTM6KiogQSB2YXJpYW5jZS1jb3ZhcmlhbmNlIG1hdHJpeCBpcyBhIHRhYmxlIHRoYXQgc3VtbWFyaXplcyB0d28gdGhpbmdzIGFib3V0IHlvdXIgcGFyYW1ldGVyIGVzdGltYXRlcy4gVGhlIGRpYWdvbmFsIGNvbnRhaW5zIHRoZSB2YXJpYW5jZXMgb2YgZWFjaCBwYXJhbWV0ZXIuIFZhcmlhbmNlIG1lYXN1cmVzIGhvdyBzcHJlYWQgb3V0IGFuIGVzdGltYXRlIGlzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGVzdGltYXRlIGEgY29lZmZpY2llbnQgdG8gYmUgNSB3aXRoIGEgdmFyaWFuY2Ugb2YgNCAoc3RhbmRhcmQgZGV2aWF0aW9uID0gMiksIHRoZSB0cnVlIHZhbHVlIHByb2JhYmx5IGxpZXMgc29tZXdoZXJlIGFyb3VuZCA1IMKxIDIsIHJvdWdobHkgYmV0d2VlbiAzIGFuZCA3LiBUaGUgbGFyZ2VyIHRoZSB2YXJpYW5jZSwgdGhlIG1vcmUgdW5jZXJ0YWluIHlvdSBhcmUgYWJvdXQgdGhhdCBlc3RpbWF0ZS4gVGhlIG9mZi1kaWFnb25hbCBlbGVtZW50cyBjb250YWluIHRoZSBjb3ZhcmlhbmNlcywgd2hpY2ggdGVsbCB5b3UgaG93IHR3byBlc3RpbWF0ZXMgbW92ZSB0b2dldGhlci4gSW1hZ2luZSB5b3UgZXN0aW1hdGUgdHdvIGNvZWZmaWNpZW50czogYuKCgSAoZWZmZWN0IG9mIGVkdWNhdGlvbikgYW5kIGLigoIgKGVmZmVjdCBvZiBleHBlcmllbmNlKS4gSWYgdGhlaXIgY292YXJpYW5jZSBpcyBuZWdhdGl2ZSwgaXQgbWVhbnM6IHdoZW4geW91ciBtb2RlbCBvdmVyZXN0aW1hdGVzIHRoZSBlZmZlY3Qgb2YgZWR1Y2F0aW9uLCBpdCB0eXBpY2FsbHkgdW5kZXJlc3RpbWF0ZXMgdGhlIGVmZmVjdCBvZiBleHBlcmllbmNlIOKAkyB0aGV5IGNvbXBlbnNhdGUgZm9yIGVhY2ggb3RoZXIuIElmIHRoZSBjb3ZhcmlhbmNlIGlzIHBvc2l0aXZlLCB0aGV5IG1vdmUgaW4gdGhlIHNhbWUgZGlyZWN0aW9uLiBJZiBpdCdzIHplcm8sIHRoZXkgYXJlIGluZGVwZW5kZW50LiBUaGlzIG1hdHRlcnMgYmVjYXVzZSB3aGVuIHlvdSBzaW11bGF0ZSBwYXJhbWV0ZXJzIChhcyBLaW5nIGV0IGFsLiByZWNvbW1lbmQpLCB5b3UgbmVlZCB0byBkcmF3IHZhbHVlcyB0aGF0IHJlc3BlY3QgdGhlc2UgY29ubmVjdGlvbnMuIElmIHlvdSBpZ25vcmUgdGhlIGNvdmFyaWFuY2VzIGFuZCBzaW11bGF0ZSBlYWNoIHBhcmFtZXRlciBpbmRlcGVuZGVudGx5LCB5b3UgZ2V0IHVucmVhbGlzdGljIGNvbWJpbmF0aW9ucyBhbmQgeW91ciB1bmNlcnRhaW50eSBlc3RpbWF0ZXMgd2lsbCBiZSB3cm9uZy4gU3RhbmRhcmQgZXJyb3JzIGFsb25lIG9ubHkgdGVsbCB5b3UgYWJvdXQgZWFjaCBwYXJhbWV0ZXIgaW5kaXZpZHVhbGx5LCBidXQgdGhlIGNvdmFyaWFuY2UgbWF0cml4IGdpdmVzIHlvdSB0aGUgY29tcGxldGUgbWFwIG9mIGhvdyB5b3VyIHVuY2VydGFpbnRpZXMgYXJlIGNvbm5lY3RlZC4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSAgICoqUTQ6Kio6IFdoYXQgaXMgdGhlIHJvbGUgb2YgdGhlIHZhcmlhbmNlLWNvdmFyaWFuY2UgbWF0cml4IGluIHRoZSBLaW5nIGV0IGFsLiBhcnRpY2xlPwotICAgKipBNCoqOiBJbiBLaW5nIGV0IGFsLiwgdGhlIHZhcmlhbmNlLWNvdmFyaWFuY2UgbWF0cml4IGlzIHRoZSBlbmdpbmUgb2YgdGhlaXIgZW50aXJlIHNpbXVsYXRpb24gYXBwcm9hY2guIFRoZWlyIG1ldGhvZCB3b3JrcyBpbiB0aHJlZSBzdGVwczogZmlyc3QsIGVzdGltYXRlIHRoZSBtb2RlbCBhbmQgcmVjb3JkIHRoZSBwb2ludCBlc3RpbWF0ZXMgKM6zzIIpIGFuZCB0aGUgdmFyaWFuY2UtY292YXJpYW5jZSBtYXRyaXggVijOs8yCKS4gVGhlbiwgZHJhdyBzaW11bGF0ZWQgcGFyYW1ldGVyIHZhbHVlcyBmcm9tIGEgbXVsdGl2YXJpYXRlIG5vcm1hbCBkaXN0cmlidXRpb24gdXNpbmcgdGhvc2UgdHdvIHBpZWNlcyBvZiBpbmZvcm1hdGlvbi4gVGhlIHZhcmlhbmNlLWNvdmFyaWFuY2UgbWF0cml4IGRldGVybWluZXMgaG93IHNwcmVhZCBvdXQgYW5kIGNvcnJlbGF0ZWQgdGhlc2Ugc2ltdWxhdGVkIGRyYXdzIGFyZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSAgICoqUTUqKjogQ2FuIHlvdSBleHBsYWluIHdoYXQgdGhlIGNvdmFyaWFuY2UgbWF0cml4IGlzIGdvb2QgZm9yIGluIHRoaXMgZXhhbXBsZT8KLSAgICoqQTUqKjogSW4gcHJhY3RpY2FsIHRlcm1zLCB0aGUgY292YXJpYW5jZSBtYXRyaXggYWxsb3dzIHJlc2VhcmNoZXJzIHRvIGRvIHNvbWV0aGluZyBwb3dlcmZ1bDogdHJhbnNsYXRlIHJhdyByZWdyZXNzaW9uIG91dHB1dCBpbnRvIHF1YW50aXRpZXMgdGhhdCBhbnlvbmUgY2FuIHVuZGVyc3RhbmQsIHdoaWxlIHByb3Blcmx5IGFjY291bnRpbmcgZm9yIHVuY2VydGFpbnR5LiBGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZiBzYXlpbmcgInRoZSBjb2VmZmljaWVudCBvbiBlZHVjYXRpb24gaXMgMC4zIHdpdGggYSBzdGFuZGFyZCBlcnJvciBvZiAwLjEsIiB5b3UgY2FuIHNheSAiYW4gZXh0cmEgeWVhciBvZiBlZHVjYXRpb24gaW5jcmVhc2VzIHlvdXIgaW5jb21lIGJ5IFwkMSw1MDAgb24gYXZlcmFnZSwgcGx1cyBvciBtaW51cyBhYm91dCBcJDUwMC4iIFRoZSBjb3ZhcmlhbmNlIG1hdHJpeCBtYWtlcyB0aGlzIHBvc3NpYmxlIGJlY2F1c2Ugd2hlbiB5b3UgY2FsY3VsYXRlIHF1YW50aXRpZXMgbGlrZSBwcmVkaWN0ZWQgdmFsdWVzIG9yIGZpcnN0IGRpZmZlcmVuY2VzLCB0aGUgdW5jZXJ0YWludHkgaW4gdGhvc2UgcXVhbnRpdGllcyBkZXBlbmRzIG9uIHRoZSB1bmNlcnRhaW50eSBpbiBhbGwgdGhlIHBhcmFtZXRlcnMgdG9nZXRoZXIg4oCTIG5vdCBqdXN0IG9uZSBhdCBhIHRpbWUuIFRoZSBjb3ZhcmlhbmNlIG1hdHJpeCBjYXB0dXJlcyB0aG9zZSBjb25uZWN0aW9ucy4gV2l0aG91dCBpdCwgeW91IHdvdWxkIGVpdGhlciBpZ25vcmUgdW5jZXJ0YWludHkgZW50aXJlbHkgKGp1c3QgcGx1Z2dpbmcgaW4gcG9pbnQgZXN0aW1hdGVzKSBvciB1bmRlcmVzdGltYXRlL292ZXJlc3RpbWF0ZSBpdCAoYnkgdHJlYXRpbmcgcGFyYW1ldGVycyBhcyBpbmRlcGVuZGVudCB3aGVuIHRoZXkncmUgbm90KS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSAgICoqUTY6KiogV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGZ1bmRhbWVudGFsIGFuZCBlc3RpbWF0aW9uIHVuY2VydGFpbnR5PwotICAgKipBNjoqKiBFc3RpbWF0aW9uIHVuY2VydGFpbnR5IGNvbWVzIGZyb20gbm90IGhhdmluZyBpbmZpbml0ZSBkYXRhLiBXZSBlc3RpbWF0ZSDOsiBhbmQgzrEgZnJvbSBhIHNhbXBsZSwgc28gb3VyIGVzdGltYXRlcyBhcmUgaW1wZXJmZWN0LiBJZiB3ZSBoYWQgbW9yZSBvYnNlcnZhdGlvbnMsIG91ciBlc3RpbWF0ZXMgd291bGQgYmUgbW9yZSBwcmVjaXNlLiBUaGlzIHR5cGUgb2YgdW5jZXJ0YWludHkgY2FuIGJlIHJlZHVjZWQgYnkgY29sbGVjdGluZyBtb3JlIGRhdGEuIEZ1bmRhbWVudGFsIHVuY2VydGFpbnR5IGNvbWVzIGZyb20gdGhlIHJhbmRvbW5lc3Mgb2YgdGhlIHdvcmxkIGl0c2VsZi4gRXZlbiBpZiB5b3Uga25ldyB0aGUgZXhhY3QgcGFyYW1ldGVyIHZhbHVlcyAoZWxpbWluYXRpbmcgYWxsIGVzdGltYXRpb24gdW5jZXJ0YWludHkpLCB5b3Ugc3RpbGwgY291bGRuJ3QgcHJlZGljdCBZIHBlcmZlY3RseSBiZWNhdXNlIGNvdW50bGVzcyByYW5kb20gZmFjdG9ycyAod2VhdGhlciwgaWxsbmVzcywgbW9vZCwgbHVjaykgaW5mbHVlbmNlIFkgYnV0IGFyZW4ndCBpbiB5b3VyIG1vZGVsLiBUaGlzIGlzIHRoZSBzdG9jaGFzdGljIGNvbXBvbmVudCDigJMgdGhlIHJhbmRvbW5lc3MgYnVpbHQgaW50byB0aGUgcmVhbCB3b3JsZC4gVGhpcyB1bmNlcnRhaW50eSBjYW5ub3QgYmUgcmVkdWNlZCBieSBjb2xsZWN0aW5nIG1vcmUgZGF0YTsgaXQncyBpbmhlcmVudCB0byB0aGUgcGhlbm9tZW5vbi4gQXMgS2luZyBldCBhbC4gcHV0IGl0OiBlc3RpbWF0aW9uIHVuY2VydGFpbnR5IGlzIGFib3V0IG5vdCBrbm93aW5nIHRoZSBwYXJhbWV0ZXJzIHBlcmZlY3RseSwgd2hpbGUgZnVuZGFtZW50YWwgdW5jZXJ0YWludHkgaXMgYWJvdXQgdGhlIHdvcmxkIGJlaW5nIGluaGVyZW50bHkgdW5wcmVkaWN0YWJsZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSAgICoqUTc6KiogV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGV4cGVjdGVkIGFuZCBwcmVkaWN0ZWQgdmFsdWVzIG9mIFksIGFuZCBob3cgZG9lcyB0aGlzIHJlbGF0ZSB0byBmdW5kYW1lbnRhbCB2cy4gZXN0aW1hdGlvbiB1bmNlcnRhaW50eT8gV2hlbiBhbSBJIGludGVyZXN0ZWQgaW4gb25lIHJhdGhlciB0aGFuIHRoZSBvdGhlcj8KLSAgICoqQTc6KiogRXhwZWN0ZWQgdmFsdWVzIChFKFkpKSBnaXZlIHlvdSB0aGUgYXZlcmFnZSBvdXRjb21lIGZvciBhIGdpdmVuIHNldCBvZiBYIHZhbHVlcy4gVGhleSBvbmx5IGNvbnRhaW4gZXN0aW1hdGlvbiB1bmNlcnRhaW50eSDigJMgdGhlIHZhcmlhYmlsaXR5IGNvbWVzIHNvbGVseSBmcm9tIG5vdCBrbm93aW5nIHRoZSBwYXJhbWV0ZXJzIHBlcmZlY3RseS4gRnVuZGFtZW50YWwgdW5jZXJ0YWludHkgaXMgYXZlcmFnZWQgYXdheS4gUHJlZGljdGVkIHZhbHVlcyAoxbYpIGdpdmUgeW91IGEgc3BlY2lmaWMgb3V0Y29tZSBmb3IgYSBnaXZlbiBzZXQgb2YgWCB2YWx1ZXMuIFRoZXkgY29udGFpbiBib3RoIGVzdGltYXRpb24gdW5jZXJ0YWludHkgQU5EIGZ1bmRhbWVudGFsIHVuY2VydGFpbnR5LiBTbyBwcmVkaWN0ZWQgdmFsdWVzIGhhdmUgYSB3aWRlciBjb25maWRlbmNlIGludGVydmFsIHRoYW4gZXhwZWN0ZWQgdmFsdWVzLCBldmVuIHRob3VnaCB0aGVpciBhdmVyYWdlIGlzIHJvdWdobHkgdGhlIHNhbWUuIFdoZW4gdG8gdXNlIHdoaWNoOiBVc2UgZXhwZWN0ZWQgdmFsdWVzIHdoZW4geW91IGNhcmUgYWJvdXQgdGhlIGF2ZXJhZ2UgZWZmZWN0IG9mIGEgdmFyaWFibGUg4oCTIGZvciBleGFtcGxlOiAib24gYXZlcmFnZSwgaG93IG1hbnkgbW9yZSBhc3Npc3RhbnRzIGRvZXMgYSBjYW5kaWRhdGUtY2VudGVyZWQgTUVQIGhhdmUgY29tcGFyZWQgdG8gYSBwYXJ0eS1jZW50ZXJlZCBvbmU/IiBZb3Ugd2FudCB0byBoaWdobGlnaHQgdGhlIHN5c3RlbWF0aWMgcGF0dGVybiwgbm90IHJhbmRvbSBub2lzZS4gVXNlIHByZWRpY3RlZCB2YWx1ZXMgd2hlbiB5b3UgY2FyZSBhYm91dCBhIHNwZWNpZmljIGNhc2Ug4oCTIGZvciBleGFtcGxlOiAiaG93IG1hbnkgYXNzaXN0YW50cyB3aWxsIHRoaXMgcGFydGljdWxhciBNRVAgYWN0dWFsbHkgaGF2ZT8iIEhlcmUgeW91IG5lZWQgdG8gYWNjb3VudCBmb3IgYWxsIHRoZSByYW5kb20gZmFjdG9ycyB0aGF0IGNvdWxkIHB1c2ggdGhlIGFjdHVhbCBvdXRjb21lIGF3YXkgZnJvbSB0aGUgYXZlcmFnZS4gRWxlY3Rpb24gZm9yZWNhc3RpbmcgaXMgYW5vdGhlciBleGFtcGxlIOKAkyB5b3UgZG9uJ3QganVzdCB3YW50IHRoZSBleHBlY3RlZCB3aW5uZXIsIHlvdSB3YW50IHRvIGtub3cgaG93IGxpa2VseSBhbiB1cHNldCBpcy4gVGhlIGtleSBpbnR1aXRpb246IGV4cGVjdGVkIHZhbHVlcyB0ZWxsIHlvdSBhYm91dCB0aGUgc2lnbmFsLCBwcmVkaWN0ZWQgdmFsdWVzIHRlbGwgeW91IGFib3V0IHRoZSBzaWduYWwgcGx1cyBub2lzZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBFeGVyY2lzZXMgaW4gUgoKLSAgICoqUTE6KiogQ2FuIHlvdSByZS1maXQgbW9kZWwgMiB3aXRoIGVhY2ggTUVQ4oCZcyBuYXRpb25hbCBwYXJ0eSBzaXplIGluIHRoZSBuYXRpb25hbCBwYXJsaWFtZW50IGFzIGEgcHJlZGljdG9yPwotICAgKipBMToqKiBBZGRpbmcgU2VhdHNOYXRQYWwucHJvcCAocGFydHkgc2l6ZSBpbiB0aGUgbmF0aW9uYWwgcGFybGlhbWVudCkgdG8gbW9kZWwgMiB5aWVsZHMgYSBjb2VmZmljaWVudCBvZiAtMC4xODQsIGJ1dCBpdCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCAocCA9IDAuNzY4KS4gVGhlIG90aGVyIGNvZWZmaWNpZW50cyByZW1haW4gbGFyZ2VseSB1bmNoYW5nZWQ6IE9wZW5MaXN0IGluY3JlYXNlcyBzbGlnaHRseSBmcm9tIDAuODI5IHRvIDAuOTM3LCBhbmQgTGFib3JDb3N0IHN0YXlzIGF0IGFib3V0IC0wLjA2OC4gVGhlIG1vZGVsJ3MgUsKyIGJhcmVseSBjaGFuZ2VzIChmcm9tIDAuMDgxIHRvIDAuMDg1KSwgc3VnZ2VzdGluZyB0aGF0IHBhcnR5IHNpemUgZG9lcyBub3QgbWVhbmluZ2Z1bGx5IGltcHJvdmUgdGhlIG1vZGVsLiBOb3RlIHRoYXQgMTcgb2JzZXJ2YXRpb25zIGFyZSBsb3N0IGR1ZSB0byBtaXNzaW5nIGRhdGEgb24gcGFydHkgc2l6ZSAoTiBkcm9wcyBmcm9tIDczOSB0byA3MjIpLgoKYGBge3J9CnNldHdkKCcvVXNlcnMvZGF2aWRoYW1hZC9Eb2N1bWVudHMvQ2FuZC5TY2llbnQuUG9sLzIuIFNlbWVzdGVyL1N0YXRpc3RpY2FsIG1vZGVscyBiZXlvbmQgbGluZWFyIHJlZ3Jlc3Npb24gLSBhcHBsaWVkIHN0YXRpc3RpY3MgZm9yIHBvbGl0aWNhbCBzY2llbnRpc3RzLzMpIExpbmVhciByZWdyZXNzaW9uJykKCmxvYWQoIk1FUDIwMTQucmRhIikKCmRmIDwtIE1FUDIwMTQKCm1vZDIgPC0gbG0oTG9jYWxBc3Npc3RhbnRzIH4gT3Blbkxpc3QgKyBMYWJvckNvc3QsIGRmKQoKbW9kMi5wYXJ0eSA8LSBsbShMb2NhbEFzc2lzdGFudHMgfiBPcGVuTGlzdCArIExhYm9yQ29zdCArIFNlYXRzTmF0UGFsLnByb3AsIGRmKQoKc3RhcmdhemVyKG1vZDIsIG1vZDIucGFydHksIHR5cGUgPSAidGV4dCIpCmBgYAoKLS0tCgotICoqUTI6KiogV2hhdCBpcyB0aGUgbWFyZ2luYWwgZWZmZWN0IG9mIHBhcnR5IHNpemUgb24gTUVQ4oCZcyBsb2NhbCBpbnZlc3RtZW50PwotICoqQTI6KiogVGhlIG1hcmdpbmFsIGVmZmVjdCBvZiBwYXJ0eSBzaXplIGlzIHRoZSBjb2VmZmljaWVudDogLTAuMTg0LiBUaGlzIG1lYW5zIHRoYXQgYSBvbmUtdW5pdCBpbmNyZWFzZSBpbiBwYXJ0eSBzaXplIChmcm9tIDAlIHRvIDEwMCUgb2YgbmF0aW9uYWwgcGFybGlhbWVudCBzZWF0cykgaXMgYXNzb2NpYXRlZCB3aXRoIDAuMTggZmV3ZXIgbG9jYWwgYXNzaXN0YW50cywgb24gYXZlcmFnZS4gSG93ZXZlciwgc2luY2UgdGhlIGVmZmVjdCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCwgd2UgY2Fubm90IGRpc3Rpbmd1aXNoIGl0IGZyb20gemVyby4gSW4gc3Vic3RhbnRpdmUgdGVybXMsIHBhcnR5IHNpemUgZG9lcyBub3QgYXBwZWFyIHRvIGFmZmVjdCBob3cgbWFueSBsb2NhbCBhc3Npc3RhbnRzIGFuIE1FUCBoaXJlcywgb25jZSB3ZSBjb250cm9sIGZvciB0aGUgZWxlY3RvcmFsIHN5c3RlbSBhbmQgbGFib3IgY29zdHMuCgotLS0KCi0gKipRMzoqKiBDcmVhdGUgdHdvIHNjZW5hcmlvcywganVzdGlmeSB5b3VyIGNob2ljZSBhbmQgY2FsY3VsYXRlIHRoZSBmaXJzdCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3by4KLSAqKkEzOioqIEkgY2hvc2UgdHdvIHNjZW5hcmlvcyBiYXNlZCBvbiB0aGUgcXVhcnRpbGVzIG9mIHRoZSBwYXJ0eSBzaXplIHZhcmlhYmxlIChRMSA9IDAuMDksIFEzID0gMC40MCksIHRvIGVuc3VyZSB0aGV5IHJlcHJlc2VudCByZWFsaXN0aWMgdmFsdWVzIGluIHRoZSBkYXRhLiBBbGwgb3RoZXIgdmFyaWFibGVzIGFyZSBoZWxkIGF0IHRoZWlyIG1lYW5zIChPcGVuTGlzdCA9IDAsIExhYm9yQ29zdCA9IDIyLjk2KS4gVGhlIHByZWRpY3RlZCBzdGFmZiBzaXplIGZvciBhIHNtYWxsIHBhcnR5IGlzIDIuNDcgKDk1JSBDSTogMi4wOeKAkzIuODUpIGFuZCBmb3IgYSBsYXJnZSBwYXJ0eSBpcyAyLjQxICg5NSUgQ0k6IDIuMDjigJMyLjc1KS4gVGhlIGZpcnN0IGRpZmZlcmVuY2UgaXMgLTAuMDYsIG1lYW5pbmcgdGhhdCBtb3ZpbmcgZnJvbSBhIHNtYWxsIHRvIGEgbGFyZ2UgbmF0aW9uYWwgcGFydHkgaXMgYXNzb2NpYXRlZCB3aXRoIGVzc2VudGlhbGx5IG5vIGNoYW5nZSBpbiBsb2NhbCBzdGFmZiBzaXplLiBUaGUgY29uZmlkZW5jZSBpbnRlcnZhbHMgb3ZlcmxhcCBhbG1vc3QgZW50aXJlbHksIGNvbmZpcm1pbmcgdGhhdCB0aGUgZGlmZmVyZW5jZSBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4KCgpgYGB7cn0Kc3VtbWFyeShkZiRTZWF0c05hdFBhbC5wcm9wKQplZmYgPC0gZ2dwcmVkaWN0KG1vZDIucGFydHksIHRlcm1zID0gIlNlYXRzTmF0UGFsLnByb3AgWzAuMDksIDAuNDBdIikKYGBgCgotLS0KCi0gKipRNDoqKiBWaXN1YWxpemUgdGhlIGVmZmVjdCBvZiBwYXJ0eSBzaXplIG9uIE1FUOKAmXMgbG9jYWwgaW52ZXN0bWVudC4KLSAqKkE0OioqIFRoZSBwbG90IHNob3dzIGEgbmVhcmx5IGZsYXQgbGluZSB3aXRoIGEgd2lkZSBjb25maWRlbmNlIGludGVydmFsLCB2aXN1YWxseSBjb25maXJtaW5nIHRoYXQgcGFydHkgc2l6ZSBoYXMgbm8gbWVhbmluZ2Z1bCBlZmZlY3Qgb24gdGhlIG51bWJlciBvZiBsb2NhbCBhc3Npc3RhbnRzLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgbm9uLXNpZ25pZmljYW50IGNvZWZmaWNpZW50IGZyb20gdGhlIHJlZ3Jlc3Npb24uCgpgYGB7cn0KZWZmX2Z1bGwgPC0gZ2dwcmVkaWN0KG1vZDIucGFydHksIHRlcm1zID0gIlNlYXRzTmF0UGFsLnByb3AiKQplZmZfZnVsbCAlPiUKICBwbG90ICsKICB5bGFiKCJQcmVkaWN0ZWQgbG9jYWwgc3RhZmYgc2l6ZSIpICsKICB4bGFiKCJQYXJ0eSBzaXplIGluIG5hdGlvbmFsIHBhcmxpYW1lbnQgKHByb3BvcnRpb24pIikgKwogIGdndGl0bGUoIkVmZmVjdCBvZiBuYXRpb25hbCBwYXJ0eSBzaXplIG9uIE1FUCBsb2NhbCBzdGFmZiIsCiAgICAgICAgICBzdWJ0aXRsZSA9ICJDb250cm9sbGluZyBmb3IgT3Blbkxpc3QgYW5kIExhYm9yQ29zdCIpCmBgYAoKLS0tCgojIEZ1bmRhbWVudGFsIHZhcmlhdGlvbgoKLSAqKlExOioqIENhbiB5b3UgY2FsY3VsYXRlIHRoZSByZXNpZHVhbHMgZm9yIG1vZGVsIDEsIHRoZW4gbW9kZWwgMiBhbmQgc3RvcmUgdGhlbSBhcyBzZXBhcmF0ZSB2YXJpYWJsZXMgaW4gUj8KCmBgYHtyfQptb2QxIDwtIGxtKExvY2FsQXNzaXN0YW50cyB+IE9wZW5MaXN0LCBkZikKbW9kMiA8LSBsbShMb2NhbEFzc2lzdGFudHMgfiBPcGVuTGlzdCArIExhYm9yQ29zdCwgZGYpCgpkZiRyZXNpZF9tb2QxIDwtIHJlc2lkdWFscyhtb2QxKQpkZiRyZXNpZF9tb2QyIDwtIHJlc2lkdWFscyhtb2QyKQpgYGAKCi0tLQoKLSAqKlEyOioqIENhbiB5b3UgZGVzY3JpYmUgdGhlIHJlc2l0dWFscyBvZiB0aGUgdHdvIG1vZGVscyBpbiBhIGhpc3RvZ3JhbSwgdGhlbiBpbiBudW1iZXJzIGJ5IGNhbGN1bGF0aW5nIHRoZQptZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24/CgpgYGB7cn0KZ2dwbG90KGRhdGEuZnJhbWUociA9IHJlc2lkdWFscyhtb2QxKSksIGFlcyhyKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCkgKwogIGdndGl0bGUoIlJlc2lkdWFsczogTW9kZWwgMSAoT3Blbkxpc3Qgb25seSkiKQoKZ2dwbG90KGRhdGEuZnJhbWUociA9IHJlc2lkdWFscyhtb2QyKSksIGFlcyhyKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCkgKwogIGdndGl0bGUoIlJlc2lkdWFsczogTW9kZWwgMiAoT3Blbkxpc3QgKyBMYWJvckNvc3QpIikKCm1lYW4ocmVzaWR1YWxzKG1vZDEpKQpzZChyZXNpZHVhbHMobW9kMSkpCgptZWFuKHJlc2lkdWFscyhtb2QyKSkKc2QocmVzaWR1YWxzKG1vZDIpKSAgICAKYGBgCgotLS0KCi0gKipRMzoqKiBXaGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBzZXRzIG9mIHJlc2lkdWFscyBhbmQgd2h5PwotICoqQTM6KiogTW9kZWwgMidzIHJlc2lkdWFscyBoYXZlIGEgc21hbGxlciBzdGFuZGFyZCBkZXZpYXRpb24gKDMuMDggdnMgMy4xOCkgYmVjYXVzZSBhZGRpbmcgTGFib3JDb3N0IGFzIGEgcHJlZGljdG9yIGV4cGxhaW5zIG1vcmUgb2YgdGhlIHZhcmlhdGlvbiBpbiBMb2NhbEFzc2lzdGFudHMuIFRoZSBSwrIgaW5jcmVhc2VzIGZyb20gMC4wMjIgdG8gMC4wODEsIG1lYW5pbmcgTW9kZWwgMiBjYXB0dXJlcyBtb3JlIG9mIHRoZSBzeXN0ZW1hdGljIHBhdHRlcm4gaW4gdGhlIGRhdGEsIGxlYXZpbmcgbGVzcyB1bmV4cGxhaW5lZCB2YXJpYXRpb24gKGkuZS4gc21hbGxlciByZXNpZHVhbHMpLiBJbiBLaW5nIGV0IGFsLidzIHRlcm1zLCBhZGRpbmcgYSByZWxldmFudCBwcmVkaWN0b3IgcmVkdWNlcyB0aGUgZnVuZGFtZW50YWwgdW5jZXJ0YWludHkg4oCTIHRoZXJlIGlzIGxlc3MgImxlZnRvdmVyIiByYW5kb21uZXNzIHRoYXQgdGhlIG1vZGVsIGNhbm5vdCBhY2NvdW50IGZvci4KCi0tLQoKLSAqKlE0OioqIENhbiB5b3UgZXh0cmFjdCB0aGUgdmFyaWFuY2UtY292YXJpYW5jZSBtYXRyaXggZm9yIG1vZGVsIDI/CgpgYGB7cn0KdmNvdihtb2QyKQpgYGAKCi0tLQoKLSAqKlE1OioqIENhbiB5b3UgY2FsY3VsYXRlIHRoZSBzdGFuZGFyZCBlcnJvciBmb3IgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIChwYXJhbWV0ZXJzKSBmcm9tIHRoZSB2YXJpYW5jZS0KY292YXJpYW5jZSBtYXRyaXg/Ci0gKipBNToqKiBUaGUgc3RhbmRhcmQgZXJyb3JzIGFyZSB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIGRpYWdvbmFsIGVsZW1lbnRzOiBJbnRlcmNlcHQgPSAwLjI4NiwgT3Blbkxpc3QgPSAwLjIyOCwgTGFib3JDb3N0ID0gMC4wMTAuIFRoZXNlIG1hdGNoIGV4YWN0bHkgd2hhdCBzdW1tYXJ5KG1vZDIpIHJlcG9ydHMg4oCTIGJlY2F1c2UgdGhhdCdzIHdoZXJlIHN0YW5kYXJkIGVycm9ycyBjb21lIGZyb20uCgpgYGB7cn0Kc3FydChkaWFnKHZjb3YobW9kMikpKQpgYGAKCi0tLQoKLSAqKlE2OioqIEFyZSB0aGVyZSBhbnkgcHJlZGljdG9ycyB0aGF0IGNvcnJlbGF0ZSBtb3JlIHRoYW4gb3RoZXJzPwotICoqQTY6KiogVGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIEludGVyY2VwdCBhbmQgTGFib3JDb3N0IGVzdGltYXRlcyBpcyAtMC44NCwgd2hpY2ggaXMgdmVyeSBzdHJvbmcuIFRoaXMgbWVhbnM6IHdoZW4gdGhlIG1vZGVsIG92ZXJlc3RpbWF0ZXMgdGhlIGludGVyY2VwdCwgaXQgdGVuZHMgdG8gdW5kZXJlc3RpbWF0ZSB0aGUgZWZmZWN0IG9mIExhYm9yQ29zdCwgYW5kIHZpY2UgdmVyc2EuIFRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIEludGVyY2VwdCBhbmQgT3Blbkxpc3QgaXMgbW9kZXJhdGUgKC0wLjQ0KSwgd2hpbGUgT3Blbkxpc3QgYW5kIExhYm9yQ29zdCBhcmUgbmVhcmx5IGluZGVwZW5kZW50ICgwLjA4KS4KCgpgYGB7cn0KY292MmNvcih2Y292KG1vZDIpKQpgYGAKCi0tLQoKLSAqKlE3OioqIEhvdyBkb2VzIHRoaXMgcmVsYXRlIHRvIEtpbmcgZXQgYWzigJlzIGFyZ3VtZW50PwotICoqQTc6KiogS2luZyBldCBhbC4gYXJndWUgdGhhdCB5b3UgbmVlZCB0aGUgZnVsbCB2YXJpYW5jZS1jb3ZhcmlhbmNlIG1hdHJpeCDigJMgbm90IGp1c3QgaW5kaXZpZHVhbCBzdGFuZGFyZCBlcnJvcnMg4oCTIHRvIHByb3Blcmx5IGFjY291bnQgZm9yIHVuY2VydGFpbnR5LiBUaGlzIGV4YW1wbGUgc2hvd3Mgd2h5OiB0aGUgaW50ZXJjZXB0IGFuZCBMYWJvckNvc3QgYXJlIHN0cm9uZ2x5IGNvcnJlbGF0ZWQgKC0wLjg0KS4gSWYgeW91IHNpbXVsYXRlZCB0aGVzZSBwYXJhbWV0ZXJzIGluZGVwZW5kZW50bHkgKGlnbm9yaW5nIHRoYXQgY29ycmVsYXRpb24pLCB5b3Ugd291bGQgZ2V0IHVucmVhbGlzdGljIGNvbWJpbmF0aW9ucyB3aGVyZSBib3RoIGFyZSBvdmVyZXN0aW1hdGVkIHNpbXVsdGFuZW91c2x5LiBUaGUgY292YXJpYW5jZSBtYXRyaXggZW5zdXJlcyB0aGF0IHdoZW4geW91IHNpbXVsYXRlIHBhcmFtZXRlcnMgdG8gY2FsY3VsYXRlIHF1YW50aXRpZXMgbGlrZSBwcmVkaWN0ZWQgdmFsdWVzIG9yIGZpcnN0IGRpZmZlcmVuY2VzLCB0aGUgZHJhd3MgcmVzcGVjdCB0aGVzZSBjb25uZWN0aW9ucywgZ2l2aW5nIHlvdSBhY2N1cmF0ZSBjb25maWRlbmNlIGludGVydmFscy4gV2l0aG91dCBpdCwgeW91ciB1bmNlcnRhaW50eSBlc3RpbWF0ZXMgd291bGQgYmUgd3Jvbmcu