Part I: EDA and Feature Engineering
(for week #5)
Data Set
Choose a data set that has at least four categorical variables and
four numerical variables. The sample size should be at least 200. You
can find a data set either from my teaching data repository or other
data sources. The data set should be cross-sectional (i.e., each of the
data points must be observed/collected/generated at the same time).
Description of
Data
The following information of the data should be provided in the
report:
A brief description of the data source.
How the data set is generated or collected.
Number of variables and their type (categorical or numerical) and
size of the data set.
List the variable names and their
description/definitions.
Exploratory Data
Analysis and Feature
Perform the standard EDA such as distribution for categorical and
numerical variables respectively, the relationship between two variables
(combinations of categorical and numerical variables), and pairwise
relationship. Keep in mind that the pairwise scatter plot is only
meaning for numerical variables.
For each EDA and associated representation, you should
interpret what you observed and the implication of potential
feature engineering
perform feature engineering based on EDA by writing an R/Python
function.
Write a main function to wrap individual feature engineering
functions.
Test the main function with different patterns in the components
and sure it produces the expected result.
Part II: Regression Analysis (for
week #6)
Statistical Regression
Modeling
Linear and logistic regression models are the most commonly used
models in classical statistics. This part of the assignment uses the
traditional statistical approaches to modeling building and
implementation.
Linear Regression
Models
Choose a continuous variable as a response to perform a linear
regression analysis. Please use several subsections to organize your
analysis that contain the following components.
Statement of the question(s), the purpose of this analysis:
association analysis or predictive analysis?
Justify whether the data set has sufficient information to
address the question(s)
Model building process: initial model, diagnostics, further
transformations (in addition to the one in the EDA), key performance
metrics of model assessment, and final model selection (based on
appropriate performance metrics). You are expected to
- create a model that contains a few practically important
variables
- create a model that includes additional variables that potentially
influence the response
- use certain variable selection methods to identify the optimal model
(i.e., the final model)
Interpretation of regression coefficients. If you transformed
your response variable, you need to do some algebra to convert the
transformed response variable back to the original scale before you
interpret the regression coefficient.
Summary/discussion/recommendation
You could open a subsection for each bullet point.
Logistic Regression
Analysis
Choose a binary variable as a response to perform a logistic
regression analysis. If your data set does not have a binary categorical
variable that can be used for the logistic regression model, you can
dichotomize a continuous response in a meaningful way
and then build a logistic regression model with the dichotomized
variable.
Please use several subsections to organize your analysis that contain
the following components.
Statement of the question(s), the purpose of this analysis:
association analysis or predictive analysis?
Justify whether the data set has sufficient information to
address the question(s)
Model building process: initial model, diagnostics,
transformation and scaling (in addition to the one in the EDA), key
performance metrics of model assessment, and final model selection
(based on certain performance metrics). For practice, you are expected
to
- create a model that contains a few practically important
variables
- create a model that includes additional variables that potentially
influence the response
- use certain variable selection methods to identify the optimal model
(i.e., the final model)
The interpretation of the final model: interpret the regression
coefficient and applications of the model.
Summary/discussion/recommendation
You could open a subsection for each bullet point.
Part III: Report Revision- Including Cross
Validation (for week #7)
Predictive
Modeling
The idea is to use data-driven approaches to data
splitting and then apply cross-validation methods to select the final
model from a pool of candidate models based on predictive
performance metric such as MSE for linear
regression models and accuracy,
sensitivity, or specificity for
logistic regression models.
Suggested Components in the Predictive Analysis
random splitting - using random splitting for all data
partitions.
Two-way data splitting - data split into 75% for
training and validation and 25% for testing.
5-fold cross-validation - using a 5-fold
cross-validation algorithm on the training data
Prediction Linear
Regression
The primary predictive performance metric for linear regression
modeling is the mean square error (the average
squared error between predicted and the observed values of the response
variable in its original scale).
Other predictive performance metrics that can also be used are \(R^2\) or \(R^2_{adj}\).
Likelihood-based metrics such as AIC and SBC can be used if the
likelihood functions of all candidate models are at the same scale.
These measures are not as intuitive as the MSE since MSE is a squared
‘distance’ in the Euclidean space.
If the response variables in all candidate
models are at the same scale, the MSE is expected to be used in the
cross-validation for model selection.
Logistic Predictive
Modeling
The primary tool for assessing the global predictive performance of
logistic models is ROC curve analysis (this includes the area under the
ROC curve - AUC). ROC curve suggested for this assignment.
Other predictive performance measures that can be considered are
accuracy, sensitivity, and
specificity.
Reporting ROC and AUC is required when
comparing candidate models.
LS0tDQp0aXRsZTogJ1JlZ3Jlc3Npb24gQW5hbHlzaXMnDQphdXRob3I6ICIgKFlvdSBhcmUgZXhwZWN0ZWQgdG8gZ2l2ZSBhIGRlc2NyaXB0aXZlIHRpdGxlKSINCmRhdGU6ICIgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDMNCiAgICBmaWdfaGVpZ2h0OiAzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7PWh0bWx9DQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCi8qIENhc2NhZGluZyBTdHlsZSBTaGVldHMgKENTUykgaXMgYSBzdHlsZXNoZWV0IGxhbmd1YWdlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHByZXNlbnRhdGlvbiBvZiBhIGRvY3VtZW50IHdyaXR0ZW4gaW4gSFRNTCBvciBYTUwuIGl0IGlzIGEgc2ltcGxlIG1lY2hhbmlzbSBmb3IgYWRkaW5nIHN0eWxlIChlLmcuLCBmb250cywgY29sb3JzLCBzcGFjaW5nKSB0byBXZWIgZG9jdW1lbnRzLiAqLw0KDQpoMS50aXRsZSB7ICAvKiBUaXRsZSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIHJlcG9ydCB0aXRsZSAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGF1dGhvcnMgICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IHJlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGRhdGUgICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KaDEgeyAvKiBIZWFkZXIgMSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDEgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDIycHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KaDIgeyAvKiBIZWFkZXIgMiAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDIgc2VjdGlvbiB0aXRsZSAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCAzIHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDQgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCg0KcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KPC9zdHlsZT4NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KfQ0KaWYgKCFyZXF1aXJlKCJHR2FsbHkiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiR0dhbGx5IikNCmxpYnJhcnkoR0dhbGx5KQ0KfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICMgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIG91dHB1dA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BDQogICAgICAgICAgICAgICAgICAgICAgKSAgDQpgYGANClwNCg0KPGNlbnRlcj48Zm9udCBzdHlsZT0iZm9udC1zaXplOiAyMnB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtncmVlbjsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsiPiBQYXJ0IEk6IEVEQSBhbmQgRmVhdHVyZSBFbmdpbmVlcmluZyA8L2ZvbnQ+DQogIChmb3Igd2VlayAjNSkNCiAgPC9jZW50ZXI+DQoNClwNCg0KDQojIERhdGEgU2V0DQoNCg0KQ2hvb3NlIGEgZGF0YSBzZXQgdGhhdCBoYXMgYXQgbGVhc3QgZm91ciBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgYW5kIGZvdXIgbnVtZXJpY2FsIHZhcmlhYmxlcy4gVGhlIHNhbXBsZSBzaXplIHNob3VsZCBiZSBhdCBsZWFzdCAyMDAuIFlvdSBjYW4gZmluZCBhIGRhdGEgc2V0IGVpdGhlciBmcm9tIG15IHRlYWNoaW5nIGRhdGEgcmVwb3NpdG9yeSBvciBvdGhlciBkYXRhIHNvdXJjZXMuIFRoZSBkYXRhIHNldCBzaG91bGQgYmUgY3Jvc3Mtc2VjdGlvbmFsIChpLmUuLCBlYWNoIG9mIHRoZSBkYXRhIHBvaW50cyBtdXN0IGJlIG9ic2VydmVkL2NvbGxlY3RlZC9nZW5lcmF0ZWQgYXQgdGhlIHNhbWUgdGltZSkuDQoNCiMgRGVzY3JpcHRpb24gb2YgRGF0YQ0KDQpUaGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIG9mIHRoZSBkYXRhIHNob3VsZCBiZSBwcm92aWRlZCBpbiB0aGUgcmVwb3J0Og0KDQoqIEEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGRhdGEgc291cmNlLg0KDQoqIEhvdyB0aGUgZGF0YSBzZXQgaXMgZ2VuZXJhdGVkIG9yIGNvbGxlY3RlZC4NCg0KKiBOdW1iZXIgb2YgdmFyaWFibGVzIGFuZCB0aGVpciB0eXBlIChjYXRlZ29yaWNhbCBvciBudW1lcmljYWwpIGFuZCBzaXplIG9mIHRoZSBkYXRhIHNldC4NCg0KKiBMaXN0IHRoZSB2YXJpYWJsZSBuYW1lcyBhbmQgdGhlaXIgZGVzY3JpcHRpb24vZGVmaW5pdGlvbnMuDQoNCiMgRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcyBhbmQgRmVhdHVyZQ0KDQpQZXJmb3JtIHRoZSBzdGFuZGFyZCBFREEgc3VjaCBhcyBkaXN0cmlidXRpb24gZm9yIGNhdGVnb3JpY2FsIGFuZCBudW1lcmljYWwgdmFyaWFibGVzIHJlc3BlY3RpdmVseSwgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byB2YXJpYWJsZXMgKGNvbWJpbmF0aW9ucyBvZiBjYXRlZ29yaWNhbCBhbmQgbnVtZXJpY2FsIHZhcmlhYmxlcyksIGFuZCBwYWlyd2lzZSByZWxhdGlvbnNoaXAuIEtlZXAgaW4gbWluZCB0aGF0IHRoZSBwYWlyd2lzZSBzY2F0dGVyIHBsb3QgaXMgb25seSBtZWFuaW5nIGZvciBudW1lcmljYWwgdmFyaWFibGVzLg0KDQpGb3IgZWFjaCBFREEgYW5kIGFzc29jaWF0ZWQgcmVwcmVzZW50YXRpb24sIHlvdSBzaG91bGQgDQoNCiogaW50ZXJwcmV0IHdoYXQgeW91IG9ic2VydmVkIGFuZCB0aGUgaW1wbGljYXRpb24gb2YgcG90ZW50aWFsIGZlYXR1cmUgZW5naW5lZXJpbmcNCg0KKiBwZXJmb3JtIGZlYXR1cmUgZW5naW5lZXJpbmcgYmFzZWQgb24gRURBIGJ5IHdyaXRpbmcgYW4gUi9QeXRob24gZnVuY3Rpb24uDQoNCiogV3JpdGUgYSBtYWluIGZ1bmN0aW9uIHRvIHdyYXAgaW5kaXZpZHVhbCBmZWF0dXJlIGVuZ2luZWVyaW5nIGZ1bmN0aW9ucy4NCg0KKiBUZXN0IHRoZSBtYWluIGZ1bmN0aW9uIHdpdGggZGlmZmVyZW50IHBhdHRlcm5zIGluIHRoZSBjb21wb25lbnRzIGFuZCBzdXJlIGl0IHByb2R1Y2VzIHRoZSBleHBlY3RlZCByZXN1bHQuDQoNCg0KXA0KDQo8Y2VudGVyPjxmb250IHN0eWxlPSJmb250LXNpemU6IDIycHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya2dyZWVuOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyI+IFBhcnQgSUk6IFJlZ3Jlc3Npb24gQW5hbHlzaXM8L2ZvbnQ+DQogIChmb3Igd2VlayAjNikNCiAgPC9jZW50ZXI+DQoNCg0KXA0KDQojIFN0YXRpc3RpY2FsIFJlZ3Jlc3Npb24gTW9kZWxpbmcNCg0KTGluZWFyIGFuZCBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVscyBhcmUgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBtb2RlbHMgaW4gY2xhc3NpY2FsIHN0YXRpc3RpY3MuIFRoaXMgcGFydCBvZiB0aGUgYXNzaWdubWVudCB1c2VzIHRoZSB0cmFkaXRpb25hbCBzdGF0aXN0aWNhbCBhcHByb2FjaGVzIHRvIG1vZGVsaW5nIGJ1aWxkaW5nIGFuZCBpbXBsZW1lbnRhdGlvbi4NCg0KIyMgTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWxzDQoNCkNob29zZSBhIGNvbnRpbnVvdXMgdmFyaWFibGUgYXMgYSByZXNwb25zZSB0byBwZXJmb3JtIGEgbGluZWFyIHJlZ3Jlc3Npb24gYW5hbHlzaXMuIFBsZWFzZSB1c2Ugc2V2ZXJhbCBzdWJzZWN0aW9ucyB0byBvcmdhbml6ZSB5b3VyIGFuYWx5c2lzIHRoYXQgY29udGFpbiB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHMuDQoNCiogU3RhdGVtZW50IG9mIHRoZSBxdWVzdGlvbihzKSwgdGhlIHB1cnBvc2Ugb2YgdGhpcyBhbmFseXNpczogYXNzb2NpYXRpb24gYW5hbHlzaXMgb3IgcHJlZGljdGl2ZSBhbmFseXNpcz8NCg0KKiBKdXN0aWZ5IHdoZXRoZXIgdGhlIGRhdGEgc2V0IGhhcyBzdWZmaWNpZW50IGluZm9ybWF0aW9uIHRvIGFkZHJlc3MgdGhlIHF1ZXN0aW9uKHMpDQoNCiogTW9kZWwgYnVpbGRpbmcgcHJvY2VzczogaW5pdGlhbCBtb2RlbCwgZGlhZ25vc3RpY3MsIGZ1cnRoZXIgdHJhbnNmb3JtYXRpb25zIChpbiBhZGRpdGlvbiB0byB0aGUgb25lIGluIHRoZSBFREEpLCBrZXkgcGVyZm9ybWFuY2UgbWV0cmljcyBvZiBtb2RlbCBhc3Nlc3NtZW50LCBhbmQgZmluYWwgbW9kZWwgc2VsZWN0aW9uIChiYXNlZCBvbiBhcHByb3ByaWF0ZSBwZXJmb3JtYW5jZSBtZXRyaWNzKS4gWW91IGFyZSBleHBlY3RlZCB0bw0KICArIGNyZWF0ZSBhIG1vZGVsIHRoYXQgY29udGFpbnMgYSBmZXcgcHJhY3RpY2FsbHkgaW1wb3J0YW50IHZhcmlhYmxlcw0KICArIGNyZWF0ZSBhIG1vZGVsIHRoYXQgaW5jbHVkZXMgYWRkaXRpb25hbCB2YXJpYWJsZXMgdGhhdCBwb3RlbnRpYWxseSBpbmZsdWVuY2UgdGhlIHJlc3BvbnNlDQogICsgdXNlIGNlcnRhaW4gdmFyaWFibGUgc2VsZWN0aW9uIG1ldGhvZHMgdG8gaWRlbnRpZnkgdGhlIG9wdGltYWwgbW9kZWwgKGkuZS4sIHRoZSBmaW5hbCBtb2RlbCkNCiAgDQoqIEludGVycHJldGF0aW9uIG9mIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzLiBJZiB5b3UgdHJhbnNmb3JtZWQgeW91ciByZXNwb25zZSB2YXJpYWJsZSwgeW91IG5lZWQgdG8gZG8gc29tZSBhbGdlYnJhIHRvIGNvbnZlcnQgdGhlIHRyYW5zZm9ybWVkIHJlc3BvbnNlIHZhcmlhYmxlIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHNjYWxlIGJlZm9yZSB5b3UgaW50ZXJwcmV0IHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50Lg0KDQoqIFN1bW1hcnkvZGlzY3Vzc2lvbi9yZWNvbW1lbmRhdGlvbg0KDQpZb3UgY291bGQgb3BlbiBhIHN1YnNlY3Rpb24gZm9yIGVhY2ggYnVsbGV0IHBvaW50LiANCg0KDQojIyBMb2dpc3RpYyBSZWdyZXNzaW9uIEFuYWx5c2lzDQoNCkNob29zZSBhIGJpbmFyeSB2YXJpYWJsZSBhcyBhIHJlc3BvbnNlIHRvIHBlcmZvcm0gYSBsb2dpc3RpYyByZWdyZXNzaW9uIGFuYWx5c2lzLiBJZiB5b3VyIGRhdGEgc2V0IGRvZXMgbm90IGhhdmUgYSBiaW5hcnkgY2F0ZWdvcmljYWwgdmFyaWFibGUgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdGhlIGxvZ2lzdGljIHJlZ3Jlc3Npb24gbW9kZWwsIHlvdSBjYW4gZGljaG90b21pemUgYSBjb250aW51b3VzIHJlc3BvbnNlICoqaW4gYSBtZWFuaW5nZnVsIHdheSoqIGFuZCB0aGVuIGJ1aWxkIGEgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCB3aXRoIHRoZSBkaWNob3RvbWl6ZWQgdmFyaWFibGUuDQoNCg0KUGxlYXNlIHVzZSBzZXZlcmFsIHN1YnNlY3Rpb25zIHRvIG9yZ2FuaXplIHlvdXIgYW5hbHlzaXMgdGhhdCBjb250YWluIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50cy4NCg0KKiBTdGF0ZW1lbnQgb2YgdGhlIHF1ZXN0aW9uKHMpLCB0aGUgcHVycG9zZSBvZiB0aGlzIGFuYWx5c2lzOiBhc3NvY2lhdGlvbiBhbmFseXNpcyBvciBwcmVkaWN0aXZlIGFuYWx5c2lzPw0KDQoqIEp1c3RpZnkgd2hldGhlciB0aGUgZGF0YSBzZXQgaGFzIHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gdG8gYWRkcmVzcyB0aGUgcXVlc3Rpb24ocykNCg0KKiBNb2RlbCBidWlsZGluZyBwcm9jZXNzOiBpbml0aWFsIG1vZGVsLCBkaWFnbm9zdGljcywgdHJhbnNmb3JtYXRpb24gYW5kIHNjYWxpbmcgKGluIGFkZGl0aW9uIHRvIHRoZSBvbmUgaW4gdGhlIEVEQSksIGtleSBwZXJmb3JtYW5jZSBtZXRyaWNzIG9mIG1vZGVsIGFzc2Vzc21lbnQsIGFuZCBmaW5hbCBtb2RlbCBzZWxlY3Rpb24gKGJhc2VkIG9uIGNlcnRhaW4gcGVyZm9ybWFuY2UgbWV0cmljcykuIEZvciBwcmFjdGljZSwgeW91IGFyZSBleHBlY3RlZCB0bw0KICArIGNyZWF0ZSBhIG1vZGVsIHRoYXQgY29udGFpbnMgYSBmZXcgcHJhY3RpY2FsbHkgaW1wb3J0YW50IHZhcmlhYmxlcw0KICArIGNyZWF0ZSBhIG1vZGVsIHRoYXQgaW5jbHVkZXMgYWRkaXRpb25hbCB2YXJpYWJsZXMgdGhhdCBwb3RlbnRpYWxseSBpbmZsdWVuY2UgdGhlIHJlc3BvbnNlDQogICsgdXNlIGNlcnRhaW4gdmFyaWFibGUgc2VsZWN0aW9uIG1ldGhvZHMgdG8gaWRlbnRpZnkgdGhlIG9wdGltYWwgbW9kZWwgKGkuZS4sIHRoZSBmaW5hbCBtb2RlbCkNCiAgDQoqIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgZmluYWwgbW9kZWw6IGludGVycHJldCB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBhbmQgYXBwbGljYXRpb25zIG9mIHRoZSBtb2RlbC4NCg0KKiBTdW1tYXJ5L2Rpc2N1c3Npb24vcmVjb21tZW5kYXRpb24NCg0KDQpZb3UgY291bGQgb3BlbiBhIHN1YnNlY3Rpb24gZm9yIGVhY2ggYnVsbGV0IHBvaW50LiANCg0KDQpcDQoNCjxjZW50ZXI+PGZvbnQgc3R5bGU9ImZvbnQtc2l6ZTogMjJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrZ3JlZW47DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7Ij4gUGFydCBJSUk6IFJlcG9ydCBSZXZpc2lvbi0gSW5jbHVkaW5nIENyb3NzIFZhbGlkYXRpb248L2ZvbnQ+DQogIChmb3Igd2VlayAjNykNCiAgPC9jZW50ZXI+DQoNClwNCg0KIyBQcmVkaWN0aXZlIE1vZGVsaW5nIA0KDQpUaGUgaWRlYSBpcyB0byB1c2UgKipkYXRhLWRyaXZlbiBhcHByb2FjaGVzKiogdG8gZGF0YSBzcGxpdHRpbmcgYW5kIHRoZW4gYXBwbHkgY3Jvc3MtdmFsaWRhdGlvbiBtZXRob2RzIHRvIHNlbGVjdCB0aGUgZmluYWwgbW9kZWwgZnJvbSBhIHBvb2wgb2YgY2FuZGlkYXRlIG1vZGVscyBiYXNlZCBvbiAqKnByZWRpY3RpdmUgcGVyZm9ybWFuY2UgbWV0cmljKiogc3VjaCBhcyAqKk1TRSoqIGZvciBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbHMgYW5kICoqYWNjdXJhY3kqKiwgKipzZW5zaXRpdml0eSoqLCBvciAqKnNwZWNpZmljaXR5KiogZm9yIGxvZ2lzdGljIHJlZ3Jlc3Npb24gbW9kZWxzLg0KDQoqKlN1Z2dlc3RlZCBDb21wb25lbnRzIGluIHRoZSBQcmVkaWN0aXZlIEFuYWx5c2lzKioNCg0KKiAqcmFuZG9tIHNwbGl0dGluZyogLSB1c2luZyByYW5kb20gc3BsaXR0aW5nIGZvciBhbGwgZGF0YSBwYXJ0aXRpb25zLg0KDQoqICpUd28td2F5IGRhdGEgc3BsaXR0aW5nKiAtIGRhdGEgc3BsaXQgaW50byA3NSUgZm9yIHRyYWluaW5nIGFuZCB2YWxpZGF0aW9uIGFuZCAyNSUgZm9yIHRlc3RpbmcuIA0KDQoqICo1LWZvbGQgY3Jvc3MtdmFsaWRhdGlvbiogLSB1c2luZyBhIDUtZm9sZCBjcm9zcy12YWxpZGF0aW9uIGFsZ29yaXRobSBvbiB0aGUgdHJhaW5pbmcgZGF0YQ0KDQpcDQoNCiMjIFByZWRpY3Rpb24gTGluZWFyIFJlZ3Jlc3Npb24NCg0KVGhlIHByaW1hcnkgcHJlZGljdGl2ZSBwZXJmb3JtYW5jZSBtZXRyaWMgZm9yIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsaW5nIGlzIHRoZSBtZWFuIHNxdWFyZSBlcnJvciA8Zm9udCBjb2xvciA9ICJyZWQiPiAodGhlIGF2ZXJhZ2Ugc3F1YXJlZCBlcnJvciBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgdGhlIG9ic2VydmVkIHZhbHVlcyBvZiB0aGUgcmVzcG9uc2UgdmFyaWFibGUgPGI+aW4gaXRzIG9yaWdpbmFsIHNjYWxlKTwvYj48L2ZvbnQ+LiANCg0KT3RoZXIgcHJlZGljdGl2ZSBwZXJmb3JtYW5jZSBtZXRyaWNzIHRoYXQgY2FuIGFsc28gYmUgdXNlZCBhcmUgJFJeMiQgb3IgJFJeMl97YWRqfSQuIA0KDQpMaWtlbGlob29kLWJhc2VkIG1ldHJpY3Mgc3VjaCBhcyBBSUMgYW5kIFNCQyBjYW4gYmUgdXNlZCBpZiB0aGUgbGlrZWxpaG9vZCBmdW5jdGlvbnMgb2YgYWxsIGNhbmRpZGF0ZSBtb2RlbHMgYXJlIGF0IHRoZSBzYW1lIHNjYWxlLiBUaGVzZSBtZWFzdXJlcyBhcmUgbm90IGFzIGludHVpdGl2ZSBhcyB0aGUgTVNFIHNpbmNlIE1TRSBpcyBhIHNxdWFyZWQgJyoqZGlzdGFuY2UqKicgaW4gdGhlIEV1Y2xpZGVhbiBzcGFjZS4NCg0KPGZvbnQgY29sb3IgPSAicmVkIj4qXGNvbG9ye3JlZH1JZiB0aGUgcmVzcG9uc2UgdmFyaWFibGVzIGluIGFsbCBjYW5kaWRhdGUgbW9kZWxzIGFyZSBhdCB0aGUgc2FtZSBzY2FsZSwgdGhlIE1TRSBpcyBleHBlY3RlZCB0byBiZSB1c2VkIGluIHRoZSBjcm9zcy12YWxpZGF0aW9uIGZvciBtb2RlbCBzZWxlY3Rpb24uKjwvZm9udD4NCg0KDQojIyBMb2dpc3RpYyBQcmVkaWN0aXZlIE1vZGVsaW5nDQoNClRoZSBwcmltYXJ5IHRvb2wgZm9yIGFzc2Vzc2luZyB0aGUgZ2xvYmFsIHByZWRpY3RpdmUgcGVyZm9ybWFuY2Ugb2YgbG9naXN0aWMgbW9kZWxzIGlzIFJPQyBjdXJ2ZSBhbmFseXNpcyAodGhpcyBpbmNsdWRlcyB0aGUgYXJlYSB1bmRlciB0aGUgUk9DIGN1cnZlIC0gQVVDKS4gUk9DIGN1cnZlIHN1Z2dlc3RlZCBmb3IgdGhpcyBhc3NpZ25tZW50Lg0KDQpPdGhlciBwcmVkaWN0aXZlIHBlcmZvcm1hbmNlIG1lYXN1cmVzIHRoYXQgY2FuIGJlIGNvbnNpZGVyZWQgYXJlICoqYWNjdXJhY3kqKiwgKipzZW5zaXRpdml0eSoqLCBhbmQgKipzcGVjaWZpY2l0eSoqLg0KDQo8Zm9udCBjb2xvciA9ICJyZWQiPipcY29sb3J7cmVkfVJlcG9ydGluZyBST0MgYW5kIEFVQyBpcyByZXF1aXJlZCB3aGVuIGNvbXBhcmluZyBjYW5kaWRhdGUgbW9kZWxzLio8L2ZvbnQ+DQoNCg0KIyMgVGVzdGluZyBQZXJmb3JtYW5jZSANCg0KQWZ0ZXIgdGhlIGZpbmFsIG1vZGVsIGlzIGlkZW50aWZpZWQsIHlvdSBuZWVkIHRvIHVzZSB0aGUgMjUlIHRlc3RpbmcgZGF0YSBzZXQgdG8gcmVwb3J0IHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgY29ycmVzcG9uZGluZyBtb2RlbHMgb24gdGhlICoqbmV3IGRhdGEqKi4gDQoNCg==