**General instructions**
The `.Rmd` source for this document will be the template for your homework submission. You must submit your completed assignment as a single html document saved as a PDF file, uploaded to eLC by **11:59p on October 23 ** using the filename `sectiontime_teamnumber_hw1.html` (e.g. `935_1_hw5.html`).
*Notes*:
+ Include the name of each teammate under `author` in the `yaml`.
+ For questions requiring analytical solutions, you can type them in using markdown math code. Or, you can submit handwritten solutions, embedding them in the knitted document as clearly readable images.
+ For questions requiring computation, some or all of the required code is included in associated chunks. Modify chunks where and how you are directed.
+ For (almost) all questions about R Markdown, consult [The Definitive Guide](https://bookdown.org/yihui/rmarkdown/).
+ The `setup` chunk above indicates the packages required for this assignment.
+ You will find a description of the variables in the referenced dataset through the Help tab in the Plot pane of RStudio.
- **Switch `eval` to `TRUE` in the global options command to execute code chunks**.
***
In this homework assignment, you will use data from Angrist and
Krueger 1991 to estimate the effects of years of schooling on labor
market outcomes. This paper uses an indicator for being born in the
first quarter of the year as an instrument for years of schooling since
students born in the first quarter of the year will have attended fewer
years of school when they hit the compulsory schooling age.
data <- read.csv("hw5_data.csv")
str(data)
'data.frame': 816435 obs. of 9 variables:
$ education : int 12 12 12 16 14 12 12 12 12 7 ...
$ log_wage : num 6.25 5.85 6.65 6.71 6.36 ...
$ married : int 1 1 1 1 1 1 1 1 1 0 ...
$ mid_atlantic : int 0 0 0 0 0 0 0 0 0 0 ...
$ mountain : int 0 0 0 0 0 0 0 0 0 0 ...
$ new_england : int 0 0 0 0 0 0 0 0 0 0 ...
$ quarter_of_birth: int 1 4 1 1 4 4 1 1 3 2 ...
$ year_of_birth : int 33 33 30 33 37 35 38 30 39 36 ...
$ first_quarter : int 1 0 1 1 0 0 1 1 0 0 ...
- First calculate the OLS estimate of the relationship between years
of schooling and log wages. Why might you not trust this estimate?
Discuss the potential sign of the bias using the OVB formula.
# insert command to run linear regression with robust standard errors here
# Estimate the OLS model
ols <- lm(log_wage ~ education, data = data)
# Display coefficients with robust SEs (HC1 = heteroskedasticity-consistent)
summary(lm_robust(log_wage ~ education, data = data, se_type = "HC1"))
Call:
lm_robust(formula = log_wage ~ education, data = data, se_type = "HC1")
Standard error type: HC1
Coefficients:
Estimate Std. Error t value Pr(>|t|) CI Lower CI Upper DF
(Intercept) 5.05223 0.0035331 1430.0 0 5.04531 5.05916 816433
education 0.05937 0.0002578 230.3 0 0.05887 0.05988 816433
Multiple R-squared: 0.07905 , Adjusted R-squared: 0.07905
F-statistic: 5.303e+04 on 1 and 816433 DF, p-value: < 2.2e-16
Answer
The OLS results show that each additional year of education raises
log wages by about 5.9%, indicating a strong positive relationship
between schooling and earnings. However, this estimate likely overstates
the true causal effect because education is correlated with unobserved
traits such as ability, ambition, or family background, which also
affect wages. According to the Omitted Variable Bias (OVB) formula, if
these omitted factors are positively related to both education and
wages, the estimated coefficient is biased upward—meaning the OLS
estimate captures not only the return to schooling but also the
influence of these unobserved characteristics.
- Now, you decide you use an instrumental variables approach and
instrument for education using quarter of birth. What assumptions do you
need for this to be a valid strategy?
Answer
For quarter of birth to be a valid instrument for education, two key
assumptions must hold: relevance and exogeneity. First, the relevance
assumption requires that quarter of birth be correlated with years of
schooling — meaning that a person’s birth quarter has a measurable
effect on how much education they complete. In this context, individuals
born early in the year typically start school at an older age and may
reach the compulsory schooling age with fewer completed years of
education, satisfying instrument relevance. Second, the exogeneity (or
exclusion restriction) assumption requires that quarter of birth affects
wages only through its impact on education, not through any other
channel. In other words, the quarter in which someone is born should
have no direct effect on their earnings or be correlated with unobserved
factors (like ability, family background, or health) that also influence
wages. If both assumptions hold, quarter of birth can serve as a valid
instrument, allowing us to isolate the causal effect of education on
wages.
- Write down and estimate the first stage equation. Report the main
coefficient estimate in a sentence. Store your predicted values.
# insert command to estimate the first stage regression here
first_stage <- lm(education ~ first_quarter, data = data)
educ_hat <- predict(first_stage)
summary(first_stage)
Call:
lm(formula = education ~ first_quarter, data = data)
Residuals:
Min 1Q Median 3Q
-13.273 -1.272 -1.173 2.728
Max
6.827
Coefficients:
Estimate Std. Error
(Intercept) 13.272459 0.003984
first_quarter -0.099587 0.008062
t value Pr(>|t|)
(Intercept) 3331.18 <2e-16 ***
first_quarter -12.35 <2e-16 ***
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05
‘.’ 0.1 ‘ ’ 1
Residual standard error: 3.13 on 816433 degrees of freedom
Multiple R-squared: 0.0001868, Adjusted R-squared: 0.0001856
F-statistic: 152.6 on 1 and 816433 DF, p-value: < 2.2e-16
Answer
The first stage equation is
\[
education_i = \alpha_0 + \alpha_1 \text{first\_quarter}_i + u_i
\]
The estimated coefficient on first_quarter is
–0.0996, meaning that individuals born in the first
quarter of the year complete about 0.10 fewer years of
education on average compared to those born in other quarters.
This negative and statistically significant relationship confirms that
quarter of birth is a relevant instrument for
education. The predicted values of education from this regression were
stored in the object educ_hat for use in the second-stage
analysis.
- Write down and estimate the reduced form equation. Report the main
coefficient estimate in a sentence.
reduced_form <- lm(log_wage ~ first_quarter, data = data)
summary(reduced_form)
Call:
lm(formula = log_wage ~ first_quarter, data = data)
Residuals:
Min 1Q Median 3Q
-8.1814 -0.2552 0.0824 0.3475
Max
5.3856
Coefficients:
Estimate Std. Error
(Intercept) 5.8396114 0.0008415
first_quarter -0.0032298 0.0017027
t value Pr(>|t|)
(Intercept) 6939.821 <2e-16 ***
first_quarter -1.897 0.0578 .
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05
‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.661 on 816433 degrees of freedom
Multiple R-squared: 4.407e-06, Adjusted R-squared: 3.182e-06
F-statistic: 3.598 on 1 and 816433 DF, p-value: 0.05785
- Using your answers in 3) and 4), report the Wald estimate of the
relationship between education and wages.
Answer
The reduced-form equation is:
\[
\log(wage)_i = \pi_0 + \pi_1 \text{first\_quarter}_i + v_i
\]
The estimated coefficient on first_quarter is
–0.00323, indicating that individuals born in the first
quarter of the year earn about 0.3% lower wages on
average compared to those born in other quarters. This relationship is
marginally significant (p ≈ 0.058), consistent with the
idea that being born earlier in the year slightly reduces schooling and,
consequently, earnings.
The negative sign aligns with the first-stage result—since those born
in the first quarter obtain less education on average, they also tend to
earn slightly less—supporting the logic behind the instrumental
variables approach.
- To estimate this using 2SLS, write down the second stage equation.
Estimate this using your predicted values from 3).
# insert command to estimate the second stage regression here
second_stage <- lm(___ ~ educ_hat)
Answer
- Now, use the ivreg command to direct estimate this effect. Compare
this estimate to your OLS estimate in 1).
iv = ivreg(_____~ _______ | _______ ,data = data)
summary(iv)
Answer
- Now, add control variables to your IV regression. How do these
change your results?
iv2 = ivreg(_____~ _______ | _______ ,data = data)
summary(iv2)
Answer
- The relationship between quarter of birth and years of schooling
should only hold for those who are affected by r compulsory school laws.
Estimate a regression that tests whether there is a relationship between
quarter of birth and years of schooling for those who have at least a
college education (16 years of schooling). What do you find?
data_16 = subset(data, education > 16)
# Insert regression here
Answer
- Someone now tells you that quarter of birth is related to parental
income. Does this change how you feel about your IV analysis?
Answer
LS0tCnRpdGxlOiB8CiAgICB8IEVDT04gNzcxMCAKICAgIHwgSG9tZXdvcmsgNTogSW5zdHJ1bWVudGFsIFZhcmlhYmxlcyAKI2F1dGhvcjoKIy0gIlRlYW0gbWVtYmVyIDEiCiMtICJUZWFtIG1lbWJlciAyIgojLSAiVGVhbSBtZW1iZXIgMyIKIy0gIlRlYW0gbWVtYmVyIDQiCm91dHB1dDoKIGh0bWxfbm90ZWJvb2sKdXJsY29sb3I6IGJsdWUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KCiMgQXR0YWNoIHBhY2thZ2VzCmxpYnJhcnkodGlkeXZlcnNlKSAgICAgCmxpYnJhcnkoZ2dwbG90MikgICAgICAgCmxpYnJhcnkobW9kZWxzdW1tYXJ5KSAgCmxpYnJhcnkodnRhYmxlKSAgICAgICAKbGlicmFyeShBRVIpIApsaWJyYXJ5KGVzdGltYXRyKQoKIyBTZXQgZ2xvYmFsIG9wdGlvbnMKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBldmFsPVRSVUUpCmBgYAoKYGBge2FzaXMsIGRpcmVjdGlvbnM9VFJVRX0KCioqR2VuZXJhbCBpbnN0cnVjdGlvbnMqKiAKClRoZSBgLlJtZGAgc291cmNlIGZvciB0aGlzIGRvY3VtZW50IHdpbGwgYmUgdGhlIHRlbXBsYXRlIGZvciB5b3VyIGhvbWV3b3JrIHN1Ym1pc3Npb24uIFlvdSBtdXN0IHN1Ym1pdCB5b3VyIGNvbXBsZXRlZCBhc3NpZ25tZW50IGFzIGEgc2luZ2xlIGh0bWwgZG9jdW1lbnQgc2F2ZWQgYXMgYSBQREYgZmlsZSwgdXBsb2FkZWQgdG8gZUxDIGJ5ICoqMTE6NTlwIG9uIE9jdG9iZXIgMjMgKiogdXNpbmcgdGhlIGZpbGVuYW1lIGBzZWN0aW9udGltZV90ZWFtbnVtYmVyX2h3MS5odG1sYCAoZS5nLiBgOTM1XzFfaHc1Lmh0bWxgKS4gCgoqTm90ZXMqOgogIAorIEluY2x1ZGUgdGhlIG5hbWUgb2YgZWFjaCB0ZWFtbWF0ZSB1bmRlciBgYXV0aG9yYCBpbiB0aGUgYHlhbWxgLiAKKyBGb3IgcXVlc3Rpb25zIHJlcXVpcmluZyBhbmFseXRpY2FsIHNvbHV0aW9ucywgeW91IGNhbiB0eXBlIHRoZW0gaW4gdXNpbmcgbWFya2Rvd24gbWF0aCBjb2RlLiAgT3IsIHlvdSBjYW4gc3VibWl0IGhhbmR3cml0dGVuIHNvbHV0aW9ucywgZW1iZWRkaW5nIHRoZW0gaW4gdGhlIGtuaXR0ZWQgZG9jdW1lbnQgYXMgY2xlYXJseSByZWFkYWJsZSBpbWFnZXMuCisgRm9yIHF1ZXN0aW9ucyByZXF1aXJpbmcgY29tcHV0YXRpb24sIHNvbWUgb3IgYWxsIG9mIHRoZSByZXF1aXJlZCBjb2RlIGlzIGluY2x1ZGVkIGluIGFzc29jaWF0ZWQgY2h1bmtzLiBNb2RpZnkgY2h1bmtzIHdoZXJlIGFuZCBob3cgeW91IGFyZSBkaXJlY3RlZC4KKyBGb3IgKGFsbW9zdCkgYWxsIHF1ZXN0aW9ucyBhYm91dCBSIE1hcmtkb3duLCBjb25zdWx0IFtUaGUgRGVmaW5pdGl2ZSBHdWlkZV0oaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duLykuCisgVGhlIGBzZXR1cGAgY2h1bmsgYWJvdmUgaW5kaWNhdGVzIHRoZSBwYWNrYWdlcyByZXF1aXJlZCBmb3IgdGhpcyBhc3NpZ25tZW50LgorIFlvdSB3aWxsIGZpbmQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgdmFyaWFibGVzIGluIHRoZSByZWZlcmVuY2VkIGRhdGFzZXQgdGhyb3VnaCB0aGUgSGVscCB0YWIgaW4gdGhlIFBsb3QgcGFuZSBvZiBSU3R1ZGlvLiAKLSAqKlN3aXRjaCBgZXZhbGAgdG8gYFRSVUVgIGluIHRoZSBnbG9iYWwgb3B0aW9ucyBjb21tYW5kIHRvIGV4ZWN1dGUgY29kZSBjaHVua3MqKi4KCioqKgpgYGAKCkluIHRoaXMgaG9tZXdvcmsgYXNzaWdubWVudCwgeW91IHdpbGwgdXNlIGRhdGEgZnJvbSBBbmdyaXN0IGFuZCBLcnVlZ2VyIDE5OTEgdG8gZXN0aW1hdGUgdGhlIGVmZmVjdHMgb2YgeWVhcnMgb2Ygc2Nob29saW5nIG9uIGxhYm9yIG1hcmtldCBvdXRjb21lcy4gVGhpcyBwYXBlciB1c2VzIGFuIGluZGljYXRvciBmb3IgYmVpbmcgYm9ybiBpbiB0aGUgZmlyc3QgcXVhcnRlciBvZiB0aGUgeWVhciBhcyBhbiBpbnN0cnVtZW50IGZvciB5ZWFycyBvZiBzY2hvb2xpbmcgc2luY2Ugc3R1ZGVudHMgYm9ybiBpbiB0aGUgZmlyc3QgcXVhcnRlciBvZiB0aGUgeWVhciB3aWxsIGhhdmUgYXR0ZW5kZWQgZmV3ZXIgeWVhcnMgb2Ygc2Nob29sIHdoZW4gdGhleSBoaXQgdGhlIGNvbXB1bHNvcnkgc2Nob29saW5nIGFnZS4gCgoKCmBgYHtyfQpkYXRhIDwtIHJlYWQuY3N2KCJodzVfZGF0YS5jc3YiKQpzdHIoZGF0YSkKYGBgCjEuIEZpcnN0IGNhbGN1bGF0ZSB0aGUgT0xTIGVzdGltYXRlIG9mIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB5ZWFycyBvZiBzY2hvb2xpbmcgYW5kIGxvZyB3YWdlcy4gV2h5IG1pZ2h0IHlvdSBub3QgdHJ1c3QgdGhpcyBlc3RpbWF0ZT8gRGlzY3VzcyB0aGUgcG90ZW50aWFsIHNpZ24gb2YgdGhlIGJpYXMgdXNpbmcgdGhlIE9WQiBmb3JtdWxhLiAKCmBgYHtyfQojIGluc2VydCBjb21tYW5kIHRvIHJ1biBsaW5lYXIgcmVncmVzc2lvbiB3aXRoIHJvYnVzdCBzdGFuZGFyZCBlcnJvcnMgaGVyZQojIEVzdGltYXRlIHRoZSBPTFMgbW9kZWwKb2xzIDwtIGxtKGxvZ193YWdlIH4gZWR1Y2F0aW9uLCBkYXRhID0gZGF0YSkKCiMgRGlzcGxheSBjb2VmZmljaWVudHMgd2l0aCByb2J1c3QgU0VzIChIQzEgPSBoZXRlcm9za2VkYXN0aWNpdHktY29uc2lzdGVudCkKc3VtbWFyeShsbV9yb2J1c3QobG9nX3dhZ2UgfiBlZHVjYXRpb24sIGRhdGEgPSBkYXRhLCBzZV90eXBlID0gIkhDMSIpKQpgYGAKCioqQW5zd2VyKiogCgpUaGUgT0xTIHJlc3VsdHMgc2hvdyB0aGF0IGVhY2ggYWRkaXRpb25hbCB5ZWFyIG9mIGVkdWNhdGlvbiByYWlzZXMgbG9nIHdhZ2VzIGJ5IGFib3V0IDUuOSUsIGluZGljYXRpbmcgYSBzdHJvbmcgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2Nob29saW5nIGFuZCBlYXJuaW5ncy4gSG93ZXZlciwgdGhpcyBlc3RpbWF0ZSBsaWtlbHkgb3ZlcnN0YXRlcyB0aGUgdHJ1ZSBjYXVzYWwgZWZmZWN0IGJlY2F1c2UgZWR1Y2F0aW9uIGlzIGNvcnJlbGF0ZWQgd2l0aCB1bm9ic2VydmVkIHRyYWl0cyBzdWNoIGFzIGFiaWxpdHksIGFtYml0aW9uLCBvciBmYW1pbHkgYmFja2dyb3VuZCwgd2hpY2ggYWxzbyBhZmZlY3Qgd2FnZXMuIEFjY29yZGluZyB0byB0aGUgT21pdHRlZCBWYXJpYWJsZSBCaWFzIChPVkIpIGZvcm11bGEsIGlmIHRoZXNlIG9taXR0ZWQgZmFjdG9ycyBhcmUgcG9zaXRpdmVseSByZWxhdGVkIHRvIGJvdGggZWR1Y2F0aW9uIGFuZCB3YWdlcywgdGhlIGVzdGltYXRlZCBjb2VmZmljaWVudCBpcyBiaWFzZWQgdXB3YXJk4oCUbWVhbmluZyB0aGUgT0xTIGVzdGltYXRlIGNhcHR1cmVzIG5vdCBvbmx5IHRoZSByZXR1cm4gdG8gc2Nob29saW5nIGJ1dCBhbHNvIHRoZSBpbmZsdWVuY2Ugb2YgdGhlc2UgdW5vYnNlcnZlZCBjaGFyYWN0ZXJpc3RpY3MuCgoyLglOb3csIHlvdSBkZWNpZGUgeW91IHVzZSBhbiBpbnN0cnVtZW50YWwgdmFyaWFibGVzIGFwcHJvYWNoIGFuZCBpbnN0cnVtZW50IGZvciBlZHVjYXRpb24gdXNpbmcgcXVhcnRlciBvZiBiaXJ0aC4gV2hhdCBhc3N1bXB0aW9ucyBkbyB5b3UgbmVlZCBmb3IgdGhpcyB0byBiZSBhIHZhbGlkIHN0cmF0ZWd5PwoKKipBbnN3ZXIqKiAKCkZvciBxdWFydGVyIG9mIGJpcnRoIHRvIGJlIGEgdmFsaWQgaW5zdHJ1bWVudCBmb3IgZWR1Y2F0aW9uLCB0d28ga2V5IGFzc3VtcHRpb25zIG11c3QgaG9sZDogcmVsZXZhbmNlIGFuZCBleG9nZW5laXR5LgpGaXJzdCwgdGhlIHJlbGV2YW5jZSBhc3N1bXB0aW9uIHJlcXVpcmVzIHRoYXQgcXVhcnRlciBvZiBiaXJ0aCBiZSBjb3JyZWxhdGVkIHdpdGggeWVhcnMgb2Ygc2Nob29saW5nIOKAlCBtZWFuaW5nIHRoYXQgYSBwZXJzb27igJlzIGJpcnRoIHF1YXJ0ZXIgaGFzIGEgbWVhc3VyYWJsZSBlZmZlY3Qgb24gaG93IG11Y2ggZWR1Y2F0aW9uIHRoZXkgY29tcGxldGUuIEluIHRoaXMgY29udGV4dCwgaW5kaXZpZHVhbHMgYm9ybiBlYXJseSBpbiB0aGUgeWVhciB0eXBpY2FsbHkgc3RhcnQgc2Nob29sIGF0IGFuIG9sZGVyIGFnZSBhbmQgbWF5IHJlYWNoIHRoZSBjb21wdWxzb3J5IHNjaG9vbGluZyBhZ2Ugd2l0aCBmZXdlciBjb21wbGV0ZWQgeWVhcnMgb2YgZWR1Y2F0aW9uLCBzYXRpc2Z5aW5nIGluc3RydW1lbnQgcmVsZXZhbmNlLgpTZWNvbmQsIHRoZSBleG9nZW5laXR5IChvciBleGNsdXNpb24gcmVzdHJpY3Rpb24pIGFzc3VtcHRpb24gcmVxdWlyZXMgdGhhdCBxdWFydGVyIG9mIGJpcnRoIGFmZmVjdHMgd2FnZXMgb25seSB0aHJvdWdoIGl0cyBpbXBhY3Qgb24gZWR1Y2F0aW9uLCBub3QgdGhyb3VnaCBhbnkgb3RoZXIgY2hhbm5lbC4gSW4gb3RoZXIgd29yZHMsIHRoZSBxdWFydGVyIGluIHdoaWNoIHNvbWVvbmUgaXMgYm9ybiBzaG91bGQgaGF2ZSBubyBkaXJlY3QgZWZmZWN0IG9uIHRoZWlyIGVhcm5pbmdzIG9yIGJlIGNvcnJlbGF0ZWQgd2l0aCB1bm9ic2VydmVkIGZhY3RvcnMgKGxpa2UgYWJpbGl0eSwgZmFtaWx5IGJhY2tncm91bmQsIG9yIGhlYWx0aCkgdGhhdCBhbHNvIGluZmx1ZW5jZSB3YWdlcy4KSWYgYm90aCBhc3N1bXB0aW9ucyBob2xkLCBxdWFydGVyIG9mIGJpcnRoIGNhbiBzZXJ2ZSBhcyBhIHZhbGlkIGluc3RydW1lbnQsIGFsbG93aW5nIHVzIHRvIGlzb2xhdGUgdGhlIGNhdXNhbCBlZmZlY3Qgb2YgZWR1Y2F0aW9uIG9uIHdhZ2VzLgoKMy4gV3JpdGUgZG93biBhbmQgZXN0aW1hdGUgdGhlIGZpcnN0IHN0YWdlIGVxdWF0aW9uLiBSZXBvcnQgdGhlIG1haW4gY29lZmZpY2llbnQgZXN0aW1hdGUgaW4gYSBzZW50ZW5jZS4gU3RvcmUgeW91ciBwcmVkaWN0ZWQgdmFsdWVzLiAgIAoKYGBge3J9CiMgaW5zZXJ0IGNvbW1hbmQgdG8gZXN0aW1hdGUgdGhlIGZpcnN0IHN0YWdlIHJlZ3Jlc3Npb24gaGVyZSAKZmlyc3Rfc3RhZ2UgPC0gbG0oZWR1Y2F0aW9uIH4gZmlyc3RfcXVhcnRlciwgZGF0YSA9IGRhdGEpCmVkdWNfaGF0IDwtIHByZWRpY3QoZmlyc3Rfc3RhZ2UpCnN1bW1hcnkoZmlyc3Rfc3RhZ2UpCmBgYAoKKipBbnN3ZXIqKiAKClRoZSBmaXJzdCBzdGFnZSBlcXVhdGlvbiBpcyAKCiQkCmVkdWNhdGlvbl9pID0gXGFscGhhXzAgKyBcYWxwaGFfMSBcdGV4dHtmaXJzdFxfcXVhcnRlcn1faSArIHVfaQokJAoKVGhlIGVzdGltYXRlZCBjb2VmZmljaWVudCBvbiBgZmlyc3RfcXVhcnRlcmAgaXMgKirigJMwLjA5OTYqKiwgbWVhbmluZyB0aGF0IGluZGl2aWR1YWxzIGJvcm4gaW4gdGhlIGZpcnN0IHF1YXJ0ZXIgb2YgdGhlIHllYXIgY29tcGxldGUgYWJvdXQgKiowLjEwIGZld2VyIHllYXJzIG9mIGVkdWNhdGlvbioqIG9uIGF2ZXJhZ2UgY29tcGFyZWQgdG8gdGhvc2UgYm9ybiBpbiBvdGhlciBxdWFydGVycy4gVGhpcyBuZWdhdGl2ZSBhbmQgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCByZWxhdGlvbnNoaXAgY29uZmlybXMgdGhhdCBxdWFydGVyIG9mIGJpcnRoIGlzIGEgKipyZWxldmFudCBpbnN0cnVtZW50KiogZm9yIGVkdWNhdGlvbi4gVGhlIHByZWRpY3RlZCB2YWx1ZXMgb2YgZWR1Y2F0aW9uIGZyb20gdGhpcyByZWdyZXNzaW9uIHdlcmUgc3RvcmVkIGluIHRoZSBvYmplY3QgYGVkdWNfaGF0YCBmb3IgdXNlIGluIHRoZSBzZWNvbmQtc3RhZ2UgYW5hbHlzaXMuCgoKNC4gV3JpdGUgZG93biBhbmQgZXN0aW1hdGUgdGhlIHJlZHVjZWQgZm9ybSBlcXVhdGlvbi4gUmVwb3J0IHRoZSBtYWluIGNvZWZmaWNpZW50IGVzdGltYXRlIGluIGEgc2VudGVuY2UuICAKCmBgYHtyfQpyZWR1Y2VkX2Zvcm0gPC0gbG0obG9nX3dhZ2UgfiBmaXJzdF9xdWFydGVyLCBkYXRhID0gZGF0YSkKc3VtbWFyeShyZWR1Y2VkX2Zvcm0pCmBgYAoKCjQuIFVzaW5nIHlvdXIgYW5zd2VycyBpbiAzKSBhbmQgNCksIHJlcG9ydCB0aGUgV2FsZCBlc3RpbWF0ZSBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZWR1Y2F0aW9uIGFuZCB3YWdlcy4gCgoqKkFuc3dlcioqIAoKVGhlIHJlZHVjZWQtZm9ybSBlcXVhdGlvbiBpczoKCiQkClxsb2cod2FnZSlfaSA9IFxwaV8wICsgXHBpXzEgXHRleHR7Zmlyc3RcX3F1YXJ0ZXJ9X2kgKyB2X2kKJCQKClRoZSBlc3RpbWF0ZWQgY29lZmZpY2llbnQgb24gYGZpcnN0X3F1YXJ0ZXJgIGlzICoq4oCTMC4wMDMyMyoqLCBpbmRpY2F0aW5nIHRoYXQgaW5kaXZpZHVhbHMgYm9ybiBpbiB0aGUgZmlyc3QgcXVhcnRlciBvZiB0aGUgeWVhciBlYXJuIGFib3V0ICoqMC4zJSBsb3dlciB3YWdlcyoqIG9uIGF2ZXJhZ2UgY29tcGFyZWQgdG8gdGhvc2UgYm9ybiBpbiBvdGhlciBxdWFydGVycy4gVGhpcyByZWxhdGlvbnNoaXAgaXMgKiptYXJnaW5hbGx5IHNpZ25pZmljYW50KiogKHAg4omIIDAuMDU4KSwgY29uc2lzdGVudCB3aXRoIHRoZSBpZGVhIHRoYXQgYmVpbmcgYm9ybiBlYXJsaWVyIGluIHRoZSB5ZWFyIHNsaWdodGx5IHJlZHVjZXMgc2Nob29saW5nIGFuZCwgY29uc2VxdWVudGx5LCBlYXJuaW5ncy4gIAoKVGhlIG5lZ2F0aXZlIHNpZ24gYWxpZ25zIHdpdGggdGhlIGZpcnN0LXN0YWdlIHJlc3VsdOKAlHNpbmNlIHRob3NlIGJvcm4gaW4gdGhlIGZpcnN0IHF1YXJ0ZXIgb2J0YWluIGxlc3MgZWR1Y2F0aW9uIG9uIGF2ZXJhZ2UsIHRoZXkgYWxzbyB0ZW5kIHRvIGVhcm4gc2xpZ2h0bHkgbGVzc+KAlHN1cHBvcnRpbmcgdGhlIGxvZ2ljIGJlaGluZCB0aGUgaW5zdHJ1bWVudGFsIHZhcmlhYmxlcyBhcHByb2FjaC4KCjUuIFRvIGVzdGltYXRlIHRoaXMgdXNpbmcgMlNMUywgd3JpdGUgZG93biB0aGUgc2Vjb25kIHN0YWdlIGVxdWF0aW9uLiBFc3RpbWF0ZSB0aGlzIHVzaW5nIHlvdXIgcHJlZGljdGVkIHZhbHVlcyBmcm9tIDMpLgoKYGBge3J9CiMgaW5zZXJ0IGNvbW1hbmQgdG8gZXN0aW1hdGUgdGhlIHNlY29uZCBzdGFnZSByZWdyZXNzaW9uIGhlcmUKc2Vjb25kX3N0YWdlIDwtIGxtKF9fXyB+IGVkdWNfaGF0KQpgYGAKCioqQW5zd2VyKiogCgo2LiBOb3csIHVzZSB0aGUgaXZyZWcgY29tbWFuZCB0byBkaXJlY3QgZXN0aW1hdGUgdGhpcyBlZmZlY3QuIENvbXBhcmUgdGhpcyBlc3RpbWF0ZSB0byB5b3VyIE9MUyBlc3RpbWF0ZSBpbiAxKS4KCmBgYHtyfQppdiA9IGl2cmVnKF9fX19ffiBfX19fX19fIHwgX19fX19fXyAsZGF0YSA9IGRhdGEpCnN1bW1hcnkoaXYpCmBgYAoKKipBbnN3ZXIqKiAKCjcuIE5vdywgYWRkIGNvbnRyb2wgdmFyaWFibGVzIHRvIHlvdXIgSVYgcmVncmVzc2lvbi4gSG93IGRvIHRoZXNlIGNoYW5nZSB5b3VyIHJlc3VsdHM/IAoKYGBge3J9Cml2MiA9IGl2cmVnKF9fX19ffiBfX19fX19fIHwgX19fX19fXyAsZGF0YSA9IGRhdGEpCnN1bW1hcnkoaXYyKQpgYGAKCgoqKkFuc3dlcioqIAoKOC4gVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHF1YXJ0ZXIgb2YgYmlydGggYW5kIHllYXJzIG9mIHNjaG9vbGluZyBzaG91bGQgb25seSBob2xkIGZvciB0aG9zZSB3aG8gYXJlIGFmZmVjdGVkIGJ5IHIgY29tcHVsc29yeSBzY2hvb2wgbGF3cy4gRXN0aW1hdGUgYSByZWdyZXNzaW9uIHRoYXQgdGVzdHMgd2hldGhlciB0aGVyZSBpcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHF1YXJ0ZXIgb2YgYmlydGggYW5kIHllYXJzIG9mIHNjaG9vbGluZyBmb3IgdGhvc2Ugd2hvIGhhdmUgYXQgbGVhc3QgYSBjb2xsZWdlIGVkdWNhdGlvbiAoMTYgeWVhcnMgb2Ygc2Nob29saW5nKS4gV2hhdCBkbyB5b3UgZmluZD8gCgpgYGB7cn0KZGF0YV8xNiA9IHN1YnNldChkYXRhLCBlZHVjYXRpb24gPiAxNikKIyBJbnNlcnQgcmVncmVzc2lvbiBoZXJlIApgYGAKCioqQW5zd2VyKiogCgo5LglTb21lb25lIG5vdyB0ZWxscyB5b3UgdGhhdCBxdWFydGVyIG9mIGJpcnRoIGlzIHJlbGF0ZWQgdG8gcGFyZW50YWwgaW5jb21lLiBEb2VzIHRoaXMgY2hhbmdlIGhvdyB5b3UgZmVlbCBhYm91dCB5b3VyIElWIGFuYWx5c2lzPyAKCioqQW5zd2VyKiog