Announcements
Announcements
- grading
- Piazza posted (will update again)
- GitHub posted (split 1st & 2nd halves of term)
- midterm exam
- planning to return them & discuss on Wed (3/13)
- Extra Credit survey (to boost avg slightly)
- MDSR Ch 6 (ethics): no programming assigned
- MDSR Ch 6 exercises–no code, but use GitHub, make commits, & submit R Notebook like always
- MDSR Ch 10 programming notebook
MDSR Ch 10 Errata / Tips
- Some sections don’t require programming, but please still include the headers for navigation purposes
- p. 234-235: Rename the result for 20,000 simulations as
sim_results20k
- the authors reuse the object name
sim_results
for the example with 20,000 simulations, but this overwrites the object expected for the plot at the top of p. 235.
- by renaming the object resulting form 20,000 simulations, the ggplot call will still be able to access the intended object
Stand your ground
- Graphic once published by news source Reuters
- Q: What can you learn from this graphic?
- Q: Anything you would change about it?
Professional Ethics
- In the US, there are popular notions of professional ethics for some professions but not others
- Medical Doctors–Hippocratic Oath
- “(help or) Do no harm” is well-known, but actually comes from elsewhere
- “I will not be ashamed to say ‘I know not,’ nor will I fail to call in my colleagues when the skills of another are needed for a patient’s recovery”
- “I will respect the privacy of my patients, for their problems are not disclosed to me that the world may know”
- “I will remember that I am a member of society, with special obligations to all my fellow human beings, those of sound mind and body as well as the infirm”
- Q: How do these relate to professional ethics in Statistics & Data Science
Professional Ethics
- Some behaviors are pretty universally viewed as unethical: lying, cheating, stealing
- Professional ethics additionally requires a more nuanced interpretation
- Reasonable people can disagree about what actions are best,
- Ethics are not law
- We are best to assess ethical action though use of consistent principles and guidelines
General principles
- You have skills that aren’t widely available; don’t use them to deceive others (intentionally or not)
- Do your work well by your own standards and by the standards of your profession
- do work that would pass scrutiny by professional colleagues
- know your limits (e.g. regarding use of methods you don’t understand)
- Recognize the parties (stakeholders) to whom you have a special professional obligation
- employer & client
- general public or participants in a study
- research community or the profession itself
- Report results and methods honestly and respect your responsibility to identify and report flaws and shortcomings in your work.
- don’t overstate your confidence
- often, “flaws in your work” are unavoidable limitations or necessary compromise. These should still be known to the consumer of your analysis
American Statistical Association (2018 ethical guidelines)
- Professional integrity and accountability
- Integrity of data and methods
- Note: both plots shown before violate this section of ASA ethical guidelines
- Responsibilities to Science/Public/Funder/Client
- Responsibilities to research subjects
- Responsibilities to research team colleagues
- Responsibilities to other statisticians and statistics practitioners
- Responsibilities regarding allegations of misconduct
- Responsibililies of [those] employing statistical practitioners
Data Science ethics
- Clearly a well-identified issue, but so far unclear who should be the competent authority
- Some examples I found easily
- Penn State IST 402: Data Ethics
- U Chicago Data Science for Social Good
- U Michigan short course on Data Science Ethics
- Coursera & edX courses on Data Science Ethics
(PSU) Guidelines for decision making
- Percieved problem or ethical dilemma?
- What are the facts?
- What stakeholders, values, and guidelines are involved?
- What are the options (good & bad)?
- Consider the options (outcomes, virtues, …)?
- Which is the BEST (or “least bad”) option?
- How might we prevent this issue in the future?
Some Examples
- Employment discrimination
- Scraping OkCupid data
- Reproducible spreadsheet analysis
- Legal negotiations
Applying our guidelines: Employment Discrimination
Applying our guidelines: Employment Discrimination
- Easy to criticize the method… quite likely that employers are inappropriately labeled as discriminators just by chance alone
- OFCCP didn’t create the method, they are actually required to implement this method…
- US Office of Personnel Management (www.opm.gov)
- “The Uniform Guidelines (http://uniformguidelines.com/) apply to all selection procedures used to make employment decisions” (according to OPM FAQ page)
- OFCCP enforces the law, and has a responsibility to the courts
Applying our guidelines: Data Scraping
Applying our guidelines: Data Scraping
- the researcher seems to use perfectly legitimate means to access the data
- Stakeholders: OkCupid users
- Users did not consent to this use of their data… (& could not Opt out)
- The data are personally identifiable and users could reasonably experience “damages” (embarassment or personal harm)
- Stakeholders: OkCupid
- companies like this often specify terms of use that restrict how the data may be legitimately used.
- terms of use cannot ethically be disregarded since they represent an explicit agreement between the service provider and (any) user of the service
Applying our guidelines: Reproducible spreadsheet analysis
Applying our guidelines: Reproducible spreadsheet analysis
- Researchers have an ethical obligation to be truthful in their reporting of research
- honest reporting of results
- permit results to be challenged or confirmed (Reinhart & Rogoff did this well)
- It is not unethical to be wrong so to speak
- the ethical obligation is to take all reasonable steps to ensure that conclusions faithfully represent the data and the analysis framework
- Reinhart & Rogoff may have done so to the best of their ability
- In statistics and data science, we have an ethical obligation to use tools that are reliable, verifiable, and conducive to reproducible data analysis
- a reproducible workflow like that of R, RMarkdown, and Git accomplishes this purpose
- tools should strive to avoid quiet (or silent) failure modes
- Microsoft Excel does not
- mixes the data with the analysis
- difficult to program in a concise and readable way
- commands are customized to a particular size and organization of data
- validating against a known result is often impractical in Excel
- click & drag operations are error-prone
Data reidentification and disclosure avoidance
- obligation to privacy protections
- HIPAA protects privacy health information
- FERPA protects privacy of student records
- there is an appropriate tension between disclosures for public good (healthcare costs and outcomes) and nondisclosures that protect personal privacy
- data scientists have skills that could circumvent these protections (even accidentally), and this carries with it a clear ethical responsibility
Data scraping and terms of use
- According to MDSR, (Slate.com)[https://slate.com/terms] recently stated in their terms of use explicitly prohibited users from scraping content or information (this appears to have changed)
- An application programming interface (API) is an approach to providing a program interface to allow consumers controlled access to services or applications owned by a company.
- If you want data from a public source
- see if the company has a public API
- see if someone has already written an R package
- APIs vary, but lots of APIs allow you to pull data into R without the need to “scrape” it… R packages provide functions to make it easier
- If it’s not otherwise clear how to appropriate access the data… you need to ask permission.
Reproducibility
- Reproducible analysis is the practice of recording each and every step, no matter how trivial, in a data analysis
- Some elements of a reproducible analysis include (see MDSR for source)
- Data: all source data in original form
- Metadata: codebooks and other info needed to understand the data
- Code: script needed to process data, conduct analysis, etc
- Map: file that maps between output and results in the report
- Statisticians and data scientists should welcome code reviews and rigorous vetting, particularly when our work is expected to have significant impact or exposure.
- Q: How does our STAT 380 workflow compare to this standard?
- what parts are we doing well?
- what parts should we improve?
Multiple Testing
- One common way in which a statistician or data scientist can easily mislead others (and themselves in the process) is through multiple testing
- Imagine 100 research teams working to study efficacy of the same medical drug
- with 5% significance level we expect 5 of those teams to observe statistically significant results by chance alone
- 5 (false) positive reports are published; 95 are–of course–not published
- Q: is the corroborating evidence of these 5 publications compelling evidence of an effect?
Multiple Testing
- we often consider dozens of variables… even hundreds (e.g., indicators for lots of categorical variables can add up)
- we are implicitly conducting parallel tests as part of model selection
- we are responsible to faithfully disclose such pertinent details of the analysis, and take reasonable steps to avoid misleading or overstated conclusions in those cases
- Q: What are some stretegies that have we discussed to avoid this issue?
More examples the ethical minefield we call Statistics & Data Science…
- Study design considerations
- Sample size
- Sampling methods
- Assignment of subjects to treatment conditions
- Data collection protocol
- “re-randomizing”
- Stopping rules (e.g. clinical trials)
- Responsibility during double-blinding
- Data stewardship
- Data cleaning (i.e. preparing raw data for analysis)
- Data privacy / confidentiality
- Outlier handling
- Reproducibility of analysis
- Data analysis decisions
- Analysis consistent with design / data collection
- Misleading graphs
- Checking assumptions
- Analysis of data from unknown origin
- Use of (deviation from) prescribed research protocol
- Multiple testing
- Fitting multiple statistical models (i.e. competing analyses)
- Outlier handling
- Interpretations / Conclusions
- Interpretation of results
- Generalizeability of conclusions
- Which is worse: bad data or no data?
- Causal inference
- Confirmation bias
- post hoc conclusions
- Role of statistician in polarizing contexts
- Controversial issues (e.g. animal research)
- Expert trial witness (e.g. litigation involving your employer)
- Political policy (e.g. gerrymandering)
LS0tCnRpdGxlOiAiUHJvZmVzc2lvbmFsIEV0aGljcyIgIApzdWJ0aXRsZTogIk1EU1IgQ2ggNiIgIApvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQgIAogIHNsaWR5X3ByZXNlbnRhdGlvbjogZGVmYXVsdCAgCi0tLQoKCgpgYGB7ciBGcm9udCBNYXR0ZXIsIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyBjbGVhbiB1cCBSIGVudmlyb25tZW50CnJtKGxpc3QgPSBscygpKQoKIyBnbG9iYWwgb3B0aW9ucwprbml0cjo6b3B0c19jaHVuayRzZXQoZXZhbD1UUlVFLCBpbmNsdWRlPVRSVUUpCm9wdGlvbnMoZGlnaXRzPTQpCgojIHBhY2thZ2VzIHVzZWQKCgojIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgCgoKIyBpbnB1dHMgc3VtbWFyeQoKCmBgYAoKCgojIyBBbm5vdW5jZW1lbnRzCgojIyMjIEFubm91bmNlbWVudHMKCi0gZ3JhZGluZwogICAgLSBQaWF6emEgcG9zdGVkICh3aWxsIHVwZGF0ZSBhZ2FpbikKICAgIC0gR2l0SHViIHBvc3RlZCAoc3BsaXQgMXN0ICYgMm5kIGhhbHZlcyBvZiB0ZXJtKQotIG1pZHRlcm0gZXhhbQogICAgLSBwbGFubmluZyB0byByZXR1cm4gdGhlbSAmIGRpc2N1c3Mgb24gV2VkICgzLzEzKQogICAgLSBFeHRyYSBDcmVkaXQgc3VydmV5ICh0byBib29zdCBhdmcgc2xpZ2h0bHkpCi0gTURTUiBDaCA2IChldGhpY3MpOiBubyBwcm9ncmFtbWluZyBhc3NpZ25lZAotIE1EU1IgQ2ggNiBleGVyY2lzZXMtLW5vIGNvZGUsIGJ1dCB1c2UgR2l0SHViLCBtYWtlIGNvbW1pdHMsICYgc3VibWl0IFIgTm90ZWJvb2sgbGlrZSBhbHdheXMKLSBNRFNSIENoIDEwIHByb2dyYW1taW5nIG5vdGVib29rCgoKIyMjIyBNRFNSIENoIDEwIEVycmF0YSAvIFRpcHMKCi0gU29tZSBzZWN0aW9ucyBkb24ndCByZXF1aXJlIHByb2dyYW1taW5nLCBidXQgcGxlYXNlIHN0aWxsIGluY2x1ZGUgdGhlIGhlYWRlcnMgZm9yIG5hdmlnYXRpb24gcHVycG9zZXMKLSBwLiAyMzQtMjM1OiBSZW5hbWUgdGhlIHJlc3VsdCBmb3IgMjAsMDAwIHNpbXVsYXRpb25zIGFzIGBzaW1fcmVzdWx0czIwa2AKICAgIC0gdGhlIGF1dGhvcnMgcmV1c2UgdGhlIG9iamVjdCBuYW1lIGBzaW1fcmVzdWx0c2AgZm9yIHRoZSBleGFtcGxlIHdpdGggMjAsMDAwIHNpbXVsYXRpb25zLCBidXQgdGhpcyBvdmVyd3JpdGVzIHRoZSBvYmplY3QgZXhwZWN0ZWQgZm9yIHRoZSBwbG90IGF0IHRoZSB0b3Agb2YgcC4gMjM1LiAgCiAgICAtIGJ5IHJlbmFtaW5nIHRoZSBvYmplY3QgcmVzdWx0aW5nIGZvcm0gMjAsMDAwIHNpbXVsYXRpb25zLCB0aGUgZ2dwbG90IGNhbGwgd2lsbCBzdGlsbCBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgaW50ZW5kZWQgb2JqZWN0CgoKCiMjIEluIHRoZSBuZXdzLi4uCgojIyMjIFRoZXNlIFR3byBDaGFydHMgUHJvdmUgQSBDb2xsZWdlIEVkdWNhdGlvbiBKdXN0IElzbid0IFdvcnRoIFRoZSBNb25leSBBbnltb3JlCgotIFE6IEFueSB0aG91Z2h0cz8KCgohW10oYnVzaW5lc3NJbnNpZGVyLnBuZykKCnNvdXJjZTogPGh0dHBzOi8vd3d3LmJ1c2luZXNzaW5zaWRlci5jb20vdGhlc2UtdHdvLWNoYXJ0cy1wcm92ZS1hLWNvbGxlZ2UtZWR1Y2F0aW9uLWp1c3QtaXNudC13b3J0aC10aGUtbW9uZXktYW55bW9yZS0yMDEyLTY+CgoKIyMgRWR1Y2F0aW9uIHZzIEluY29tZSBPYnNlcnZhdGlvbnMKCi0gZG9lcyBub3Qgc2hvdyBjb21wYXJpc29uIHdpdGggbm9uLWNvbGxlZ2UgZ3JhZHVhdGVzCi0gaXMgYW5udWFsIGluY29tZSBhdCBncmFkdWF0aW9uIHRoZSBiZXN0IG1ldHJpYz8gCiAgICAtIChubyBkb3VidCBlYXNpZXIgdG8gYWNjZXNzKQogICAgLSBsaWZldGltZSB0b3RhbCBpbmNvbWUgZWFybmluZ3M/CiAgICAtIG1heGltdW0gaW5jb21lIGFjaGlldmVkPwogICAgLSBpcyBpbmNvbWUgdGhlIG9ubHkgYmVuZWZpdD8KICAgIC0gb3RoZXJzPwotIFE6IGNhbiB5b3UgcmVhbGx5IHRydXN0ICoqbWUqKiBvbiB0aGlzIHN1YmplY3Q/CiAgICAtIFE6IHdoeSBvciB3aHkgbm90PwoKc291cmNlOiA8aHR0cHM6Ly9pbzkuZ2l6bW9kby5jb20vMTEtbW9zdC11c2VsZXNzLWFuZC1taXNsZWFkaW5nLWluZm9ncmFwaGljcy1vbi10aGUtaW50ZS0xNjg4MjM5Njc0PgoKCiMjIFN0YW5kIHlvdXIgZ3JvdW5kCgotIEdyYXBoaWMgb25jZSBwdWJsaXNoZWQgYnkgbmV3cyBzb3VyY2UgUmV1dGVycwogICAgLSBROiBXaGF0IGNhbiB5b3UgbGVhcm4gZnJvbSB0aGlzIGdyYXBoaWM/CiAgICAtIFE6IEFueXRoaW5nIHlvdSB3b3VsZCBjaGFuZ2UgYWJvdXQgaXQ/CgohW10ocmV1dGVycy5naWYpCgoKCiMjIFByb2Zlc3Npb25hbCBFdGhpY3MKCi0gSW4gdGhlIFVTLCB0aGVyZSBhcmUgcG9wdWxhciBub3Rpb25zIG9mIHByb2Zlc3Npb25hbCBldGhpY3MgZm9yIHNvbWUgcHJvZmVzc2lvbnMgYnV0IG5vdCBvdGhlcnMKICAgIC0gTWVkaWNhbCBEb2N0b3JzLS1IaXBwb2NyYXRpYyBPYXRoIAogICAgICAgIC0gIihoZWxwIG9yKSBEbyBubyBoYXJtIiBpcyB3ZWxsLWtub3duLCBidXQgYWN0dWFsbHkgY29tZXMgZnJvbSBlbHNld2hlcmUKICAgICAgICAtICJJIHdpbGwgbm90IGJlIGFzaGFtZWQgdG8gc2F5ICdJIGtub3cgbm90LCcgbm9yIHdpbGwgSSBmYWlsIHRvIGNhbGwgaW4gbXkgY29sbGVhZ3VlcyB3aGVuIHRoZSBza2lsbHMgb2YgYW5vdGhlciBhcmUgbmVlZGVkIGZvciBhIHBhdGllbnQncyByZWNvdmVyeSIKICAgICAgICAtICJJIHdpbGwgcmVzcGVjdCB0aGUgcHJpdmFjeSBvZiBteSBwYXRpZW50cywgZm9yIHRoZWlyIHByb2JsZW1zIGFyZSBub3QgZGlzY2xvc2VkIHRvIG1lIHRoYXQgdGhlIHdvcmxkIG1heSBrbm93IgogICAgICAgIC0gIkkgd2lsbCByZW1lbWJlciB0aGF0IEkgYW0gYSBtZW1iZXIgb2Ygc29jaWV0eSwgd2l0aCBzcGVjaWFsIG9ibGlnYXRpb25zIHRvIGFsbCBteSBmZWxsb3cgaHVtYW4gYmVpbmdzLCB0aG9zZSBvZiBzb3VuZCBtaW5kIGFuZCBib2R5IGFzIHdlbGwgYXMgdGhlIGluZmlybSIKLSAqKlE6IEhvdyBkbyB0aGVzZSByZWxhdGUgdG8gcHJvZmVzc2lvbmFsIGV0aGljcyBpbiBTdGF0aXN0aWNzICYgRGF0YSBTY2llbmNlKioKCgojIyBQcm9mZXNzaW9uYWwgRXRoaWNzCgotIFNvbWUgYmVoYXZpb3JzIGFyZSBwcmV0dHkgdW5pdmVyc2FsbHkgdmlld2VkIGFzIHVuZXRoaWNhbDogbHlpbmcsIGNoZWF0aW5nLCBzdGVhbGluZwotIFByb2Zlc3Npb25hbCBldGhpY3MgYWRkaXRpb25hbGx5IHJlcXVpcmVzIGEgbW9yZSBudWFuY2VkIGludGVycHJldGF0aW9uCi0gKipSZWFzb25hYmxlIHBlb3BsZSBjYW4gZGlzYWdyZWUgYWJvdXQgd2hhdCBhY3Rpb25zIGFyZSBiZXN0LCoqIAogICAgLSBFdGhpY3MgYXJlIG5vdCBsYXcKICAgIC0gV2UgYXJlIGJlc3QgdG8gYXNzZXNzIGV0aGljYWwgYWN0aW9uIHRob3VnaCB1c2Ugb2YgY29uc2lzdGVudCBwcmluY2lwbGVzIGFuZCBndWlkZWxpbmVzCgojIyBHZW5lcmFsIHByaW5jaXBsZXMKCi0gKllvdSBoYXZlIHNraWxscyB0aGF0IGFyZW4ndCB3aWRlbHkgYXZhaWxhYmxlOyBkb24ndCB1c2UgdGhlbSB0byBkZWNlaXZlIG90aGVycyAoaW50ZW50aW9uYWxseSBvciBub3QpKgotIERvIHlvdXIgd29yayB3ZWxsIGJ5IHlvdXIgb3duIHN0YW5kYXJkcyBhbmQgYnkgdGhlIHN0YW5kYXJkcyBvZiB5b3VyIHByb2Zlc3Npb24KICAgIC0gZG8gd29yayB0aGF0IHdvdWxkIHBhc3Mgc2NydXRpbnkgYnkgcHJvZmVzc2lvbmFsIGNvbGxlYWd1ZXMKICAgIC0ga25vdyB5b3VyIGxpbWl0cyAoZS5nLiByZWdhcmRpbmcgdXNlIG9mIG1ldGhvZHMgeW91IGRvbid0IHVuZGVyc3RhbmQpCi0gUmVjb2duaXplIHRoZSBwYXJ0aWVzIChzdGFrZWhvbGRlcnMpIHRvIHdob20geW91IGhhdmUgYSBzcGVjaWFsIHByb2Zlc3Npb25hbCBvYmxpZ2F0aW9uCiAgICAtIGVtcGxveWVyICYgY2xpZW50CiAgICAtIGdlbmVyYWwgcHVibGljIG9yIHBhcnRpY2lwYW50cyBpbiBhIHN0dWR5CiAgICAtIHJlc2VhcmNoIGNvbW11bml0eSBvciB0aGUgcHJvZmVzc2lvbiBpdHNlbGYKLSBSZXBvcnQgcmVzdWx0cyBhbmQgbWV0aG9kcyBob25lc3RseSBhbmQgcmVzcGVjdCB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGlkZW50aWZ5IGFuZCByZXBvcnQgZmxhd3MgYW5kIHNob3J0Y29taW5ncyBpbiB5b3VyIHdvcmsuCiAgICAtIGRvbid0IG92ZXJzdGF0ZSB5b3VyIGNvbmZpZGVuY2UKICAgIC0gb2Z0ZW4sICJmbGF3cyBpbiB5b3VyIHdvcmsiIGFyZSB1bmF2b2lkYWJsZSBsaW1pdGF0aW9ucyBvciBuZWNlc3NhcnkgY29tcHJvbWlzZS4gIFRoZXNlIHNob3VsZCBzdGlsbCBiZSBrbm93biB0byB0aGUgY29uc3VtZXIgb2YgeW91ciBhbmFseXNpcwoKCiMjIEFtZXJpY2FuIFN0YXRpc3RpY2FsIEFzc29jaWF0aW9uICgyMDE4IGV0aGljYWwgZ3VpZGVsaW5lcykKCi0gUHJvZmVzc2lvbmFsIGludGVncml0eSBhbmQgYWNjb3VudGFiaWxpdHkgCi0gSW50ZWdyaXR5IG9mIGRhdGEgYW5kIG1ldGhvZHMgCiAgICAtIE5vdGU6IGJvdGggcGxvdHMgc2hvd24gYmVmb3JlIHZpb2xhdGUgdGhpcyBzZWN0aW9uIG9mIEFTQSBldGhpY2FsIGd1aWRlbGluZXMKLSBSZXNwb25zaWJpbGl0aWVzIHRvIFNjaWVuY2UvUHVibGljL0Z1bmRlci9DbGllbnQKLSBSZXNwb25zaWJpbGl0aWVzIHRvIHJlc2VhcmNoIHN1YmplY3RzCi0gUmVzcG9uc2liaWxpdGllcyB0byByZXNlYXJjaCB0ZWFtIGNvbGxlYWd1ZXMKLSBSZXNwb25zaWJpbGl0aWVzIHRvIG90aGVyIHN0YXRpc3RpY2lhbnMgYW5kIHN0YXRpc3RpY3MgcHJhY3RpdGlvbmVycwotIFJlc3BvbnNpYmlsaXRpZXMgcmVnYXJkaW5nIGFsbGVnYXRpb25zIG9mIG1pc2NvbmR1Y3QKLSBSZXNwb25zaWJpbGlsaWVzIG9mIFt0aG9zZV0gKmVtcGxveWluZyogc3RhdGlzdGljYWwgcHJhY3RpdGlvbmVycwoKCiFbc291cmNlOiA8aHR0cHM6Ly93d3cuYW1zdGF0Lm9yZy9BU0EvWW91ci1DYXJlZXIvRXRoaWNhbC1HdWlkZWxpbmVzLWZvci1TdGF0aXN0aWNhbC1QcmFjdGljZS5hc3B4Pl0oYXNhRXRoaWNzLnBuZykKCgojIyBEYXRhIFNjaWVuY2UgZXRoaWNzCgotIENsZWFybHkgYSB3ZWxsLWlkZW50aWZpZWQgaXNzdWUsIGJ1dCBzbyBmYXIgdW5jbGVhciB3aG8gc2hvdWxkIGJlIHRoZSBjb21wZXRlbnQgYXV0aG9yaXR5Ci0gU29tZSBleGFtcGxlcyBJIGZvdW5kIGVhc2lseQogICAgLSBQZW5uIFN0YXRlIElTVCA0MDI6IERhdGEgRXRoaWNzIAogICAgLSBVIENoaWNhZ28gRGF0YSBTY2llbmNlIGZvciBTb2NpYWwgR29vZAogICAgLSBVIE1pY2hpZ2FuIHNob3J0IGNvdXJzZSBvbiBEYXRhIFNjaWVuY2UgRXRoaWNzCiAgICAtIENvdXJzZXJhICYgZWRYIGNvdXJzZXMgb24gRGF0YSBTY2llbmNlIEV0aGljcwoKCiFbU291cmNlOiA8aHR0cHM6Ly93d3cuZm9yYmVzLmNvbS9zaXRlcy9rYWxldmxlZXRhcnUvMjAxOC8xMC8wOC9kby13ZS1uZWVkLXRvLXRlYWNoLWV0aGljcy1hbmQtZW1wYXRoeS10by1kYXRhLXNjaWVudGlzdHMvIzQxNTQwYjUxMmVlMT5dKGZvcmJlczIwMTgucG5nKQoKIyMgKFBTVSkgR3VpZGVsaW5lcyBmb3IgZGVjaXNpb24gbWFraW5nIAoKMS4gUGVyY2lldmVkIHByb2JsZW0gb3IgZXRoaWNhbCBkaWxlbW1hPwojLiBXaGF0IGFyZSB0aGUgZmFjdHM/CiMuIFdoYXQgc3Rha2Vob2xkZXJzLCB2YWx1ZXMsIGFuZCBndWlkZWxpbmVzIGFyZSBpbnZvbHZlZD8KIy4gV2hhdCBhcmUgdGhlIG9wdGlvbnMgKGdvb2QgJiBiYWQpPwojLiBDb25zaWRlciB0aGUgb3B0aW9ucyAob3V0Y29tZXMsIHZpcnR1ZXMsIC4uLik/CiMuIFdoaWNoIGlzIHRoZSBCRVNUIChvciAibGVhc3QgYmFkIikgb3B0aW9uPwojLiBIb3cgbWlnaHQgd2UgcHJldmVudCB0aGlzIGlzc3VlIGluIHRoZSBmdXR1cmU/CgoKIyMgU29tZSBFeGFtcGxlcwoKLSBFbXBsb3ltZW50IGRpc2NyaW1pbmF0aW9uCi0gU2NyYXBpbmcgT2tDdXBpZCBkYXRhCi0gUmVwcm9kdWNpYmxlIHNwcmVhZHNoZWV0IGFuYWx5c2lzIAotIExlZ2FsIG5lZ290aWF0aW9ucwoKIyMgQXBwbHlpbmcgb3VyIGd1aWRlbGluZXM6IEVtcGxveW1lbnQgRGlzY3JpbWluYXRpb24KCgojIyBBcHBseWluZyBvdXIgZ3VpZGVsaW5lczogRW1wbG95bWVudCBEaXNjcmltaW5hdGlvbgoKLSBFYXN5IHRvIGNyaXRpY2l6ZSB0aGUgbWV0aG9kLi4uIHF1aXRlIGxpa2VseSB0aGF0IGVtcGxveWVycyBhcmUgaW5hcHByb3ByaWF0ZWx5IGxhYmVsZWQgYXMgZGlzY3JpbWluYXRvcnMganVzdCBieSBjaGFuY2UgYWxvbmUKLSBPRkNDUCBkaWRuJ3QgKipjcmVhdGUqKiB0aGUgbWV0aG9kLCB0aGV5IGFyZSBhY3R1YWxseSByZXF1aXJlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QuLi4gCiAgICAtIFVTIE9mZmljZSBvZiBQZXJzb25uZWwgTWFuYWdlbWVudCAod3d3Lm9wbS5nb3YpCiAgICAtICJUaGUgVW5pZm9ybSBHdWlkZWxpbmVzICg8aHR0cDovL3VuaWZvcm1ndWlkZWxpbmVzLmNvbS8+KSBhcHBseSB0byBhbGwgc2VsZWN0aW9uIHByb2NlZHVyZXMgdXNlZCB0byBtYWtlIGVtcGxveW1lbnQgZGVjaXNpb25zIiAoYWNjb3JkaW5nIHRvIE9QTSBGQVEgcGFnZSkKLSBPRkNDUCBlbmZvcmNlcyB0aGUgbGF3LCBhbmQgaGFzIGEgcmVzcG9uc2liaWxpdHkgdG8gdGhlIGNvdXJ0cwoKCgojIyBBcHBseWluZyBvdXIgZ3VpZGVsaW5lczogRGF0YSBTY3JhcGluZwoKCiMjIEFwcGx5aW5nIG91ciBndWlkZWxpbmVzOiBEYXRhIFNjcmFwaW5nCgotIHRoZSByZXNlYXJjaGVyIHNlZW1zIHRvIHVzZSBwZXJmZWN0bHkgbGVnaXRpbWF0ZSBtZWFucyB0byBhY2Nlc3MgdGhlIGRhdGEgCi0gU3Rha2Vob2xkZXJzOiAqKk9rQ3VwaWQgdXNlcnMqKgogICAgLSBVc2VycyBkaWQgbm90IGNvbnNlbnQgdG8gdGhpcyB1c2Ugb2YgdGhlaXIgZGF0YS4uLiAoJiBjb3VsZCBub3QgT3B0IG91dCkKICAgIC0gVGhlIGRhdGEgYXJlIHBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGFuZCB1c2VycyBjb3VsZCByZWFzb25hYmx5IGV4cGVyaWVuY2UgImRhbWFnZXMiIChlbWJhcmFzc21lbnQgb3IgcGVyc29uYWwgaGFybSkKLSBTdGFrZWhvbGRlcnM6ICoqT2tDdXBpZCoqCiAgICAtIGNvbXBhbmllcyBsaWtlIHRoaXMgb2Z0ZW4gc3BlY2lmeSAqdGVybXMgb2YgdXNlKiB0aGF0IHJlc3RyaWN0IGhvdyB0aGUgZGF0YSBtYXkgYmUgbGVnaXRpbWF0ZWx5IHVzZWQuCiAgICAtICoqdGVybXMgb2YgdXNlIGNhbm5vdCBldGhpY2FsbHkgYmUgZGlzcmVnYXJkZWQqKiBzaW5jZSB0aGV5IHJlcHJlc2VudCBhbiBleHBsaWNpdCBhZ3JlZW1lbnQgYmV0d2VlbiB0aGUgc2VydmljZSBwcm92aWRlciBhbmQgKGFueSkgdXNlciBvZiB0aGUgc2VydmljZQoKCiMjIEFwcGx5aW5nIG91ciBndWlkZWxpbmVzOiBSZXByb2R1Y2libGUgc3ByZWFkc2hlZXQgYW5hbHlzaXMKCgojIyBBcHBseWluZyBvdXIgZ3VpZGVsaW5lczogUmVwcm9kdWNpYmxlIHNwcmVhZHNoZWV0IGFuYWx5c2lzCgotIFJlc2VhcmNoZXJzIGhhdmUgYW4gZXRoaWNhbCBvYmxpZ2F0aW9uIHRvIGJlIHRydXRoZnVsIGluIHRoZWlyIHJlcG9ydGluZyBvZiByZXNlYXJjaAogICAgLSBob25lc3QgcmVwb3J0aW5nIG9mIHJlc3VsdHMKICAgIC0gcGVybWl0IHJlc3VsdHMgdG8gYmUgY2hhbGxlbmdlZCBvciBjb25maXJtZWQgKFJlaW5oYXJ0ICYgUm9nb2ZmIGRpZCB0aGlzIHdlbGwpCi0gSXQgaXMgbm90IHVuZXRoaWNhbCB0byBiZSAqKndyb25nKiogc28gdG8gc3BlYWsKICAgIC0gdGhlIGV0aGljYWwgb2JsaWdhdGlvbiBpcyB0byB0YWtlIGFsbCByZWFzb25hYmxlIHN0ZXBzIHRvIGVuc3VyZSB0aGF0IGNvbmNsdXNpb25zIGZhaXRoZnVsbHkgcmVwcmVzZW50IHRoZSBkYXRhIGFuZCB0aGUgYW5hbHlzaXMgZnJhbWV3b3JrCiAgICAtIFJlaW5oYXJ0ICYgUm9nb2ZmIG1heSBoYXZlIGRvbmUgc28gdG8gdGhlIGJlc3Qgb2YgdGhlaXIgYWJpbGl0eQotIEluIHN0YXRpc3RpY3MgYW5kIGRhdGEgc2NpZW5jZSwgd2UgaGF2ZSBhbiBldGhpY2FsIG9ibGlnYXRpb24gdG8gdXNlIHRvb2xzIHRoYXQgYXJlIHJlbGlhYmxlLCB2ZXJpZmlhYmxlLCBhbmQgY29uZHVjaXZlIHRvIHJlcHJvZHVjaWJsZSBkYXRhIGFuYWx5c2lzCiAgICAtIGEgcmVwcm9kdWNpYmxlIHdvcmtmbG93IGxpa2UgdGhhdCBvZiBSLCBSTWFya2Rvd24sIGFuZCBHaXQgYWNjb21wbGlzaGVzIHRoaXMgcHVycG9zZQogICAgLSB0b29scyBzaG91bGQgc3RyaXZlIHRvIGF2b2lkIHF1aWV0IChvciBzaWxlbnQpIGZhaWx1cmUgbW9kZXMKICAgIC0gTWljcm9zb2Z0IEV4Y2VsIGRvZXMgbm90CiAgICAgICAgLSBtaXhlcyB0aGUgZGF0YSB3aXRoIHRoZSBhbmFseXNpcwogICAgICAgIC0gZGlmZmljdWx0IHRvIHByb2dyYW0gaW4gYSBjb25jaXNlIGFuZCByZWFkYWJsZSB3YXkKICAgICAgICAtIGNvbW1hbmRzIGFyZSBjdXN0b21pemVkIHRvIGEgcGFydGljdWxhciBzaXplIGFuZCBvcmdhbml6YXRpb24gb2YgZGF0YQogICAgICAgIC0gdmFsaWRhdGluZyBhZ2FpbnN0IGEga25vd24gcmVzdWx0IGlzIG9mdGVuIGltcHJhY3RpY2FsIGluIEV4Y2VsCiAgICAgICAgLSBjbGljayAmIGRyYWcgb3BlcmF0aW9ucyBhcmUgZXJyb3ItcHJvbmUKCgoKIyMgRGF0YSByZWlkZW50aWZpY2F0aW9uIGFuZCBkaXNjbG9zdXJlIGF2b2lkYW5jZQoKLSBvYmxpZ2F0aW9uIHRvIHByaXZhY3kgcHJvdGVjdGlvbnMKICAgIC0gSElQQUEgcHJvdGVjdHMgcHJpdmFjeSBoZWFsdGggaW5mb3JtYXRpb24KICAgIC0gRkVSUEEgcHJvdGVjdHMgcHJpdmFjeSBvZiBzdHVkZW50IHJlY29yZHMKLSB0aGVyZSBpcyBhbiBhcHByb3ByaWF0ZSB0ZW5zaW9uIGJldHdlZW4gZGlzY2xvc3VyZXMgZm9yIHB1YmxpYyBnb29kIChoZWFsdGhjYXJlIGNvc3RzIGFuZCBvdXRjb21lcykgYW5kIG5vbmRpc2Nsb3N1cmVzIHRoYXQgcHJvdGVjdCBwZXJzb25hbCBwcml2YWN5Ci0gZGF0YSBzY2llbnRpc3RzIGhhdmUgc2tpbGxzIHRoYXQgY291bGQgY2lyY3VtdmVudCB0aGVzZSBwcm90ZWN0aW9ucyAoZXZlbiBhY2NpZGVudGFsbHkpLCBhbmQgdGhpcyBjYXJyaWVzIHdpdGggaXQgYSBjbGVhciBldGhpY2FsIHJlc3BvbnNpYmlsaXR5CgojIyBEYXRhIHNjcmFwaW5nIGFuZCB0ZXJtcyBvZiB1c2UKCi0gQWNjb3JkaW5nIHRvIE1EU1IsIChTbGF0ZS5jb20pW2h0dHBzOi8vc2xhdGUuY29tL3Rlcm1zXSByZWNlbnRseSBzdGF0ZWQgaW4gdGhlaXIgdGVybXMgb2YgdXNlIGV4cGxpY2l0bHkgcHJvaGliaXRlZCB1c2VycyBmcm9tIHNjcmFwaW5nIGNvbnRlbnQgb3IgaW5mb3JtYXRpb24gKHRoaXMgYXBwZWFycyB0byBoYXZlIGNoYW5nZWQpCi0gQW4gYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlIChBUEkpIGlzIGFuIGFwcHJvYWNoIHRvIHByb3ZpZGluZyBhIHByb2dyYW0gaW50ZXJmYWNlIHRvIGFsbG93IGNvbnN1bWVycyBjb250cm9sbGVkIGFjY2VzcyB0byBzZXJ2aWNlcyBvciBhcHBsaWNhdGlvbnMgb3duZWQgYnkgYSBjb21wYW55LgotIElmIHlvdSB3YW50IGRhdGEgZnJvbSBhIHB1YmxpYyBzb3VyY2UKICAgIC0gc2VlIGlmIHRoZSBjb21wYW55IGhhcyBhIHB1YmxpYyBBUEkKICAgIC0gc2VlIGlmIHNvbWVvbmUgaGFzIGFscmVhZHkgd3JpdHRlbiBhbiBSIHBhY2thZ2UgCiAgICAtIEFQSXMgdmFyeSwgYnV0IGxvdHMgb2YgQVBJcyBhbGxvdyB5b3UgdG8gcHVsbCBkYXRhIGludG8gUiB3aXRob3V0IHRoZSBuZWVkIHRvICJzY3JhcGUiIGl0Li4uIFIgcGFja2FnZXMgcHJvdmlkZSBmdW5jdGlvbnMgdG8gbWFrZSBpdCBlYXNpZXIKLSBJZiBpdCdzIG5vdCBvdGhlcndpc2UgY2xlYXIgaG93IHRvIGFwcHJvcHJpYXRlIGFjY2VzcyB0aGUgZGF0YS4uLiB5b3UgbmVlZCB0byBhc2sgcGVybWlzc2lvbi4KCgojIyBSZXByb2R1Y2liaWxpdHkKCi0gUmVwcm9kdWNpYmxlIGFuYWx5c2lzIGlzIHRoZSBwcmFjdGljZSBvZiByZWNvcmRpbmcgZWFjaCBhbmQgZXZlcnkgc3RlcCwgbm8gbWF0dGVyIGhvdyB0cml2aWFsLCBpbiBhIGRhdGEgYW5hbHlzaXMKLSBTb21lIGVsZW1lbnRzIG9mIGEgcmVwcm9kdWNpYmxlIGFuYWx5c2lzIGluY2x1ZGUgKHNlZSBNRFNSIGZvciBzb3VyY2UpCiAgICAtICoqRGF0YSoqOiBhbGwgc291cmNlIGRhdGEgaW4gb3JpZ2luYWwgZm9ybQogICAgLSAqKk1ldGFkYXRhKio6IGNvZGVib29rcyBhbmQgb3RoZXIgaW5mbyBuZWVkZWQgdG8gdW5kZXJzdGFuZCB0aGUgZGF0YQogICAgLSAqKkNvZGUqKjogc2NyaXB0IG5lZWRlZCB0byBwcm9jZXNzIGRhdGEsIGNvbmR1Y3QgYW5hbHlzaXMsIGV0YwogICAgLSAqKk1hcCoqOiBmaWxlIHRoYXQgbWFwcyBiZXR3ZWVuIG91dHB1dCBhbmQgcmVzdWx0cyBpbiB0aGUgcmVwb3J0Ci0gU3RhdGlzdGljaWFucyBhbmQgZGF0YSBzY2llbnRpc3RzIHNob3VsZCB3ZWxjb21lIGNvZGUgcmV2aWV3cyBhbmQgcmlnb3JvdXMgdmV0dGluZywgcGFydGljdWxhcmx5IHdoZW4gb3VyIHdvcmsgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBzaWduaWZpY2FudCBpbXBhY3Qgb3IgZXhwb3N1cmUuCi0gKipROiBIb3cgZG9lcyBvdXIgU1RBVCAzODAgd29ya2Zsb3cgY29tcGFyZSB0byB0aGlzIHN0YW5kYXJkPyoqCiAgICAtIHdoYXQgcGFydHMgYXJlIHdlIGRvaW5nIHdlbGw/CiAgICAtIHdoYXQgcGFydHMgc2hvdWxkIHdlIGltcHJvdmU/CgoKIyMgTXVsdGlwbGUgVGVzdGluZwoKLSBPbmUgY29tbW9uIHdheSBpbiB3aGljaCBhIHN0YXRpc3RpY2lhbiBvciBkYXRhIHNjaWVudGlzdCBjYW4gZWFzaWx5IG1pc2xlYWQgb3RoZXJzIChhbmQgdGhlbXNlbHZlcyBpbiB0aGUgcHJvY2VzcykgaXMgdGhyb3VnaCBtdWx0aXBsZSB0ZXN0aW5nCi0gSW1hZ2luZSAxMDAgcmVzZWFyY2ggdGVhbXMgd29ya2luZyB0byBzdHVkeSBlZmZpY2FjeSBvZiB0aGUgc2FtZSBtZWRpY2FsIGRydWcKICAgIC0gd2l0aCA1JSBzaWduaWZpY2FuY2UgbGV2ZWwgd2UgZXhwZWN0IDUgb2YgdGhvc2UgdGVhbXMgdG8gb2JzZXJ2ZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHJlc3VsdHMgKipieSBjaGFuY2UgYWxvbmUqKgogICAgLSA1IChmYWxzZSkgcG9zaXRpdmUgcmVwb3J0cyBhcmUgcHVibGlzaGVkOyA5NSBhcmUtLW9mIGNvdXJzZS0tbm90IHB1Ymxpc2hlZAogICAgLSBROiBpcyB0aGUgY29ycm9ib3JhdGluZyBldmlkZW5jZSBvZiB0aGVzZSA1IHB1YmxpY2F0aW9ucyBjb21wZWxsaW5nIGV2aWRlbmNlIG9mIGFuIGVmZmVjdD8KCiMjIE11bHRpcGxlIFRlc3RpbmcKCi0gd2Ugb2Z0ZW4gY29uc2lkZXIgZG96ZW5zIG9mIHZhcmlhYmxlcy4uLiBldmVuIGh1bmRyZWRzIChlLmcuLCBpbmRpY2F0b3JzIGZvciBsb3RzIG9mIGNhdGVnb3JpY2FsIHZhcmlhYmxlcyBjYW4gYWRkIHVwKQotIHdlIGFyZSBpbXBsaWNpdGx5IGNvbmR1Y3RpbmcgcGFyYWxsZWwgdGVzdHMgYXMgcGFydCBvZiBtb2RlbCBzZWxlY3Rpb24KLSB3ZSBhcmUgcmVzcG9uc2libGUgdG8gZmFpdGhmdWxseSBkaXNjbG9zZSBzdWNoIHBlcnRpbmVudCBkZXRhaWxzIG9mIHRoZSBhbmFseXNpcywgYW5kIHRha2UgcmVhc29uYWJsZSBzdGVwcyB0byBhdm9pZCBtaXNsZWFkaW5nIG9yIG92ZXJzdGF0ZWQgY29uY2x1c2lvbnMgaW4gdGhvc2UgY2FzZXMKLSBROiBXaGF0IGFyZSBzb21lIHN0cmV0ZWdpZXMgdGhhdCBoYXZlIHdlIGRpc2N1c3NlZCB0byBhdm9pZCB0aGlzIGlzc3VlPwoKIyMgTW9yZSBleGFtcGxlcyB0aGUgZXRoaWNhbCBtaW5lZmllbGQgd2UgY2FsbCBTdGF0aXN0aWNzICYgRGF0YSBTY2llbmNlLi4uCgotIFN0dWR5IGRlc2lnbiBjb25zaWRlcmF0aW9ucyAKICAgIC0gU2FtcGxlIHNpemUgIAogICAgLSBTYW1wbGluZyBtZXRob2RzICAKICAgIC0gQXNzaWdubWVudCBvZiBzdWJqZWN0cyB0byB0cmVhdG1lbnQgY29uZGl0aW9ucwogICAgLSBEYXRhIGNvbGxlY3Rpb24gcHJvdG9jb2wgCiAgICAtICJyZS1yYW5kb21pemluZyIKICAgIC0gU3RvcHBpbmcgcnVsZXMgKGUuZy4gY2xpbmljYWwgdHJpYWxzKQogICAgLSBSZXNwb25zaWJpbGl0eSBkdXJpbmcgZG91YmxlLWJsaW5kaW5nCgotIERhdGEgc3Rld2FyZHNoaXAKICAgIC0gRGF0YSBjbGVhbmluZyAoaS5lLiBwcmVwYXJpbmcgcmF3IGRhdGEgZm9yIGFuYWx5c2lzKQogICAgLSBEYXRhIHByaXZhY3kgLyBjb25maWRlbnRpYWxpdHkKICAgIC0gT3V0bGllciBoYW5kbGluZwogICAgLSBSZXByb2R1Y2liaWxpdHkgb2YgYW5hbHlzaXMgCgotIERhdGEgYW5hbHlzaXMgZGVjaXNpb25zCiAgICAtIEFuYWx5c2lzIGNvbnNpc3RlbnQgd2l0aCBkZXNpZ24gLyBkYXRhIGNvbGxlY3Rpb24KICAgIC0gTWlzbGVhZGluZyBncmFwaHMKICAgIC0gQ2hlY2tpbmcgYXNzdW1wdGlvbnMKICAgIC0gQW5hbHlzaXMgb2YgZGF0YSBmcm9tIHVua25vd24gb3JpZ2luCiAgICAtIFVzZSBvZiAoZGV2aWF0aW9uIGZyb20pIHByZXNjcmliZWQgcmVzZWFyY2ggcHJvdG9jb2wKICAgIC0gTXVsdGlwbGUgdGVzdGluZwogICAgLSBGaXR0aW5nIG11bHRpcGxlIHN0YXRpc3RpY2FsIG1vZGVscyAoaS5lLiBjb21wZXRpbmcgYW5hbHlzZXMpCiAgICAtIE91dGxpZXIgaGFuZGxpbmcKCi0gSW50ZXJwcmV0YXRpb25zIC8gQ29uY2x1c2lvbnMKICAgIC0gSW50ZXJwcmV0YXRpb24gb2YgcmVzdWx0cyAKICAgIC0gR2VuZXJhbGl6ZWFiaWxpdHkgb2YgY29uY2x1c2lvbnMKICAgIC0gV2hpY2ggaXMgd29yc2U6IGJhZCBkYXRhIG9yIG5vIGRhdGE/CiAgICAtIENhdXNhbCBpbmZlcmVuY2UKICAgIC0gQ29uZmlybWF0aW9uIGJpYXMgIAogICAgLSBwb3N0IGhvYyBjb25jbHVzaW9ucwogICAgLSBSb2xlIG9mIHN0YXRpc3RpY2lhbiBpbiBwb2xhcml6aW5nIGNvbnRleHRzICAKICAgICAgICAtIENvbnRyb3ZlcnNpYWwgaXNzdWVzIChlLmcuIGFuaW1hbCByZXNlYXJjaCkgIAogICAgICAgIC0gRXhwZXJ0IHRyaWFsIHdpdG5lc3MgKGUuZy4gbGl0aWdhdGlvbiBpbnZvbHZpbmcgeW91ciBlbXBsb3llcikgIAogICAgICAgIC0gUG9saXRpY2FsIHBvbGljeSAoZS5nLiBnZXJyeW1hbmRlcmluZykgIAoKCg==